<?xml version="1.0" encoding="UTF-8"?>
<robot generator="Robot 7.5 (Python 3.11.10 on linux)" generated="2026-10-11T00:46:51.144046" 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-10-11T00:46:51.567465" 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-10-11T00:46:51.567007" elapsed="0.000501"/>
</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-10-11T00:46:51.570617" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:46:51.570704" 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-10-11T00:46:51.569574" elapsed="0.001157"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:46:51.570878" elapsed="0.000416"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:46:51.572104" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:46:51.989376" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 00:46:16 UTC 2026

  System load:  0.39               Processes:             126
  Usage of /:   13.3% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.173
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


[?2004h[jenkins@releng-26932-423-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-10-11T00:46:51.571847" elapsed="0.417770"/>
</kw>
<msg time="2026-10-11T00:46:51.989740" 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-10-11T00:46:51.571473" elapsed="0.418390"/>
</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-10-11T00:46:51.569156" elapsed="0.420855"/>
</kw>
<msg time="2026-10-11T00:46:51.990073" 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-10-11T00:46:51.568636" elapsed="0.421490"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-10-11T00:46:51.568092" elapsed="0.422138"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-10-11T00:46:51.990306" elapsed="0.000064"/>
</return>
<msg time="2026-10-11T00:46:51.990602" 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-10-11T00:46:51.566623" elapsed="0.424006"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T00:46:52.003044" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-10-11T00:46:52.015275" 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-10-11T00:46:51.990910" elapsed="0.024455"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:46:52.015608" elapsed="0.000445"/>
</kw>
<if>
<branch type="IF" condition="not (${tools_system_connect})">
<return>
<status status="NOT RUN" start="2026-10-11T00:46:52.016449" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:46:52.016216" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:52.016169" elapsed="0.000374"/>
</if>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:46:52.019668" 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-10-11T00:46:52.019110" elapsed="0.000595"/>
</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-10-11T00:46:52.022269" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:46:52.022378" 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-10-11T00:46:52.021596" elapsed="0.000834"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:46:52.022625" elapsed="0.000420"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:46:52.024153" level="INFO">Logging into '10.30.171.7:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:46:52.523798" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Sun Oct 11 00:46:06 UTC 2026

  System load:  0.13               Processes:             111
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.7
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


[?2004h[jenkins@releng-26932-423-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-10-11T00:46:52.023793" elapsed="0.500315"/>
</kw>
<msg time="2026-10-11T00:46:52.524228" 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-10-11T00:46:52.023271" elapsed="0.501070"/>
</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-10-11T00:46:52.020998" elapsed="0.503500"/>
</kw>
<msg time="2026-10-11T00:46:52.524559" 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-10-11T00:46:52.020366" elapsed="0.504245"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-10-11T00:46:52.019934" elapsed="0.504755"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-10-11T00:46:52.524751" elapsed="0.000063"/>
</return>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-10-11T00:46:52.018615" elapsed="0.506330"/>
</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-10-11T00:46:51.564800" elapsed="0.960203"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:46:52.525720" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x743447249a10&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-10-11T00:46:52.525365" elapsed="0.000619"/>
</kw>
<kw name="Deploy_Test_Tool" owner="NexusKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:46:52.530479" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:46:52.530079" elapsed="0.000426"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:46:52.531033" 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-10-11T00:46:52.530675" elapsed="0.000382"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:46:52.531603" 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-10-11T00:46:52.531225" elapsed="0.000403"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:46:52.532651" elapsed="0.000285"/>
</kw>
<kw name="Fetch From Left" owner="String">
<msg time="2026-10-11T00:46:52.533361" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories//autorelease-10272</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-10-11T00:46:52.533160" elapsed="0.000226"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:46:52.533903" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories//autorelease-10272</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-10-11T00:46:52.533554" elapsed="0.000375"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:46:52.540748" elapsed="0.000334"/>
</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-10-11T00:46:52.540422" elapsed="0.000745"/>
</kw>
<msg time="2026-10-11T00:46:52.541211" 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-10-11T00:46:52.537693" elapsed="0.003565"/>
</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-10-11T00:46:52.537297" elapsed="0.004030"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:46:52.547673" elapsed="0.000325"/>
</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-10-11T00:46:52.547341" elapsed="0.000720"/>
</kw>
<msg time="2026-10-11T00:46:52.548100" 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-10-11T00:46:52.544712" elapsed="0.003453"/>
</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-10-11T00:46:52.544430" elapsed="0.003852"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:46:52.554658" elapsed="0.000334"/>
</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-10-11T00:46:52.554327" elapsed="0.000727"/>
</kw>
<msg time="2026-10-11T00:46:52.555095" 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-10-11T00:46:52.551707" elapsed="0.003449"/>
</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-10-11T00:46:52.551421" elapsed="0.003811"/>
</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-10-11T00:46:52.556290" elapsed="0.000237"/>
</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-10-11T00:46:52.556994" elapsed="0.000137"/>
</kw>
<msg time="2026-10-11T00:46:52.557187" 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-10-11T00:46:52.556669" elapsed="0.000566"/>
</kw>
<msg time="2026-10-11T00:46:52.557328" 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-10-11T00:46:52.555972" elapsed="0.001378"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:46:52.557709" level="INFO">index=2
host=10.30.171.7
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-10-11T00:46:52.557808" level="INFO">${current_ssh_connection} = index=2
host=10.30.171.7
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-10-11T00:46:52.557559" elapsed="0.000275"/>
</kw>
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:46:52.559922" 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-10-11T00:46:52.559566" elapsed="0.000381"/>
</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-10-11T00:46:52.561383" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:46:52.561471" 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-10-11T00:46:52.561073" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:46:52.561625" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:46:52.562826" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:46:52.935838" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 00:46:16 UTC 2026

  System load:  0.39               Processes:             126
  Usage of /:   13.3% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.173
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:46:51 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:46:52.562431" elapsed="0.373591"/>
</kw>
<msg time="2026-10-11T00:46:52.936114" 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-10-11T00:46:52.562055" elapsed="0.374174"/>
</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-10-11T00:46:52.560721" elapsed="0.375626"/>
</kw>
<msg time="2026-10-11T00:46:52.936398" 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-10-11T00:46:52.560365" elapsed="0.376106"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-10-11T00:46:52.560090" elapsed="0.376535"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-10-11T00:46:52.936687" elapsed="0.000056"/>
</return>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-10-11T00:46:52.559279" elapsed="0.377585"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:46:52.937457" level="INFO">Executing command 'sh search.sh /tmp/karaf-0.23.3/system pcep-impl'.</msg>
<msg time="2026-10-11T00:46:53.001375" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:46:53.001723" level="INFO">${version} = 1.0.3
org/opendaylight/bgpcep</msg>
<msg time="2026-10-11T00:46:53.001815" 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-10-11T00:46:52.937166" elapsed="0.064697"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:46:53.002286" elapsed="0.000623"/>
</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-10-11T00:46:53.005910" elapsed="0.000323"/>
</kw>
<msg time="2026-10-11T00:46:53.006329" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:46:53.004361" 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-10-11T00:46:53.006844" elapsed="0.000369"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:46:53.007531" elapsed="0.000044"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:46:53.003523" elapsed="0.004182"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:46:53.008652" level="INFO">1.0.3
org/opendaylight/bgpcep</msg>
<arg>${version}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:46:53.008070" elapsed="0.000676"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:46:53.009824" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:46:53.009347" elapsed="0.000590"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:53.008865" elapsed="0.001128"/>
</if>
<kw name="Split String" owner="String">
<msg time="2026-10-11T00:46:53.010845" level="INFO">${version} = 1.0.3</msg>
<msg time="2026-10-11T00:46:53.010936" 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-10-11T00:46:53.010340" elapsed="0.000644"/>
</kw>
<return>
<value>${version}</value>
<value>${location}</value>
<status status="PASS" start="2026-10-11T00:46:53.011093" elapsed="0.000099"/>
</return>
<msg time="2026-10-11T00:46:53.011539" level="INFO">${version} = 1.0.3</msg>
<msg time="2026-10-11T00:46:53.011628" 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-10-11T00:46:52.555686" elapsed="0.455988"/>
</kw>
<status status="PASS" start="2026-10-11T00:46:52.555328" elapsed="0.456430"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:46:53.012115" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:46:53.011812" elapsed="0.000451"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:52.555297" elapsed="0.457013"/>
</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-10-11T00:46:53.012879" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:46:53.012468" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:53.012401" elapsed="0.000646"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:46:53.014211" 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-10-11T00:46:53.013388" elapsed="0.000887"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:46:53.015540" 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-10-11T00:46:53.014657" elapsed="0.000939"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:46:53.016798" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories//autorelease-10272</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-10-11T00:46:53.015945" elapsed="0.000909"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:46:53.017884" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3</msg>
<var>${url}</var>
<arg>${urlbase}/${location}/${artifact}/${version}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:46:53.017187" elapsed="0.000752"/>
</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-10-11T00:46:53.021765" level="INFO">Executing command 'curl -L https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/maven-metadata.xml'.</msg>
<msg time="2026-10-11T00:46:53.126704" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:46:53.127017" level="INFO">${stdout} = &lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-10272 (staging: closed)&amp;quot; [id=autore...</msg>
<msg time="2026-10-11T00:46:53.127117" 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-10-11T00:46:53.127237" 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-10-11T00:46:53.021383" elapsed="0.105904"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:46:53.129617" level="INFO">Length is 395.</msg>
<msg time="2026-10-11T00:46:53.129853" 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  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  1101    0  1101    0     0  13786      0 --:--:-- --:--:-- --:--:-- 13762' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-10-11T00:46:53.128569" elapsed="0.001638">'  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  1101    0  1101    0     0  13786      0 --:--:-- --:--:-- --:--:-- 13762' should be empty.</status>
</kw>
<msg time="2026-10-11T00:46:53.130480" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-10-11T00:46:53.130573" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:46:53.127747" elapsed="0.002875"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:46:53.131903" 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-10-11T00:46:53.130982" elapsed="0.000976"/>
</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-10-11T00:46:53.134349" level="INFO">&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-10272 (staging: closed)&amp;quot; [id=autorelease-10272]&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.3/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-10272 (staging: closed)&amp;quot; [id=autorelease-10272]&lt;/h1&gt;
    &lt;p&gt;Path /org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-10272 (staging: closed)&amp;quot; [id=autorelease-10272]&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-10-11T00:46:53.133762" elapsed="0.000768"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:46:53.135890" 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  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  1101    0  1101    0     0  13786      0 --:--:-- --:--:-- --:--:-- 13762</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:46:53.134915" elapsed="0.001078"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:46:53.137042" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:46:53.136507" elapsed="0.000663"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T00:46:53.132845" elapsed="0.004473"/>
</kw>
<status status="PASS" start="2026-10-11T00:46:53.132163" elapsed="0.005279"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:53.132087" elapsed="0.005433"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T00:46:53.137857" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:46:53.137670" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:53.137626" elapsed="0.000370"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:46:53.138337" elapsed="0.000119"/>
</return>
<status status="PASS" start="2026-10-11T00:46:53.138107" elapsed="0.000430"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:53.138071" elapsed="0.000531"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:46:53.138943" elapsed="0.000049"/>
</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-10-11T00:46:53.020172" elapsed="0.119025"/>
</kw>
<msg time="2026-10-11T00:46:53.139356" 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-10-11T00:46:53.019033" elapsed="0.120493"/>
</kw>
<msg time="2026-10-11T00:46:53.139967" level="INFO">${metadata} = &lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-10272 (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-10-11T00:46:53.018363" elapsed="0.121674"/>
</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-10-11T00:46:53.144929" level="INFO">Executing command 'echo "&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-10272 (staging: closed)&amp;quot; [id=autorelease-10272]&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.3/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-10272 (staging: closed)&amp;quot; [id=autorelease-10272]&lt;/h1&gt;
    &lt;p&gt;Path /org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-10272 (staging: closed)&amp;quot; [id=autorelease-10272]&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-10-11T00:46:53.180573" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:46:53.180851" level="INFO">${stdout} = &lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-10272 (staging: closed)&amp;quot; [id=autore...</msg>
<msg time="2026-10-11T00:46:53.180947" 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-10-11T00:46:53.181034" 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-10-11T00:46:53.144567" elapsed="0.036514"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:46:53.183052" level="INFO">Length is 253.</msg>
<msg time="2026-10-11T00:46:53.183277" 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-10-11T00:46:53.182360" elapsed="0.001130">'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-10-11T00:46:53.183729" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-10-11T00:46:53.183827" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:46:53.181516" elapsed="0.002363"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:46:53.185238" 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-10-11T00:46:53.184283" elapsed="0.001026"/>
</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-10-11T00:46:53.187709" level="INFO">&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-10272 (staging: closed)&amp;quot; [id=autorelease-10272]&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-10-11T00:46:53.187044" elapsed="0.000770"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:46:53.188809" 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-10-11T00:46:53.188238" elapsed="0.000678"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:46:53.189987" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:46:53.189447" elapsed="0.000632"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T00:46:53.186190" elapsed="0.004038"/>
</kw>
<status status="PASS" start="2026-10-11T00:46:53.185527" elapsed="0.004795"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:53.185480" elapsed="0.004910"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T00:46:53.190789" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:46:53.190586" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:53.190539" elapsed="0.000390"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-10-11T00:46:53.191250" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:46:53.191035" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:53.191003" elapsed="0.000536"/>
</if>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-10-11T00:46:53.192672" 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 or task with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-10-11T00:46:53.191848" elapsed="0.000976">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-10-11T00:46:53.143470" elapsed="0.049630">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-10-11T00:46:53.193260" 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-10-11T00:46:53.142197" elapsed="0.051166"/>
</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-10-11T00:46:53.141356" elapsed="0.052296">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-10-11T00:46:53.193913" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T00:46:53.194054" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:46:53.140497" elapsed="0.053621"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:46:53.195229" level="INFO">Length is 288.</msg>
<msg time="2026-10-11T00:46:53.195465" 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-10-11T00:46:53.194602" elapsed="0.000932"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:46:53.196856" level="INFO">${namepart} = 1.0.3</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-10-11T00:46:53.195923" elapsed="0.000990"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:46:53.198084" level="INFO">${filename} = bgp-bmp-mock-1.0.3-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 variable.</doc>
<status status="PASS" start="2026-10-11T00:46:53.197290" elapsed="0.000878"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:46:53.199219" level="INFO">bgp-bmp-mock-1.0.3-executable.jar</msg>
<arg>${filename}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:46:53.198676" elapsed="0.000665"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:46:53.200498" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/bgp-bmp-mock-1.0.3-executable.jar</msg>
<var>${url}</var>
<arg>${url}/${filename}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:46:53.199751" elapsed="0.000810"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:46:53.201319" level="INFO">Executing command 'wget -q -N 'https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/bgp-bmp-mock-1.0.3-executable.jar' 2&gt;&amp;1'.</msg>
<msg time="2026-10-11T00:46:53.262920" level="INFO">Command exited with return code 8.</msg>
<msg time="2026-10-11T00:46:53.263218" level="INFO">${response} = </msg>
<msg time="2026-10-11T00:46:53.263325" 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-10-11T00:46:53.200939" elapsed="0.062437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:46:53.264505" level="INFO"/>
<arg>${response}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:46:53.263901" elapsed="0.000693"/>
</kw>
<if>
<branch type="IF" condition="${result} == 0">
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-10-11T00:46:53.264944" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:46:53.264739" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:53.264698" elapsed="0.000382"/>
</if>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:46:53.266209" level="INFO">${release_url} = https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/bgp-bmp-mock-1.0.3-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-10-11T00:46:53.265483" elapsed="0.000796"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:46:53.267020" level="INFO">Executing command 'wget -q -N 'https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/bgp-bmp-mock-1.0.3-executable.jar' 2&gt;&amp;1'.</msg>
<msg time="2026-10-11T00:46:53.332802" level="INFO">Command exited with return code 8.</msg>
<msg time="2026-10-11T00:46:53.333037" level="INFO">${response} = </msg>
<msg time="2026-10-11T00:46:53.333262" level="INFO">${result} = 8</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-10-11T00:46:53.266707" elapsed="0.066622"/>
</kw>
<if>
<branch type="IF" condition="${result} != 0">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-10-11T00:46:53.334945" level="FAIL">Artifact "bgp-bmp-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/bgp-bmp-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/bgp-bmp-mock-1.0.3-executable.jar</msg>
<arg>Artifact "${artifact}" in component "${component}" could not be downloaded from ${release_url} nor ${url}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-10-11T00:46:53.334042" elapsed="0.001058">Artifact "bgp-bmp-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/bgp-bmp-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/bgp-bmp-mock-1.0.3-executable.jar</status>
</kw>
<status status="FAIL" start="2026-10-11T00:46:53.333583" elapsed="0.001713">Artifact "bgp-bmp-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/bgp-bmp-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/bgp-bmp-mock-1.0.3-executable.jar</status>
</branch>
<status status="FAIL" start="2026-10-11T00:46:53.333537" elapsed="0.001852">Artifact "bgp-bmp-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/bgp-bmp-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/bgp-bmp-mock-1.0.3-executable.jar</status>
</if>
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-10-11T00:46:53.335547" elapsed="0.000035"/>
</return>
<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-10272/org/opendaylight/integration/karaf/0.23.3/karaf-0.23.3.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="FAIL" start="2026-10-11T00:46:52.532186" elapsed="0.803578">Artifact "bgp-bmp-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/bgp-bmp-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/bgp-bmp-mock-1.0.3-executable.jar</status>
</kw>
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-10-11T00:46:53.335918" elapsed="0.000034"/>
</return>
<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="FAIL" start="2026-10-11T00:46:52.529630" elapsed="0.806491">Artifact "bgp-bmp-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/bgp-bmp-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/bgp-bmp-mock-1.0.3-executable.jar</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${filename}</arg>
<arg>${name}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-11T00:46:53.336723" elapsed="0.000049"/>
</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="FAIL" start="2026-10-11T00:46:51.564314" elapsed="1.772649">Artifact "bgp-bmp-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/bgp-bmp-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/bgp-bmp-mock-1.0.3-executable.jar</status>
</kw>
<test id="s1-s1-t1" name="Verify BMP Feature" line="39">
<doc>Verifies if feature is up</doc>
<status status="FAIL" start="2026-10-11T00:46:53.337135" elapsed="0.001522">Parent suite setup failed:
Artifact "bgp-bmp-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/bgp-bmp-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/bgp-bmp-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s1-t2" name="Start_Bmp_Mock" line="51">
<doc>Starts bmp-mock on tools vm</doc>
<status status="FAIL" start="2026-10-11T00:46:53.340045" elapsed="0.001284">Parent suite setup failed:
Artifact "bgp-bmp-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/bgp-bmp-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/bgp-bmp-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s1-t3" name="Verify Data Reported" line="61">
<doc>Verifies if the tool reported expected data</doc>
<status status="FAIL" start="2026-10-11T00:46:53.341774" elapsed="0.001179">Parent suite setup failed:
Artifact "bgp-bmp-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/bgp-bmp-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/bgp-bmp-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s1-t4" name="Stop_Bmp_Mock" line="73">
<doc>Send ctrl+c to bmp-mock to stop it</doc>
<status status="FAIL" start="2026-10-11T00:46:53.343593" elapsed="0.002399">Parent suite setup failed:
Artifact "bgp-bmp-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/bgp-bmp-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/bgp-bmp-mock-1.0.3-executable.jar</status>
</test>
<kw name="Tear_It_Down" type="TEARDOWN">
<kw name="Get File" owner="SSHLibrary">
<msg time="2026-10-11T00:46:53.381772" level="INFO">[chan 5] Opened sftp connection (server version 3)</msg>
<msg time="2026-10-11T00:46:53.391350" level="FAIL">There were no source files matching 'bmpmock.log'.</msg>
<arg>${BMP_LOG_FILE}</arg>
<doc>Downloads file(s) from the remote machine to the local machine.</doc>
<status status="FAIL" start="2026-10-11T00:46:53.348734" elapsed="0.045176">There were no source files matching 'bmpmock.log'.</status>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:46:53.394964" 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-10-11T00:46:53.395322" level="INFO">${cnt} = None</msg>
<msg time="2026-10-11T00:46:53.395450" level="FAIL">FileNotFoundError: [Errno 2] No such file or directory: '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/bmpmock.log'</msg>
<var>${cnt}</var>
<arg>${BMP_LOG_FILE}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="FAIL" start="2026-10-11T00:46:53.394614" elapsed="0.000973">FileNotFoundError: [Errno 2] No such file or directory: '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/bmpmock.log'</status>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:46:53.397182" level="INFO">None</msg>
<arg>${cnt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:46:53.396581" elapsed="0.000698"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-10-11T00:46:53.397772" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects </doc>
<status status="PASS" start="2026-10-11T00:46:53.397605" elapsed="0.000331"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-10-11T00:46:53.398262" elapsed="0.000607"/>
</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="FAIL" start="2026-10-11T00:46:53.348050" elapsed="0.051087">Several failures occurred:

1) There were no source files matching 'bmpmock.log'.

2) FileNotFoundError: [Errno 2] No such file or directory: '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/bmpmock.log'</status>
</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="FAIL" start="2026-10-11T00:46:51.194399" elapsed="2.204916">Suite setup failed:
Artifact "bgp-bmp-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/bgp-bmp-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/bgp-bmp-mock/1.0.3/bgp-bmp-mock-1.0.3-executable.jar

Also suite teardown failed:
Several failures occurred:

1) There were no source files matching 'bmpmock.log'.

2) FileNotFoundError: [Errno 2] No such file or directory: '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/bmpmock.log'</status>
</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-10-11T00:46:53.446956" 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-10-11T00:46:53.446431" elapsed="0.000567"/>
</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-10-11T00:46:53.449294" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:46:53.449370" 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-10-11T00:46:53.448971" elapsed="0.000427"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:46:53.449574" elapsed="0.000310"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:46:53.450761" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:46:53.861398" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 00:46:16 UTC 2026

  System load:  0.39               Processes:             126
  Usage of /:   13.3% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.173
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:46:52 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:46:53.450508" elapsed="0.411125"/>
</kw>
<msg time="2026-10-11T00:46:53.861752" 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-10-11T00:46:53.450036" elapsed="0.411839"/>
</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-10-11T00:46:53.448604" elapsed="0.413423"/>
</kw>
<msg time="2026-10-11T00:46:53.862094" 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-10-11T00:46:53.447727" elapsed="0.414538"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-10-11T00:46:53.447316" elapsed="0.415052"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-10-11T00:46:53.862465" elapsed="0.000071"/>
</return>
<msg time="2026-10-11T00:46:53.862746" 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-10-11T00:46:53.445937" elapsed="0.416843"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T00:46:53.874803" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-10-11T00:46:53.885456" 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-10-11T00:46:53.863098" elapsed="0.022449"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:46:53.885746" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="not (${tools_system_connect})">
<return>
<status status="NOT RUN" start="2026-10-11T00:46:53.886485" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:46:53.886285" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:53.886247" elapsed="0.000323"/>
</if>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:46:53.889622" 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-10-11T00:46:53.889089" elapsed="0.000570"/>
</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-10-11T00:46:53.891890" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:46:53.891989" 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-10-11T00:46:53.891513" elapsed="0.000506"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:46:53.892247" elapsed="0.000517"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:46:53.893826" level="INFO">Logging into '10.30.171.7:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:46:54.280219" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Sun Oct 11 00:46:06 UTC 2026

  System load:  0.13               Processes:             111
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.7
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:46:52 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:46:53.893504" elapsed="0.386829"/>
</kw>
<msg time="2026-10-11T00:46:54.280403" 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-10-11T00:46:53.892973" elapsed="0.387520"/>
</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-10-11T00:46:53.890863" elapsed="0.389721"/>
</kw>
<msg time="2026-10-11T00:46:54.280631" 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-10-11T00:46:53.890276" elapsed="0.390401"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-10-11T00:46:53.889880" elapsed="0.390870"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-10-11T00:46:54.280793" elapsed="0.000039"/>
</return>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-10-11T00:46:53.888636" elapsed="0.392290"/>
</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-10-11T00:46:53.443600" elapsed="0.837377"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:46:54.281494" level="INFO">Creating Session using : alias=session, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7434472fa990&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-10-11T00:46:54.281200" elapsed="0.000515"/>
</kw>
<kw name="Deploy_Test_Tool" owner="NexusKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:46:54.286490" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:46:54.286108" elapsed="0.000407"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:46:54.286996" 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-10-11T00:46:54.286678" elapsed="0.000342"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:46:54.287608" 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-10-11T00:46:54.287258" elapsed="0.000375"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:46:54.288654" elapsed="0.000275"/>
</kw>
<kw name="Fetch From Left" owner="String">
<msg time="2026-10-11T00:46:54.289297" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories//autorelease-10272</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-10-11T00:46:54.289072" elapsed="0.000249"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:46:54.289822" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories//autorelease-10272</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-10-11T00:46:54.289491" elapsed="0.000355"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:46:54.296618" elapsed="0.000326"/>
</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-10-11T00:46:54.296281" elapsed="0.000726"/>
</kw>
<msg time="2026-10-11T00:46:54.297048" 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-10-11T00:46:54.293511" elapsed="0.003581"/>
</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-10-11T00:46:54.293193" elapsed="0.003979"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:46:54.303806" elapsed="0.000322"/>
</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-10-11T00:46:54.303484" elapsed="0.000729"/>
</kw>
<msg time="2026-10-11T00:46:54.304253" 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-10-11T00:46:54.300657" elapsed="0.003640"/>
</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-10-11T00:46:54.300363" elapsed="0.004000"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:46:54.312699" elapsed="0.000331"/>
</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-10-11T00:46:54.312314" elapsed="0.000781"/>
</kw>
<msg time="2026-10-11T00:46:54.313136" 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-10-11T00:46:54.307862" elapsed="0.005337"/>
</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-10-11T00:46:54.307582" elapsed="0.005684"/>
</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-10-11T00:46:54.314205" elapsed="0.000215"/>
</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-10-11T00:46:54.314883" elapsed="0.000137"/>
</kw>
<msg time="2026-10-11T00:46:54.315061" 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-10-11T00:46:54.314565" elapsed="0.000540"/>
</kw>
<msg time="2026-10-11T00:46:54.315217" 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-10-11T00:46:54.313960" elapsed="0.001281"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:46:54.315609" level="INFO">index=2
host=10.30.171.7
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-10-11T00:46:54.315703" level="INFO">${current_ssh_connection} = index=2
host=10.30.171.7
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-10-11T00:46:54.315483" elapsed="0.000245"/>
</kw>
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:46:54.317768" 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-10-11T00:46:54.317396" elapsed="0.000396"/>
</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-10-11T00:46:54.319219" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:46:54.319290" 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-10-11T00:46:54.318945" elapsed="0.000367"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:46:54.319478" elapsed="0.000304"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:46:54.320707" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:46:54.753796" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 00:46:16 UTC 2026

  System load:  0.39               Processes:             126
  Usage of /:   13.3% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.173
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:46:53 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:46:54.320327" elapsed="0.433591"/>
</kw>
<msg time="2026-10-11T00:46:54.754001" 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-10-11T00:46:54.319930" elapsed="0.434155"/>
</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-10-11T00:46:54.318590" elapsed="0.435620"/>
</kw>
<msg time="2026-10-11T00:46:54.754263" 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-10-11T00:46:54.318230" elapsed="0.436082"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-10-11T00:46:54.317940" elapsed="0.436449"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-10-11T00:46:54.754457" elapsed="0.000043"/>
</return>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="PASS" start="2026-10-11T00:46:54.317059" elapsed="0.437551"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:46:54.755083" level="INFO">Executing command 'sh search.sh /tmp/karaf-0.23.3/system pcep-impl'.</msg>
<msg time="2026-10-11T00:46:54.819247" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:46:54.819526" level="INFO">${version} = 1.0.3
org/opendaylight/bgpcep</msg>
<msg time="2026-10-11T00:46:54.819620" 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-10-11T00:46:54.754843" elapsed="0.064824"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:46:54.819985" elapsed="0.000547"/>
</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-10-11T00:46:54.822858" elapsed="0.000252"/>
</kw>
<msg time="2026-10-11T00:46:54.823571" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:46:54.821806" elapsed="0.001875"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:46:54.824050" elapsed="0.000058"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:46:54.824499" elapsed="0.000055"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:46:54.821041" elapsed="0.003670"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:46:54.825783" level="INFO">1.0.3
org/opendaylight/bgpcep</msg>
<arg>${version}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:46:54.825189" elapsed="0.000689"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:46:54.826568" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:46:54.826044" elapsed="0.000728"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:54.825994" elapsed="0.000837"/>
</if>
<kw name="Split String" owner="String">
<msg time="2026-10-11T00:46:54.827702" level="INFO">${version} = 1.0.3</msg>
<msg time="2026-10-11T00:46:54.827795" 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-10-11T00:46:54.827137" elapsed="0.000705"/>
</kw>
<return>
<value>${version}</value>
<value>${location}</value>
<status status="PASS" start="2026-10-11T00:46:54.827944" elapsed="0.000061"/>
</return>
<msg time="2026-10-11T00:46:54.828350" level="INFO">${version} = 1.0.3</msg>
<msg time="2026-10-11T00:46:54.828496" 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-10-11T00:46:54.313677" elapsed="0.514883"/>
</kw>
<status status="PASS" start="2026-10-11T00:46:54.313345" elapsed="0.515314"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:46:54.829013" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:46:54.828711" elapsed="0.000420"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:54.313323" elapsed="0.515893"/>
</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-10-11T00:46:54.829839" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:46:54.829372" elapsed="0.000586"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:54.829326" elapsed="0.000680"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:46:54.831118" 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-10-11T00:46:54.830350" elapsed="0.000849"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:46:54.832373" 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-10-11T00:46:54.831588" elapsed="0.000872"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:46:54.833706" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories//autorelease-10272</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-10-11T00:46:54.832807" elapsed="0.000956"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:46:54.834822" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3</msg>
<var>${url}</var>
<arg>${urlbase}/${location}/${artifact}/${version}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:46:54.834082" elapsed="0.000796"/>
</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-10-11T00:46:54.838780" level="INFO">Executing command 'curl -L https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/maven-metadata.xml'.</msg>
<msg time="2026-10-11T00:46:54.943962" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:46:54.944253" level="INFO">${stdout} = &lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-10272 (staging: closed)&amp;quot; [id=autor...</msg>
<msg time="2026-10-11T00:46:54.944361" 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-10-11T00:46:54.944489" 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-10-11T00:46:54.838439" elapsed="0.106099"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:46:54.946356" level="INFO">Length is 316.</msg>
<msg time="2026-10-11T00:46:54.946575" 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  1104    0  1104    0     0  13584      0 --:--:-- --:--:-- --:--:-- 13629' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-10-11T00:46:54.945662" elapsed="0.001101">'  % 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  1104    0  1104    0     0  13584      0 --:--:-- --:--:-- --:--:-- 13629' should be empty.</status>
</kw>
<msg time="2026-10-11T00:46:54.946997" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-10-11T00:46:54.947098" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:46:54.944904" elapsed="0.002280"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:46:54.948486" 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-10-11T00:46:54.947599" elapsed="0.000943"/>
</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-10-11T00:46:54.951124" level="INFO">&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-10272 (staging: closed)&amp;quot; [id=autorelease-10272]&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.3/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-10272 (staging: closed)&amp;quot; [id=autorelease-10272]&lt;/h1&gt;
    &lt;p&gt;Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-10272 (staging: closed)&amp;quot; [id=autorelease-10272]&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-10-11T00:46:54.950097" elapsed="0.001246"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:46:54.952455" 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  1104    0  1104    0     0  13584      0 --:--:-- --:--:-- --:--:-- 13629</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:46:54.951886" elapsed="0.000670"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:46:54.953563" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:46:54.952946" elapsed="0.000708"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T00:46:54.949343" elapsed="0.004423"/>
</kw>
<status status="PASS" start="2026-10-11T00:46:54.948700" elapsed="0.005136"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:54.948657" elapsed="0.005231"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T00:46:54.954267" elapsed="0.000047"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:46:54.954019" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:54.953978" elapsed="0.000491"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:46:54.954736" elapsed="0.000054"/>
</return>
<status status="PASS" start="2026-10-11T00:46:54.954578" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:54.954546" elapsed="0.000359"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:46:54.955243" elapsed="0.000056"/>
</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-10-11T00:46:54.837190" elapsed="0.118355"/>
</kw>
<msg time="2026-10-11T00:46:54.955690" 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-10-11T00:46:54.836028" elapsed="0.119761"/>
</kw>
<msg time="2026-10-11T00:46:54.956080" level="INFO">${metadata} = &lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-10272 (staging: closed)&amp;quot; [id=autor...</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-10-11T00:46:54.835282" elapsed="0.120856"/>
</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-10-11T00:46:54.960695" level="INFO">Executing command 'echo "&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-10272 (staging: closed)&amp;quot; [id=autorelease-10272]&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.3/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-10272 (staging: closed)&amp;quot; [id=autorelease-10272]&lt;/h1&gt;
    &lt;p&gt;Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-10272 (staging: closed)&amp;quot; [id=autorelease-10272]&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-10-11T00:46:54.992848" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:46:54.993093" level="INFO">${stdout} = &lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-10272 (staging: closed)&amp;quot; [id=autor...</msg>
<msg time="2026-10-11T00:46:54.993236" 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-10-11T00:46:54.993348" 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-10-11T00:46:54.960326" elapsed="0.033071"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:46:54.995225" level="INFO">Length is 253.</msg>
<msg time="2026-10-11T00:46:54.995473" 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-10-11T00:46:54.994653" elapsed="0.000984">'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-10-11T00:46:54.995861" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-10-11T00:46:54.995947" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:46:54.993798" elapsed="0.002200"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:46:54.997266" 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-10-11T00:46:54.996392" elapsed="0.000943"/>
</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-10-11T00:46:54.999530" level="INFO">&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-10272 (staging: closed)&amp;quot; [id=autorelease-10272]&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-10-11T00:46:54.998898" elapsed="0.000763"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:46:55.000651" 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-10-11T00:46:55.000065" elapsed="0.000683"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:46:55.001706" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:46:55.001130" elapsed="0.000664"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T00:46:54.998076" elapsed="0.003826"/>
</kw>
<status status="PASS" start="2026-10-11T00:46:54.997535" elapsed="0.004438"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:54.997489" elapsed="0.004535"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T00:46:55.002357" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:46:55.002139" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:55.002104" elapsed="0.000422"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-10-11T00:46:55.002784" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:46:55.002630" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:55.002599" elapsed="0.000310"/>
</if>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-10-11T00:46:55.004000" 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 or task with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-10-11T00:46:55.003234" elapsed="0.000904">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-10-11T00:46:54.959225" elapsed="0.045234">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-10-11T00:46:55.004580" 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-10-11T00:46:54.958098" elapsed="0.046581"/>
</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-10-11T00:46:54.957330" elapsed="0.047553">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-10-11T00:46:55.005101" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T00:46:55.005240" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:46:54.956516" elapsed="0.048783"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:46:55.006342" level="INFO">Length is 288.</msg>
<msg time="2026-10-11T00:46:55.006534" 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-10-11T00:46:55.005738" elapsed="0.000847"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:46:55.007824" level="INFO">${namepart} = 1.0.3</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-10-11T00:46:55.006930" elapsed="0.000949"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:46:55.008956" level="INFO">${filename} = pcep-pcc-mock-1.0.3-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 variable.</doc>
<status status="PASS" start="2026-10-11T00:46:55.008239" elapsed="0.000772"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:46:55.009986" level="INFO">pcep-pcc-mock-1.0.3-executable.jar</msg>
<arg>${filename}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:46:55.009499" elapsed="0.000580"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:46:55.011093" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</msg>
<var>${url}</var>
<arg>${url}/${filename}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:46:55.010472" elapsed="0.000706"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:46:55.012024" level="INFO">Executing command 'wget -q -N 'https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar' 2&gt;&amp;1'.</msg>
<msg time="2026-10-11T00:46:55.065861" level="INFO">Command exited with return code 8.</msg>
<msg time="2026-10-11T00:46:55.066115" level="INFO">${response} = </msg>
<msg time="2026-10-11T00:46:55.066235" 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-10-11T00:46:55.011706" elapsed="0.054580"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:46:55.067356" level="INFO"/>
<arg>${response}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:46:55.066776" elapsed="0.000729"/>
</kw>
<if>
<branch type="IF" condition="${result} == 0">
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-10-11T00:46:55.067932" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:46:55.067690" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:55.067634" elapsed="0.000443"/>
</if>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:46:55.068975" level="INFO">${release_url} = https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-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-10-11T00:46:55.068542" elapsed="0.000490"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:46:55.069841" level="INFO">Executing command 'wget -q -N 'https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar' 2&gt;&amp;1'.</msg>
<msg time="2026-10-11T00:46:55.136999" level="INFO">Command exited with return code 8.</msg>
<msg time="2026-10-11T00:46:55.137249" level="INFO">${response} = </msg>
<msg time="2026-10-11T00:46:55.137340" level="INFO">${result} = 8</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-10-11T00:46:55.069524" elapsed="0.067863"/>
</kw>
<if>
<branch type="IF" condition="${result} != 0">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-10-11T00:46:55.138824" level="FAIL">Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</msg>
<arg>Artifact "${artifact}" in component "${component}" could not be downloaded from ${release_url} nor ${url}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-10-11T00:46:55.138031" elapsed="0.000927">Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</kw>
<status status="FAIL" start="2026-10-11T00:46:55.137602" elapsed="0.001493">Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</branch>
<status status="FAIL" start="2026-10-11T00:46:55.137555" elapsed="0.001646">Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</if>
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-10-11T00:46:55.139327" elapsed="0.000043"/>
</return>
<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-10272/org/opendaylight/integration/karaf/0.23.3/karaf-0.23.3.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="FAIL" start="2026-10-11T00:46:54.288142" elapsed="0.851491">Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</kw>
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-10-11T00:46:55.139911" elapsed="0.000037"/>
</return>
<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="FAIL" start="2026-10-11T00:46:54.285691" elapsed="0.854425">Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${filename}</arg>
<arg>${name}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-11T00:46:55.140610" elapsed="0.000048"/>
</kw>
<kw name="Setup_Pcep_Operations" owner="PcepOperations">
<doc>Creates Requests session to be used by subsequent keywords.</doc>
<status status="NOT RUN" start="2026-10-11T00:46:55.141027" elapsed="0.000049"/>
</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="FAIL" start="2026-10-11T00:46:53.443041" elapsed="1.698230">Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</kw>
<test id="s1-s2-t1" name="Topology_Precondition" line="33">
<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="FAIL" start="2026-10-11T00:46:55.141473" elapsed="0.001269">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s2-t2" name="Start_Pcc_Mock" line="39">
<doc>Execute pcc-mock on Mininet, fail is Open is not sent, keep it running for next tests.</doc>
<status status="FAIL" start="2026-10-11T00:46:55.143142" elapsed="0.000928">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s2-t3" name="Configure_Speaker_Entity_Identifier" line="49">
<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-10-11T00:46:55.144496" elapsed="0.001455">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s2-t4" name="Topology_Default" line="58">
<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-10-11T00:46:55.146667" elapsed="0.001414">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s2-t5" name="Update_Delegated" line="64">
<doc>Perform update-lsp on the mocked tunnel, check response is success.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-10-11T00:46:55.148757" elapsed="0.000903">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s2-t6" name="Topology_Updated" line="69">
<doc>Compare pcep-topology to default_json, which includes the updated tunnel.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-10-11T00:46:55.150241" elapsed="0.000954">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s2-t7" name="Refuse_Remove_Delegated" line="74">
<doc>Perform remove-lsp on the mocked tunnel, check that mock-pcc has refused to remove it.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-10-11T00:46:55.151965" elapsed="0.001219">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s2-t8" name="Topology_Still_Updated" line="80">
<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-10-11T00:46:55.153882" elapsed="0.001123">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s2-t9" name="Add_Instantiated" line="85">
<doc>Perform add-lsp to create new tunnel, check that response is success.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-10-11T00:46:55.155746" elapsed="0.000850">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s2-t10" name="Topology_Second_Default" line="90">
<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-10-11T00:46:55.156955" elapsed="0.001129">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s2-t11" name="Update_Instantiated" line="95">
<doc>Perform update-lsp on the newly instantiated tunnel, check that response is success.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-10-11T00:46:55.158775" elapsed="0.000988">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s2-t12" name="Topology_Second_Updated" line="100">
<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-10-11T00:46:55.160357" elapsed="0.001097">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s2-t13" name="Remove_Instantiated" line="105">
<doc>Perform remove-lsp on the instantiated tunnel, check that response is success.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-10-11T00:46:55.162003" elapsed="0.000955">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s2-t14" name="Topology_Again_Updated" line="110">
<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-10-11T00:46:55.163645" elapsed="0.001121">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s2-t15" name="Stop_Pcc_Mock" line="115">
<doc>Send ctrl+c to pcc-mock, fails if no prompt is seen
after 3 seconds (the default for SSHLibrary)</doc>
<status status="FAIL" start="2026-10-11T00:46:55.165374" elapsed="0.000994">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s2-t16" name="Topology_Postcondition" line="122">
<doc>Compare curent pcep-topology to "off_json" again.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-10-11T00:46:55.166782" elapsed="0.000848">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<kw name="Tear_It_Down" type="TEARDOWN">
<kw name="Get File" owner="SSHLibrary">
<msg time="2026-10-11T00:46:55.189263" level="INFO">[chan 5] Opened sftp connection (server version 3)</msg>
<msg time="2026-10-11T00:46:55.198966" level="FAIL">There were no source files matching 'pccmock.log'.</msg>
<arg>pccmock.log</arg>
<doc>Downloads file(s) from the remote machine to the local machine.</doc>
<status status="FAIL" start="2026-10-11T00:46:55.169386" elapsed="0.030664">There were no source files matching 'pccmock.log'.</status>
</kw>
<kw name="Run" owner="OperatingSystem">
<msg time="2026-10-11T00:46:55.200772" level="INFO">Running command 'cat pccmock.log'.</msg>
<msg time="2026-10-11T00:46:55.206642" level="INFO">${pccmocklog} = cat: pccmock.log: No such file or directory</msg>
<var>${pccmocklog}</var>
<arg>cat pccmock.log</arg>
<doc>*This keyword is considered deprecated. Use the [Process] library instead.*</doc>
<status status="PASS" start="2026-10-11T00:46:55.200555" elapsed="0.006148"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:46:55.207838" level="INFO">cat: pccmock.log: No such file or directory</msg>
<arg>${pccmocklog}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:46:55.207123" elapsed="0.000810"/>
</kw>
<kw name="Teardown_Pcep_Operations" owner="PcepOperations">
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-10-11T00:46:55.208992" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects </doc>
<status status="PASS" start="2026-10-11T00:46:55.208838" elapsed="0.000715"/>
</kw>
<doc>Teardown to pair with Setup (otherwise no-op).</doc>
<status status="PASS" start="2026-10-11T00:46:55.208376" elapsed="0.001339"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-10-11T00:46:55.210247" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects </doc>
<status status="PASS" start="2026-10-11T00:46:55.210048" elapsed="0.000301"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-10-11T00:46:55.210716" elapsed="0.000577"/>
</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="FAIL" start="2026-10-11T00:46:55.168758" elapsed="0.042795">There were no source files matching 'pccmock.log'.</status>
</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-10-11T00:46:53.400857" elapsed="1.810864">Suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar

Also suite teardown failed:
There were no source files matching 'pccmock.log'.</status>
</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-10-11T00:46:55.404340" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:46:55.402722" elapsed="0.001675"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-10-11T00:46:55.402474" elapsed="0.002012"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T00:46:55.406990" 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-10-11T00:46:55.405702" elapsed="0.001315"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-10-11T00:46:55.407214" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:46:55.407102" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:55.407075" elapsed="0.000208"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:46:55.407806" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:46:55.407475" elapsed="0.000371"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T00:46:55.408299" 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-10-11T00:46:55.408008" elapsed="0.000315"/>
</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-10-11T00:46:55.408851" elapsed="0.000257"/>
</kw>
<msg time="2026-10-11T00:46:55.409207" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:46:55.409250" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:46:55.408503" elapsed="0.000769"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:46:55.409786" 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-10-11T00:46:55.409464" elapsed="0.000346"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:46:55.410774" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:46:55.410523" elapsed="0.000276"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:46:55.411203" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:46:55.410944" elapsed="0.000285"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:46:55.411693" 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-10-11T00:46:55.411402" elapsed="0.000316"/>
</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-10-11T00:46:55.412693" elapsed="0.000188"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:46:55.413489" level="INFO">${member_ip} = 10.30.170.173</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:46:55.413041" elapsed="0.000473"/>
</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-10-11T00:46:55.413683" elapsed="0.000244"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:46:55.414666" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:46:55.414385" elapsed="0.000306"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-11T00:46:55.414732" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:46:55.414869" 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-10-11T00:46:55.414102" elapsed="0.000790"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:46:55.415466" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x743447258410&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-10-11T00:46:55.415067" elapsed="0.000550"/>
</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-10-11T00:46:55.415782" elapsed="0.000152"/>
</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-10-11T00:46:55.412228" elapsed="0.003760"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:46:55.411993" elapsed="0.004072"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-10-11T00:46:55.411782" elapsed="0.004318"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:46:55.416680" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:46:55.416303" elapsed="0.000416"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:46:55.417273" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.173'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:46:55.416904" elapsed="0.000409"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:46:55.417855" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:46:55.417512" elapsed="0.000382"/>
</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-10-11T00:46:55.410119" elapsed="0.007828"/>
</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-10-11T00:46:55.405377" elapsed="0.012625"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:46:55.418165" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:46:55.418061" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:55.418043" elapsed="0.000184"/>
</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-10-11T00:46:55.419429" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:46:55.419075" elapsed="0.000380"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:46:55.419872" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:46:55.419610" elapsed="0.000285"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:46:55.419935" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:46:55.420060" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:46:55.418779" elapsed="0.001304"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:46:55.420951" level="INFO">${member_ip} = 10.30.170.173</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-10-11T00:46:55.420744" elapsed="0.000231"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:46:55.421734" 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-10-11T00:46:55.421828" 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-10-11T00:46:55.421557" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:46:55.424940" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:46:55.424338" elapsed="0.000684"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:55.424319" elapsed="0.000738"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:46:55.425770" 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-10-11T00:46:55.425999" 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-10-11T00:46:55.425317" elapsed="0.000731"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:46:55.426942" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.173" 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-10-11T00:46:55.426363" elapsed="0.000699"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:46:55.428225" 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-10-11T00:46:55.427369" elapsed="0.000906"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:46:55.429917" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:46:55.430117" 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-10-11T00:46:55.429592" elapsed="0.000581"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:46:55.430517" elapsed="0.000414"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:46:55.432003" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:46:55.814816" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 00:46:16 UTC 2026

  System load:  0.39               Processes:             126
  Usage of /:   13.3% of 77.35GB   Users logged in:       0
  Memory usage: 2%                 IPv4 address for ens3: 10.30.170.173
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:46:54 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:46:55.431764" elapsed="0.383140"/>
</kw>
<msg time="2026-10-11T00:46:55.814969" 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-10-11T00:46:55.431294" elapsed="0.383794"/>
</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-10-11T00:46:55.428712" elapsed="0.386583"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:46:55.816129" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-10-11T00:46:55.829427" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-10-11T00:46:55.829600" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T00:46:55.829698" 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-10-11T00:46:55.815719" elapsed="0.014026"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:46:55.830103" elapsed="0.000798"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:46:55.832778" 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-10-11T00:46:55.831954" elapsed="0.000990"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T00:46:55.833574" elapsed="0.000096"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:46:55.833184" elapsed="0.000600"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:55.833130" elapsed="0.000701"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:46:55.834226" elapsed="0.000109"/>
</return>
<status status="PASS" start="2026-10-11T00:46:55.833935" elapsed="0.000627"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:55.833913" elapsed="0.000702"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T00:46:55.834692" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:46:55.836621" elapsed="0.000906"/>
</kw>
<kw name="Open 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-10-11T00:46:55.837958" elapsed="0.000413"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:46:55.838783" elapsed="0.000330"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:46:55.835501" elapsed="0.003760"/>
</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-10-11T00:46:55.423662" elapsed="0.415859"/>
</kw>
<msg time="2026-10-11T00:46:55.839610" 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-10-11T00:46:55.422894" elapsed="0.416797"/>
</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-10-11T00:46:55.422506" elapsed="0.417287"/>
</kw>
<msg time="2026-10-11T00:46:55.839844" 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-10-11T00:46:55.422004" elapsed="0.417900"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:46:55.840877" elapsed="0.000634"/>
</kw>
<kw name="Open 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-10-11T00:46:55.841774" elapsed="0.000190"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:46:55.842183" elapsed="0.000126"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:46:55.840378" elapsed="0.001996"/>
</kw>
<msg time="2026-10-11T00:46:55.842541" 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-10-11T00:46:55.421185" elapsed="0.421389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:46:55.843210" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:46:55.842872" elapsed="0.000406"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-11T00:46:55.843345" elapsed="0.000049"/>
</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-10-11T00:46:55.420431" elapsed="0.423116"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:46:55.420256" elapsed="0.423338"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:46:55.420132" elapsed="0.423508"/>
</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-10-11T00:46:55.418440" elapsed="0.425271"/>
</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-10-11T00:46:55.843928" elapsed="0.000348"/>
</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-10-11T00:46:55.852087" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:46:55.851966" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:55.851940" elapsed="0.000254"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:46:55.852671" 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-10-11T00:46:55.852801" 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-10-11T00:46:55.852500" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:46:55.853454" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:46:55.853102" elapsed="0.000410"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:46:55.854111" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:46:55.853779" elapsed="0.000423"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:46:55.855257" 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-10-11T00:46:55.854941" elapsed="0.000512">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-10-11T00:46:55.855591" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T00:46:55.855648" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:46:55.854448" elapsed="0.001229"/>
</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-10-11T00:46:55.856098" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:46:55.855770" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:55.855746" elapsed="0.000537"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:46:55.857278" level="INFO">${ip_address} = 10.30.170.173</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-10-11T00:46:55.856906" elapsed="0.000403"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-10-11T00:46:55.857362" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T00:46:55.857504" level="INFO">${odl_ip} = 10.30.170.173</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-10-11T00:46:55.856561" elapsed="0.000966"/>
</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-10-11T00:46:55.857706" elapsed="0.000319"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:46:55.858358" level="INFO">index=4
host=10.30.170.173
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-10-11T00:46:55.858463" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.173
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-10-11T00:46:55.858256" 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-10-11T00:46:55.858687" elapsed="0.000236"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-10-11T00:46:55.859325" level="INFO">Logging into '10.30.170.173:8101' as 'karaf'.</msg>
<msg time="2026-10-11T00:46:56.794601" 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-10-11T00:46:55.859111" elapsed="0.935595"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:46:56.796065" elapsed="0.000295"/>
</kw>
<kw name="Open 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-10-11T00:46:56.796569" elapsed="0.000146"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:46:56.796860" elapsed="0.000094"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:46:56.795696" elapsed="0.001306"/>
</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-10-11T00:46:56.795059" elapsed="0.001985"/>
</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-10-11T00:46:55.851643" elapsed="0.945452"/>
</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-10-11T00:46:55.845279" elapsed="0.951862"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:46:55.844735" elapsed="0.952470"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:46:55.844536" elapsed="0.952705"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-10-11T00:46:55.844348" elapsed="0.952928"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-10-11T00:46:55.404832" elapsed="1.392503"/>
</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-10-11T00:46:56.798213" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:46:56.798099" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:56.798077" 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-10-11T00:46:56.800250" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:46:56.800146" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:56.800129" elapsed="0.000184"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:46:56.801191" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:46:56.800844" elapsed="0.000374"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:46:56.801655" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:46:56.801373" elapsed="0.000307"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:46:56.801720" elapsed="0.000032"/>
</return>
<msg time="2026-10-11T00:46:56.801853" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:46:56.800537" elapsed="0.001340"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:46:56.804568" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:46:56.804481" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:56.804463" elapsed="0.000169"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:46:56.805735" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:46:56.805609" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:56.805591" elapsed="0.000211"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:46:56.806271" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:46:56.805959" elapsed="0.000337"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:46:56.806690" 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-10-11T00:46:56.806491" elapsed="0.000224"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:46:56.881882" 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-10-11T00:46:56.807507" elapsed="0.074510"/>
</kw>
<msg time="2026-10-11T00:46:56.882170" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:46:56.882216" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:46:56.806874" elapsed="0.075379"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:46:57.021364" 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-10-11T00:46:56.882985" elapsed="0.138542"/>
</kw>
<msg time="2026-10-11T00:46:57.021660" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:46:57.021702" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:46:56.882453" elapsed="0.139285"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:46:57.022033" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:46:57.021811" elapsed="0.000378"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:57.021792" elapsed="0.000424"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:46:57.022795" 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-10-11T00:46:57.022426" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:46:57.023144" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:46:57.022939" elapsed="0.000360"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:57.022922" elapsed="0.000402"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:46:57.023357" 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">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:46:57.025241" elapsed="0.000428"/>
</kw>
<kw name="Open 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-10-11T00:46:57.026030" elapsed="0.000319"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:46:57.026702" elapsed="0.000220"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:46:57.024516" 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-10-11T00:46:57.023666" elapsed="0.003467"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:46:56.805381" elapsed="0.221849"/>
</kw>
<msg time="2026-10-11T00:46:57.027315" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:46:57.027356" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:46:56.804784" elapsed="0.222609"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:46:57.027790" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:46:57.027703" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:57.027684" elapsed="0.000186"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:46:57.028217" 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-10-11T00:46:57.028588" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:46:57.028654" 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-10-11T00:46:56.804225" elapsed="0.224517"/>
</kw>
<msg time="2026-10-11T00:46:57.028828" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:46:57.028869" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:46:56.802249" elapsed="0.226656"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:46:57.029210" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:46:57.028973" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:57.028957" elapsed="0.000326"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:46:56.802087" elapsed="0.227218"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:46:56.801933" elapsed="0.227405"/>
</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-10-11T00:46:56.799915" elapsed="0.229473"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-10-11T00:46:56.797914" elapsed="0.231542"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:46:56.797506" elapsed="0.231989"/>
</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-10-11T00:46:55.402163" elapsed="1.627381"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:46:57.030015" 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-10-11T00:46:57.029723" elapsed="0.000317"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:46:57.030575" level="INFO">${tools_system_conn_id} = 7</msg>
<arg>${tools_system_conn_id}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:46:57.030247" elapsed="0.000367"/>
</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-10-11T00:46:57.032632" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:46:57.032706" 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-10-11T00:46:57.032175" elapsed="0.000554"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:46:57.032884" elapsed="0.000303"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:46:57.033975" level="INFO">Logging into '10.30.171.7:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:46:57.388297" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Sun Oct 11 00:46:06 UTC 2026

  System load:  0.13               Processes:             111
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.7
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:46:54 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:46:57.033743" elapsed="0.354640"/>
</kw>
<msg time="2026-10-11T00:46:57.388459" 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-10-11T00:46:57.033356" elapsed="0.355160"/>
</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-10-11T00:46:57.031784" elapsed="0.356812"/>
</kw>
<msg time="2026-10-11T00:46:57.388642" 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-10-11T00:46:57.031133" elapsed="0.357550"/>
</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-10-11T00:46:57.030810" elapsed="0.357941"/>
</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-10-11T00:46:57.391844" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:46:57.391554" 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-10-11T00:46:57.393271" level="INFO">Executing command 'cd '.' &amp;&amp; virtualenv /tmp/defaultvenv'.</msg>
<msg time="2026-10-11T00:46:57.821680" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:46:57.821911" level="INFO">${stdout} = created virtual environment CPython3.10.12.final.0-64 in 256ms
  creator CPython3Posix(dest=/tmp/defaultvenv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=b...</msg>
<msg time="2026-10-11T00:46:57.821993" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T00:46:57.822063" 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-10-11T00:46:57.393104" elapsed="0.428999"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:46:57.823206" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T00:46:57.822723" elapsed="0.000528"/>
</kw>
<msg time="2026-10-11T00:46:57.823341" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T00:46:57.823382" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:46:57.822331" elapsed="0.001073"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:46:57.823987" 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-10-11T00:46:57.823608" elapsed="0.000403"/>
</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-10-11T00:46:57.824984" level="INFO">created virtual environment CPython3.10.12.final.0-64 in 256ms
  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-10-11T00:46:57.824760" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:46:57.825465" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:46:57.825237" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:46:57.825908" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:46:57.825692" elapsed="0.000256"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T00:46:57.824391" elapsed="0.001608"/>
</kw>
<status status="PASS" start="2026-10-11T00:46:57.824093" elapsed="0.001938"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:57.824070" elapsed="0.001987"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T00:46:57.826202" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:46:57.826109" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:57.826093" elapsed="0.000173"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:46:57.826383" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-10-11T00:46:57.826314" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-11T00:46:57.826299" elapsed="0.000180"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:46:57.826630" elapsed="0.000020"/>
</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-10-11T00:46:57.392615" elapsed="0.434110"/>
</kw>
<msg time="2026-10-11T00:46:57.826777" 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-10-11T00:46:57.392086" elapsed="0.434736"/>
</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-10-11T00:46:57.391032" elapsed="0.435889"/>
</kw>
<msg time="2026-10-11T00:46:57.826971" 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-10-11T00:46:57.389612" elapsed="0.437399"/>
</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-10-11T00:46:57.389272" elapsed="0.437834"/>
</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-10-11T00:46:57.831059" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:46:57.830732" elapsed="0.000354"/>
</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-10-11T00:46:57.832670" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate'.</msg>
<msg time="2026-10-11T00:47:00.118605" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:47:00.119097" level="INFO">${stdout} = Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Downloading pip-26.2.1-py3-none-any.whl (1.8 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━...</msg>
<msg time="2026-10-11T00:47:00.119296" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T00:47:00.119490" 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-10-11T00:46:57.832355" elapsed="2.287222"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:47:00.125135" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T00:47:00.124037" elapsed="0.001435"/>
</kw>
<msg time="2026-10-11T00:47:00.125792" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T00:47:00.125939" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:00.120379" elapsed="0.005637"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:00.129307" 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-10-11T00:47:00.126862" elapsed="0.002533"/>
</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-10-11T00:47:00.134931" level="INFO">Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Downloading pip-26.2.1-py3-none-any.whl (1.8 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.8/1.8 MB 11.0 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.2.1</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:00.133594" elapsed="0.001570"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:00.137300" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:00.136489" elapsed="0.001061"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:00.139374" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:00.138559" elapsed="0.001084"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T00:47:00.131344" elapsed="0.008493"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:00.129809" elapsed="0.010244"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:00.129751" elapsed="0.010367"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T00:47:00.140601" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:00.140287" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:00.140245" elapsed="0.000660"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:47:00.141266" elapsed="0.000079"/>
</return>
<status status="PASS" start="2026-10-11T00:47:00.141016" elapsed="0.000625"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:00.140983" elapsed="0.000715"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:00.142041" 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-10-11T00:46:57.831853" elapsed="2.310683"/>
</kw>
<msg time="2026-10-11T00:47:00.142658" 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-10-11T00:46:57.831261" elapsed="2.311506"/>
</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-10-11T00:46:57.830238" elapsed="2.312685"/>
</kw>
<msg time="2026-10-11T00:47:00.143027" 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-10-11T00:46:57.828804" elapsed="2.314312"/>
</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-10-11T00:46:57.828352" elapsed="2.314936"/>
</kw>
<msg time="2026-10-11T00:47:00.143543" 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-10-11T00:46:57.827982" elapsed="2.315655"/>
</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-10-11T00:46:57.827674" elapsed="2.316113"/>
</kw>
<msg time="2026-10-11T00:47:00.143871" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:46:57.827266" elapsed="2.316690"/>
</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-10-11T00:46:57.388974" elapsed="2.755130"/>
</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-10-11T00:47:00.154111" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:00.153468" elapsed="0.000724"/>
</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-10-11T00:47:00.158612" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate'.</msg>
<msg time="2026-10-11T00:47:01.377951" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:47:01.378619" 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-10-11T00:47:01.378728" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T00:47:01.378817" 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-10-11T00:47:00.157679" elapsed="1.221188"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:47:01.384628" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T00:47:01.383192" elapsed="0.001685"/>
</kw>
<msg time="2026-10-11T00:47:01.385212" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T00:47:01.385329" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:01.379734" elapsed="0.005656"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:01.388374" 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-10-11T00:47:01.386012" elapsed="0.002485"/>
</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-10-11T00:47:01.393341" 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 7.7 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-10-11T00:47:01.392604" elapsed="0.000975"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:01.395274" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:01.394583" elapsed="0.000940"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:01.401297" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:01.396518" elapsed="0.005009"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T00:47:01.390268" elapsed="0.011433"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:01.388804" elapsed="0.013099"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:01.388744" elapsed="0.013221"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T00:47:01.402342" elapsed="0.000047"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:01.402087" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:01.402050" elapsed="0.000629"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:47:01.402957" elapsed="0.000066"/>
</return>
<status status="PASS" start="2026-10-11T00:47:01.402790" elapsed="0.000451"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:01.402758" elapsed="0.000556"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:01.403728" elapsed="0.000049"/>
</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-10-11T00:47:00.156151" elapsed="1.247848"/>
</kw>
<msg time="2026-10-11T00:47:01.404228" 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-10-11T00:47:00.154579" elapsed="1.249770"/>
</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-10-11T00:47:00.152107" elapsed="1.252476"/>
</kw>
<msg time="2026-10-11T00:47:01.404695" 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-10-11T00:47:00.148866" elapsed="1.255920"/>
</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-10-11T00:47:00.147767" elapsed="1.257196"/>
</kw>
<msg time="2026-10-11T00:47:01.405062" 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-10-11T00:47:00.146806" elapsed="1.258342"/>
</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-10-11T00:47:00.146014" elapsed="1.259382"/>
</kw>
<msg time="2026-10-11T00:47:01.405557" 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-10-11T00:47:00.145160" elapsed="1.260489"/>
</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-10-11T00:47:00.144619" elapsed="1.261192"/>
</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-10-11T00:47:01.416030" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:01.415311" elapsed="0.000778"/>
</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-10-11T00:47:01.419961" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==3.4.17; deactivate'.</msg>
<msg time="2026-10-11T00:47:03.778106" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:47:03.778661" 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-10-11T00:47:03.778774" 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-10-11T00:47:03.778875" 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-10-11T00:47:01.419161" elapsed="2.359765"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:47:03.784096" level="INFO">Length is 1862.</msg>
<msg time="2026-10-11T00:47:03.785279" 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-bz3d5lhb/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-bz3d5lhb/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-bz3d5lhb/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-bz3d5lhb/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())  # noqa: S102 # exec is intentional here
        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-10-11T00:47:03.782814" elapsed="0.003202">'  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-bz3d5lhb/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-bz3d5lhb/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-bz3d5lhb/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-bz3d5lhb/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())  # noqa: S102 # exec is intentional here
        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-10-11T00:47:03.786537" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-10-11T00:47:03.786641" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:03.779659" elapsed="0.007038"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:03.789325" 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-10-11T00:47:03.787245" elapsed="0.002137"/>
</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-10-11T00:47:03.794366" 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-10-11T00:47:03.793112" elapsed="0.001501"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:03.796218" 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-bz3d5lhb/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-bz3d5lhb/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-bz3d5lhb/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-bz3d5lhb/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())  # noqa: S102 # exec is intentional here
        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-10-11T00:47:03.795520" elapsed="0.001006"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:03.798064" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:03.797344" elapsed="0.000879"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T00:47:03.791033" elapsed="0.007343"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:03.789716" elapsed="0.008906"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:03.789661" elapsed="0.009026"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T00:47:03.798994" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:03.798809" elapsed="0.000413"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:03.798773" elapsed="0.000503"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:47:03.799594" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-10-11T00:47:03.799387" elapsed="0.000442"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:03.799354" elapsed="0.000531"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:03.800251" 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-10-11T00:47:01.417953" elapsed="2.382604"/>
</kw>
<msg time="2026-10-11T00:47:03.800671" 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-10-11T00:47:01.416554" elapsed="2.384218"/>
</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-10-11T00:47:01.414068" elapsed="2.386884"/>
</kw>
<msg time="2026-10-11T00:47:03.801057" 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-10-11T00:47:01.410678" elapsed="2.390470"/>
</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-10-11T00:47:01.409592" elapsed="2.391754"/>
</kw>
<msg time="2026-10-11T00:47:03.801591" 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-10-11T00:47:01.408654" elapsed="2.393034"/>
</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-10-11T00:47:01.407793" elapsed="2.394067"/>
</kw>
<msg time="2026-10-11T00:47:03.801943" 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-10-11T00:47:01.406893" elapsed="2.395136"/>
</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-10-11T00:47:01.406250" elapsed="2.395956"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:47:03.803102" level="INFO">Creating Session using : alias=session, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x743445995c10&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-10-11T00:47:03.802629" elapsed="0.000903"/>
</kw>
<kw name="Upload_Config_Files">
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T00:47:03.829690" level="INFO">[chan 5] Opened sftp connection (server version 3)</msg>
<msg time="2026-10-11T00:47:03.842060" 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-10-11T00:47:03.804604" elapsed="0.037602"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-10-11T00:47:03.853999" level="INFO">1 file:
exa-md5.cfg</msg>
<msg time="2026-10-11T00:47:03.854244" 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-10-11T00:47:03.842581" elapsed="0.011716"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:47:03.855521" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' exa-md5.cfg'.</msg>
<msg time="2026-10-11T00:47:03.868633" 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-10-11T00:47:03.855208" elapsed="0.013544"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:47:03.869524" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' exa-md5.cfg'.</msg>
<msg time="2026-10-11T00:47:03.924209" 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-10-11T00:47:03.869177" elapsed="0.055151"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:47:03.925039" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exa-md5.cfg'.</msg>
<msg time="2026-10-11T00:47:03.976327" 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-10-11T00:47:03.924793" elapsed="0.051686"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:47:03.977153" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exa-md5.cfg'.</msg>
<msg time="2026-10-11T00:47:04.028713" 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-10-11T00:47:03.976910" elapsed="0.051921"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:47:04.029605" level="INFO">Executing command 'sed -i -e 's/PASSWORD/topsecret/g' exa-md5.cfg'.</msg>
<msg time="2026-10-11T00:47:04.080621" 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-10-11T00:47:04.029279" elapsed="0.051459"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:47:04.081476" level="INFO">Executing command 'cat exa-md5.cfg'.</msg>
<msg time="2026-10-11T00:47:04.132795" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:47:04.133005" level="INFO">${stdout} = neighbor 10.30.170.173 {
  router-id 10.30.171.7;
  local-address 10.30.171.7;
  local-as 64496;
  peer-as 64496;
  md5-password topsecret;

  capability {
    route-refresh disable;
    add-path disa...</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-10-11T00:47:04.081165" elapsed="0.051897"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:04.134169" level="INFO">neighbor 10.30.170.173 {
  router-id 10.30.171.7;
  local-address 10.30.171.7;
  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-10-11T00:47:04.133629" elapsed="0.000667"/>
</kw>
<var name="${cfgfile}">exa-md5.cfg</var>
<status status="PASS" start="2026-10-11T00:47:03.854794" elapsed="0.279574"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-10-11T00:47:03.854458" elapsed="0.280008"/>
</for>
<doc>Uploads exabgp config files</doc>
<status status="PASS" start="2026-10-11T00:47:03.803975" elapsed="0.330608"/>
</kw>
<doc>Suite setup keyword.</doc>
<status status="PASS" start="2026-10-11T00:46:55.401817" elapsed="8.732867"/>
</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-10-11T00:47:04.137889" level="INFO">&amp;{mapping} = { BGP_RIB_OPENCONFIG=example-bgp-rib | IP=10.30.171.7 | 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-10-11T00:47:04.136676" elapsed="0.001277"/>
</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-10-11T00:47:04.162958" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:04.162018" elapsed="0.001026"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:04.165076" 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-10-11T00:47:04.164528" elapsed="0.000771">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-10-11T00:47:04.165546" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:04.163544" elapsed="0.002058"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:04.166789" 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-10-11T00:47:04.166000" elapsed="0.000848"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:04.167750" 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-10-11T00:47:04.168056" 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-10-11T00:47:04.167480" elapsed="0.000633"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:04.169124" 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-10-11T00:47:04.168616" elapsed="0.000706"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:04.171551" level="INFO">mapping: {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.171.7', '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-10-11T00:47:04.170949" elapsed="0.000698"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:04.172681" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:47:04.172044" elapsed="0.000691"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:04.174151" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:04.173536" elapsed="0.000695"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:04.176346" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:04.175385" elapsed="0.000997"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:04.176477" elapsed="0.000048"/>
</return>
<msg time="2026-10-11T00:47:04.176670" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:04.174654" elapsed="0.002048"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:04.176937" elapsed="0.000279"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:47:04.173178" elapsed="0.004092"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:04.178006" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:04.177624" elapsed="0.000416"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:04.179278" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:04.178764" elapsed="0.000553"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:04.179378" elapsed="0.000079"/>
</return>
<msg time="2026-10-11T00:47:04.179595" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:04.178303" elapsed="0.001325"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:04.179854" elapsed="0.000234"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:47:04.177436" elapsed="0.002703"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:04.181118" 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-10-11T00:47:04.180735" elapsed="0.000417"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:04.182465" 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-10-11T00:47:04.181864" elapsed="0.000638"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:04.182566" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:47:04.182742" 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-10-11T00:47:04.181430" elapsed="0.001343"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:04.183000" elapsed="0.000249"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:47:04.180298" elapsed="0.003003"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:04.184022" 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-10-11T00:47:04.183646" elapsed="0.000410"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:04.185274" 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-10-11T00:47:04.184768" elapsed="0.000545"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:04.185375" elapsed="0.000078"/>
</return>
<msg time="2026-10-11T00:47:04.185593" 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-10-11T00:47:04.184310" elapsed="0.001315"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:04.185851" elapsed="0.000229"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:47:04.183464" elapsed="0.002667"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:04.186861" 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-10-11T00:47:04.186487" elapsed="0.000407"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:04.188092" 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-10-11T00:47:04.187603" elapsed="0.000524"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:04.188213" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:47:04.188390" 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-10-11T00:47:04.187131" 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-10-11T00:47:04.188689" elapsed="0.000231"/>
</kw>
<var name="${key}">PASSWORD</var>
<var name="${value}">topsecret</var>
<status status="PASS" start="2026-10-11T00:47:04.186285" elapsed="0.002685"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:04.189706" 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-10-11T00:47:04.189306" elapsed="0.000434"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:04.190938" 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-10-11T00:47:04.190446" elapsed="0.000526"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:04.191034" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:47:04.191219" 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-10-11T00:47:04.189977" elapsed="0.001275"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:04.191520" elapsed="0.000231"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:47:04.189108" elapsed="0.002694"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:47:04.172841" elapsed="0.019005"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:47:04.191901" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T00:47:04.192079" level="INFO">${mapping_to_use} = {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.171.7', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSWORD': 'topsecret', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:47:04.170113" elapsed="0.022000"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:04.169514" elapsed="0.022639"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:04.192432" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:04.192204" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:04.169466" elapsed="0.023068"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:04.203030" 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-10-11T00:47:04.192759" elapsed="0.010299"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:04.203105" 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-10-11T00:47:04.160749" elapsed="0.042472"/>
</kw>
<msg time="2026-10-11T00:47:04.203311" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:04.150245" elapsed="0.053114"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:04.207425" 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/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-10-11T00:47:04.211491" 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/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-10-11T00:47:04.215492" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:04.215674" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:04.215853" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:04.216212" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:04.216053" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:04.216039" 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-10-11T00:47:04.216460" 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-10-11T00:47:04.216642" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:04.216805" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:04.216012" elapsed="0.000840"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:04.215921" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:04.217026" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:04.217092" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:47:04.217215" 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-10-11T00:47:04.148821" elapsed="0.068420"/>
</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-10-11T00:47:04.226126" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:04.225824" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:04.226840" 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-10-11T00:47:04.226658" elapsed="0.000279">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-10-11T00:47:04.227025" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:04.226325" elapsed="0.000722"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:04.227556" 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-10-11T00:47:04.227230" elapsed="0.000351"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:04.227856" 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-10-11T00:47:04.228026" 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-10-11T00:47:04.227746" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:04.228497" 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-10-11T00:47:04.228262" 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-10-11T00:47:04.228863" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:04.228611" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:04.229363" level="INFO">${mapping_to_use} = {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.171.7', '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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:04.229083" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:04.228938" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:04.228594" elapsed="0.000863"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:04.230259" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflecto...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:04.229619" elapsed="0.000668"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:04.230331" 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-10-11T00:47:04.225310" elapsed="0.005138"/>
</kw>
<msg time="2026-10-11T00:47:04.230500" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:04.220999" elapsed="0.009545"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:04.234924" 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/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-10-11T00:47:04.238984" 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/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-10-11T00:47:04.243049" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:04.243245" 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-10-11T00:47:04.243440" 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-10-11T00:47:04.243790" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:04.243644" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:04.243630" 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-10-11T00:47:04.244017" 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-10-11T00:47:04.244218" 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-10-11T00:47:04.244391" elapsed="0.000032"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:04.243604" elapsed="0.000849"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:04.243513" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:04.244631" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:04.244697" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:47:04.244813" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflecto...</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-10-11T00:47:04.220285" elapsed="0.024555"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:04.245966" 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-10-11T00:47:04.245770" elapsed="0.000257">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-10-11T00:47:04.246111" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:04.245445" elapsed="0.000689"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:04.246449" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:04.246212" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:04.246960" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:04.246700" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:04.246524" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:04.246194" elapsed="0.000842"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:04.247565" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:04.247210" elapsed="0.000379"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:47:04.247634" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:47:04.247756" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:47:04.245114" elapsed="0.002664"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:04.249037" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:04.248816" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:04.249559" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T00:47:04.249325" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:04.250021" 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-10-11T00:47:04.249802" elapsed="0.000259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:04.250497" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:04.250265" elapsed="0.000272"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:04.251279" 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-10-11T00:47:04.251078" elapsed="0.000226"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:47:04.251627" 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-10-11T00:47:04.251479" elapsed="0.000172"/>
</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-10-11T00:47:04.251814" elapsed="0.000155"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:04.252400" 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-10-11T00:47:04.252163" elapsed="0.000293"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:47:04.252496" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:04.252623" 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-10-11T00:47:04.250721" elapsed="0.001925"/>
</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-10-11T00:47:05.408163" level="INFO">PUT Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Content-Length': '845', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T00:47:05.408372" level="INFO">PUT Response : url=http://10.30.170.173: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.171.7 
 status=201, reason=Created 
 headers={'Set-Cookie': 'JSESSIONID=node0ko3eu9jz69y11vv609i6fzgwq0.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Sat, 10-Oct-2026 00:47:05 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:05.408643" 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-10-11T00:47:04.252938" elapsed="1.155762"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:04.252708" elapsed="1.156106"/>
</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-10-11T00:47:05.409323" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:05.408880" elapsed="0.000615"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:04.252692" elapsed="1.156848"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:05.412468" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:05.411733" elapsed="0.000831"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:05.411110" elapsed="0.001527"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:05.411068" elapsed="0.001619"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:05.414100" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:05.413477" elapsed="0.000737"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:05.412884" elapsed="0.001403"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:05.412847" elapsed="0.001490"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:05.415703" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:05.414798" elapsed="0.000963"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:05.416439" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:05.415904" elapsed="0.000657"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:05.417679" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:05.416970" elapsed="0.000766"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:05.416609" elapsed="0.001200"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:05.415866" elapsed="0.001988"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:05.419211" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:05.418264" elapsed="0.001007"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:05.419925" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:05.419449" elapsed="0.000592"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:05.421084" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:05.420496" elapsed="0.000642"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:05.420089" elapsed="0.001147"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:05.419377" elapsed="0.001904"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:05.421639" elapsed="0.000680"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:47:05.423547" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:05.422707" elapsed="0.000897"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:47:05.423946" elapsed="0.000548"/>
</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-10-11T00:47:05.410357" elapsed="0.014272"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:47:05.424954" elapsed="0.000071"/>
</return>
<status status="PASS" start="2026-10-11T00:47:05.424763" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:05.424725" elapsed="0.000418"/>
</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-10-11T00:47:05.425519" elapsed="0.000046"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:47:05.425659" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T00:47:05.426022" 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-10-11T00:47:04.248070" elapsed="1.178005"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:05.426225" elapsed="0.000064"/>
</return>
<msg time="2026-10-11T00:47:05.426547" 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-10-11T00:47:04.139885" elapsed="1.286715"/>
</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-10-11T00:47:05.427279" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:05.426795" elapsed="0.000652"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:05.426758" elapsed="0.000740"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:05.427565" elapsed="0.000052"/>
</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-10-11T00:47:04.138569" elapsed="1.289214"/>
</kw>
<arg>${MD5_SAME_PASSWD}</arg>
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="PASS" start="2026-10-11T00:47:04.135877" elapsed="1.292107"/>
</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-10-11T00:47:05.432007" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:05.431344" elapsed="0.000721"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:05.433037" 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-10-11T00:47:05.432548" elapsed="0.000580"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:05.437794" 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-10-11T00:47:05.434473" elapsed="0.003439"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:47:05.441665" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T00:47:05.441845" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T00:47:05.438314" elapsed="0.003587"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:05.443170" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T00:47:05.442669" elapsed="0.000621"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:05.442039" elapsed="0.001321"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:05.442000" elapsed="0.001442"/>
</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-10-11T00:47:05.433668" elapsed="0.009870"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:05.446609" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa-md5.cfg</msg>
<msg time="2026-10-11T00:47:05.446785" 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-10-11T00:47:05.443879" elapsed="0.002959"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:05.447834" 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-10-11T00:47:05.447307" elapsed="0.000619"/>
</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-10-11T00:47:05.430650" elapsed="0.017385"/>
</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-10-11T00:47:05.452172" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:05.451484" elapsed="0.000769"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:05.453326" 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-10-11T00:47:05.452668" elapsed="0.000712"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:47:05.491318" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ko3eu9jz69y11vv609i6fzgwq0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:05.493005" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T00:47:05.493236" 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-10-11T00:47:05.453759" elapsed="0.039536"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:05.494498" 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-10-11T00:47:05.493817" elapsed="0.000790"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T00:47:05.495863" 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-10-11T00:47:05.494990" elapsed="0.001020">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-10-11T00:47:05.450538" elapsed="0.045724">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.498928" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:08.498131" elapsed="0.000860"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.500094" 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-10-11T00:47:08.499441" elapsed="0.000707"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:47:08.533689" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ko3eu9jz69y11vv609i6fzgwq0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:08.534018" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '609'} 
 body={"bgp-rib:peer":[{"peer-id":"bgp://10.30.171.7","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-10-11T00:47:08.534284" 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-10-11T00:47:08.500650" elapsed="0.033691"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.535552" level="INFO">{"bgp-rib:peer":[{"peer-id":"bgp://10.30.171.7","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-10-11T00:47:08.534842" elapsed="0.000818"/>
</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-10-11T00:47:08.536044" elapsed="0.000789"/>
</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-10-11T00:47:08.497013" elapsed="0.039951"/>
</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-10-11T00:47:05.449440" elapsed="3.087627"/>
</kw>
<msg time="2026-10-11T00:47:08.537295" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:08.537389" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:05.448440" elapsed="3.089026"/>
</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-10-11T00:47:08.538290" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:08.537708" elapsed="0.000731"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:08.537656" elapsed="0.000863"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="PASS" start="2026-10-11T00:47:08.538833" elapsed="0.000068"/>
</return>
<status status="PASS" start="2026-10-11T00:47:08.538638" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:08.538605" elapsed="0.000405"/>
</if>
<var name="${idx}">0</var>
<status status="PASS" start="2026-10-11T00:47:05.430254" elapsed="3.108810"/>
</iter>
<var>${idx}</var>
<value>${connection_retries}</value>
<status status="PASS" start="2026-10-11T00:47:05.429517" elapsed="3.109617"/>
</for>
<kw name="Fail" owner="BuiltIn">
<arg>Unable to connect ExaBgp to ODL</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:08.539541" elapsed="0.000046"/>
</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-10-11T00:47:05.428724" elapsed="3.110983"/>
</kw>
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-10-11T00:47:08.541107" level="INFO">[?2004l00:47:05 | 1782   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:47:05 | 1782   | [01;34mversion      [0m | [1m4.2.17  [0m
00:47:05 | 1782   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
00:47:05 | 1782   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
00:47:05 | 1782   | [01;34minstallation [0m | [1m        [0m
00:47:05 | 1782   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:47:05 | 1782   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:47:05 | 1782   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:47:05 | 1782   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:47:05 | 1782   | [01;31mcli control  [0m | [1m - /run/[0m
00:47:05 | 1782   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:47:05 | 1782   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:47:05 | 1782   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:47:05 | 1782   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:47:05 | 1782   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:47:05 | 1782   | [01;31mcli control  [0m | [1m - /run/[0m
00:47:05 | 1782   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:47:05 | 1782   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:47:05 | 1782   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:47:05 | 1782   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:47:05 | 1782   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:47:05 | 1782   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:47:05 | 1782   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:47:05 | 1782   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:47:05 | 1782   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
00:47:05 | 1782   | configuration[0m | . router-id        | '10.30.171.7'[0m
00:47:05 | 1782   | configuration[0m | . local-address    | '10.30.171.7'[0m
00:47:05 | 1782   | configuration[0m | . local-as         | '64496'[0m
00:47:05 | 1782   | configuration[0m | . peer-as          | '64496'[0m
00:47:05 | 1782   | configuration[0m | . md5-password     | 'topsecret'[0m
00:47:05 | 1782   | configuration[0m | &gt; capability       | [0m
00:47:05 | 1782   | configuration[0m | . route-refresh    | 'disable'[0m
00:47:05 | 1782   | configuration[0m | . add-path         | 'disable'[0m
00:47:05 | 1782   | configuration[0m | &lt; capability       | [0m
00:47:05 | 1782   | configuration[0m | &gt; family           | [0m
00:47:05 | 1782   | configuration[0m | . ipv4             | 'unicast'[0m
00:47:05 | 1782   | configuration[0m | &lt; family           | [0m
00:47:05 | 1782   | configuration[0m | &lt; neighbor         | [0m
00:47:05 | 1782   | reactor      [0m | new peer: neighbor 10.30.170.173 local-ip 10.30.171.7 local-as 64496 peer-as 64496 router-id 10.30.171.7 family-allowed in-open[0m
00:47:05 | 1782   | [01;34mreactor      [0m | [1mloaded new configuration successfully[0m
00:47:05 | 1782   | reactor      [0m | initialising connection to peer-1[0m
00:47:05 | 1782   | outgoing-1   [0m | attempting connection to 10.30.170.173:1790[0m
00:47:05 | 1782   | outgoing-1   [0m | sending TCP payload (  49) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0031 0104 FBF0 00B4 0A1E AB07 1402 0601 0400 0100 0102 0641 0400 00FB F002 0206 00[0m
00:47:05 | 1782   | outgoing-1   [0m | &gt;&gt; OPEN version=4 asn=64496 hold_time=180 router_id=10.30.171.7 capabilities=[Multiprotocol(ipv4 unicast), Extended Message(65535), ASN4(64496)][0m
00:47:05 | 1782   | ka-outgoing-1[0m | receive-timer 60 second(s) left[0m
00:47:05 | 1782   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0035 01[0m
00:47:05 | 1782   | 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:47:05 | 1782   | outgoing-1   [0m | &lt;&lt; message of type OPEN[0m
00:47:05 | 1782   | 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:47:05 | 1782   | outgoing-1   [0m | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04[0m
00:47:05 | 1782   | outgoing-1   [0m | &gt;&gt; KEEPALIVE (OPENCONFIRM)[0m
00:47:05 | 1782   | ka-outgoing-1[0m | receive-timer 180 second(s) left[0m
00:47:05 | 1782   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04[0m
00:47:05 | 1782   | outgoing-1   [0m | &lt;&lt; message of type KEEPALIVE[0m
00:47:05 | 1782   | [01;34mreactor      [0m | [1mconnected to peer-1 with outgoing-1 10.30.171.7-10.30.170.173[0m
00:47:05 | 1782   | outgoing-1   [0m | sending TCP payload (  23) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 0200 0000 00[0m
00:47:05 | 1782   | outgoing-1   [0m | &gt;&gt; EOR ipv4 unicast[0m
00:47:05 | 1782   | peer-1       [0m | &gt;&gt; EOR(s)[0m
00:47:05 | 1782   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02[0m
00:47:05 | 1782   | outgoing-1   [0m | received complete TCP payload (   4) 0000 0000[0m
00:47:05 | 1782   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:47:05 | 1782   | parser       [0m | parsing UPDATE (   4) 0000 0000[0m
00:47:05 | 1782   | peer-1       [0m | &lt;&lt; UPDATE #1[0m
00:47:05 | 1782   | peer-1       [0m |    UPDATE #1 nlri  (   4) eor 1/1 (ipv4 unicast)[0m
00:47:06 | 1782   | ka-outgoing-1[0m | receive-timer 179 second(s) left[0m
00:47:06 | 1782   | ka-outgoing-1[0m | send-timer 59 second(s) left[0m
00:47:07 | 1782   | ka-outgoing-1[0m | receive-timer 178 second(s) left[0m
00:47:07 | 1782   | ka-outgoing-1[0m | send-timer 58 second(s) left[0m
00:47:08 | 1782   | ka-outgoing-1[0m | receive-timer 177 second(s) left[0m
00:47:08 | 1782   | ka-outgoing-1[0m | send-timer 57 second(s) left[0m</msg>
<msg time="2026-10-11T00:47:08.541704" level="INFO">${output} = [?2004l00:47:05 | 1782   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:47:05 | 1782   | [01;34mversion      [0m | [1m4.2.17  [0m
00:47:05 | 1782   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-10-11T00:47:08.540842" elapsed="0.000926"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.542765" level="INFO">[?2004l00:47:05 | 1782   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:47:05 | 1782   | [01;34mversion      [0m | [1m4.2.17  [0m
00:47:05 | 1782   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
00:47:05 | 1782   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
00:47:05 | 1782   | [01;34minstallation [0m | [1m        [0m
00:47:05 | 1782   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:47:05 | 1782   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:47:05 | 1782   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:47:05 | 1782   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:47:05 | 1782   | [01;31mcli control  [0m | [1m - /run/[0m
00:47:05 | 1782   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:47:05 | 1782   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:47:05 | 1782   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:47:05 | 1782   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:47:05 | 1782   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:47:05 | 1782   | [01;31mcli control  [0m | [1m - /run/[0m
00:47:05 | 1782   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:47:05 | 1782   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:47:05 | 1782   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:47:05 | 1782   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:47:05 | 1782   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:47:05 | 1782   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:47:05 | 1782   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:47:05 | 1782   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:47:05 | 1782   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
00:47:05 | 1782   | configuration[0m | . router-id        | '10.30.171.7'[0m
00:47:05 | 1782   | configuration[0m | . local-address    | '10.30.171.7'[0m
00:47:05 | 1782   | configuration[0m | . local-as         | '64496'[0m
00:47:05 | 1782   | configuration[0m | . peer-as          | '64496'[0m
00:47:05 | 1782   | configuration[0m | . md5-password     | 'topsecret'[0m
00:47:05 | 1782   | configuration[0m | &gt; capability       | [0m
00:47:05 | 1782   | configuration[0m | . route-refresh    | 'disable'[0m
00:47:05 | 1782   | configuration[0m | . add-path         | 'disable'[0m
00:47:05 | 1782   | configuration[0m | &lt; capability       | [0m
00:47:05 | 1782   | configuration[0m | &gt; family           | [0m
00:47:05 | 1782   | configuration[0m | . ipv4             | 'unicast'[0m
00:47:05 | 1782   | configuration[0m | &lt; family           | [0m
00:47:05 | 1782   | configuration[0m | &lt; neighbor         | [0m
00:47:05 | 1782   | reactor      [0m | new peer: neighbor 10.30.170.173 local-ip 10.30.171.7 local-as 64496 peer-as 64496 router-id 10.30.171.7 family-allowed in-open[0m
00:47:05 | 1782   | [01;34mreactor      [0m | [1mloaded new configuration successfully[0m
00:47:05 | 1782   | reactor      [0m | initialising connection to peer-1[0m
00:47:05 | 1782   | outgoing-1   [0m | attempting connection to 10.30.170.173:1790[0m
00:47:05 | 1782   | outgoing-1   [0m | sending TCP payload (  49) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0031 0104 FBF0 00B4 0A1E AB07 1402 0601 0400 0100 0102 0641 0400 00FB F002 0206 00[0m
00:47:05 | 1782   | outgoing-1   [0m | &gt;&gt; OPEN version=4 asn=64496 hold_time=180 router_id=10.30.171.7 capabilities=[Multiprotocol(ipv4 unicast), Extended Message(65535), ASN4(64496)][0m
00:47:05 | 1782   | ka-outgoing-1[0m | receive-timer 60 second(s) left[0m
00:47:05 | 1782   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0035 01[0m
00:47:05 | 1782   | 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:47:05 | 1782   | outgoing-1   [0m | &lt;&lt; message of type OPEN[0m
00:47:05 | 1782   | 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:47:05 | 1782   | outgoing-1   [0m | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04[0m
00:47:05 | 1782   | outgoing-1   [0m | &gt;&gt; KEEPALIVE (OPENCONFIRM)[0m
00:47:05 | 1782   | ka-outgoing-1[0m | receive-timer 180 second(s) left[0m
00:47:05 | 1782   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04[0m
00:47:05 | 1782   | outgoing-1   [0m | &lt;&lt; message of type KEEPALIVE[0m
00:47:05 | 1782   | [01;34mreactor      [0m | [1mconnected to peer-1 with outgoing-1 10.30.171.7-10.30.170.173[0m
00:47:05 | 1782   | outgoing-1   [0m | sending TCP payload (  23) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 0200 0000 00[0m
00:47:05 | 1782   | outgoing-1   [0m | &gt;&gt; EOR ipv4 unicast[0m
00:47:05 | 1782   | peer-1       [0m | &gt;&gt; EOR(s)[0m
00:47:05 | 1782   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02[0m
00:47:05 | 1782   | outgoing-1   [0m | received complete TCP payload (   4) 0000 0000[0m
00:47:05 | 1782   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:47:05 | 1782   | parser       [0m | parsing UPDATE (   4) 0000 0000[0m
00:47:05 | 1782   | peer-1       [0m | &lt;&lt; UPDATE #1[0m
00:47:05 | 1782   | peer-1       [0m |    UPDATE #1 nlri  (   4) eor 1/1 (ipv4 unicast)[0m
00:47:06 | 1782   | ka-outgoing-1[0m | receive-timer 179 second(s) left[0m
00:47:06 | 1782   | ka-outgoing-1[0m | send-timer 59 second(s) left[0m
00:47:07 | 1782   | ka-outgoing-1[0m | receive-timer 178 second(s) left[0m
00:47:07 | 1782   | ka-outgoing-1[0m | send-timer 58 second(s) left[0m
00:47:08 | 1782   | ka-outgoing-1[0m | receive-timer 177 second(s) left[0m
00:47:08 | 1782   | 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-10-11T00:47:08.542218" elapsed="0.000866"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.544939" 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-10-11T00:47:08.544252" elapsed="0.000744"/>
</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-10-11T00:47:08.545352" elapsed="0.000431"/>
</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-10-11T00:47:08.543600" elapsed="0.002320"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:47:08.675385" level="INFO">^C00:47:08 | 1782   | [00;31mreactor      [0m | [1m^C received[0m
00:47:08 | 1782   | [00;31mreactor      [0m | [1mperforming shutdown[0m
00:47:08 | 1782   | outgoing-1   [0m | stop, message [shutting down][0m
00:47:08 | 1782   | [01;33moutgoing-1   [0m | [1moutgoing-1 10.30.171.7-10.30.170.173, closing connection[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T00:47:08.675530" level="INFO">${output} = ^C00:47:08 | 1782   | [00;31mreactor      [0m | [1m^C received[0m
00:47:08 | 1782   | [00;31mreactor      [0m | [1mperforming shutdown[0m
00:47:08 | 1782   | 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-10-11T00:47:08.546298" elapsed="0.129263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.676006" level="INFO">^C00:47:08 | 1782   | [00;31mreactor      [0m | [1m^C received[0m
00:47:08 | 1782   | [00;31mreactor      [0m | [1mperforming shutdown[0m
00:47:08 | 1782   | outgoing-1   [0m | stop, message [shutting down][0m
00:47:08 | 1782   | [01;33moutgoing-1   [0m | [1moutgoing-1 10.30.171.7-10.30.170.173, closing connection[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T00:47:08.675765" elapsed="0.000293"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:08.678356" 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-10-11T00:47:08.676686" elapsed="0.001738"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:47:08.679204" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T00:47:08.679281" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-423-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-10-11T00:47:08.678596" elapsed="0.000709"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.679869" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-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-10-11T00:47:08.679644" elapsed="0.000267"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:08.679366" elapsed="0.000576"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:08.679348" elapsed="0.000617"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-10-11T00:47:08.676317" elapsed="0.003689"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-10-11T00:47:08.540167" elapsed="0.139883"/>
</kw>
<kw name="Delete_Bgp_Peer_Configuration" type="TEARDOWN">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.681033" level="INFO">&amp;{mapping} = { BGP_RIB_OPENCONFIG=example-bgp-rib | IP=10.30.171.7 }</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-10-11T00:47:08.680619" elapsed="0.000441"/>
</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-10-11T00:47:08.694437" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:08.694103" elapsed="0.000362"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:08.695180" 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-10-11T00:47:08.694950" elapsed="0.000318">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-10-11T00:47:08.695355" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:08.694626" elapsed="0.000751"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.695873" 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-10-11T00:47:08.695565" elapsed="0.000332"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:08.696181" 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-10-11T00:47:08.696338" 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-10-11T00:47:08.696062" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.696792" 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-10-11T00:47:08.696575" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.697771" level="INFO">mapping: {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.171.7'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:08.697540" elapsed="0.000271"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.698246" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:47:08.697984" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.698891" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:08.698616" elapsed="0.000298"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:08.699685" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:08.699453" elapsed="0.000257"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:08.699757" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T00:47:08.699886" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:08.699085" 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-10-11T00:47:08.700073" elapsed="0.000201"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:47:08.698484" elapsed="0.001827"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.700823" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:08.700557" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:08.701560" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:08.701367" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:08.701629" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:08.701751" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:08.701015" elapsed="0.000758"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:08.701934" elapsed="0.000162"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:47:08.700427" elapsed="0.001705"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:47:08.698318" elapsed="0.003846"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:47:08.702217" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:47:08.702361" level="INFO">${mapping_to_use} = {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.171.7'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:47:08.697145" elapsed="0.005240"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:08.696893" elapsed="0.005537"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:08.702614" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:08.702452" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:08.696877" elapsed="0.005806"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.703548" 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-10-11T00:47:08.702839" elapsed="0.000737"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:08.703621" 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-10-11T00:47:08.693576" elapsed="0.010170"/>
</kw>
<msg time="2026-10-11T00:47:08.703800" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:08.689276" elapsed="0.014580"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:08.707936" 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/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-10-11T00:47:08.712015" 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/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-10-11T00:47:08.716031" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:08.716262" 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-10-11T00:47:08.716458" 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-10-11T00:47:08.716796" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:08.716651" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:08.716637" 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-10-11T00:47:08.717024" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:08.717213" 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-10-11T00:47:08.717377" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:08.716613" elapsed="0.000827"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:08.716525" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:08.717616" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:08.717682" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:47:08.717798" 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-10-11T00:47:08.688600" elapsed="0.029224"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.718901" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:08.718676" elapsed="0.000268"/>
</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-10-11T00:47:08.735201" level="INFO">DELETE Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ko3eu9jz69y11vv609i6fzgwq0.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:08.735255" level="INFO">DELETE Response : url=http://10.30.170.173: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.171.7 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:08.735339" 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-10-11T00:47:08.719251" elapsed="0.016113"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:08.719004" elapsed="0.016397"/>
</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-10-11T00:47:08.735610" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:08.735455" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:08.718988" elapsed="0.016697"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.736925" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:08.736650" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:08.736390" elapsed="0.000607"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:08.736373" elapsed="0.000646"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.737605" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:08.737315" elapsed="0.000361"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:08.737068" elapsed="0.000640"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:08.737053" elapsed="0.000678"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.738297" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:08.737920" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:08.738613" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:08.738385" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.739111" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:08.738847" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:08.738686" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:08.738368" elapsed="0.000833"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.739728" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:08.739374" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:08.740020" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:08.739815" elapsed="0.000256"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.740542" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:08.740266" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:08.740093" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:08.739799" elapsed="0.000819"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:08.740760" elapsed="0.000290"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:47:08.741483" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:08.741225" elapsed="0.000283"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:47:08.741661" elapsed="0.000224"/>
</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-10-11T00:47:08.736019" elapsed="0.005922"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:47:08.741982" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:08.742157" 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-10-11T00:47:08.718061" elapsed="0.024120"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:08.742244" elapsed="0.000025"/>
</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-10-11T00:47:08.681283" elapsed="0.061057"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-10-11T00:47:08.680272" elapsed="0.062118"/>
</kw>
<doc>Verifies exabgp connected with md5 settings</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:47:04.134815" elapsed="4.607627"/>
</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-10-11T00:47:08.745858" level="INFO">&amp;{mapping} = { BGP_RIB_OPENCONFIG=example-bgp-rib | IP=10.30.171.7 | 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-10-11T00:47:08.745315" elapsed="0.000571"/>
</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-10-11T00:47:08.756094" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:08.755795" elapsed="0.000326"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:08.756806" 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-10-11T00:47:08.756626" elapsed="0.000241">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-10-11T00:47:08.756985" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:08.756292" elapsed="0.000717"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.757521" 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-10-11T00:47:08.757182" elapsed="0.000365"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:08.757820" 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-10-11T00:47:08.757940" 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-10-11T00:47:08.757711" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.758386" 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-10-11T00:47:08.758154" 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-10-11T00:47:08.759395" level="INFO">mapping: {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.171.7', '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-10-11T00:47:08.759139" elapsed="0.000325"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.759889" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:47:08.759642" elapsed="0.000271"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.760545" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:08.760257" elapsed="0.000312"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:08.761598" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:08.761156" elapsed="0.000467"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:08.761669" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T00:47:08.761798" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:08.760738" elapsed="0.001084"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:08.761986" elapsed="0.000170"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:47:08.760102" elapsed="0.002106"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.762745" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:08.762466" elapsed="0.000304"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:08.763661" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:08.763261" elapsed="0.000426"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:08.763733" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:08.763857" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:08.762939" 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-10-11T00:47:08.764043" elapsed="0.000187"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:47:08.762310" elapsed="0.001957"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.764801" 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-10-11T00:47:08.764530" elapsed="0.000295"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:08.765680" 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-10-11T00:47:08.765316" elapsed="0.000389"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:08.765748" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:08.765871" 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-10-11T00:47:08.764993" elapsed="0.000900"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:08.766052" elapsed="0.000177"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:47:08.764365" elapsed="0.001900"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.766809" 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-10-11T00:47:08.766533" elapsed="0.000301"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:08.767760" 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-10-11T00:47:08.767370" elapsed="0.000415"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:08.767829" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:08.767953" 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-10-11T00:47:08.767039" 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-10-11T00:47:08.768136" elapsed="0.000183"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:47:08.766362" elapsed="0.001994"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.768892" 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-10-11T00:47:08.768620" elapsed="0.000298"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:08.769815" 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-10-11T00:47:08.769457" elapsed="0.000383"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:08.769885" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:08.770008" 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-10-11T00:47:08.769087" 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-10-11T00:47:08.770204" elapsed="0.000183"/>
</kw>
<var name="${key}">PASSWORD</var>
<var name="${value}">different</var>
<status status="PASS" start="2026-10-11T00:47:08.768488" elapsed="0.001962"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.770961" 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-10-11T00:47:08.770689" elapsed="0.000296"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:08.771878" 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-10-11T00:47:08.771518" elapsed="0.000386"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:08.771949" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:08.772073" 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-10-11T00:47:08.771155" 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-10-11T00:47:08.772277" elapsed="0.000210"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:47:08.770559" elapsed="0.001968"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:47:08.759958" elapsed="0.012601"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:47:08.772597" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:47:08.772730" level="INFO">${mapping_to_use} = {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.171.7', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSWORD': 'different', 'PASSIVE_MODE': 'true'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:47:08.758780" elapsed="0.013974"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:08.758526" elapsed="0.014257"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:08.772954" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:08.772805" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:08.758508" elapsed="0.014515"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.773974" 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-10-11T00:47:08.773180" elapsed="0.000822"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:08.774047" 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-10-11T00:47:08.755278" elapsed="0.018871"/>
</kw>
<msg time="2026-10-11T00:47:08.774214" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:08.750961" elapsed="0.023300"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:08.778327" 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/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-10-11T00:47:08.782479" 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/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-10-11T00:47:08.786597" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:08.786780" 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-10-11T00:47:08.786961" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:08.787313" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:08.787153" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:08.787140" 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-10-11T00:47:08.787554" 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-10-11T00:47:08.787732" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:08.787893" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:08.787115" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:08.787026" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:08.788112" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:08.788178" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T00:47:08.788305" 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-10-11T00:47:08.750359" elapsed="0.037971"/>
</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-10-11T00:47:08.797224" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:08.796905" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:08.797917" 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-10-11T00:47:08.797745" elapsed="0.000231">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-10-11T00:47:08.798060" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:08.797425" elapsed="0.000657"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.798630" 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-10-11T00:47:08.798301" elapsed="0.000355"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:08.798931" 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-10-11T00:47:08.799048" 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-10-11T00:47:08.798822" elapsed="0.000252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.799518" 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-10-11T00:47:08.799283" 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-10-11T00:47:08.799885" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:08.799633" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.800388" level="INFO">${mapping_to_use} = {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.171.7', '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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:08.800106" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:08.799960" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:08.799615" elapsed="0.000867"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.801276" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflecto...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:08.800643" elapsed="0.000661"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:08.801348" 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-10-11T00:47:08.796385" elapsed="0.005086"/>
</kw>
<msg time="2026-10-11T00:47:08.801523" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:08.792060" elapsed="0.009506"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:08.805765" 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/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-10-11T00:47:08.809798" 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/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-10-11T00:47:08.813908" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:08.814124" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:08.814321" 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-10-11T00:47:08.814676" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:08.814531" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:08.814517" 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-10-11T00:47:08.814902" 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-10-11T00:47:08.815080" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:08.815258" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:08.814491" elapsed="0.000816"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:08.814387" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:08.815496" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:08.815563" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:47:08.815679" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflecto...</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-10-11T00:47:08.791333" elapsed="0.024373"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:08.816828" 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-10-11T00:47:08.816642" elapsed="0.000245">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-10-11T00:47:08.816972" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:08.816295" elapsed="0.000699"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:08.817289" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:08.817057" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.817803" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:08.817541" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:08.817363" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:08.817040" elapsed="0.000839"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.818388" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:08.818038" elapsed="0.000389"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:47:08.818473" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:47:08.818596" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:47:08.815977" elapsed="0.002641"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.819825" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:08.819607" elapsed="0.000261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.820286" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T00:47:08.820056" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.820800" 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-10-11T00:47:08.820580" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.821260" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:08.821028" elapsed="0.000272"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:08.822017" 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-10-11T00:47:08.821856" elapsed="0.000186"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:47:08.822357" 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-10-11T00:47:08.822212" elapsed="0.000169"/>
</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-10-11T00:47:08.822560" elapsed="0.000154"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.823125" 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-10-11T00:47:08.822905" elapsed="0.000261"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:47:08.823220" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:08.823349" 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-10-11T00:47:08.821498" elapsed="0.001874"/>
</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-10-11T00:47:08.840356" level="INFO">PUT Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0ko3eu9jz69y11vv609i6fzgwq0.node0', 'Content-Length': '845', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T00:47:08.840444" level="INFO">PUT Response : url=http://10.30.170.173: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.171.7 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:08.840549" 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-10-11T00:47:08.823679" elapsed="0.016895"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:08.823450" elapsed="0.017166"/>
</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-10-11T00:47:08.840797" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:08.840641" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:08.823433" elapsed="0.017444"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.842104" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:08.841827" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:08.841569" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:08.841540" elapsed="0.000673"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.842821" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:08.842547" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:08.842264" elapsed="0.000629"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:08.842248" elapsed="0.000668"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.843479" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:08.843090" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:08.843777" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:08.843570" elapsed="0.000259"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.844284" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:08.844008" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:08.843851" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:08.843553" elapsed="0.000841"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.844923" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:08.844583" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:08.845229" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:08.845011" elapsed="0.000271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.845746" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:08.845485" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:08.845304" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:08.844994" elapsed="0.000828"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:08.845964" elapsed="0.000302"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:47:08.846664" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:08.846440" elapsed="0.000248"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:47:08.846840" elapsed="0.000210"/>
</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-10-11T00:47:08.841217" elapsed="0.005887"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:47:08.847257" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:47:08.847162" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:08.847146" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:08.847493" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:47:08.847555" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:47:08.847713" 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-10-11T00:47:08.818906" elapsed="0.028830"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:08.847791" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:47:08.847909" 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-10-11T00:47:08.746749" elapsed="0.101181"/>
</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-10-11T00:47:08.848226" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:08.848013" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:08.847997" elapsed="0.000311"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:08.848337" elapsed="0.000023"/>
</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-10-11T00:47:08.746131" elapsed="0.102315"/>
</kw>
<arg>${MD5_DIFF_PASSWD}</arg>
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="PASS" start="2026-10-11T00:47:08.744907" elapsed="0.103592"/>
</kw>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.849290" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:08.849002" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.849742" 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-10-11T00:47:08.849527" elapsed="0.000255"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:08.852996" 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-10-11T00:47:08.850347" elapsed="0.002701"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:47:08.857120" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T00:47:08.857250" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T00:47:08.853230" elapsed="0.004045"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.857833" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T00:47:08.857610" elapsed="0.000266"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:08.857339" elapsed="0.000568"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:08.857321" 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-10-11T00:47:08.850000" elapsed="0.007972"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:08.860269" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa-md5.cfg</msg>
<msg time="2026-10-11T00:47:08.860347" 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-10-11T00:47:08.858123" elapsed="0.002248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.860798" 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-10-11T00:47:08.860579" elapsed="0.000260"/>
</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-10-11T00:47:08.848703" elapsed="0.012186"/>
</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-10-11T00:47:08.863945" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:08.863645" elapsed="0.000325"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.864456" 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-10-11T00:47:08.864142" elapsed="0.000340"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:47:08.873141" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ko3eu9jz69y11vv609i6fzgwq0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:08.873315" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T00:47:08.873402" 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-10-11T00:47:08.864641" elapsed="0.008829"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.873960" 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-10-11T00:47:08.873680" elapsed="0.000323"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T00:47:08.874587" 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-10-11T00:47:08.874176" elapsed="0.000470">200.0 != 409.0</status>
</kw>
<arg>session</arg>
<arg>10.30.171.7</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-10-11T00:47:08.863284" elapsed="0.011470">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:10.877601" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:10.876765" elapsed="0.000904"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:10.878853" 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-10-11T00:47:10.878079" elapsed="0.000830"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:47:10.890528" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ko3eu9jz69y11vv609i6fzgwq0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:10.890898" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T00:47:10.891099" 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-10-11T00:47:10.879286" elapsed="0.011867"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:10.892505" 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-10-11T00:47:10.891790" elapsed="0.000816"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T00:47:10.894090" 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-10-11T00:47:10.893130" elapsed="0.001134">200.0 != 409.0</status>
</kw>
<arg>session</arg>
<arg>10.30.171.7</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-10-11T00:47:10.875710" elapsed="0.018817">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:12.897351" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:12.896530" elapsed="0.000918"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:12.898585" 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-10-11T00:47:12.897864" elapsed="0.000777"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:47:12.910895" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ko3eu9jz69y11vv609i6fzgwq0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:12.911266" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T00:47:12.911505" 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-10-11T00:47:12.898999" elapsed="0.012564"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:12.912751" 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-10-11T00:47:12.912032" elapsed="0.000818"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T00:47:12.914635" 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-10-11T00:47:12.913259" elapsed="0.001531">200.0 != 409.0</status>
</kw>
<arg>session</arg>
<arg>10.30.171.7</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-10-11T00:47:12.895484" elapsed="0.019536">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:14.917882" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:14.917039" elapsed="0.000910"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:14.919079" 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-10-11T00:47:14.918385" elapsed="0.000747"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:47:14.930922" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ko3eu9jz69y11vv609i6fzgwq0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:14.931262" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T00:47:14.931502" 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-10-11T00:47:14.919534" elapsed="0.012027"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:14.932774" 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-10-11T00:47:14.932035" elapsed="0.000838"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T00:47:14.934162" 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-10-11T00:47:14.933286" elapsed="0.001057">200.0 != 409.0</status>
</kw>
<arg>session</arg>
<arg>10.30.171.7</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-10-11T00:47:14.915978" elapsed="0.018636">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:16.937575" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:16.936730" elapsed="0.000912"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:16.938870" 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-10-11T00:47:16.938053" elapsed="0.000873"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:47:16.951110" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ko3eu9jz69y11vv609i6fzgwq0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:16.951477" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T00:47:16.951683" 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-10-11T00:47:16.939311" elapsed="0.012424"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:16.952905" 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-10-11T00:47:16.952216" elapsed="0.000787"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T00:47:16.954310" 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-10-11T00:47:16.953468" elapsed="0.001236">200.0 != 409.0</status>
</kw>
<arg>session</arg>
<arg>10.30.171.7</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-10-11T00:47:16.935683" elapsed="0.019267">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:18.957828" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:18.956997" elapsed="0.000898"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:18.959017" 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-10-11T00:47:18.958321" elapsed="0.000752"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:47:18.971914" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ko3eu9jz69y11vv609i6fzgwq0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:18.972258" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T00:47:18.972486" 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-10-11T00:47:18.959481" elapsed="0.013061"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:18.973713" 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-10-11T00:47:18.973004" elapsed="0.000812"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T00:47:18.975090" 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-10-11T00:47:18.974191" elapsed="0.001123">200.0 != 409.0</status>
</kw>
<arg>session</arg>
<arg>10.30.171.7</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-10-11T00:47:18.955951" elapsed="0.019621">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:20.978897" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:20.978065" elapsed="0.000898"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:20.980095" 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-10-11T00:47:20.979393" elapsed="0.000758"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:47:20.994043" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ko3eu9jz69y11vv609i6fzgwq0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:20.994484" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T00:47:20.994706" 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-10-11T00:47:20.980563" elapsed="0.014196"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:20.995936" 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-10-11T00:47:20.995243" elapsed="0.000790"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T00:47:20.997298" 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-10-11T00:47:20.996462" elapsed="0.001010">200.0 != 409.0</status>
</kw>
<arg>session</arg>
<arg>10.30.171.7</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-10-11T00:47:20.976462" elapsed="0.021235">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:23.000539" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:22.999694" elapsed="0.000914"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:23.001732" 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-10-11T00:47:23.001018" elapsed="0.000768"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:47:23.013790" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ko3eu9jz69y11vv609i6fzgwq0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:23.014083" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T00:47:23.014300" 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-10-11T00:47:23.002136" elapsed="0.012219"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:23.015557" 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-10-11T00:47:23.014849" elapsed="0.000808"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T00:47:23.016904" 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-10-11T00:47:23.016035" elapsed="0.001016">200.0 != 409.0</status>
</kw>
<arg>session</arg>
<arg>10.30.171.7</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-10-11T00:47:22.998649" elapsed="0.018651">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.020119" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:25.019306" elapsed="0.000900"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.021350" 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-10-11T00:47:25.020659" elapsed="0.000746"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:47:25.031866" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ko3eu9jz69y11vv609i6fzgwq0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:25.032157" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T00:47:25.032382" 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-10-11T00:47:25.021801" elapsed="0.010666"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.033635" 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-10-11T00:47:25.032928" elapsed="0.000907"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.035087" 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-10-11T00:47:25.034239" elapsed="0.001018">200.0 != 409.0</status>
</kw>
<arg>session</arg>
<arg>10.30.171.7</arg>
<doc>Checks peer presence in operational datastore</doc>
<status status="FAIL" start="2026-10-11T00:47:25.018259" elapsed="0.017258">200.0 != 409.0</status>
</kw>
<msg time="2026-10-11T00:47:25.035721" 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.171.7</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-10-11T00:47:08.862781" elapsed="16.173140">Keyword 'ExaBgpLib.Verify_ExaBgps_Connection' failed after retrying for 15 seconds. The last error was: 200.0 != 409.0</status>
</kw>
<msg time="2026-10-11T00:47:25.036153" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T00:47:25.036384" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:08.862383" elapsed="16.174081"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-11T00:47:25.036865" elapsed="0.000063"/>
</return>
<status status="PASS" start="2026-10-11T00:47:25.036642" elapsed="0.000362"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:25.036593" elapsed="0.000463"/>
</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-10-11T00:47:25.037404" elapsed="0.000077"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:25.037822" elapsed="0.000042"/>
</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-10-11T00:47:08.861888" elapsed="16.176153"/>
</kw>
<msg time="2026-10-11T00:47:25.038143" 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-10-11T00:47:08.861481" elapsed="16.176781"/>
</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-10-11T00:47:08.861066" elapsed="16.177398"/>
</kw>
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-10-11T00:47:25.040434" level="INFO">[?2004l00:47:09 | 1786   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:47:09 | 1786   | [01;34mversion      [0m | [1m4.2.17  [0m
00:47:09 | 1786   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
00:47:09 | 1786   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
00:47:09 | 1786   | [01;34minstallation [0m | [1m        [0m
00:47:09 | 1786   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:47:09 | 1786   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:47:09 | 1786   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:47:09 | 1786   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:47:09 | 1786   | [01;31mcli control  [0m | [1m - /run/[0m
00:47:09 | 1786   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:47:09 | 1786   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:47:09 | 1786   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:47:09 | 1786   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:47:09 | 1786   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:47:09 | 1786   | [01;31mcli control  [0m | [1m - /run/[0m
00:47:09 | 1786   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:47:09 | 1786   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:47:09 | 1786   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:47:09 | 1786   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:47:09 | 1786   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:47:09 | 1786   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:47:09 | 1786   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:47:09 | 1786   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:47:09 | 1786   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
00:47:09 | 1786   | configuration[0m | . router-id        | '10.30.171.7'[0m
00:47:09 | 1786   | configuration[0m | . local-address    | '10.30.171.7'[0m
00:47:09 | 1786   | configuration[0m | . local-as         | '64496'[0m
00:47:09 | 1786   | configuration[0m | . peer-as          | '64496'[0m
00:47:09 | 1786   | configuration[0m | . md5-password     | 'topsecret'[0m
00:47:09 | 1786   | configuration[0m | &gt; capability       | [0m
00:47:09 | 1786   | configuration[0m | . route-refresh    | 'disable'[0m
00:47:09 | 1786   | configuration[0m | . add-path         | 'disable'[0m
00:47:09 | 1786   | configuration[0m | &lt; capability       | [0m
00:47:09 | 1786   | configuration[0m | &gt; family           | [0m
00:47:09 | 1786   | configuration[0m | . ipv4             | 'unicast'[0m
00:47:09 | 1786   | configuration[0m | &lt; family           | [0m
00:47:09 | 1786   | configuration[0m | &lt; neighbor         | [0m
00:47:09 | 1786   | reactor      [0m | new peer: neighbor 10.30.170.173 local-ip 10.30.171.7 local-as 64496 peer-as 64496 router-id 10.30.171.7 family-allowed in-open[0m
00:47:09 | 1786   | [01;34mreactor      [0m | [1mloaded new configuration successfully[0m
00:47:09 | 1786   | reactor      [0m | initialising connection to peer-1[0m
00:47:09 | 1786   | outgoing-1   [0m | attempting connection to 10.30.170.173:1790[0m</msg>
<msg time="2026-10-11T00:47:25.040765" level="INFO">${output} = [?2004l00:47:09 | 1786   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:47:09 | 1786   | [01;34mversion      [0m | [1m4.2.17  [0m
00:47:09 | 1786   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-10-11T00:47:25.039625" elapsed="0.001202"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.041825" level="INFO">[?2004l00:47:09 | 1786   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:47:09 | 1786   | [01;34mversion      [0m | [1m4.2.17  [0m
00:47:09 | 1786   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
00:47:09 | 1786   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
00:47:09 | 1786   | [01;34minstallation [0m | [1m        [0m
00:47:09 | 1786   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:47:09 | 1786   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:47:09 | 1786   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:47:09 | 1786   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:47:09 | 1786   | [01;31mcli control  [0m | [1m - /run/[0m
00:47:09 | 1786   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:47:09 | 1786   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:47:09 | 1786   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:47:09 | 1786   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:47:09 | 1786   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:47:09 | 1786   | [01;31mcli control  [0m | [1m - /run/[0m
00:47:09 | 1786   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:47:09 | 1786   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:47:09 | 1786   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:47:09 | 1786   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:47:09 | 1786   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:47:09 | 1786   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:47:09 | 1786   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:47:09 | 1786   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:47:09 | 1786   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
00:47:09 | 1786   | configuration[0m | . router-id        | '10.30.171.7'[0m
00:47:09 | 1786   | configuration[0m | . local-address    | '10.30.171.7'[0m
00:47:09 | 1786   | configuration[0m | . local-as         | '64496'[0m
00:47:09 | 1786   | configuration[0m | . peer-as          | '64496'[0m
00:47:09 | 1786   | configuration[0m | . md5-password     | 'topsecret'[0m
00:47:09 | 1786   | configuration[0m | &gt; capability       | [0m
00:47:09 | 1786   | configuration[0m | . route-refresh    | 'disable'[0m
00:47:09 | 1786   | configuration[0m | . add-path         | 'disable'[0m
00:47:09 | 1786   | configuration[0m | &lt; capability       | [0m
00:47:09 | 1786   | configuration[0m | &gt; family           | [0m
00:47:09 | 1786   | configuration[0m | . ipv4             | 'unicast'[0m
00:47:09 | 1786   | configuration[0m | &lt; family           | [0m
00:47:09 | 1786   | configuration[0m | &lt; neighbor         | [0m
00:47:09 | 1786   | reactor      [0m | new peer: neighbor 10.30.170.173 local-ip 10.30.171.7 local-as 64496 peer-as 64496 router-id 10.30.171.7 family-allowed in-open[0m
00:47:09 | 1786   | [01;34mreactor      [0m | [1mloaded new configuration successfully[0m
00:47:09 | 1786   | reactor      [0m | initialising connection to peer-1[0m
00:47:09 | 1786   | outgoing-1   [0m | attempting connection to 10.30.170.173:1790[0m
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:25.041277" elapsed="0.000861"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.044060" 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-10-11T00:47:25.043369" elapsed="0.000749"/>
</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-10-11T00:47:25.044503" elapsed="0.000430"/>
</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-10-11T00:47:25.042701" elapsed="0.002372"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:47:25.175871" level="INFO">^C00:47:25 | 1786   | [00;31mreactor      [0m | [1m^C received[0m
00:47:25 | 1786   | [00;31mreactor      [0m | [1mperforming shutdown[0m
00:47:25 | 1786   | [01;33moutgoing-1   [0m | [1moutgoing-1 10.30.171.7-10.30.170.173, closing connection[0m
00:47:25 | 1786   | [01;33moutgoing-1   [0m | [1mconnection to 10.30.170.173 closed[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T00:47:25.175995" level="INFO">${output} = ^C00:47:25 | 1786   | [00;31mreactor      [0m | [1m^C received[0m
00:47:25 | 1786   | [00;31mreactor      [0m | [1mperforming shutdown[0m
00:47:25 | 1786   | [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-10-11T00:47:25.045486" elapsed="0.130537"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.176549" level="INFO">^C00:47:25 | 1786   | [00;31mreactor      [0m | [1m^C received[0m
00:47:25 | 1786   | [00;31mreactor      [0m | [1mperforming shutdown[0m
00:47:25 | 1786   | [01;33moutgoing-1   [0m | [1moutgoing-1 10.30.171.7-10.30.170.173, closing connection[0m
00:47:25 | 1786   | [01;33moutgoing-1   [0m | [1mconnection to 10.30.170.173 closed[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T00:47:25.176263" elapsed="0.000339"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:25.178722" 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-10-11T00:47:25.177245" elapsed="0.001528"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:47:25.179559" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T00:47:25.179634" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-423-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-10-11T00:47:25.178940" elapsed="0.000718"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.180231" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-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-10-11T00:47:25.179994" elapsed="0.000281"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:25.179727" elapsed="0.000578"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:25.179704" elapsed="0.000629"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-10-11T00:47:25.176858" elapsed="0.003521"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-10-11T00:47:25.038951" elapsed="0.141491"/>
</kw>
<kw name="Delete_Bgp_Peer_Configuration" type="TEARDOWN">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.181402" level="INFO">&amp;{mapping} = { BGP_RIB_OPENCONFIG=example-bgp-rib | IP=10.30.171.7 }</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-10-11T00:47:25.180974" elapsed="0.000469"/>
</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-10-11T00:47:25.194516" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:25.194181" elapsed="0.000362"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:25.195272" 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-10-11T00:47:25.195021" elapsed="0.000320">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-10-11T00:47:25.195442" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:25.194701" elapsed="0.000770"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.195954" 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-10-11T00:47:25.195643" elapsed="0.000338"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:25.196273" 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-10-11T00:47:25.196441" 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-10-11T00:47:25.196147" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.196881" 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-10-11T00:47:25.196663" 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-10-11T00:47:25.198072" level="INFO">mapping: {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.171.7'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:25.197839" elapsed="0.000275"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.198567" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:47:25.198301" elapsed="0.000290"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.199211" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:25.198932" elapsed="0.000303"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:25.199953" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:25.199757" elapsed="0.000220"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:25.200024" elapsed="0.000032"/>
</return>
<msg time="2026-10-11T00:47:25.200154" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:25.199423" elapsed="0.000754"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:25.200353" elapsed="0.000200"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:47:25.198800" elapsed="0.001790"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.201081" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:25.200819" elapsed="0.000286"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:25.201802" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:25.201627" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:25.201869" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:25.201992" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:25.201283" elapsed="0.000731"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:25.202173" elapsed="0.000182"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:47:25.200691" elapsed="0.001701"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:47:25.198645" elapsed="0.003792"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:47:25.202477" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:47:25.202603" level="INFO">${mapping_to_use} = {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.171.7'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:47:25.197472" elapsed="0.005155"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:25.197034" elapsed="0.005622"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:25.202826" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:25.202678" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:25.197016" elapsed="0.005879"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.203592" 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-10-11T00:47:25.203053" elapsed="0.000566"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:25.203661" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:25.193656" elapsed="0.010104"/>
</kw>
<msg time="2026-10-11T00:47:25.203809" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:25.189387" elapsed="0.014476"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:25.207913" 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/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-10-11T00:47:25.211967" 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/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-10-11T00:47:25.216114" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:25.216311" 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-10-11T00:47:25.216508" 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-10-11T00:47:25.216852" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:25.216705" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:25.216692" 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-10-11T00:47:25.217081" 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-10-11T00:47:25.217271" 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-10-11T00:47:25.217449" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:25.216667" elapsed="0.000830"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:25.216576" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:25.217671" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:25.217737" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:47:25.217846" 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-10-11T00:47:25.188738" elapsed="0.029133"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.218895" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:25.218674" elapsed="0.000264"/>
</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-10-11T00:47:25.232283" level="INFO">DELETE Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ko3eu9jz69y11vv609i6fzgwq0.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:25.232329" level="INFO">DELETE Response : url=http://10.30.170.173: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.171.7 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:25.232442" 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-10-11T00:47:25.219236" elapsed="0.013232"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:25.218998" elapsed="0.013507"/>
</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-10-11T00:47:25.232722" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:25.232566" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:25.218982" elapsed="0.013814"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.234032" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:25.233755" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:25.233508" elapsed="0.000595"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:25.233491" elapsed="0.000634"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.234703" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:25.234437" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:25.234173" elapsed="0.000602"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:25.234159" elapsed="0.000638"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.235341" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:25.234978" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:25.235655" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:25.235445" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.236153" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:25.235891" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:25.235729" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:25.235428" elapsed="0.000813"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.236768" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:25.236427" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:25.237064" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:25.236854" elapsed="0.000261"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.237588" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:25.237311" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:25.237136" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:25.236838" elapsed="0.000826"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:25.237810" elapsed="0.000289"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:47:25.238517" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:25.238268" elapsed="0.000273"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:47:25.238695" elapsed="0.000216"/>
</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-10-11T00:47:25.233126" elapsed="0.005841"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:47:25.239008" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:25.239180" 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-10-11T00:47:25.218106" elapsed="0.021109"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:25.239262" elapsed="0.000025"/>
</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-10-11T00:47:25.181656" elapsed="0.057703"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-10-11T00:47:25.180648" elapsed="0.058778"/>
</kw>
<doc>Verifies exabgp connected with md5 settings</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:47:08.742811" elapsed="16.496653"/>
</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-10-11T00:47:25.243396" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:25.243098" elapsed="0.000340"/>
</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-10-11T00:47:25.244743" level="INFO">Executing command 'cd '.' &amp;&amp; rm -rf /tmp/defaultvenv'.</msg>
<msg time="2026-10-11T00:47:25.297445" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:47:25.297821" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T00:47:25.297909" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T00:47:25.297994" 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-10-11T00:47:25.244588" elapsed="0.053453"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.299909" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T00:47:25.299335" elapsed="0.000672"/>
</kw>
<msg time="2026-10-11T00:47:25.300220" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T00:47:25.300313" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:25.298536" elapsed="0.001823"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.301660" 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-10-11T00:47:25.300783" elapsed="0.000931"/>
</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-10-11T00:47:25.303847" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:25.303324" elapsed="0.000612"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.304878" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:25.304378" elapsed="0.000582"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.305915" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:25.305402" elapsed="0.000606"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T00:47:25.302529" elapsed="0.003590"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:25.301879" elapsed="0.004330"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:25.301835" elapsed="0.004431"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T00:47:25.306613" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:25.306379" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:25.306345" elapsed="0.000406"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:47:25.307005" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-10-11T00:47:25.306856" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:25.306825" elapsed="0.000352"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:25.307564" elapsed="0.000046"/>
</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-10-11T00:47:25.244083" elapsed="0.063697"/>
</kw>
<msg time="2026-10-11T00:47:25.307880" 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-10-11T00:47:25.243598" elapsed="0.064405"/>
</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-10-11T00:47:25.242618" elapsed="0.065537"/>
</kw>
<msg time="2026-10-11T00:47:25.308273" 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-10-11T00:47:25.240871" elapsed="0.067513"/>
</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-10-11T00:47:25.240559" elapsed="0.068004"/>
</kw>
<doc>Deletes a directory with virtual env.</doc>
<status status="PASS" start="2026-10-11T00:47:25.240335" elapsed="0.068346"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-10-11T00:47:25.309006" elapsed="0.000734"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-10-11T00:47:25.310240" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects </doc>
<status status="PASS" start="2026-10-11T00:47:25.310068" elapsed="0.000385"/>
</kw>
<doc>Suite teardown keyword with old rib restoration</doc>
<status status="PASS" start="2026-10-11T00:47:25.240088" elapsed="0.070479"/>
</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-10-11T00:46:55.213529" elapsed="30.097102"/>
</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-10-11T00:47:25.353178" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:47:25.351638" elapsed="0.001596"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-10-11T00:47:25.351341" elapsed="0.001950"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.355574" 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-10-11T00:47:25.354278" elapsed="0.001322"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-10-11T00:47:25.355756" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:25.355673" elapsed="0.000121"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:25.355653" elapsed="0.000161"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.356330" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:47:25.355992" elapsed="0.000378"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.356826" 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-10-11T00:47:25.356548" elapsed="0.000302"/>
</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-10-11T00:47:25.357358" elapsed="0.000267"/>
</kw>
<msg time="2026-10-11T00:47:25.357711" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:25.357752" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:25.357012" elapsed="0.000761"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.358273" 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-10-11T00:47:25.357946" elapsed="0.000351"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.359198" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:47:25.358939" elapsed="0.000285"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.359630" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:47:25.359371" elapsed="0.000284"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.360098" 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-10-11T00:47:25.359830" elapsed="0.000293"/>
</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-10-11T00:47:25.361014" elapsed="0.000163"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.361647" level="INFO">${member_ip} = 10.30.170.173</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:25.361349" elapsed="0.000322"/>
</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-10-11T00:47:25.361834" elapsed="0.000170"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.362875" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:25.362475" elapsed="0.000425"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-11T00:47:25.362942" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T00:47:25.363070" 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-10-11T00:47:25.362181" elapsed="0.000911"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:47:25.363620" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x74344598fc10&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-10-11T00:47:25.363277" elapsed="0.000479"/>
</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-10-11T00:47:25.363919" elapsed="0.000149"/>
</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-10-11T00:47:25.360576" elapsed="0.003546"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:47:25.360382" elapsed="0.003779"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-10-11T00:47:25.360174" elapsed="0.004028"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.364907" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:47:25.364388" elapsed="0.000563"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.365517" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.173'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:47:25.365137" elapsed="0.000455"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.366117" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:47:25.365778" elapsed="0.000378"/>
</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-10-11T00:47:25.358553" elapsed="0.007668"/>
</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-10-11T00:47:25.353953" elapsed="0.012318"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:25.366433" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:25.366328" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:25.366312" elapsed="0.000182"/>
</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-10-11T00:47:25.367680" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:25.367340" elapsed="0.000365"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.368122" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:47:25.367856" elapsed="0.000290"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:47:25.368196" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:47:25.368325" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:47:25.367032" elapsed="0.001315"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:25.369207" level="INFO">${member_ip} = 10.30.170.173</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-10-11T00:47:25.368992" elapsed="0.000240"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:47:25.370028" 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-10-11T00:47:25.370120" 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-10-11T00:47:25.369873" elapsed="0.000271"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:25.372976" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:25.372445" elapsed="0.000628"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:25.372425" elapsed="0.000684"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:47:25.373809" 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-10-11T00:47:25.374026" 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-10-11T00:47:25.373369" elapsed="0.000705"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.375096" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.173" 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-10-11T00:47:25.374380" elapsed="0.000847"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:47:25.376356" 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-10-11T00:47:25.375553" elapsed="0.000851"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.378128" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:47:25.378304" 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-10-11T00:47:25.377809" elapsed="0.000536"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:25.378685" elapsed="0.000411"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:47:25.380210" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:47:25.976301" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 00:47:25 UTC 2026

  System load:  0.75               Processes:             128
  Usage of /:   14.1% of 77.35GB   Users logged in:       0
  Memory usage: 9%                 IPv4 address for ens3: 10.30.170.173
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:46:55 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:47:25.379960" elapsed="0.596605"/>
</kw>
<msg time="2026-10-11T00:47:25.976668" 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-10-11T00:47:25.379509" elapsed="0.597342"/>
</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-10-11T00:47:25.376834" elapsed="0.600200"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:47:25.978251" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-10-11T00:47:25.991520" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-10-11T00:47:25.991741" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T00:47:25.991874" 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-10-11T00:47:25.977608" elapsed="0.014332"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:47:25.992369" elapsed="0.000676"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:25.994755" 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-10-11T00:47:25.993963" elapsed="0.000959"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T00:47:25.995546" elapsed="0.000096"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:25.995159" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:25.995122" elapsed="0.000683"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:47:25.996200" elapsed="0.000111"/>
</return>
<status status="PASS" start="2026-10-11T00:47:25.995913" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:25.995891" elapsed="0.000616"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T00:47:25.996584" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:25.998425" elapsed="0.000592"/>
</kw>
<kw name="Open 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-10-11T00:47:25.999508" elapsed="0.000380"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:47:26.000272" elapsed="0.000315"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:47:25.997236" elapsed="0.003439"/>
</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-10-11T00:47:25.371764" elapsed="0.629059"/>
</kw>
<msg time="2026-10-11T00:47:26.000890" 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-10-11T00:47:25.371166" elapsed="0.629792"/>
</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-10-11T00:47:25.370784" elapsed="0.630274"/>
</kw>
<msg time="2026-10-11T00:47:26.001107" 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-10-11T00:47:25.370309" elapsed="0.630855"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:26.002103" elapsed="0.000451"/>
</kw>
<kw name="Open 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-10-11T00:47:26.002808" elapsed="0.000185"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:47:26.003203" 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-10-11T00:47:26.001638" elapsed="0.001754"/>
</kw>
<msg time="2026-10-11T00:47:26.003533" 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-10-11T00:47:25.369445" elapsed="0.634167"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:26.004230" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:26.003906" elapsed="0.000380"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-11T00:47:26.004339" elapsed="0.000038"/>
</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-10-11T00:47:25.368683" elapsed="0.635831"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:47:25.368520" elapsed="0.636042"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:47:25.368394" elapsed="0.636212"/>
</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-10-11T00:47:25.366694" elapsed="0.637983"/>
</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-10-11T00:47:26.004891" elapsed="0.000280"/>
</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-10-11T00:47:26.012566" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:26.012479" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:26.012461" elapsed="0.000167"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:47:26.012949" 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-10-11T00:47:26.013041" 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-10-11T00:47:26.012825" elapsed="0.000240"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:26.013514" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:26.013268" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:26.013961" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:26.013745" elapsed="0.000260"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:26.014723" 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-10-11T00:47:26.014540" elapsed="0.000294">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-10-11T00:47:26.014931" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T00:47:26.014971" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:26.014162" elapsed="0.000831"/>
</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-10-11T00:47:26.015293" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:26.015061" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:26.015044" elapsed="0.000338"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:26.016030" level="INFO">${ip_address} = 10.30.170.173</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-10-11T00:47:26.015824" elapsed="0.000231"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-10-11T00:47:26.016097" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:47:26.016234" level="INFO">${odl_ip} = 10.30.170.173</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-10-11T00:47:26.015581" elapsed="0.000676"/>
</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-10-11T00:47:26.016445" elapsed="0.000323"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:47:26.017075" level="INFO">index=4
host=10.30.170.173
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-10-11T00:47:26.017162" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.173
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-10-11T00:47:26.016978" elapsed="0.000222"/>
</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-10-11T00:47:26.017363" elapsed="0.000259"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-10-11T00:47:26.018003" level="INFO">Logging into '10.30.170.173:8101' as 'karaf'.</msg>
<msg time="2026-10-11T00:47:26.274014" 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-10-11T00:47:26.017809" elapsed="0.256400"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:26.275855" elapsed="0.000275"/>
</kw>
<kw name="Open 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-10-11T00:47:26.276328" elapsed="0.000164"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:47:26.276639" elapsed="0.000092"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:47:26.275489" elapsed="0.001290"/>
</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-10-11T00:47:26.274608" elapsed="0.002214"/>
</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-10-11T00:47:26.012230" elapsed="0.264638"/>
</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-10-11T00:47:26.006167" elapsed="0.270745"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:26.005646" elapsed="0.271315"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:47:26.005446" elapsed="0.271552"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-10-11T00:47:26.005259" elapsed="0.271774"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-10-11T00:47:25.353571" elapsed="0.923519"/>
</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-10-11T00:47:26.277975" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:26.277883" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:26.277863" elapsed="0.000178"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:26.279970" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:26.279886" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:26.279869" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:26.280899" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:26.280573" elapsed="0.000351"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:47:26.281352" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:47:26.281074" elapsed="0.000301"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:47:26.281433" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T00:47:26.281571" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:47:26.280254" elapsed="0.001339"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:26.284006" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:26.283922" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:26.283905" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:26.285114" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:26.285029" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:26.285012" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:26.285623" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:47:26.285336" elapsed="0.000312"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:47:26.286008" 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-10-11T00:47:26.285813" elapsed="0.000220"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:26.346959" 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-10-11T00:47:26.286718" elapsed="0.060385"/>
</kw>
<msg time="2026-10-11T00:47:26.347275" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:47:26.347317" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:26.286204" elapsed="0.061260"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:47:26.425255" 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-10-11T00:47:26.348230" elapsed="0.077165"/>
</kw>
<msg time="2026-10-11T00:47:26.425609" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:47:26.425651" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:26.347664" elapsed="0.078022"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:26.425991" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:26.425766" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:26.425742" elapsed="0.000416"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:26.426743" 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-10-11T00:47:26.426364" elapsed="0.000456"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:26.427299" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:26.427074" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:26.426863" elapsed="0.000723"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:47:26.427621" 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">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:26.429589" 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-10-11T00:47:26.430388" elapsed="0.000298"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:47:26.431011" elapsed="0.000231"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:47:26.428789" elapsed="0.002537"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:47:26.427940" elapsed="0.003532"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:47:26.284828" elapsed="0.146723"/>
</kw>
<msg time="2026-10-11T00:47:26.431634" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:26.431675" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:26.284237" elapsed="0.147473"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:47:26.431865" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:47:26.431780" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:26.431762" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:26.432321" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:26.432758" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:47:26.432823" 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-10-11T00:47:26.283692" elapsed="0.149216"/>
</kw>
<msg time="2026-10-11T00:47:26.432991" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:26.433031" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:26.281933" elapsed="0.151134"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:26.433371" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:26.433135" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:26.433118" elapsed="0.000373"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:47:26.281789" elapsed="0.151725"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:47:26.281644" elapsed="0.151901"/>
</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-10-11T00:47:26.279657" elapsed="0.153941"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-10-11T00:47:26.277707" elapsed="0.155941"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:26.277281" elapsed="0.156405"/>
</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-10-11T00:47:25.350974" elapsed="1.082761"/>
</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-10-11T00:47:26.433890" elapsed="0.000152"/>
</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-10-11T00:47:26.434232" elapsed="0.000149"/>
</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-10-11T00:47:26.435904" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:47:26.435974" 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-10-11T00:47:26.435639" elapsed="0.000356"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:26.436146" elapsed="0.000307"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:47:26.437229" level="INFO">Logging into '10.30.171.7:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:47:27.040142" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Sun Oct 11 00:47:26 UTC 2026

  System load:  0.09               Processes:             111
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.7
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:46:57 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:47:26.436980" elapsed="0.603301"/>
</kw>
<msg time="2026-10-11T00:47:27.040359" 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-10-11T00:47:26.436618" elapsed="0.603828"/>
</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-10-11T00:47:26.435250" elapsed="0.605308"/>
</kw>
<msg time="2026-10-11T00:47:27.040607" 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-10-11T00:47:26.434871" elapsed="0.605779"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-10-11T00:47:26.434584" elapsed="0.606134"/>
</kw>
<kw name="Require_Python" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:47:27.042449" level="INFO">Executing command 'python3 --help'.</msg>
<msg time="2026-10-11T00:47:27.055558" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:47:27.055671" 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-10-11T00:47:27.055712" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T00:47:27.055749" 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-10-11T00:47:27.042243" elapsed="0.013527"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.056913" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T00:47:27.056554" elapsed="0.000418"/>
</kw>
<msg time="2026-10-11T00:47:27.057091" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T00:47:27.057146" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:27.055954" elapsed="0.001220"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.057994" 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-10-11T00:47:27.057476" elapsed="0.000551"/>
</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-10-11T00:47:27.058551" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.058138" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.058106" elapsed="0.000628"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-10-11T00:47:27.058917" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-10-11T00:47:27.058808" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.058787" elapsed="0.000245"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-10-11T00:47:27.059143" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:27.059101" elapsed="0.000107"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:27.059081" elapsed="0.000155"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.059462" elapsed="0.000028"/>
</kw>
<msg time="2026-10-11T00:47:27.059633" 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-10-11T00:47:27.041853" elapsed="0.017812"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-10-11T00:47:27.059846" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-10-11T00:47:27.059750" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.059728" elapsed="0.000214"/>
</if>
<kw name="Fatal Error" owner="BuiltIn">
<arg>Python 3 is not installed!</arg>
<doc>Stops the whole execution.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.060132" elapsed="0.000026"/>
</kw>
<doc>Verify current SSH connection leads to machine with python working. Fatal fail otherwise.</doc>
<status status="PASS" start="2026-10-11T00:47:27.041436" elapsed="0.018808"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:47:27.061855" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-10-11T00:47:27.220086" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-10-11T00:47:27.220367" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T00:47:27.220508" 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-10-11T00:47:27.220603" 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-10-11T00:47:27.061645" elapsed="0.159005"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.222497" level="INFO">Length is 119.</msg>
<msg time="2026-10-11T00:47:27.222666" 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-10-11T00:47:27.221889" elapsed="0.000924">'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-10-11T00:47:27.223025" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-10-11T00:47:27.223110" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:27.221067" elapsed="0.002092"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.224516" 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-10-11T00:47:27.223618" elapsed="0.000953"/>
</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-10-11T00:47:27.226789" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:27.226212" elapsed="0.000665"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.227844" 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-10-11T00:47:27.227330" elapsed="0.000608"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.229322" level="INFO">1</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:27.228397" elapsed="0.001047"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T00:47:27.225343" elapsed="0.004218"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:27.224727" elapsed="0.004906"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.224686" elapsed="0.005000"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-10-11T00:47:27.229974" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-10-11T00:47:27.229796" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.229764" elapsed="0.000383"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-10-11T00:47:27.230347" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:27.230278" elapsed="0.000178"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:27.230247" elapsed="0.000254"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.230829" elapsed="0.000042"/>
</kw>
<msg time="2026-10-11T00:47:27.231096" 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-10-11T00:47:27.061093" elapsed="0.170053"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="NOT RUN" start="2026-10-11T00:47:27.231592" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:27.231314" elapsed="0.000364"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.231278" elapsed="0.000444"/>
</if>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T00:47:27.265765" level="INFO">[chan 3] Opened sftp connection (server version 3)</msg>
<msg time="2026-10-11T00:47:27.281905" 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-10-11T00:47:27.232093" elapsed="0.049960"/>
</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-10-11T00:47:27.060568" elapsed="0.221632"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T00:47:27.298871" 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-10-11T00:47:27.282631" elapsed="0.016360"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:47:27.299958" level="INFO">Creating Session using : alias=session, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7434458d0610&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-10-11T00:47:27.299474" elapsed="0.000839"/>
</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-10-11T00:47:27.301800" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:27.301608" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.301570" elapsed="0.000370"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:27.302709" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:47:27.302294" elapsed="0.000470"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:47:27.303486" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:47:27.303125" elapsed="0.000415"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:27.321717" 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-10-11T00:47:27.304731" elapsed="0.017103"/>
</kw>
<msg time="2026-10-11T00:47:27.322034" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:47:27.322124" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:27.303900" elapsed="0.018272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:47:27.330857" 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-10-11T00:47:27.323398" elapsed="0.007536"/>
</kw>
<msg time="2026-10-11T00:47:27.331056" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:47:27.331109" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:27.322624" elapsed="0.008519"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.331565" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.331252" elapsed="0.000383"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.331227" elapsed="0.000439"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.332273" 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-10-11T00:47:27.331949" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.332752" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.332442" elapsed="0.000377"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.332395" elapsed="0.000453"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:47:27.332889" 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-10-11T00:47:27.335027" elapsed="0.000152"/>
</kw>
<msg time="2026-10-11T00:47:27.335249" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:27.334401" 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-10-11T00:47:27.335597" elapsed="0.000035"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.335824" 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-10-11T00:47:27.333996" elapsed="0.001928"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:47:27.333328" elapsed="0.002707"/>
</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-10-11T00:47:27.301089" elapsed="0.035049"/>
</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-10-11T00:47:27.337020" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:27.336891" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.336869" elapsed="0.000238"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:27.337594" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:47:27.337337" elapsed="0.000291"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:47:27.338060" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:47:27.337873" elapsed="0.000219"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:27.408944" 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-10-11T00:47:27.338803" elapsed="0.070214"/>
</kw>
<msg time="2026-10-11T00:47:27.409128" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:47:27.409168" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:27.338326" elapsed="0.070878"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:47:27.411603" 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-10-11T00:47:27.410040" elapsed="0.001617"/>
</kw>
<msg time="2026-10-11T00:47:27.411744" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:47:27.411783" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:27.409402" elapsed="0.002406"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.412099" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.411880" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.411859" elapsed="0.000314"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.412645" 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-10-11T00:47:27.412397" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.412953" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.412749" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.412732" elapsed="0.000293"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:47:27.413059" 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-10-11T00:47:27.414621" elapsed="0.000112"/>
</kw>
<msg time="2026-10-11T00:47:27.414772" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:27.414165" 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="NOT RUN" start="2026-10-11T00:47:27.415007" elapsed="0.000025"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.415169" 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-10-11T00:47:27.413885" elapsed="0.001435"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:47:27.413397" elapsed="0.001964"/>
</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-10-11T00:47:27.336612" elapsed="0.078834"/>
</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-10-11T00:47:27.416064" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:27.415975" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.415954" elapsed="0.000171"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:27.416468" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:47:27.416286" elapsed="0.000206"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:47:27.416840" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:47:27.416703" elapsed="0.000160"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:27.473201" 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-10-11T00:47:27.417363" elapsed="0.055898"/>
</kw>
<msg time="2026-10-11T00:47:27.473358" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:47:27.473399" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:27.417023" elapsed="0.056413"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:47:27.475417" 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-10-11T00:47:27.473975" elapsed="0.001495"/>
</kw>
<msg time="2026-10-11T00:47:27.475558" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:47:27.475597" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:27.473613" elapsed="0.002009"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.475908" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.475689" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.475671" elapsed="0.000309"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.476447" 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-10-11T00:47:27.476202" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.476755" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.476552" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.476535" elapsed="0.000289"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:47:27.476854" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:47:27.478352" elapsed="0.000126"/>
</kw>
<msg time="2026-10-11T00:47:27.478517" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:27.477907" elapsed="0.000666"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.478750" elapsed="0.000019"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.478901" elapsed="0.000018"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:47:27.477631" elapsed="0.001341"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:47:27.477132" elapsed="0.001881"/>
</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-10-11T00:47:27.415764" elapsed="0.063319"/>
</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-10-11T00:47:25.350715" elapsed="2.128418"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.480852" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.480639" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.480617" elapsed="0.000308"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-10-11T00:47:27.480195" 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-10-11T00:47:27.481921" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:27.481838" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.481821" elapsed="0.000162"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:27.484091" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:27.484009" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.483992" elapsed="0.000160"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.485139" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:27.484810" elapsed="0.000354"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.485683" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:47:27.485400" elapsed="0.000307"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:47:27.485747" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:27.485873" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:47:27.484445" elapsed="0.001450"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:27.488456" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:27.488351" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.488333" elapsed="0.000186"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:27.489608" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:27.489516" elapsed="0.000135"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.489499" elapsed="0.000171"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:27.489979" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:47:27.489813" elapsed="0.000190"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:47:27.490310" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:47:27.490162" elapsed="0.000171"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:27.540085" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:47:27.490851" elapsed="0.049343"/>
</kw>
<msg time="2026-10-11T00:47:27.540348" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:47:27.540389" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:27.490508" elapsed="0.049934"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:47:27.606419" 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-10-11T00:47:27.540945" elapsed="0.065597"/>
</kw>
<msg time="2026-10-11T00:47:27.606708" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:47:27.606750" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:27.540611" elapsed="0.066174"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.607094" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.606863" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.606841" elapsed="0.000329"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.607651" 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-10-11T00:47:27.607374" elapsed="0.000342"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.609366" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.607775" elapsed="0.001661"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.607758" elapsed="0.001702"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:47:27.609492" 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-10-11T00:47:27.611928" elapsed="0.000115"/>
</kw>
<msg time="2026-10-11T00:47:27.612101" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:27.610904" elapsed="0.001343"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.612571" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.612905" 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-10-11T00:47:27.610295" elapsed="0.002838"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:47:27.609791" elapsed="0.003413"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:47:27.489230" elapsed="0.124050"/>
</kw>
<msg time="2026-10-11T00:47:27.613362" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:27.613402" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:27.488668" elapsed="0.124789"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:47:27.613611" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:47:27.613526" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.613508" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.614013" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.614327" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:47:27.614391" elapsed="0.000034"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:47:27.488027" elapsed="0.126470"/>
</kw>
<msg time="2026-10-11T00:47:27.614579" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:27.614618" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:27.486267" elapsed="0.128385"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.614936" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.614718" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.614703" elapsed="0.000303"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:47:27.486102" elapsed="0.128926"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:47:27.485951" elapsed="0.129108"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:47:27.483715" elapsed="0.131393"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:47:27.481580" elapsed="0.133576"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:27.481119" elapsed="0.134111"/>
</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-10-11T00:47:27.479784" elapsed="0.135495"/>
</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-10-11T00:47:27.631885" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:27.631578" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:27.632701" 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-10-11T00:47:27.632422" elapsed="0.000359">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-10-11T00:47:27.632866" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:27.632069" elapsed="0.000820"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.633387" 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-10-11T00:47:27.633060" elapsed="0.000371"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:27.633719" 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-10-11T00:47:27.633924" 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-10-11T00:47:27.633600" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.634393" 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-10-11T00:47:27.634146" 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-10-11T00:47:27.635679" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:27.635106" elapsed="0.000631"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.636393" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:47:27.635915" elapsed="0.000522"/>
</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-10-11T00:47:27.636793" 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-10-11T00:47:27.637539" elapsed="0.000048"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:47:27.637879" elapsed="0.000043"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:47:27.636609" elapsed="0.001426"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:47:27.636487" elapsed="0.001608"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:47:27.638137" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:27.638286" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:47:27.634768" elapsed="0.003542"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:27.634514" elapsed="0.003824"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.638533" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.638360" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.634496" elapsed="0.004107"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.639145" 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-10-11T00:47:27.638760" elapsed="0.000411"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:27.639237" 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-10-11T00:47:27.631042" elapsed="0.008300"/>
</kw>
<msg time="2026-10-11T00:47:27.639390" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:27.626706" elapsed="0.012750"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:27.643703" 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/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-10-11T00:47:27.647862" 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/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-10-11T00:47:27.651865" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.652080" 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-10-11T00:47:27.652302" 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-10-11T00:47:27.652733" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.652567" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:27.652550" 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-10-11T00:47:27.652959" 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-10-11T00:47:27.653135" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.653351" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:27.652517" elapsed="0.000900"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:27.652388" elapsed="0.001054"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.653597" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:27.653663" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:47:27.653771" 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-10-11T00:47:27.626017" elapsed="0.027778"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:27.654922" 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-10-11T00:47:27.654729" elapsed="0.000254">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-10-11T00:47:27.655066" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:27.654386" elapsed="0.000703"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.655387" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.655151" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.655912" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:27.655649" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:27.655476" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.655134" elapsed="0.000853"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.656540" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:27.656157" elapsed="0.000407"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:47:27.656609" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:27.656732" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:47:27.654063" elapsed="0.002691"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:27.657848" 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-10-11T00:47:27.657659" elapsed="0.000249">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-10-11T00:47:27.657990" 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-10-11T00:47:27.657322" elapsed="0.000690"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:47:27.658174" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-10-11T00:47:27.658075" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.658058" elapsed="0.000207"/>
</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-10-11T00:47:27.658439" elapsed="0.000020"/>
</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-10-11T00:47:27.658651" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:47:27.658710" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:47:27.658834" 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-10-11T00:47:27.657005" elapsed="0.001852"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.660111" 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-10-11T00:47:27.659882" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.660588" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:27.660355" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:47:27.673570" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:27.673735" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Sat, 10-Oct-2026 00:47:27 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-10-11T00:47:27.673920" 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-10-11T00:47:27.660917" elapsed="0.013040"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:27.660688" elapsed="0.013309"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.674177" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.674021" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.660671" elapsed="0.013612"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.675649" 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-10-11T00:47:27.675297" elapsed="0.000396"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:27.675009" elapsed="0.000715"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.674953" elapsed="0.000794"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.676327" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:27.676036" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:27.675797" elapsed="0.000602"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.675782" elapsed="0.000661"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.676988" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:27.676619" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.677301" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.677076" elapsed="0.000277"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.677825" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:27.677554" elapsed="0.000295"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:27.677375" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.677059" elapsed="0.000842"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.678462" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:27.678081" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.678756" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.678549" elapsed="0.000258"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.679261" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:27.678987" elapsed="0.000298"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:27.678829" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.678533" elapsed="0.000803"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:27.679493" elapsed="0.000289"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:47:27.680242" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:27.679975" elapsed="0.000292"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:47:27.680438" elapsed="0.000226"/>
</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-10-11T00:47:27.674632" elapsed="0.006088"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:27.680865" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:27.680783" elapsed="0.000122"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.680766" elapsed="0.000159"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:47:27.681689" 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-10-11T00:47:27.681066" elapsed="0.000651"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:47:27.681764" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:27.681897" 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-10-11T00:47:27.659135" elapsed="0.022792"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:27.681984" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:47:27.682107" 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-10-11T00:47:27.618510" elapsed="0.063621"/>
</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-10-11T00:47:27.693156" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:27.692446" elapsed="0.000750"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:27.695244" 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-10-11T00:47:27.694754" elapsed="0.000604">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-10-11T00:47:27.695499" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:27.693356" elapsed="0.002167"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.696335" 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-10-11T00:47:27.695695" elapsed="0.000666"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:27.696774" 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-10-11T00:47:27.696988" 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-10-11T00:47:27.696583" elapsed="0.000430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.697851" 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-10-11T00:47:27.697215" elapsed="0.000694"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:47:27.698533" elapsed="0.000075"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.697971" elapsed="0.000740"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.699559" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:27.698914" elapsed="0.000684"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:27.698738" elapsed="0.000935"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.697953" elapsed="0.001742"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.700687" 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-10-11T00:47:27.699870" elapsed="0.000844"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:27.700758" 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-10-11T00:47:27.691899" elapsed="0.008959"/>
</kw>
<msg time="2026-10-11T00:47:27.700905" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:27.687608" elapsed="0.013342"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:27.705117" 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/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-10-11T00:47:27.709101" 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/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-10-11T00:47:27.713238" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.713433" 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-10-11T00:47:27.713615" 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-10-11T00:47:27.713976" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.713832" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:27.713819" 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-10-11T00:47:27.714231" 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-10-11T00:47:27.714429" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.714593" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:27.713791" elapsed="0.000850"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:27.713681" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.714812" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:27.714877" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:47:27.714982" 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-10-11T00:47:27.686875" elapsed="0.028161"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:27.715216" elapsed="0.000331"/>
</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-10-11T00:47:27.716509" 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-10-11T00:47:27.716192" elapsed="0.000344"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:47:27.716951" 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-10-11T00:47:27.716685" 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-10-11T00:47:27.717156" elapsed="0.000316"/>
</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-10-11T00:47:27.715819" elapsed="0.001707"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:27.715616" elapsed="0.001941"/>
</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-10-11T00:47:27.717771" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.717579" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.715600" elapsed="0.002239"/>
</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-10-11T00:47:27.683103" elapsed="0.034778"/>
</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-10-11T00:47:27.682444" elapsed="0.035500"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:27.682218" elapsed="0.035765"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.682202" elapsed="0.035801"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:27.718033" elapsed="0.000026"/>
</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-10-11T00:47:27.617859" elapsed="0.100278"/>
</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-10-11T00:47:27.616340" elapsed="0.101866"/>
</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-10-11T00:47:27.615889" elapsed="0.102360"/>
</kw>
<arg>empty_topology</arg>
<arg>timeout=180s</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="PASS" start="2026-10-11T00:47:27.615517" elapsed="0.102781"/>
</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-10-11T00:47:27.718862" elapsed="0.000232"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:47:27.718565" elapsed="0.000585"/>
</kw>
<doc>Sanity check example-ipv4-topology is up but empty.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:47:27.479235" elapsed="0.239973"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.720663" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.720457" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.720439" elapsed="0.000296"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-10-11T00:47:27.720266" elapsed="0.000510"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:27.721789" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:27.721686" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.721665" 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-10-11T00:47:27.724042" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:27.723959" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.723941" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.725020" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:27.724699" elapsed="0.000349"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.725516" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:47:27.725236" elapsed="0.000304"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:47:27.725579" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:27.725703" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:47:27.724332" elapsed="0.001393"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:27.728250" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:27.728147" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.728129" elapsed="0.000183"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:27.729341" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:27.729258" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.729241" elapsed="0.000179"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:27.729738" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:47:27.729569" elapsed="0.000192"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:47:27.730066" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:47:27.729927" elapsed="0.000162"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:27.786438" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:47:27.730627" elapsed="0.055952"/>
</kw>
<msg time="2026-10-11T00:47:27.786769" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:47:27.786811" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:27.730277" elapsed="0.056569"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:47:27.830010" 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-10-11T00:47:27.787513" elapsed="0.042596"/>
</kw>
<msg time="2026-10-11T00:47:27.830267" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:47:27.830308" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:27.787065" elapsed="0.043277"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.830686" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.830443" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.830399" elapsed="0.000362"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.831175" 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-10-11T00:47:27.830945" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.831532" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.831316" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.831298" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:47:27.831635" 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-10-11T00:47:27.834288" elapsed="0.000132"/>
</kw>
<msg time="2026-10-11T00:47:27.834531" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:27.833088" elapsed="0.001583"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.834976" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.835323" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:47:27.832469" 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-10-11T00:47:27.831953" 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-10-11T00:47:27.728986" elapsed="0.106677"/>
</kw>
<msg time="2026-10-11T00:47:27.835744" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:27.835783" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:27.728475" elapsed="0.107343"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:47:27.835976" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:47:27.835886" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.835868" elapsed="0.000186"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.836463" 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-10-11T00:47:27.836780" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:47:27.836843" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:47:27.727865" elapsed="0.109062"/>
</kw>
<msg time="2026-10-11T00:47:27.837010" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:27.837061" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:27.726048" elapsed="0.111047"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.837396" elapsed="0.000094"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.837162" elapsed="0.000359"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.837146" elapsed="0.000396"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:47:27.725908" elapsed="0.111656"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:47:27.725771" elapsed="0.111825"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:47:27.723664" elapsed="0.113983"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:47:27.721361" elapsed="0.116337"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:27.720923" elapsed="0.116818"/>
</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-10-11T00:47:27.719886" elapsed="0.117904"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.838568" level="INFO">&amp;{mapping} = { IP=10.30.171.7 | HOLDTIME=180 | PEER_PORT=17900 | PASSIVE_MODE=false | BGP_RIB_OPENCONFIG=example-bgp-rib | LOCAL=10.30.170.173 }</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-10-11T00:47:27.838005" elapsed="0.000590"/>
</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-10-11T00:47:27.848868" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:27.848562" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:27.849607" 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-10-11T00:47:27.849383" elapsed="0.000305">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-10-11T00:47:27.849814" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:27.849055" elapsed="0.000781"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.850329" 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-10-11T00:47:27.850008" elapsed="0.000346"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:27.850647" 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-10-11T00:47:27.850786" 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-10-11T00:47:27.850533" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.851243" 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-10-11T00:47:27.851009" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.852372" level="INFO">mapping: {'IP': '10.30.171.7', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'false', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'LOCAL': '10.30.170.173'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:27.851949" elapsed="0.000481"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.852859" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:47:27.852610" elapsed="0.000272"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.853518" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:27.853233" elapsed="0.000308"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:27.854232" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:27.854023" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:27.854300" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:27.854441" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:27.853713" elapsed="0.000751"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:27.854629" elapsed="0.000186"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:47:27.853084" elapsed="0.001767"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.855365" 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-10-11T00:47:27.855078" elapsed="0.000311"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:27.856060" 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-10-11T00:47:27.855885" elapsed="0.000198"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:27.856127" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:27.856261" 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-10-11T00:47:27.855573" elapsed="0.000711"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:27.856460" elapsed="0.000166"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:47:27.854950" elapsed="0.001711"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.857156" 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-10-11T00:47:27.856886" elapsed="0.000308"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:27.857865" 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-10-11T00:47:27.857689" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:27.857931" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:27.858060" 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-10-11T00:47:27.857361" elapsed="0.000721"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:27.858275" elapsed="0.000187"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:47:27.856758" elapsed="0.001741"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.859027" 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-10-11T00:47:27.858762" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:27.859742" 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-10-11T00:47:27.859561" elapsed="0.000211"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:27.859816" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:27.859940" 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-10-11T00:47:27.859231" elapsed="0.000731"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:27.860123" elapsed="0.000178"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:47:27.858632" elapsed="0.001706"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.860845" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:27.860581" elapsed="0.000288"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:27.861570" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:27.861372" elapsed="0.000222"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:27.861638" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:27.861759" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:27.861036" elapsed="0.000745"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:27.861943" elapsed="0.000175"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:47:27.860452" elapsed="0.001703"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.862832" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:27.862401" elapsed="0.000456"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:27.863557" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:27.863343" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:27.863623" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:27.863744" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:27.863025" elapsed="0.000741"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:27.863935" elapsed="0.000163"/>
</kw>
<var name="${key}">LOCAL</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T00:47:27.862268" elapsed="0.001866"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:47:27.852931" elapsed="0.011234"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:47:27.864215" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:47:27.864343" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'false', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'LOCAL': '10.30.170.173'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:47:27.851613" elapsed="0.012754"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:27.851346" elapsed="0.013049"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.864581" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.864432" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.851329" elapsed="0.013319"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.865433" 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-10-11T00:47:27.864804" elapsed="0.000656"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:27.865504" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:27.848030" elapsed="0.017572"/>
</kw>
<msg time="2026-10-11T00:47:27.865649" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:27.843787" elapsed="0.021904"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:27.869711" 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/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-10-11T00:47:27.873682" 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/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-10-11T00:47:27.877627" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.877806" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.877986" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.878335" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.878175" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:27.878162" 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-10-11T00:47:27.878576" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.878754" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.878914" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:27.878137" elapsed="0.000823"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:27.878050" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.879132" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:27.879211" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:47:27.879321" 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-10-11T00:47:27.843175" elapsed="0.036170"/>
</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-10-11T00:47:27.888178" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:27.887873" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:27.888874" 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-10-11T00:47:27.888706" elapsed="0.000226">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-10-11T00:47:27.889014" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:27.888372" elapsed="0.000664"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.889575" 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-10-11T00:47:27.889251" elapsed="0.000349"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:27.889884" 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-10-11T00:47:27.890004" 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-10-11T00:47:27.889775" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.890481" 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-10-11T00:47:27.890246" 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-10-11T00:47:27.890995" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.890597" elapsed="0.000453"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.891536" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PASSIVE_MODE': 'false', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'LOCAL': '10.30.170.173'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:27.891252" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:27.891072" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.890580" elapsed="0.001034"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.892451" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflecto...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:27.891773" elapsed="0.000707"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:27.892525" 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_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-10-11T00:47:27.887358" elapsed="0.005269"/>
</kw>
<msg time="2026-10-11T00:47:27.892679" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:27.883123" elapsed="0.009599"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:27.896750" 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/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-10-11T00:47:27.900718" 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/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-10-11T00:47:27.904787" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.904968" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.905148" 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-10-11T00:47:27.905514" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.905352" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:27.905338" 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-10-11T00:47:27.905743" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.905920" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.906081" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:27.905314" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:27.905225" elapsed="0.000926"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.906317" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:27.906383" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:47:27.906519" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflecto...</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-10-11T00:47:27.882429" elapsed="0.024117"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:27.907689" 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-10-11T00:47:27.907472" elapsed="0.000277">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-10-11T00:47:27.907833" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:27.907117" elapsed="0.000739"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.908137" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.907918" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.908663" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:27.908386" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:27.908222" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.907901" elapsed="0.000837"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.909254" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:27.908904" elapsed="0.000373"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:47:27.909321" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:27.909461" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:47:27.906819" elapsed="0.002665"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.910715" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:27.910493" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.911218" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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.173&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-10-11T00:47:27.910989" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.911705" 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-10-11T00:47:27.911476" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.912151" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:27.911937" elapsed="0.000266"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:27.912937" 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-10-11T00:47:27.912773" elapsed="0.000188"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:47:27.913454" 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-10-11T00:47:27.913114" elapsed="0.000365"/>
</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-10-11T00:47:27.913642" elapsed="0.000156"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.914222" 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-10-11T00:47:27.913988" elapsed="0.000275"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:47:27.914300" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:27.914442" 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-10-11T00:47:27.912389" elapsed="0.002077"/>
</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-10-11T00:47:27.939617" level="INFO">PUT Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Content-Length': '1135', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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.173&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-10-11T00:47:27.939680" level="INFO">PUT Response : url=http://10.30.170.173: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.171.7 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:27.939763" 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-10-11T00:47:27.914767" elapsed="0.025019"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:27.914528" elapsed="0.025298"/>
</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-10-11T00:47:27.940003" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.939850" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.914512" elapsed="0.025575"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.941297" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:27.941014" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:27.940762" elapsed="0.000605"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.940745" elapsed="0.000645"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.941957" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:27.941695" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:27.941457" elapsed="0.000572"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.941441" elapsed="0.000610"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.942604" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:27.942242" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.942900" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.942692" elapsed="0.000260"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.943421" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:27.943131" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:27.942974" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.942675" elapsed="0.000824"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.944003" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:27.943671" elapsed="0.000358"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.944312" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.944090" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.944829" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:27.944559" elapsed="0.000294"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:27.944386" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.944074" elapsed="0.000830"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:27.945045" elapsed="0.000304"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:47:27.945751" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:27.945525" elapsed="0.000249"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:47:27.945926" elapsed="0.000220"/>
</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-10-11T00:47:27.940475" elapsed="0.005741"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:47:27.946357" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:47:27.946276" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.946260" elapsed="0.000190"/>
</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-10-11T00:47:27.946599" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:47:27.946659" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:47:27.946817" 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-10-11T00:47:27.909785" elapsed="0.037056"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:27.946896" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:47:27.947016" 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-10-11T00:47:27.839472" elapsed="0.107566"/>
</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-10-11T00:47:27.947349" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.947127" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.947111" elapsed="0.000370"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:27.947515" elapsed="0.000024"/>
</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-10-11T00:47:27.838836" elapsed="0.108777"/>
</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-10-11T00:47:27.948814" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.948465" elapsed="0.000406"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.948448" elapsed="0.000444"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:27.949030" elapsed="0.000304"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.952846" 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-10-11T00:47:27.952395" elapsed="0.000477"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-10-11T00:47:27.953045" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-10-11T00:47:27.952939" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.952921" elapsed="0.000202"/>
</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-10-11T00:47:27.953298" elapsed="0.000020"/>
</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-10-11T00:47:27.953491" 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-10-11T00:47:27.953662" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.953824" elapsed="0.000018"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.953986" elapsed="0.000018"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message of the current test case.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.954151" elapsed="0.000017"/>
</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-10-11T00:47:27.954364" elapsed="0.000018"/>
</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-10-11T00:47:27.952068" elapsed="0.002381"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:27.948219" elapsed="0.006278"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-10-11T00:47:27.947862" elapsed="0.006673"/>
</kw>
<doc>Configure ibgp peer with local-address.</doc>
<status status="PASS" start="2026-10-11T00:47:27.719424" elapsed="0.235146"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:27.956038" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:27.955839" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.955823" elapsed="0.000288"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-10-11T00:47:27.955670" elapsed="0.000483"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:27.957060" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:27.956978" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.956961" elapsed="0.000160"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:27.959084" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:27.959002" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.958986" elapsed="0.000159"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.960060" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:27.959737" elapsed="0.000348"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:47:27.960531" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:47:27.960253" elapsed="0.000302"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:47:27.960627" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:27.960754" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:47:27.959365" elapsed="0.001411"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:27.963373" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:27.963289" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.963271" elapsed="0.000181"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:27.964508" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:27.964421" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:27.964385" elapsed="0.000184"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:27.964884" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:47:27.964717" elapsed="0.000191"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:47:27.965249" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:47:27.965069" elapsed="0.000204"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:28.009541" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:47:27.965777" elapsed="0.043893"/>
</kw>
<msg time="2026-10-11T00:47:28.009848" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:47:28.009890" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:27.965444" elapsed="0.044481"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:47:28.038428" 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-10-11T00:47:28.010564" elapsed="0.027971"/>
</kw>
<msg time="2026-10-11T00:47:28.038688" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:47:28.038729" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:28.010132" elapsed="0.028632"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:28.039069" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:28.038845" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:28.038821" elapsed="0.000323"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:28.039681" 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-10-11T00:47:28.039447" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:28.040011" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:28.039809" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:28.039792" elapsed="0.000290"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:47:28.040116" 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-10-11T00:47:28.042752" elapsed="0.000118"/>
</kw>
<msg time="2026-10-11T00:47:28.042927" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:28.041685" elapsed="0.001380"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:28.043421" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:28.043759" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:47:28.041013" 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-10-11T00:47:28.040518" 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-10-11T00:47:27.964132" elapsed="0.079992"/>
</kw>
<msg time="2026-10-11T00:47:28.044230" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:28.044282" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:27.963606" elapsed="0.080721"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:47:28.044545" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:47:28.044443" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:28.044392" 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-10-11T00:47:28.044954" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:28.045314" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:47:28.045387" 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-10-11T00:47:27.962986" elapsed="0.082511"/>
</kw>
<msg time="2026-10-11T00:47:28.045584" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:28.045626" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:27.961102" elapsed="0.084558"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:28.045951" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:28.045729" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:28.045713" elapsed="0.000308"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:47:27.960961" elapsed="0.085083"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:47:27.960823" elapsed="0.085252"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:47:27.958715" elapsed="0.087413"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:47:27.956729" elapsed="0.089449"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:27.956315" elapsed="0.089933"/>
</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-10-11T00:47:27.955286" elapsed="0.091024"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:28.046912" level="INFO">${speaker_args} = --amount 3 --listen --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:28.046589" elapsed="0.000348"/>
</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-10-11T00:47:28.048475" level="INFO">${command} = python3 play.py --amount 3 --listen --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:28.047947" elapsed="0.000556"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:28.048916" level="INFO">python3 play.py --amount 3 --listen --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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-10-11T00:47:28.048700" elapsed="0.000259"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:28.053050" level="INFO">python3 play.py --amount 3 --listen --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --debug &amp;&gt; play.py.out</msg>
<msg time="2026-10-11T00:47:28.053134" level="INFO">${output} =  python3 play.py --amount 3 --listen --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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-10-11T00:47:28.049114" elapsed="0.004045"/>
</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-10-11T00:47:28.047645" elapsed="0.005596"/>
</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-10-11T00:47:28.054640" 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-10-11T00:47:28.054348" elapsed="0.000317"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:28.055168" level="INFO">${url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:28.054859" elapsed="0.000354"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:47:28.061874" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:28.062038" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T00:47:28.062156" level="FAIL">Url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T00:47:28.055417" elapsed="0.007595">Url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig Expected status: 409 != 200</status>
</kw>
<return>
<value>${response.content}</value>
<status status="NOT RUN" start="2026-10-11T00:47:28.063077" elapsed="0.000018"/>
</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-10-11T00:47:28.053940" elapsed="0.009267">Url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T00:47:30.066088" 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-10-11T00:47:30.065344" elapsed="0.000810"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:30.067338" level="INFO">${url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:30.066590" elapsed="0.000804"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:47:30.079159" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:30.079531" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T00:47:30.079759" level="FAIL">Url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T00:47:30.067775" elapsed="0.012951">Url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig Expected status: 409 != 200</status>
</kw>
<return>
<value>${response.content}</value>
<status status="NOT RUN" start="2026-10-11T00:47:30.080878" elapsed="0.000046"/>
</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-10-11T00:47:30.064095" elapsed="0.017026">Url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T00:47:32.084110" 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-10-11T00:47:32.083350" elapsed="0.000845"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:32.085369" level="INFO">${url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:32.084609" elapsed="0.000847"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:47:32.096912" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:32.097234" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T00:47:32.097497" level="FAIL">Url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T00:47:32.085806" elapsed="0.012785">Url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig Expected status: 409 != 200</status>
</kw>
<return>
<value>${response.content}</value>
<status status="NOT RUN" start="2026-10-11T00:47:32.098744" elapsed="0.000044"/>
</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-10-11T00:47:32.082066" elapsed="0.016914">Url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T00:47:34.101820" 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-10-11T00:47:34.101043" elapsed="0.000845"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.103094" level="INFO">${url} = /rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:34.102325" elapsed="0.000824"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:47:34.122869" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:34.123248" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1989'} 
 body={"bgp-rib:peer":[{"peer-id":"bgp://10.30.171.7","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.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"}}}]}}]},"peer-role":"ibgp"}]} 
 </msg>
<msg time="2026-10-11T00:47:34.123540" 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-10-11T00:47:34.103551" elapsed="0.020046"/>
</kw>
<return>
<value>${response.content}</value>
<status status="PASS" start="2026-10-11T00:47:34.123715" elapsed="0.000084"/>
</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-10-11T00:47:34.099868" elapsed="0.024254"/>
</kw>
<msg time="2026-10-11T00:47:34.124337" level="INFO">${message} = {"bgp-rib:peer":[{"peer-id":"bgp://10.30.171.7","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-10-11T00:47:28.053461" elapsed="6.070930"/>
</kw>
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:47:34.124535" elapsed="0.000057"/>
</return>
<msg time="2026-10-11T00:47:34.124813" level="INFO">${output} = {"bgp-rib:peer":[{"peer-id":"bgp://10.30.171.7","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-10-11T00:47:28.047143" elapsed="6.077726"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.125904" level="INFO">{"bgp-rib:peer":[{"peer-id":"bgp://10.30.171.7","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.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"}}}]}}]},"peer-role":"ibgp"}]}</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:34.125350" elapsed="0.000777"/>
</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-10-11T00:47:34.127486" elapsed="0.000519"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:47:34.126757" elapsed="0.001378"/>
</kw>
<doc>Verify that peer is present in odl's rib under local-address ip.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:47:27.954773" elapsed="6.173466"/>
</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-10-11T00:47:34.131278" elapsed="0.000492"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:47:34.130672" elapsed="0.001208"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:34.134004" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:34.133796" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.133752" elapsed="0.000394"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:34.138682" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:34.138495" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.138456" elapsed="0.000362"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.140920" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:34.140136" elapsed="0.000840"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.141952" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:47:34.141340" elapsed="0.000665"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:47:34.142094" elapsed="0.000060"/>
</return>
<msg time="2026-10-11T00:47:34.142395" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:47:34.139302" elapsed="0.003174"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:34.148486" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:34.148260" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.148218" elapsed="0.000411"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:34.151067" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:34.150878" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.150840" elapsed="0.000389"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:34.151979" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:47:34.151593" elapsed="0.000441"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:47:34.152781" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:47:34.152468" elapsed="0.000366"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:34.199096" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:47:34.154078" elapsed="0.045176"/>
</kw>
<msg time="2026-10-11T00:47:34.199497" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:47:34.199557" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:34.153207" elapsed="0.046399"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:47:34.225446" 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-10-11T00:47:34.200354" elapsed="0.025209"/>
</kw>
<msg time="2026-10-11T00:47:34.225729" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:47:34.225771" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:34.199848" elapsed="0.025959"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.226131" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:34.225884" elapsed="0.000368"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.225862" elapsed="0.000416"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.226752" 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-10-11T00:47:34.226483" elapsed="0.000327"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.227073" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:34.226871" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.226854" elapsed="0.000288"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:47:34.227187" 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-10-11T00:47:34.229690" elapsed="0.000117"/>
</kw>
<msg time="2026-10-11T00:47:34.229864" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:34.228659" elapsed="0.001345"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.230320" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.230747" 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-10-11T00:47:34.228027" 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-10-11T00:47:34.227532" elapsed="0.003463"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:47:34.150260" elapsed="0.080810"/>
</kw>
<msg time="2026-10-11T00:47:34.231155" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:34.231206" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:34.148970" elapsed="0.082274"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:47:34.231399" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-10-11T00:47:34.231313" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.231296" 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-10-11T00:47:34.231844" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.232159" elapsed="0.000044"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:47:34.232255" 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-10-11T00:47:34.147589" elapsed="0.084772"/>
</kw>
<msg time="2026-10-11T00:47:34.232489" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:34.232540" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:34.143246" elapsed="0.089340"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.232900" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:34.232674" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.232653" elapsed="0.000319"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:47:34.142905" elapsed="0.090089"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:47:34.142588" elapsed="0.090438"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:47:34.137789" elapsed="0.095288"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:47:34.133161" elapsed="0.099967"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:34.132239" elapsed="0.100944"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:47:34.129844" elapsed="0.103390"/>
</kw>
<kw name="Kill_BGP_Speaker" owner="BGPSpeaker">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.234550" 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-10-11T00:47:34.234189" elapsed="0.000419"/>
</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-10-11T00:47:34.234763" elapsed="0.000382"/>
</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-10-11T00:47:34.233889" elapsed="0.001329"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:47:34.260031" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-423-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-10-11T00:47:34.235739" elapsed="0.024348"/>
</kw>
<msg time="2026-10-11T00:47:34.260185" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:34.260226" level="INFO">${message} = [?2004l^C
[?2004h[jenkins@releng-26932-423-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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:34.235386" elapsed="0.024864"/>
</kw>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:47:34.260868" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-10-11T00:47:34.273420" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:47:34.273508" level="INFO">${output_log} = 2026-10-11 00:47:28,169 INFO BGP-Thread-1 (job): Connecting in the listening mode.
2026-10-11 00:47:28,170 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 00:47:28,170 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-10-11T00:47:34.260753" elapsed="0.012779"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.273957" level="INFO">2026-10-11 00:47:28,169 INFO BGP-Thread-1 (job): Connecting in the listening mode.
2026-10-11 00:47:28,170 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 00:47:28,170 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 00:47:32,987 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:47:32,991 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:47:32,991 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:47:32,991 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:47:32,992 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 3
2026-10-11 00:47:32,992 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-10-11 00:47:32,992 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 00:47:32,992 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 00:47:32,992 INFO BGP-Thread-1 (job):   My BGP Identifier: 169782023
2026-10-11 00:47:32,992 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 00:47:32,992 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 00:47:32,992 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 00:47:32,992 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 00:47:32,992 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 00:47:32,992 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 00:47:32,992 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 3
2026-10-11 00:47:32,992 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, 2]
2026-10-11 00:47:32,992 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 00:47:32,992 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 00:47:32,993 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 00:47:32,993 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:47:32,993 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-10-11 00:47:32,993 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 00:47:32,993 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 00:47:32,993 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-10-11 00:47:32,993 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 00:47:32,993 DEBUG BGP-Thread-1 (job):   BGP Identifier=169782023 (0x0a1eab07)
2026-10-11 00:47:32,993 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-10-11 00:47:32,993 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf0
2026-10-11 00:47:32,993 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf000b40a1eab07100206010400010001020641040000fbf0'
2026-10-11 00:47:32,993 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf000b40a1eab07100206010400010001020641040000fbf0
2026-10-11 00:47:32,996 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:47:32,996 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:47:32,996 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:47:32,996 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:47:32,996 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:47:32,996 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:47:32,996 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:47:32,996 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:47:32,996 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:47:32,996 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:47:32,996 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 00:47:32,997 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 3
2026-10-11 00:47:32,997 DEBUG BGP-Thread-1 (job): ########## Iteration: 0 ##########
2026-10-11 00:47:32,997 DEBUG BGP-Thread-1 (job): Remaining prefixes: 3
2026-10-11 00:47:32,997 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:47:32,997 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:47:32,997 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-10-11 00:47:32,997 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:47:32,997 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:47:32,997 DEBUG BGP-Thread-1 (job):   Prefix indexes: [0]
2026-10-11 00:47:32,997 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.0.1.0')]
2026-10-11 00:47:32,997 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:47:32,997 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-10-11 00:47:32,997 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:47:32,997 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:47:32,997 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:47:32,998 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:47:32,998 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:47:32,998 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:47:32,998 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-10-11 00:47:32,998 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:47:32,998 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:47:32,998 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:47:32,998 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-10-11 00:47:32,998 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-10-11 00:47:32,998 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:47:32,998 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:47:32,998 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:47:32,998 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.0.1.0')]/28 (0x1c08000100)
2026-10-11 00:47:32,998 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08000100
2026-10-11 00:47:32,999 DEBUG BGP-Thread-1 (job): ########## Iteration: 1 ##########
2026-10-11 00:47:32,999 DEBUG BGP-Thread-1 (job): Remaining prefixes: 2
2026-10-11 00:47:32,999 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:47:32,999 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:47:32,999 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-10-11 00:47:32,999 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:47:32,999 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:47:32,999 DEBUG BGP-Thread-1 (job):   Prefix indexes: [1]
2026-10-11 00:47:32,999 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.0.1.16')]
2026-10-11 00:47:32,999 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:47:32,999 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-10-11 00:47:32,999 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:47:32,999 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:47:32,999 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:47:32,999 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:47:33,000 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:47:33,000 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:47:33,000 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-10-11 00:47:33,000 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:47:33,000 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:47:33,000 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:47:33,000 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-10-11 00:47:33,000 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-10-11 00:47:33,000 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:47:33,000 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:47:33,000 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:47:33,000 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.0.1.16')]/28 (0x1c08000110)
2026-10-11 00:47:33,000 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08000110
2026-10-11 00:47:33,000 DEBUG BGP-Thread-1 (job): ########## Iteration: 2 ##########
2026-10-11 00:47:33,000 DEBUG BGP-Thread-1 (job): Remaining prefixes: 1
2026-10-11 00:47:33,001 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:47:33,001 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:47:33,001 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-10-11 00:47:33,001 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:47:33,001 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:47:33,001 DEBUG BGP-Thread-1 (job):   Prefix indexes: [2]
2026-10-11 00:47:33,001 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.0.1.32')]
2026-10-11 00:47:33,001 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:47:33,001 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-10-11 00:47:33,001 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:47:33,001 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:47:33,001 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:47:33,001 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:47:33,001 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:47:33,001 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:47:33,001 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-10-11 00:47:33,002 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:47:33,002 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:47:33,002 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:47:33,002 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-10-11 00:47:33,002 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-10-11 00:47:33,002 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:47:33,002 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:47:33,002 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:47:33,002 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.0.1.32')]/28 (0x1c08000120)
2026-10-11 00:47:33,002 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08000120
2026-10-11 00:47:33,002 INFO BGP-Thread-1 (job): All update messages generated.
2026-10-11 00:47:33,002 INFO BGP-Thread-1 (job): Storing performance results.
2026-10-11 00:47:33,002 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-10-11 00:47:33,002 INFO BGP-Thread-1 (job): Number of iterations: 3
2026-10-11 00:47:33,002 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-10-11 00:47:33,002 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-10-11 00:47:33,003 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 3
2026-10-11 00:47:33,003 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.0053691864013671875s
2026-10-11 00:47:33,003 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-10-11 00:47:33,003 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-10-11 00:47:33,003 INFO BGP-Thread-1 (job):   
2026-10-11 00:47:33,003 INFO BGP-Thread-1 (job):   
2026-10-11 00:47:33,003 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-10-11 00:47:33,003 INFO BGP-Thread-1 (job):   
2026-10-11 00:47:33,003 INFO BGP-Thread-1 (job):   
2026-10-11 00:47:33,003 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-10-11 00:47:33,003 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:47:33,004 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:47:33,004 DEBUG BGP-Thread-1 (job):   Length=43 (0x002b)
2026-10-11 00:47:33,004 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:47:33,004 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:47:33,004 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:47:33,004 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=20 (0x0014)
2026-10-11 00:47:33,004 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064)
2026-10-11 00:47:33,004 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:47:33,004 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:47:33,004 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:47:33,004 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-10-11 00:47:33,004 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff002b02000000144001010040020602010000fbf040050400000064
2026-10-11 00:47:33,004 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:47:33,004 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:47:33,004 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:47:33,011 INFO BGP-Thread-1 (job): ... idle for 0.006s
2026-10-11 00:47:33,011 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.006s
2026-10-11 00:47:33,011 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 00:47:33,011 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:47:33,011 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:47:33,011 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 00:47:33,011 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:47:33,011 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:47:33,012 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:47:33,012 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:47:33,012 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:47:33,012 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:47:33,012 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:47:33,012 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:47:33,012 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:47:33,012 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:47:33,012 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:47:33,012 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:47:33,012 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-10-11 00:47:33,012 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-10-11 00:47:33,012 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:47:33,012 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:47:33,012 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-10-11T00:47:34.273731" elapsed="0.000455"/>
</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-10-11T00:47:34.260447" elapsed="0.013807"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<status status="PASS" start="2026-10-11T00:47:34.274401" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-10-11T00:47:34.274312" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.274295" elapsed="0.000199"/>
</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-10-11T00:47:34.274679" elapsed="0.000020"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was not seen within timeout period.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.274845" elapsed="0.000019"/>
</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-10-11T00:47:34.233585" elapsed="0.041330"/>
</kw>
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.275719" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:47:34.275428" elapsed="0.000330"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-10-11T00:47:34.275088" elapsed="0.000722"/>
</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-10-11T00:47:34.276335" elapsed="0.000213"/>
</kw>
<doc>This is just a more readable 'None' to override [Teardown].</doc>
<status status="PASS" start="2026-10-11T00:47:34.276041" elapsed="0.000556"/>
</kw>
<doc>Abort the Python speaker. Also, attempt to stop failing fast.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:47:34.128700" elapsed="0.147931"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.278292" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:34.278046" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.278029" elapsed="0.000342"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-10-11T00:47:34.277874" 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-10-11T00:47:34.279354" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:34.279262" elapsed="0.000134"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.279241" 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-10-11T00:47:34.281689" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:34.281606" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.281588" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.282711" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:34.282366" elapsed="0.000370"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.283180" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:47:34.282901" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:47:34.283252" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:34.283379" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:47:34.281958" elapsed="0.001467"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:34.285914" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:34.285831" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.285813" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:34.287035" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:34.286945" elapsed="0.000133"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.286927" elapsed="0.000171"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:34.287494" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:47:34.287296" elapsed="0.000223"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:47:34.287817" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:47:34.287682" elapsed="0.000158"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:34.332030" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:47:34.288339" elapsed="0.043845"/>
</kw>
<msg time="2026-10-11T00:47:34.332340" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:47:34.332382" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:34.287995" elapsed="0.044443"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:47:34.363866" 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-10-11T00:47:34.332947" elapsed="0.031014"/>
</kw>
<msg time="2026-10-11T00:47:34.364109" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:47:34.364150" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:34.332610" elapsed="0.031588"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.364496" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:34.364269" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.364251" elapsed="0.000319"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.364979" 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-10-11T00:47:34.364753" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.365314" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:34.365101" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.365085" elapsed="0.000301"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:47:34.365430" 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-10-11T00:47:34.367825" elapsed="0.000233"/>
</kw>
<msg time="2026-10-11T00:47:34.368116" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:34.366766" 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-10-11T00:47:34.368588" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.368923" 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-10-11T00:47:34.366158" elapsed="0.002951"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:47:34.365705" elapsed="0.003473"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:47:34.286687" elapsed="0.082566"/>
</kw>
<msg time="2026-10-11T00:47:34.369334" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:34.369373" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:34.286126" elapsed="0.083304"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:47:34.369584" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:47:34.369500" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.369482" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.369979" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.370297" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:47:34.370361" 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-10-11T00:47:34.285547" elapsed="0.084921"/>
</kw>
<msg time="2026-10-11T00:47:34.370552" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:34.370591" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:34.283777" elapsed="0.086848"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.370955" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:34.370731" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.370714" elapsed="0.000312"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:47:34.283634" elapsed="0.087414"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:47:34.283481" elapsed="0.087593"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:47:34.281256" elapsed="0.089865"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:47:34.278977" elapsed="0.092205"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:34.278578" elapsed="0.092646"/>
</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-10-11T00:47:34.277432" elapsed="0.093839"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.371981" level="INFO">&amp;{mapping} = { IP=10.30.171.7 | 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-10-11T00:47:34.371569" elapsed="0.000438"/>
</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-10-11T00:47:34.385218" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:34.384895" elapsed="0.000353"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:34.385967" 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-10-11T00:47:34.385744" elapsed="0.000301">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-10-11T00:47:34.386131" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:34.385423" elapsed="0.000731"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.386664" 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-10-11T00:47:34.386339" elapsed="0.000350"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:34.386968" 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-10-11T00:47:34.387115" 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-10-11T00:47:34.386857" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.387588" 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-10-11T00:47:34.387354" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.388568" level="INFO">mapping: {'IP': '10.30.171.7', '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-10-11T00:47:34.388318" elapsed="0.000291"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.389029" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:47:34.388784" elapsed="0.000268"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.389693" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:34.389417" elapsed="0.000300"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:34.390618" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:34.390418" elapsed="0.000225"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:34.390687" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:47:34.390813" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:34.390054" 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-10-11T00:47:34.391044" elapsed="0.000207"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:47:34.389270" elapsed="0.002019"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.391805" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:34.391536" elapsed="0.000294"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:34.392521" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:34.392326" elapsed="0.000219"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:34.392589" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:34.392713" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:34.391999" elapsed="0.000736"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:34.392897" elapsed="0.000167"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:47:34.391390" elapsed="0.001712"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:47:34.389095" elapsed="0.004038"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:47:34.393185" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:34.393315" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:47:34.387954" elapsed="0.005384"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:34.387690" elapsed="0.005676"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.393553" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:34.393389" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.387673" elapsed="0.005955"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.394341" 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-10-11T00:47:34.393785" elapsed="0.000583"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:34.394425" 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_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-10-11T00:47:34.384375" elapsed="0.010151"/>
</kw>
<msg time="2026-10-11T00:47:34.394575" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:34.380102" elapsed="0.014515"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:34.398625" 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/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-10-11T00:47:34.402606" 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/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-10-11T00:47:34.406569" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.406748" 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-10-11T00:47:34.406962" 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-10-11T00:47:34.407324" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:34.407157" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:34.407143" 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-10-11T00:47:34.407568" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.407752" 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-10-11T00:47:34.407915" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:34.407118" elapsed="0.000844"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:34.407028" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.408136" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:34.408216" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:47:34.408327" 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-10-11T00:47:34.379486" elapsed="0.028866"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.409375" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:34.409132" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:47:34.420205" level="INFO">DELETE Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:34.420257" level="INFO">DELETE Response : url=http://10.30.170.173: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.171.7 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:34.420343" 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-10-11T00:47:34.409729" elapsed="0.010637"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:34.409494" elapsed="0.010908"/>
</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-10-11T00:47:34.420596" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:34.420446" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.409478" elapsed="0.011191"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.422068" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:34.421621" elapsed="0.000487"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:34.421346" elapsed="0.000794"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.421329" elapsed="0.000834"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.422807" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:34.422535" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:34.422280" elapsed="0.000599"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.422264" elapsed="0.000637"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.423468" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:34.423079" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.423798" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:34.423556" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.424323" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:34.424034" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:34.423873" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.423540" elapsed="0.000859"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.424934" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:34.424589" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.425245" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:34.425023" elapsed="0.000275"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.425794" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:34.425493" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:34.425319" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.425006" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:34.426089" elapsed="0.000470"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:47:34.426969" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:34.426730" elapsed="0.000264"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:47:34.427149" elapsed="0.000235"/>
</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-10-11T00:47:34.420996" elapsed="0.006463"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:47:34.427505" elapsed="0.000032"/>
</return>
<msg time="2026-10-11T00:47:34.427687" 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-10-11T00:47:34.408602" elapsed="0.019110"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:34.427759" elapsed="0.000023"/>
</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-10-11T00:47:34.372231" elapsed="0.055623"/>
</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-10-11T00:47:34.428444" elapsed="0.000233"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:47:34.428109" elapsed="0.000626"/>
</kw>
<doc>Delete peer configuration.</doc>
<status status="PASS" start="2026-10-11T00:47:34.276889" elapsed="0.151881"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.430401" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:34.430191" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.430162" elapsed="0.000328"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-10-11T00:47:34.430001" 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-10-11T00:47:34.431450" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:34.431348" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.431331" elapsed="0.000181"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:34.433562" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:34.433472" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.433455" elapsed="0.000168"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.434557" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:34.434206" elapsed="0.000376"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.434992" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:47:34.434732" elapsed="0.000284"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:47:34.435054" elapsed="0.000074"/>
</return>
<msg time="2026-10-11T00:47:34.435245" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:47:34.433830" elapsed="0.001438"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:34.437918" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:34.437835" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.437818" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:34.439044" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:34.438960" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.438942" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:34.439474" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:47:34.439276" elapsed="0.000224"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:47:34.439806" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:47:34.439664" elapsed="0.000165"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:34.495147" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:47:34.440326" elapsed="0.054924"/>
</kw>
<msg time="2026-10-11T00:47:34.495422" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:47:34.495465" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:34.439984" elapsed="0.055516"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:47:34.538552" 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-10-11T00:47:34.496000" elapsed="0.042652"/>
</kw>
<msg time="2026-10-11T00:47:34.538801" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:47:34.538842" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:34.495665" elapsed="0.043211"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.539146" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:34.538944" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.538926" elapsed="0.000306"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.539663" 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-10-11T00:47:34.539436" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.539983" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:34.539786" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.539770" elapsed="0.000283"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:47:34.540082" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:47:34.542543" elapsed="0.000115"/>
</kw>
<msg time="2026-10-11T00:47:34.542715" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:34.541473" 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-10-11T00:47:34.543148" elapsed="0.000107"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.543537" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:47:34.540862" 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-10-11T00:47:34.540380" 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-10-11T00:47:34.438704" elapsed="0.105187"/>
</kw>
<msg time="2026-10-11T00:47:34.543975" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:34.544015" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:34.438129" elapsed="0.105921"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:47:34.544220" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:47:34.544118" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.544101" elapsed="0.000196"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.544651" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.544947" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:47:34.545010" 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-10-11T00:47:34.437551" elapsed="0.107543"/>
</kw>
<msg time="2026-10-11T00:47:34.545192" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:34.545234" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:34.435631" elapsed="0.109637"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.545575" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:34.545335" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.545320" elapsed="0.000326"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:47:34.435486" elapsed="0.110181"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:47:34.435320" elapsed="0.110374"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:47:34.433116" elapsed="0.112626"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:47:34.431077" elapsed="0.114715"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:34.430678" elapsed="0.115153"/>
</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-10-11T00:47:34.429610" elapsed="0.116265"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.546779" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.171.7 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=exampl...</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-10-11T00:47:34.546072" elapsed="0.000735"/>
</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-10-11T00:47:34.557108" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:34.556808" elapsed="0.000326"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:34.557876" 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-10-11T00:47:34.557647" elapsed="0.000303">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-10-11T00:47:34.558035" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:34.557305" elapsed="0.000752"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.558574" 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-10-11T00:47:34.558252" elapsed="0.000347"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:34.558876" 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-10-11T00:47:34.559061" 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-10-11T00:47:34.558766" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.559539" 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-10-11T00:47:34.559300" 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-10-11T00:47:34.560505" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', '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-10-11T00:47:34.560257" elapsed="0.000291"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.560968" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:47:34.560723" elapsed="0.000268"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.561608" 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-10-11T00:47:34.561327" elapsed="0.000305"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:34.562332" 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-10-11T00:47:34.562135" elapsed="0.000220"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:34.562400" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T00:47:34.562540" 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-10-11T00:47:34.561801" elapsed="0.000762"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:34.562725" elapsed="0.000170"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:47:34.561194" elapsed="0.001737"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.563481" 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-10-11T00:47:34.563157" elapsed="0.000349"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:34.565715" 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-10-11T00:47:34.565533" elapsed="0.000207"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:34.565784" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:34.565908" 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-10-11T00:47:34.563673" elapsed="0.002257"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:34.566094" elapsed="0.000178"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-10-11T00:47:34.563029" elapsed="0.003280"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.566823" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:34.566552" elapsed="0.000295"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:34.567762" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:34.567585" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:34.567829" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:34.567951" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:34.567016" 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-10-11T00:47:34.568133" elapsed="0.000178"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:47:34.566421" elapsed="0.001926"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.568855" 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-10-11T00:47:34.568589" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:34.569559" 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-10-11T00:47:34.569369" elapsed="0.000214"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:34.569627" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:47:34.569748" 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-10-11T00:47:34.569046" elapsed="0.000724"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:34.569967" elapsed="0.000163"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:47:34.568461" elapsed="0.001718"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.570688" 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-10-11T00:47:34.570421" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:34.571376" 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-10-11T00:47:34.571195" elapsed="0.000204"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:34.571459" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:34.571582" 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-10-11T00:47:34.570878" elapsed="0.000727"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:34.571766" elapsed="0.000164"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:47:34.570280" elapsed="0.001687"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.572494" 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-10-11T00:47:34.572210" elapsed="0.000308"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:34.573163" 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-10-11T00:47:34.572989" elapsed="0.000212"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:34.573245" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:34.573367" 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-10-11T00:47:34.572687" elapsed="0.000702"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:34.573566" elapsed="0.000164"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:47:34.572068" elapsed="0.001699"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.574272" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:34.573993" elapsed="0.000303"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:34.574955" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:34.574782" elapsed="0.000197"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:34.575021" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:34.575142" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:34.574479" elapsed="0.000699"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:34.575339" elapsed="0.000325"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:47:34.573865" elapsed="0.001836"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.576229" 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-10-11T00:47:34.575930" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:34.576917" 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-10-11T00:47:34.576742" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:34.576984" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:34.577106" 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-10-11T00:47:34.576437" elapsed="0.000691"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:34.577302" elapsed="0.000180"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:47:34.575803" elapsed="0.001715"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.578007" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:34.577744" elapsed="0.000287"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:34.578701" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:34.578527" elapsed="0.000198"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:34.578767" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:47:34.578887" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:34.578209" elapsed="0.000700"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:34.579114" elapsed="0.000177"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:47:34.577616" elapsed="0.001712"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:47:34.561034" elapsed="0.018325"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:47:34.579396" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:47:34.579542" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 't...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:47:34.559898" elapsed="0.019669"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:34.559644" elapsed="0.019951"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.579764" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:34.579618" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.559627" elapsed="0.020205"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.580659" 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-10-11T00:47:34.579990" elapsed="0.000696"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:34.580729" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:34.556296" elapsed="0.024531"/>
</kw>
<msg time="2026-10-11T00:47:34.580876" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:34.552064" elapsed="0.028854"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:34.584955" 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/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-10-11T00:47:34.588977" 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/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-10-11T00:47:34.592952" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.593131" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.593325" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.593675" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:34.593531" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:34.593517" 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-10-11T00:47:34.593901" 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-10-11T00:47:34.594078" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.594254" elapsed="0.000050"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:34.593491" elapsed="0.000846"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:34.593390" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.594528" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:34.594596" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:47:34.594705" 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-10-11T00:47:34.551478" elapsed="0.043251"/>
</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-10-11T00:47:34.603669" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:34.603352" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:34.604346" 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-10-11T00:47:34.604176" elapsed="0.000242">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-10-11T00:47:34.604505" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:34.603850" elapsed="0.000677"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.605000" 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-10-11T00:47:34.604697" elapsed="0.000328"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:34.605313" 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-10-11T00:47:34.605450" 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-10-11T00:47:34.605205" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.605884" 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-10-11T00:47:34.605668" elapsed="0.000271"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:47:34.606268" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:34.605999" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.606769" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 't...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:34.606502" elapsed="0.000293"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:34.606343" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.605982" elapsed="0.000865"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.607720" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflecto...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:34.607005" elapsed="0.000771"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:34.607822" 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-10-11T00:47:34.602831" elapsed="0.005094"/>
</kw>
<msg time="2026-10-11T00:47:34.607977" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:34.598596" elapsed="0.009424"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:34.612055" 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/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-10-11T00:47:34.616044" 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/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-10-11T00:47:34.620034" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.620243" 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-10-11T00:47:34.620438" 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-10-11T00:47:34.620772" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:34.620630" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:34.620617" 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-10-11T00:47:34.621000" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.621190" 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-10-11T00:47:34.621353" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:34.620592" elapsed="0.000807"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:34.620505" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.621587" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:34.621652" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:47:34.621770" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflecto...</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-10-11T00:47:34.597850" elapsed="0.023947"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:34.622953" 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-10-11T00:47:34.622762" elapsed="0.000249">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-10-11T00:47:34.623093" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:34.622438" elapsed="0.000677"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.623428" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:34.623193" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.624089" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:34.623667" elapsed="0.000447"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:34.623503" elapsed="0.000644"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.623161" elapsed="0.001019"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.624704" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:34.624344" elapsed="0.000384"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:47:34.624775" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:47:34.624898" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:47:34.622105" elapsed="0.002815"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.626144" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:34.625924" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.626622" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T00:47:34.626393" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.627085" 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-10-11T00:47:34.626868" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.627556" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:34.627325" elapsed="0.000271"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:34.628305" 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-10-11T00:47:34.628131" elapsed="0.000198"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:47:34.628643" 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-10-11T00:47:34.628497" elapsed="0.000169"/>
</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-10-11T00:47:34.628827" elapsed="0.000153"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.629417" 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-10-11T00:47:34.629183" elapsed="0.000276"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:47:34.629497" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:34.629623" 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-10-11T00:47:34.627779" elapsed="0.001867"/>
</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-10-11T00:47:34.655629" level="INFO">PUT Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Content-Length': '1077', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T00:47:34.655771" level="INFO">PUT Response : url=http://10.30.170.173: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.171.7 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:34.655895" 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-10-11T00:47:34.629937" elapsed="0.025983"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:34.629708" elapsed="0.026265"/>
</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-10-11T00:47:34.656210" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:34.656003" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.629692" elapsed="0.026602"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.657600" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:34.657272" elapsed="0.000367"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:34.657001" elapsed="0.000670"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.656983" elapsed="0.000710"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.658249" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:34.657974" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:34.657741" elapsed="0.000582"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.657727" elapsed="0.000618"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.658902" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:34.658546" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.659215" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:34.658991" elapsed="0.000276"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.659736" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:34.659469" elapsed="0.000292"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:34.659290" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.658974" elapsed="0.000838"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.660335" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:34.659984" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.660642" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:34.660436" elapsed="0.000256"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.661128" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:34.660870" elapsed="0.000282"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:34.660714" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.660405" elapsed="0.000814"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:34.661365" elapsed="0.000309"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:47:34.662069" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:34.661832" elapsed="0.000261"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:47:34.662257" elapsed="0.000229"/>
</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-10-11T00:47:34.656676" elapsed="0.005866"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:47:34.662687" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-10-11T00:47:34.662602" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.662585" elapsed="0.000190"/>
</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-10-11T00:47:34.662919" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:47:34.662978" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:47:34.663137" 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-10-11T00:47:34.625236" elapsed="0.037925"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:34.663264" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:34.663393" 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-10-11T00:47:34.547683" elapsed="0.115748"/>
</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-10-11T00:47:34.663726" elapsed="0.000198"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:34.663518" elapsed="0.000451"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.663502" elapsed="0.000490"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:34.664023" 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-10-11T00:47:34.547065" elapsed="0.117058"/>
</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-10-11T00:47:34.665310" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:34.664960" elapsed="0.000406"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.664944" elapsed="0.000445"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:34.665545" elapsed="0.000277"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.668123" 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-10-11T00:47:34.667760" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-10-11T00:47:34.668337" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:47:34.668230" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.668212" elapsed="0.000213"/>
</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-10-11T00:47:34.668591" elapsed="0.000019"/>
</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-10-11T00:47:34.668769" elapsed="0.000018"/>
</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-10-11T00:47:34.668935" elapsed="0.000018"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.669098" elapsed="0.000019"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.669281" elapsed="0.000019"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message of the current test case.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.669465" 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-10-11T00:47:34.669671" elapsed="0.000018"/>
</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-10-11T00:47:34.667447" elapsed="0.002294"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:34.664766" elapsed="0.005020"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-10-11T00:47:34.664425" elapsed="0.005398"/>
</kw>
<doc>Configure BGP peer module with initiate-connection set to false.</doc>
<status status="PASS" start="2026-10-11T00:47:34.429068" elapsed="0.240790"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.671497" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:34.671279" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.671262" elapsed="0.000308"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-10-11T00:47:34.671092" 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-10-11T00:47:34.672561" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:34.672442" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.672425" 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-10-11T00:47:34.674755" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:34.674672" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.674655" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.675787" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:34.675463" elapsed="0.000350"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.676262" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:47:34.675967" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:47:34.676327" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:34.676469" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:47:34.675024" elapsed="0.001469"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:34.678968" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:34.678884" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.678867" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:34.680097" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:34.680014" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.679997" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:34.680518" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:47:34.680322" elapsed="0.000220"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:47:34.680851" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:47:34.680707" elapsed="0.000167"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:34.722086" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:47:34.681378" elapsed="0.040817"/>
</kw>
<msg time="2026-10-11T00:47:34.722349" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:47:34.722391" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:34.681031" elapsed="0.041413"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:47:34.750051" 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-10-11T00:47:34.722951" elapsed="0.027192"/>
</kw>
<msg time="2026-10-11T00:47:34.750328" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:47:34.750379" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:34.722613" elapsed="0.027831"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.750745" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:34.750531" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.750508" elapsed="0.000310"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.751356" 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-10-11T00:47:34.751003" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.751699" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:34.751496" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.751479" elapsed="0.000290"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:47:34.751799" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:47:34.754609" elapsed="0.000273"/>
</kw>
<msg time="2026-10-11T00:47:34.754943" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:34.753393" elapsed="0.001686"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.755428" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.755772" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:47:34.752659" elapsed="0.003299"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:47:34.752071" elapsed="0.003944"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:47:34.679761" elapsed="0.076327"/>
</kw>
<msg time="2026-10-11T00:47:34.756184" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:34.756230" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:34.679197" elapsed="0.077070"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:47:34.756454" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:47:34.756337" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.756319" 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-10-11T00:47:34.756859" 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-10-11T00:47:34.757162" elapsed="0.000041"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:47:34.757247" 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-10-11T00:47:34.678602" elapsed="0.078730"/>
</kw>
<msg time="2026-10-11T00:47:34.757435" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:34.757478" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:34.676836" elapsed="0.080679"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:34.757805" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:34.757582" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:34.757565" elapsed="0.000310"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:47:34.676692" elapsed="0.081205"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:47:34.676545" elapsed="0.081380"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:47:34.674363" elapsed="0.083611"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:47:34.672158" elapsed="0.085866"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:34.671760" elapsed="0.086303"/>
</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-10-11T00:47:34.670720" elapsed="0.087390"/>
</kw>
<kw name="Start_BGP_Speaker" owner="BGPSpeaker">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.759075" level="INFO">${command} = python3 play.py --amount 3 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:34.758793" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:34.759546" level="INFO">python3 play.py --amount 3 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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-10-11T00:47:34.759313" elapsed="0.000275"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:34.762639" level="INFO">python3 play.py --amount 3 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --peerport=1790 --info &amp;&gt; play.py.out</msg>
<msg time="2026-10-11T00:47:34.762721" level="INFO">${output} =  python3 play.py --amount 3 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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-10-11T00:47:34.759740" elapsed="0.003007"/>
</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-10-11T00:47:34.758322" elapsed="0.004478"/>
</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-10-11T00:47:44.765103" 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-10-11T00:47:34.764382" elapsed="10.001610">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-10-11T00:47:44.766390" elapsed="0.000047"/>
</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-10-11T00:47:34.764088" elapsed="10.002470">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-10-11T00:47:34.763725" elapsed="10.003124"/>
</kw>
<msg time="2026-10-11T00:47:44.766959" 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-10-11T00:47:34.763335" elapsed="10.003649"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-10-11T00:47:44.767172" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-10-11T00:47:44.767074" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:44.767048" elapsed="0.000210"/>
</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-10-11T00:47:44.767512" elapsed="0.000026"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:44.767692" elapsed="0.000019"/>
</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-10-11T00:47:34.763047" elapsed="10.004720"/>
</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-10-11T00:47:44.768379" elapsed="0.000311"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:47:44.768027" elapsed="0.000724"/>
</kw>
<doc>Start Python speaker to connect to ODL, verify that the tool does not promptly exit.</doc>
<status status="PASS" start="2026-10-11T00:47:34.670177" elapsed="10.098608"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:44.771039" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:44.770821" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:44.770804" elapsed="0.000308"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-10-11T00:47:44.770647" 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-10-11T00:47:44.772573" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:44.772484" elapsed="0.000133"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:44.772466" elapsed="0.000171"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:44.774687" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:44.774603" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:44.774587" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:44.775687" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:44.775334" elapsed="0.000378"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:47:44.776151" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:47:44.775867" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:47:44.776217" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:47:44.776346" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:47:44.774961" elapsed="0.001408"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:44.778872" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:44.778787" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:44.778770" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:44.780021" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:44.779938" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:44.779921" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:44.780596" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:47:44.780364" elapsed="0.000257"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:47:44.780930" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:47:44.780789" elapsed="0.000165"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:44.823151" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:47:44.781497" elapsed="0.041750"/>
</kw>
<msg time="2026-10-11T00:47:44.823399" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:47:44.823462" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:44.781111" elapsed="0.042402"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:47:44.856369" 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-10-11T00:47:44.824024" elapsed="0.032484"/>
</kw>
<msg time="2026-10-11T00:47:44.856680" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:47:44.856721" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:44.823684" elapsed="0.033074"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:44.857090" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:44.856842" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:44.856817" elapsed="0.000368"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:44.857662" 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-10-11T00:47:44.857372" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:44.857992" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:44.857790" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:44.857773" elapsed="0.000288"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:47:44.858094" 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-10-11T00:47:44.860785" elapsed="0.000117"/>
</kw>
<msg time="2026-10-11T00:47:44.860976" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:44.859768" elapsed="0.001347"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:44.861521" elapsed="0.000082"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:44.861869" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:47:44.858947" elapsed="0.003110"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:47:44.858453" 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-10-11T00:47:44.779684" elapsed="0.082527"/>
</kw>
<msg time="2026-10-11T00:47:44.862295" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:44.862335" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:44.779083" elapsed="0.083289"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:47:44.862551" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:47:44.862464" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:44.862446" elapsed="0.000184"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:44.862962" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:44.863348" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:47:44.863434" 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-10-11T00:47:44.778505" elapsed="0.085018"/>
</kw>
<msg time="2026-10-11T00:47:44.863608" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:44.863648" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:44.776723" elapsed="0.086961"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:44.863973" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:44.863752" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:44.863736" elapsed="0.000309"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:47:44.776581" elapsed="0.087485"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:47:44.776435" elapsed="0.087661"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:47:44.774295" elapsed="0.089872"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:47:44.772174" elapsed="0.092054"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:44.771363" elapsed="0.092908"/>
</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-10-11T00:47:44.770246" elapsed="0.094072"/>
</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-10-11T00:47:44.867877" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-10-11T00:47:44.880883" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:47:44.880972" 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-10-11T00:47:44.867784" elapsed="0.013212"/>
</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-10-11T00:47:44.881377" elapsed="0.000024"/>
</kw>
<msg time="2026-10-11T00:47:44.881456" 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-10-11T00:47:44.881062" elapsed="0.000446">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-10-11T00:47:44.881044" elapsed="0.000506">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-10-11T00:47:44.867481" elapsed="0.014214">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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:44.867085" elapsed="0.014672"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:47:44.882092" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17900 .+ ESTABLISHED .+python" | wc -l'.</msg>
<msg time="2026-10-11T00:47:44.932569" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:47:44.932690" level="INFO">${output} = 1</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="PASS" start="2026-10-11T00:47:44.881944" elapsed="0.050778"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-11T00:47:44.932785" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T00:47:44.932961" level="INFO">${output} = 1</msg>
<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="PASS" start="2026-10-11T00:47:44.866773" elapsed="0.066220"/>
</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="PASS" start="2026-10-11T00:47:44.933238" elapsed="0.000430"/>
</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="PASS" start="2026-10-11T00:47:44.866443" elapsed="0.067303"/>
</kw>
<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="PASS" start="2026-10-11T00:47:44.864822" elapsed="0.068980"/>
</kw>
<doc>Give it several tries to see exactly one established connection.</doc>
<status status="PASS" start="2026-10-11T00:47:44.864533" elapsed="0.069339"/>
</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-10-11T00:47:44.934646" elapsed="0.000656"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:47:44.934217" elapsed="0.001210"/>
</kw>
<doc>See TCP (BGP) connection in established state.</doc>
<status status="PASS" start="2026-10-11T00:47:44.769761" elapsed="0.165727"/>
</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">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:44.937768" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:44.937481" elapsed="0.000360"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:44.937456" elapsed="0.000416"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-10-11T00:47:44.937206" elapsed="0.000725"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:44.939228" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:44.939084" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:44.939060" elapsed="0.000255"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:44.942043" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:44.941930" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:44.941907" elapsed="0.000236"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:44.943440" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:44.942949" elapsed="0.000528"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:47:44.944056" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:47:44.943693" elapsed="0.000396"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:47:44.944166" elapsed="0.000046"/>
</return>
<msg time="2026-10-11T00:47:44.944351" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:47:44.942449" elapsed="0.001933"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:44.948044" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:44.947927" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:44.947902" 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-10-11T00:47:44.949683" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:44.949566" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:44.949541" elapsed="0.000228"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:44.950231" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:47:44.949976" elapsed="0.000289"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:47:44.950715" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:47:44.950515" elapsed="0.000232"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:44.991579" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:47:44.951461" elapsed="0.040361"/>
</kw>
<msg time="2026-10-11T00:47:44.992218" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:47:44.992322" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:44.950963" elapsed="0.041485"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:47:45.020501" level="INFO">". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "T "a "l "k "i "n "g "_ "T "o "p "o "l "o "g "y "_ "I "s "_ "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-10-11T00:47:44.993800" elapsed="0.026836"/>
</kw>
<msg time="2026-10-11T00:47:45.020842" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:47:45.020899" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "T "a "l "k "i "n "g "_ "T "o "p "o "l "o "g "y "_ "I "s "_ "F "i "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:44.992866" elapsed="0.028081"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.021356" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.021043" elapsed="0.000423"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.021018" elapsed="0.000481"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.022079" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "T "a "l "k "i "n "g "_ "T "o "p "o "l "o "g "y "_ "I "s "_ "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-10-11T00:47:45.021757" elapsed="0.000425"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.022568" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.022266" elapsed="0.000373"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.022243" elapsed="0.000426"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:47:45.022710" 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-10-11T00:47:45.026268" elapsed="0.000231"/>
</kw>
<msg time="2026-10-11T00:47:45.026581" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:45.024696" elapsed="0.002061"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.027202" elapsed="0.000259"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.027865" 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-10-11T00:47:45.023783" elapsed="0.004338"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:47:45.023084" elapsed="0.005138"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:47:44.949180" elapsed="0.079146"/>
</kw>
<msg time="2026-10-11T00:47:45.028460" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:45.028517" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "T "a "l "k "i "n "g "_ "T "o "p "o "l "o "g "y "_ "I "s "_ "F "i "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:44.948424" elapsed="0.080142"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:47:45.028782" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-10-11T00:47:45.028662" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.028638" elapsed="0.000249"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.029354" elapsed="0.000113"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.029864" elapsed="0.000032"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.029954" 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-10-11T00:47:44.947525" elapsed="0.082547"/>
</kw>
<msg time="2026-10-11T00:47:45.030204" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:45.030260" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "T "a "l "k "i "n "g "_ "T "o "p "o "l "o "g "y "_ "I "s "_ "F "i "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:44.944882" elapsed="0.085427"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.030795" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.030402" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.030379" elapsed="0.000534"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:47:44.944677" elapsed="0.086266"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:47:44.944472" elapsed="0.086507"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:47:44.941523" elapsed="0.089522"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:47:44.938734" elapsed="0.092379"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:44.938150" elapsed="0.093041"/>
</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-10-11T00:47:44.936656" elapsed="0.094599"/>
</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-10-11T00:47:45.051156" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.050830" elapsed="0.000356"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:45.052006" 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-10-11T00:47:45.051686" elapsed="0.000397">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-10-11T00:47:45.052459" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:45.051347" elapsed="0.001140"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.052975" 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-10-11T00:47:45.052663" elapsed="0.000337"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:45.053297" 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-10-11T00:47:45.053474" 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-10-11T00:47:45.053181" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.053917" 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-10-11T00:47:45.053695" elapsed="0.000264"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.055240" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:45.054680" elapsed="0.000619"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.055959" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.055491" elapsed="0.000492"/>
</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-10-11T00:47:45.056360" elapsed="0.000073"/>
</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-10-11T00:47:45.057173" 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-10-11T00:47:45.057553" elapsed="0.000044"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:47:45.056168" elapsed="0.001545"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.056031" elapsed="0.001746"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:47:45.057822" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T00:47:45.057961" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:47:45.054297" elapsed="0.003687"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.054024" elapsed="0.003988"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.058199" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.058035" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.054003" elapsed="0.004267"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.058838" 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-10-11T00:47:45.058448" elapsed="0.000416"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:45.058907" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:45.050312" elapsed="0.008693"/>
</kw>
<msg time="2026-10-11T00:47:45.059054" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:45.046017" elapsed="0.013081"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:45.064484" 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/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-10-11T00:47:45.068547" 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/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-10-11T00:47:45.072550" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.072734" 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-10-11T00:47:45.072915" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.073266" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.073107" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:45.073093" 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-10-11T00:47:45.073506" 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-10-11T00:47:45.073685" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.073879" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:45.073068" elapsed="0.000860"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.072980" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.074102" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.074180" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:47:45.074287" 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-10-11T00:47:45.045393" elapsed="0.028919"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:45.075482" 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-10-11T00:47:45.075271" elapsed="0.000272">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-10-11T00:47:45.075626" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:45.074931" elapsed="0.000718"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.075932" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.075711" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.076475" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.076195" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.076007" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.075694" elapsed="0.000857"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.077047" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:45.076711" elapsed="0.000360"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:47:45.077116" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:47:45.077254" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:47:45.074631" elapsed="0.002645"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:45.078367" 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-10-11T00:47:45.078178" elapsed="0.000263">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-10-11T00:47:45.078527" 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-10-11T00:47:45.077845" elapsed="0.000705"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:47:45.078711" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:47:45.078613" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.078596" elapsed="0.000193"/>
</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-10-11T00:47:45.078943" elapsed="0.000019"/>
</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-10-11T00:47:45.079118" elapsed="0.000031"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.079189" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:47:45.079313" 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-10-11T00:47:45.077547" elapsed="0.001789"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.080581" 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-10-11T00:47:45.080339" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.081026" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:45.080813" elapsed="0.000253"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:47:45.092780" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:45.092963" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:47:45.093065" 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-10-11T00:47:45.081440" elapsed="0.011650"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.081194" elapsed="0.011948"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.093328" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.093168" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.081175" elapsed="0.012250"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.094698" 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-10-11T00:47:45.094351" elapsed="0.000392"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.094095" elapsed="0.000680"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.094078" elapsed="0.000719"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.095371" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:45.095084" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.094846" elapsed="0.000617"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.094831" elapsed="0.000655"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.096028" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:45.095660" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.096342" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.096116" elapsed="0.000277"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.096864" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.096600" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.096432" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.096100" elapsed="0.000840"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.097482" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:45.097112" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.097776" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.097570" elapsed="0.000257"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.098281" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.098007" elapsed="0.000298"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.097849" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.097553" elapsed="0.000803"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:45.098515" elapsed="0.000292"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:47:45.099237" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:45.098965" 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-10-11T00:47:45.099430" elapsed="0.000223"/>
</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-10-11T00:47:45.093761" elapsed="0.005947"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.099887" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:45.099805" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.099787" elapsed="0.000161"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:47:45.100746" 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-10-11T00:47:45.100088" elapsed="0.000685"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:47:45.100820" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:47:45.100946" 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-10-11T00:47:45.079633" elapsed="0.021337"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:45.101024" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:47:45.101158" 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-10-11T00:47:45.036080" elapsed="0.065103"/>
</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-10-11T00:47:45.112213" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.111470" elapsed="0.000770"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:45.114335" 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-10-11T00:47:45.113838" elapsed="0.000628">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-10-11T00:47:45.114590" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:45.112397" elapsed="0.002216"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.115451" 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-10-11T00:47:45.114786" elapsed="0.000691"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:45.115840" 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-10-11T00:47:45.116061" 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-10-11T00:47:45.115645" elapsed="0.000441"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.116833" 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-10-11T00:47:45.116295" elapsed="0.000599"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:47:45.117565" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.116958" elapsed="0.000758"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.118556" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.117915" elapsed="0.000681"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.117741" elapsed="0.000950"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.116940" elapsed="0.001773"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.119711" 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-10-11T00:47:45.118877" elapsed="0.000861"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:45.119820" 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-10-11T00:47:45.110880" elapsed="0.009044"/>
</kw>
<msg time="2026-10-11T00:47:45.119973" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:45.106575" elapsed="0.013442"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:45.124183" 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/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-10-11T00:47:45.128357" 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/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-10-11T00:47:45.132352" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.132548" 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-10-11T00:47:45.132729" 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-10-11T00:47:45.133095" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.132949" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:45.132935" 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-10-11T00:47:45.133337" 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-10-11T00:47:45.133542" 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-10-11T00:47:45.133707" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:45.132907" elapsed="0.000846"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.132794" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.133926" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.133991" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:47:45.134101" 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-10-11T00:47:45.105843" elapsed="0.028295"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:45.134338" elapsed="0.000343"/>
</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-10-11T00:47:45.135916" 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-10-11T00:47:45.135338" elapsed="0.000607"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:47:45.136529" 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-10-11T00:47:45.136097" 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-10-11T00:47:45.136743" elapsed="0.000286"/>
</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-10-11T00:47:45.134956" elapsed="0.002128"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.134752" elapsed="0.002362"/>
</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-10-11T00:47:45.137331" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.137152" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.134735" 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-10-11T00:47:45.102150" elapsed="0.035321"/>
</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-10-11T00:47:45.101479" elapsed="0.036064"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.101255" elapsed="0.036327"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.101239" elapsed="0.036365"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:45.137634" elapsed="0.000026"/>
</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-10-11T00:47:45.034987" elapsed="0.102746"/>
</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-10-11T00:47:45.032559" elapsed="0.105228"/>
</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-10-11T00:47:45.031930" elapsed="0.105898"/>
</kw>
<arg>filled_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="PASS" start="2026-10-11T00:47:45.031437" elapsed="0.106440"/>
</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-10-11T00:47:45.138444" elapsed="0.000229"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:47:45.138139" elapsed="0.000591"/>
</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-10-11T00:47:44.935840" elapsed="0.202925"/>
</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">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.140968" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.140642" elapsed="0.000381"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.140623" elapsed="0.000422"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-10-11T00:47:45.140167" elapsed="0.000920"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.141991" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:45.141907" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.141891" elapsed="0.000161"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.144012" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:45.143930" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.143913" elapsed="0.000160"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.144996" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:45.144669" elapsed="0.000353"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.145476" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:47:45.145190" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:47:45.145575" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:47:45.145705" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:47:45.144296" elapsed="0.001431"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.148357" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:45.148273" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.148255" elapsed="0.000180"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.149490" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:45.149379" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.149361" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:45.149870" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.149699" elapsed="0.000195"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:47:45.150213" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:47:45.150057" elapsed="0.000180"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:45.189904" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:47:45.150743" elapsed="0.039254"/>
</kw>
<msg time="2026-10-11T00:47:45.190165" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:47:45.190224" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:45.150392" elapsed="0.039869"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:47:45.215748" level="INFO">". "t "x "t ". "B "a "s "i "c ". "T "C "_ "R "_ "R "e "s "e "t "_ "B "g "p "_ "P "e "e "r "_ "S "e "s "s "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-10-11T00:47:45.190804" elapsed="0.025038"/>
</kw>
<msg time="2026-10-11T00:47:45.215993" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:47:45.216034" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "R "_ "R "e "s "e "t "_ "B "g "p "_ "P "e "e "r "_ "S "e "s "s "i "o "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:45.190463" elapsed="0.025607"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.216359" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.216150" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.216121" elapsed="0.000335"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.216872" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "R "_ "R "e "s "e "t "_ "B "g "p "_ "P "e "e "r "_ "S "e "s "s "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-10-11T00:47:45.216646" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.217203" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.216992" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.216975" elapsed="0.000299"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:47:45.217304" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:47:45.219741" elapsed="0.000116"/>
</kw>
<msg time="2026-10-11T00:47:45.219913" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:45.218653" 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-10-11T00:47:45.220364" elapsed="0.000102"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.220729" 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-10-11T00:47:45.218055" elapsed="0.002893"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:47:45.217594" elapsed="0.003414"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:47:45.149111" elapsed="0.072005"/>
</kw>
<msg time="2026-10-11T00:47:45.221214" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:45.221254" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "R "_ "R "e "s "e "t "_ "B "g "p "_ "P "e "e "r "_ "S "e "s "s "i "o "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:45.148586" elapsed="0.072704"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:47:45.221469" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:47:45.221358" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.221341" 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-10-11T00:47:45.221897" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.222221" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.222287" 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-10-11T00:47:45.147971" elapsed="0.074402"/>
</kw>
<msg time="2026-10-11T00:47:45.222473" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:45.222516" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "R "_ "R "e "s "e "t "_ "B "g "p "_ "P "e "e "r "_ "S "e "s "s "i "o "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:45.146054" elapsed="0.076501"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.222843" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.222621" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.222605" elapsed="0.000309"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:47:45.145914" elapsed="0.077021"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:47:45.145774" elapsed="0.077187"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:47:45.143638" elapsed="0.079370"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:47:45.141660" elapsed="0.081397"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:45.141250" elapsed="0.081847"/>
</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-10-11T00:47:45.139759" elapsed="0.083400"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.223770" level="INFO">&amp;{mapping} = { IP=10.30.171.7 | RIB_INSTANCE_NAME=example-bgp-rib }</msg>
<var>&amp;{mapping}</var>
<arg>IP=${TOOLS_SYSTEM_IP}</arg>
<arg>RIB_INSTANCE_NAME=${RIB_NAME}</arg>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.223354" elapsed="0.000442"/>
</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-10-11T00:47:45.234544" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_session/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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.234226" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:45.235240" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_session/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-10-11T00:47:45.235044" elapsed="0.000256">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_session/restart.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-11T00:47:45.235385" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:45.234728" elapsed="0.000693"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.235905" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_session/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-10-11T00:47:45.235599" elapsed="0.000331"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:45.236217" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_session/restart/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_session/restart/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-11T00:47:45.236376" level="INFO">${template} = rests/operations/bgp-peer-rpc:reset-session
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-10-11T00:47:45.236094" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.236830" level="INFO">rests/operations/bgp-peer-rpc:reset-session
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:45.236610" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.237795" level="INFO">mapping: {'IP': '10.30.171.7', '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-10-11T00:47:45.237558" elapsed="0.000279"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.238271" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.238011" elapsed="0.000284"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.238889" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:45.238622" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.239608" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.239418" elapsed="0.000214"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.239676" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:47:45.239801" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:45.239083" elapsed="0.000740"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.239987" elapsed="0.000184"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:47:45.238490" elapsed="0.001718"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.240715" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:45.240449" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.241424" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.241233" elapsed="0.000216"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.241492" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:45.241615" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:45.240913" elapsed="0.000724"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.241803" elapsed="0.000307"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:47:45.240306" elapsed="0.001855"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:47:45.238338" elapsed="0.003856"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:47:45.242233" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:47:45.242364" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', 'RIB_INSTANCE_NAME': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:47:45.237197" elapsed="0.005191"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.236932" elapsed="0.005501"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.242616" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.242457" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.236914" elapsed="0.005773"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.243316" level="INFO">${final_text} = rests/operations/bgp-peer-rpc:reset-session</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:45.242862" elapsed="0.000479"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:45.243385" 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/bgpuser/../../../variables/bgpuser//peer_session/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/bgpuser/../../../variables/bgpuser//peer_session/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/bgpuser/../../../variables/bgpuser//peer_session/restart/${file_name}.</doc>
<status status="PASS" start="2026-10-11T00:47:45.233707" elapsed="0.009795"/>
</kw>
<msg time="2026-10-11T00:47:45.243553" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:45.229480" elapsed="0.014118"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_session/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/bgpuser/../../../variables/bgpuser//peer_session/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/bgpuser/../../../variables/bgpuser//peer_session/restart/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.247687" 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/bgpuser/../../../variables/bgpuser//peer_session/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/bgpuser/../../../variables/bgpuser//peer_session/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/bgpuser/../../../variables/bgpuser//peer_session/restart/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.251704" 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/bgpuser/../../../variables/bgpuser//peer_session/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/bgpuser/../../../variables/bgpuser//peer_session/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/bgpuser/../../../variables/bgpuser//peer_session/restart/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.256722" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.256907" 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-10-11T00:47:45.257093" 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-10-11T00:47:45.257473" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.257309" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:45.257296" 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-10-11T00:47:45.257702" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.257881" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.258045" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:45.257269" elapsed="0.000823"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.257175" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.258278" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.258344" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:47:45.258459" level="INFO">${uri} = rests/operations/bgp-peer-rpc:reset-session</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from 1, by one  times.
Template variable ${j} is calculated as ${i} incremented by offset 0 ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T00:47:45.228848" elapsed="0.029635"/>
</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-10-11T00:47:45.267236" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_session/restart.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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.266921" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:45.267938" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_session/restart.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-10-11T00:47:45.267752" elapsed="0.000253">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_session/restart.vanadium/post_data.xml' does not exist.</status>
</kw>
<msg time="2026-10-11T00:47:45.268088" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:45.267433" elapsed="0.000678"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.268618" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_session/restart/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-10-11T00:47:45.268295" elapsed="0.000348"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:45.268916" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_session/restart/post_data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_session/restart/post_data.xml&lt;/a&gt;'.</msg>
<msg time="2026-10-11T00:47:45.269083" level="INFO">${template} = &lt;input xmlns="urn:opendaylight:params:xml:ns:yang:bgp-peer-rpc"&gt;
    &lt;peer-ref xmlns:rib="urn:opendaylight:params:xml:ns:yang:bgp-rib"&gt;/rib:bgp-rib/rib:rib[rib:id="$RIB_INSTANCE_NAME"]/rib:peer[rib:pe...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-10-11T00:47:45.268808" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.269552" level="INFO">&lt;input xmlns="urn:opendaylight:params:xml:ns:yang:bgp-peer-rpc"&gt;
    &lt;peer-ref xmlns:rib="urn:opendaylight:params:xml:ns:yang:bgp-rib"&gt;/rib:bgp-rib/rib:rib[rib:id="$RIB_INSTANCE_NAME"]/rib:peer[rib:peer-id="bgp://$IP"]&lt;/peer-ref&gt;
&lt;/input&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:45.269315" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:47:45.269908" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.269656" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.270423" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', '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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.270143" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.269982" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.269639" elapsed="0.000863"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.271196" level="INFO">${final_text} = &lt;input xmlns="urn:opendaylight:params:xml:ns:yang:bgp-peer-rpc"&gt;
    &lt;peer-ref xmlns:rib="urn:opendaylight:params:xml:ns:yang:bgp-rib"&gt;/rib:bgp-rib/rib:rib[rib:id="example-bgp-rib"]/rib:peer[rib:peer-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:45.270668" elapsed="0.000556"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:45.271269" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_session/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/bgpuser/../../../variables/bgpuser//peer_session/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/bgpuser/../../../variables/bgpuser//peer_session/restart/${file_name}.</doc>
<status status="PASS" start="2026-10-11T00:47:45.266418" elapsed="0.004951"/>
</kw>
<msg time="2026-10-11T00:47:45.271433" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:45.262200" elapsed="0.009277"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_session/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/bgpuser/../../../variables/bgpuser//peer_session/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/bgpuser/../../../variables/bgpuser//peer_session/restart/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.275674" 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/bgpuser/../../../variables/bgpuser//peer_session/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/bgpuser/../../../variables/bgpuser//peer_session/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/bgpuser/../../../variables/bgpuser//peer_session/restart/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.279736" 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/bgpuser/../../../variables/bgpuser//peer_session/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/bgpuser/../../../variables/bgpuser//peer_session/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/bgpuser/../../../variables/bgpuser//peer_session/restart/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.283681" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.283862" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.284041" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.284390" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.284245" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:45.284232" 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-10-11T00:47:45.284632" 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-10-11T00:47:45.284848" 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-10-11T00:47:45.285014" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:45.284206" elapsed="0.000856"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.284106" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.285252" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.285320" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:47:45.285447" level="INFO">${data} = &lt;input xmlns="urn:opendaylight:params:xml:ns:yang:bgp-peer-rpc"&gt;
    &lt;peer-ref xmlns:rib="urn:opendaylight:params:xml:ns:yang:bgp-rib"&gt;/rib:bgp-rib/rib:rib[rib:id="example-bgp-rib"]/rib:peer[rib:peer-...</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-10-11T00:47:45.261492" elapsed="0.023982"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:45.286606" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_session/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-10-11T00:47:45.286393" elapsed="0.000272">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_session/restart/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-11T00:47:45.286748" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:45.286055" elapsed="0.000715"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.287052" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.286835" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.287617" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.287335" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.287138" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.286818" elapsed="0.000875"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.288203" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:45.287855" elapsed="0.000371"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:47:45.288271" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:47:45.288394" level="INFO">${jmes_expression} = </msg>
<var>${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//peer_session/restart/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-10-11T00:47:45.285757" elapsed="0.002674"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.289768" level="INFO">rests/operations/bgp-peer-rpc:reset-session</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:45.289546" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.290226" level="INFO">&lt;input xmlns="urn:opendaylight:params:xml:ns:yang:bgp-peer-rpc"&gt;
    &lt;peer-ref xmlns:rib="urn:opendaylight:params:xml:ns:yang:bgp-rib"&gt;/rib:bgp-rib/rib:rib[rib:id="example-bgp-rib"]/rib:peer[rib:peer-id="bgp://10.30.171.7"]&lt;/peer-ref&gt;
&lt;/input&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:45.290000" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.290691" 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-10-11T00:47:45.290474" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.291143" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:45.290919" elapsed="0.000265"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:45.291910" 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-10-11T00:47:45.291738" elapsed="0.000197"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:47:45.292262" 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-10-11T00:47:45.292090" 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-10-11T00:47:45.292462" elapsed="0.000164"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.293042" 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-10-11T00:47:45.292823" elapsed="0.000294"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:47:45.293170" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:45.293300" 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-10-11T00:47:45.291368" elapsed="0.001956"/>
</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-10-11T00:47:45.344850" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/operations/bgp-peer-rpc:reset-session 
 path_url=/rests/operations/bgp-peer-rpc:reset-session 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Content-Length': '243', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;input xmlns="urn:opendaylight:params:xml:ns:yang:bgp-peer-rpc"&gt;
    &lt;peer-ref xmlns:rib="urn:opendaylight:params:xml:ns:yang:bgp-rib"&gt;/rib:bgp-rib/rib:rib[rib:id="example-bgp-rib"]/rib:peer[rib:peer-id="bgp://10.30.171.7"]&lt;/peer-ref&gt;
&lt;/input&gt; 
 </msg>
<msg time="2026-10-11T00:47:45.344900" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/operations/bgp-peer-rpc:reset-session 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:45.344983" 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 POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-10-11T00:47:45.293639" elapsed="0.051368"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.293386" elapsed="0.051663"/>
</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-10-11T00:47:45.345242" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.345072" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.293370" elapsed="0.051953"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.346570" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:45.346280" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.346027" elapsed="0.000614"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.346011" elapsed="0.000652"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.347229" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:45.346948" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.346712" elapsed="0.000588"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.346697" elapsed="0.000625"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.347858" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:45.347511" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.348169" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.347945" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.348687" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.348404" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.348244" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.347928" elapsed="0.000834"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.349286" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:45.348933" elapsed="0.000377"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.349593" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.349371" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.350082" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.349824" elapsed="0.000282"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.349666" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.349355" elapsed="0.000814"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:45.350311" elapsed="0.000319"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:47:45.351017" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:45.350790" elapsed="0.000251"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.351210" elapsed="0.000228"/>
</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-10-11T00:47:45.345672" elapsed="0.005821"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:47:45.351678" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:47:45.351594" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.351576" elapsed="0.000180"/>
</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-10-11T00:47:45.351900" elapsed="0.000018"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.351959" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:47:45.352115" 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-10-11T00:47:45.288740" elapsed="0.063412"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:45.352214" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:47:45.352335" 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-10-11T00:47:45.224795" elapsed="0.127562"/>
</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-10-11T00:47:45.352665" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.352463" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.352447" elapsed="0.000301"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:45.352778" elapsed="0.000023"/>
</return>
<arg>folder=${BGP_VARIABLES_FOLDER}${/}peer_session/restart</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-10-11T00:47:45.224033" elapsed="0.128840"/>
</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-10-11T00:47:45.353450" elapsed="0.000236"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:47:45.353123" elapsed="0.000621"/>
</kw>
<doc>Reset Peer Session</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:47:45.139201" elapsed="0.214578"/>
</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">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.355287" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.355069" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.355048" 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-10-11T00:47:45.354893" elapsed="0.000587"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.356400" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:45.356313" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.356295" elapsed="0.000181"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.358612" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:45.358529" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.358512" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.359588" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:45.359250" elapsed="0.000363"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.360026" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:47:45.359766" elapsed="0.000283"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:47:45.360089" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:45.360228" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:47:45.358879" elapsed="0.001371"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.362739" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:45.362656" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.362638" 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-10-11T00:47:45.363897" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:45.363812" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.363795" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:45.364294" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.364107" elapsed="0.000212"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:47:45.364654" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:47:45.364511" elapsed="0.000166"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:45.403569" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:47:45.365178" elapsed="0.038485"/>
</kw>
<msg time="2026-10-11T00:47:45.403814" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:47:45.403856" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:45.364833" elapsed="0.039076"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:47:45.433848" level="INFO">". "t "x "t ". "B "a "s "i "c ". "T "C "_ "R "_ "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 "_ "R "e "s "e "t "t "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-10-11T00:47:45.404470" elapsed="0.029482"/>
</kw>
<msg time="2026-10-11T00:47:45.434104" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:47:45.434162" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "R "_ "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "T "o "p "o "l "o "g "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:45.404079" elapsed="0.030120"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.434510" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.434271" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.434252" elapsed="0.000336"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.435002" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "R "_ "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 "_ "R "e "s "e "t "t "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-10-11T00:47:45.434773" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.435341" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.435140" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.435111" elapsed="0.000316"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:47:45.435459" 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-10-11T00:47:45.437890" elapsed="0.000248"/>
</kw>
<msg time="2026-10-11T00:47:45.438197" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:45.436812" elapsed="0.001518"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.438664" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.438999" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:47:45.436220" elapsed="0.002980"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:47:45.435738" elapsed="0.003520"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:47:45.363556" elapsed="0.075775"/>
</kw>
<msg time="2026-10-11T00:47:45.439432" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:45.439498" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "R "_ "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "T "o "p "o "l "o "g "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:45.362987" elapsed="0.076554"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:47:45.439719" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:47:45.439625" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.439605" 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-10-11T00:47:45.440220" 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-10-11T00:47:45.440681" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.440754" 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-10-11T00:47:45.362357" elapsed="0.078491"/>
</kw>
<msg time="2026-10-11T00:47:45.440932" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:45.440977" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "R "_ "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "T "o "p "o "l "o "g "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:45.360599" elapsed="0.080414"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.441323" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.441079" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.441064" elapsed="0.000330"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:47:45.360456" elapsed="0.080975"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:47:45.360298" elapsed="0.081161"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:47:45.358219" elapsed="0.083288"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:47:45.356043" elapsed="0.085514"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:45.355649" elapsed="0.085948"/>
</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-10-11T00:47:45.354514" elapsed="0.087130"/>
</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-10-11T00:47:45.459305" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.458971" elapsed="0.000365"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:45.460138" 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-10-11T00:47:45.459846" elapsed="0.000372">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-10-11T00:47:45.460304" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:45.459524" elapsed="0.000802"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.460839" 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-10-11T00:47:45.460527" elapsed="0.000337"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:45.461169" 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-10-11T00:47:45.461324" 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-10-11T00:47:45.461031" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.461787" 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-10-11T00:47:45.461563" elapsed="0.000266"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.463076" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:45.462544" elapsed="0.000605"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.463811" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.463328" 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-10-11T00:47:45.464265" 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-10-11T00:47:45.464992" elapsed="0.000048"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:47:45.465355" elapsed="0.000044"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:47:45.464059" elapsed="0.001475"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.463940" elapsed="0.001660"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:47:45.465649" elapsed="0.000032"/>
</return>
<msg time="2026-10-11T00:47:45.465789" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:47:45.462187" elapsed="0.003625"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.461897" elapsed="0.003944"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.466011" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.465863" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.461875" elapsed="0.004204"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.466655" 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-10-11T00:47:45.466254" elapsed="0.000426"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:45.466723" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:45.458453" elapsed="0.008368"/>
</kw>
<msg time="2026-10-11T00:47:45.466869" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:45.452738" elapsed="0.014177"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:45.470952" 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/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-10-11T00:47:45.474995" 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/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-10-11T00:47:45.480581" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.480769" 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-10-11T00:47:45.480949" 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-10-11T00:47:45.481301" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.481155" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:45.481139" 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-10-11T00:47:45.481546" 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-10-11T00:47:45.481723" 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-10-11T00:47:45.481924" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:45.481101" elapsed="0.000872"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.481014" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.482162" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.482230" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:47:45.482340" 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-10-11T00:47:45.452029" elapsed="0.030336"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:45.483504" 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-10-11T00:47:45.483292" elapsed="0.000279">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-10-11T00:47:45.483655" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:45.482951" elapsed="0.000727"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.483964" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.483741" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.484516" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.484233" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.484037" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.483724" elapsed="0.000871"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.485089" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:45.484754" elapsed="0.000358"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:47:45.485170" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:45.485293" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:47:45.482647" elapsed="0.002668"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:45.486455" 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-10-11T00:47:45.486236" elapsed="0.000279">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-10-11T00:47:45.486599" 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-10-11T00:47:45.485888" elapsed="0.000734"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:47:45.486782" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:47:45.486684" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.486667" elapsed="0.000191"/>
</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-10-11T00:47:45.487013" elapsed="0.000019"/>
</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-10-11T00:47:45.487202" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.487262" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:47:45.487385" 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-10-11T00:47:45.485579" elapsed="0.001843"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.488640" 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-10-11T00:47:45.488417" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.489121" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:45.488905" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:47:45.499204" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:45.499365" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:47:45.499484" 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-10-11T00:47:45.489484" elapsed="0.010024"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.489239" elapsed="0.010312"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.499730" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.499576" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.489222" elapsed="0.010584"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.501224" 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-10-11T00:47:45.500882" elapsed="0.000385"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.500636" elapsed="0.000663"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.500474" elapsed="0.000847"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.501892" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:45.501625" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.501370" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.501356" elapsed="0.000629"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.502560" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:45.502176" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.502860" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.502648" elapsed="0.000264"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.503372" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.503095" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.502933" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.502631" elapsed="0.000833"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.503978" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:45.503644" elapsed="0.000358"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.504288" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.504064" elapsed="0.000275"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.504796" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.504536" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.504361" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.504047" elapsed="0.000824"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:45.505013" elapsed="0.000302"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:47:45.505740" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:45.505490" elapsed="0.000274"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.505918" elapsed="0.000227"/>
</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-10-11T00:47:45.500137" elapsed="0.006063"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.506343" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:45.506261" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.506245" elapsed="0.000205"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:47:45.507110" 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-10-11T00:47:45.506597" elapsed="0.000554"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:47:45.507197" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:45.507324" 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-10-11T00:47:45.487700" elapsed="0.019647"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:45.507402" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:47:45.507540" 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-10-11T00:47:45.444761" elapsed="0.062802"/>
</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-10-11T00:47:45.518601" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.517823" elapsed="0.000805"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:45.520692" 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-10-11T00:47:45.520189" elapsed="0.000617">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-10-11T00:47:45.520928" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:45.518786" elapsed="0.002166"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.521785" 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-10-11T00:47:45.521137" elapsed="0.000674"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:45.522184" 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-10-11T00:47:45.522444" 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-10-11T00:47:45.521977" elapsed="0.000494"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.523187" 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-10-11T00:47:45.522667" elapsed="0.000578"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:47:45.523903" elapsed="0.000075"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.523307" elapsed="0.000744"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.524885" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.524267" elapsed="0.000656"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.524075" elapsed="0.000925"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.523290" elapsed="0.001732"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.526004" 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-10-11T00:47:45.525199" elapsed="0.000832"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:45.526075" 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-10-11T00:47:45.517295" elapsed="0.008895"/>
</kw>
<msg time="2026-10-11T00:47:45.526269" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:45.512836" elapsed="0.013481"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:45.530552" 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/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-10-11T00:47:45.534526" 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/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-10-11T00:47:45.538486" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.538669" 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-10-11T00:47:45.538848" 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-10-11T00:47:45.539225" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.539069" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:45.539054" 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-10-11T00:47:45.539521" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.539705" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.539870" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:45.539028" elapsed="0.000890"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.538915" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.540089" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.540168" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:47:45.540274" 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-10-11T00:47:45.512033" elapsed="0.028266"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:45.540477" elapsed="0.000314"/>
</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-10-11T00:47:45.541733" 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-10-11T00:47:45.541450" elapsed="0.000310"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:47:45.542218" 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-10-11T00:47:45.541941" 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-10-11T00:47:45.542442" elapsed="0.000285"/>
</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-10-11T00:47:45.541061" elapsed="0.001719"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.540861" elapsed="0.001949"/>
</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-10-11T00:47:45.543006" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.542832" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.540844" elapsed="0.002231"/>
</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-10-11T00:47:45.508525" elapsed="0.034592"/>
</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-10-11T00:47:45.507840" elapsed="0.035358"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.507636" elapsed="0.035601"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.507620" elapsed="0.035639"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:45.543289" elapsed="0.000026"/>
</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-10-11T00:47:45.444089" elapsed="0.099299"/>
</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-10-11T00:47:45.442567" elapsed="0.100904"/>
</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-10-11T00:47:45.442107" elapsed="0.101406"/>
</kw>
<arg>empty_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="PASS" start="2026-10-11T00:47:45.441765" elapsed="0.101797"/>
</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-10-11T00:47:45.544100" elapsed="0.000432"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:47:45.543813" elapsed="0.000776"/>
</kw>
<doc>See example-ipv4-topology empty after resetting session</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:47:45.353980" elapsed="0.190644"/>
</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">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.546285" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.546066" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.546049" elapsed="0.000308"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-10-11T00:47:45.545896" elapsed="0.000503"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.547318" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:45.547235" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.547218" elapsed="0.000162"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.549397" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:45.549315" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.549298" elapsed="0.000176"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.550376" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:45.550035" elapsed="0.000366"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.550829" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:47:45.550569" elapsed="0.000283"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:47:45.550892" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:45.551017" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:47:45.549681" elapsed="0.001358"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.553710" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:45.553626" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.553608" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.554837" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:45.554755" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.554738" elapsed="0.000160"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:45.555227" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.555045" elapsed="0.000206"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:47:45.555572" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:47:45.555430" elapsed="0.000165"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:45.593934" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:47:45.556094" elapsed="0.037931"/>
</kw>
<msg time="2026-10-11T00:47:45.594208" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:47:45.594250" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:45.555750" elapsed="0.038536"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:47:45.632838" level="INFO">". "t "x "t ". "B "a "s "i "c ". "T "C "_ "P "G "_ "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "W "i "t "h "_ "P "e "e "r "_ "G "r "o "u "p "_ "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-10-11T00:47:45.594811" elapsed="0.038128"/>
</kw>
<msg time="2026-10-11T00:47:45.633159" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:47:45.633201" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "P "G "_ "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "W "i "t "h "_ "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:45.594472" elapsed="0.038764"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.633541" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.633304" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.633286" elapsed="0.000330"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.634027" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "P "G "_ "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "W "i "t "h "_ "P "e "e "r "_ "G "r "o "u "p "_ "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-10-11T00:47:45.633800" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.634370" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.634170" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.634152" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:47:45.634487" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:47:45.636892" elapsed="0.000116"/>
</kw>
<msg time="2026-10-11T00:47:45.637063" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:45.635826" elapsed="0.001380"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.637528" elapsed="0.000072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.637860" elapsed="0.000070"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:47:45.635242" elapsed="0.002799"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:47:45.634765" elapsed="0.003334"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:47:45.554498" elapsed="0.083685"/>
</kw>
<msg time="2026-10-11T00:47:45.638265" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:45.638304" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "P "G "_ "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "W "i "t "h "_ "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:45.553923" elapsed="0.084417"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:47:45.638542" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:47:45.638456" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.638437" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.638945" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.639260" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.639326" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:47:45.553326" elapsed="0.086108"/>
</kw>
<msg time="2026-10-11T00:47:45.639521" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:45.639561" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "P "G "_ "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "W "i "t "h "_ "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:45.551481" elapsed="0.088115"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.639884" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.639662" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.639646" elapsed="0.000307"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:47:45.551322" elapsed="0.088652"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:47:45.551086" elapsed="0.088915"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:47:45.549006" elapsed="0.091041"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:47:45.546972" elapsed="0.093125"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:45.546577" elapsed="0.093579"/>
</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-10-11T00:47:45.545527" elapsed="0.094678"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.640864" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.171.7 | 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-10-11T00:47:45.640383" 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-10-11T00:47:45.654100" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.653798" elapsed="0.000340"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:45.654810" 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-10-11T00:47:45.654633" elapsed="0.000239">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-10-11T00:47:45.654956" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:45.654296" elapsed="0.000682"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.655528" 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-10-11T00:47:45.655163" elapsed="0.000392"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:45.655833" 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-10-11T00:47:45.655998" 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-10-11T00:47:45.655724" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.656470" 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-10-11T00:47:45.656232" 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-10-11T00:47:45.657459" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', '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-10-11T00:47:45.657209" elapsed="0.000293"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.657921" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.657675" elapsed="0.000270"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.658569" 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-10-11T00:47:45.658273" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.659340" 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-10-11T00:47:45.659098" elapsed="0.000267"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.659426" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T00:47:45.659561" 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-10-11T00:47:45.658778" 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-10-11T00:47:45.659755" elapsed="0.000181"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:47:45.658139" elapsed="0.001833"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.660499" 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-10-11T00:47:45.660216" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.661186" 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-10-11T00:47:45.660998" elapsed="0.000212"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.661253" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:47:45.661378" 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-10-11T00:47:45.660691" elapsed="0.000709"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.661584" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-10-11T00:47:45.660071" elapsed="0.001714"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.662479" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:45.662011" elapsed="0.000493"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.663169" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.662977" elapsed="0.000216"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.663237" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:45.663360" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:45.662672" elapsed="0.000711"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.663561" elapsed="0.000165"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:47:45.661883" elapsed="0.001880"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.664272" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:45.663990" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.664972" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.664795" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.665041" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:45.665177" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:45.664478" elapsed="0.000722"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.665367" elapsed="0.000183"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:47:45.663861" elapsed="0.001726"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:47:45.657988" elapsed="0.007630"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:47:45.665656" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:47:45.665784" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:47:45.656861" elapsed="0.008986"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.656609" elapsed="0.009270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.666053" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.665902" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.656591" elapsed="0.009532"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.666870" 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-10-11T00:47:45.666296" elapsed="0.000601"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:45.666941" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:45.653262" elapsed="0.013778"/>
</kw>
<msg time="2026-10-11T00:47:45.667090" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:45.649002" elapsed="0.018145"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:45.671176" 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/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-10-11T00:47:45.675171" 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/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-10-11T00:47:45.679144" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.679326" 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-10-11T00:47:45.679524" 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-10-11T00:47:45.679870" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.679725" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:45.679711" 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-10-11T00:47:45.680101" 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-10-11T00:47:45.680295" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.680472" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:45.679685" elapsed="0.000836"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.679591" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.680694" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.680759" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:47:45.680869" 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-10-11T00:47:45.648379" elapsed="0.032543"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.681944" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:45.681719" elapsed="0.000268"/>
</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-10-11T00:47:45.698905" level="INFO">DELETE Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:45.698951" level="INFO">DELETE Response : url=http://10.30.170.173: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.171.7 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:45.699033" 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-10-11T00:47:45.682291" elapsed="0.016767"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.682047" elapsed="0.017048"/>
</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-10-11T00:47:45.699280" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.699119" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.682031" elapsed="0.017325"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.700757" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:45.700475" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.700036" elapsed="0.000794"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.700019" elapsed="0.000834"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.701472" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:45.701184" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.700903" elapsed="0.000644"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.700888" elapsed="0.000681"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.702110" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:45.701760" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.702442" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.702213" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.702948" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.702685" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.702519" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.702196" elapsed="0.000829"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.703564" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:45.703212" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.703855" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.703651" elapsed="0.000255"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.704369" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.704095" elapsed="0.000298"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.703928" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.703634" elapsed="0.000827"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:45.704606" elapsed="0.000291"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:47:45.705329" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:45.705089" elapsed="0.000265"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.705524" elapsed="0.000217"/>
</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-10-11T00:47:45.699704" elapsed="0.006093"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:47:45.705837" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:45.706010" 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-10-11T00:47:45.681176" elapsed="0.024859"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:45.706081" elapsed="0.000024"/>
</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-10-11T00:47:45.641096" elapsed="0.065096"/>
</kw>
<kw name="Configure_Peer_Group">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.707258" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | PEER_GROUP_NAME=internal-neighbor...</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</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>
<arg>PEER_GROUP_NAME=${PEER_GROUP}</arg>
<arg>RR_CLIENT=false</arg>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.706683" elapsed="0.000602"/>
</kw>
<kw name="Run_Keyword_If_At_Least_Else" owner="CompareStream">
<kw name="Get Index From List" owner="Collections">
<msg time="2026-10-11T00:47:45.710801" level="INFO">${position} = 2</msg>
<var>${position}</var>
<arg>${varargs}</arg>
<arg>\ELSE</arg>
<doc>Returns the index of the first occurrence of the `value` on the list.</doc>
<status status="PASS" start="2026-10-11T00:47:45.710591" elapsed="0.000236"/>
</kw>
<if>
<branch type="IF" condition="&quot;${position}&quot; == &quot;-1&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>Missing else statement in defined expresion</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.711098" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.710893" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.710876" elapsed="0.000308"/>
</if>
<kw name="Get Slice From List" owner="Collections">
<msg time="2026-10-11T00:47:45.711569" level="INFO">${varargs_if} = ['BuiltIn.Set Variable', 'verify_peer_group.sulfur']</msg>
<var>${varargs_if}</var>
<arg>${varargs}</arg>
<arg>0</arg>
<arg>${position}</arg>
<doc>Returns a slice of the given list between `start` and `end` indices.</doc>
<status status="PASS" start="2026-10-11T00:47:45.711340" elapsed="0.000254"/>
</kw>
<kw name="Get Slice From List" owner="Collections">
<msg time="2026-10-11T00:47:45.711995" level="INFO">${varargs_else} = ['BuiltIn.Set Variable', 'verify_peer_group']</msg>
<var>${varargs_else}</var>
<arg>${varargs}</arg>
<arg>${position+1}</arg>
<doc>Returns a slice of the given list between `start` and `end` indices.</doc>
<status status="PASS" start="2026-10-11T00:47:45.711768" elapsed="0.000251"/>
</kw>
<kw name="CompareStream__Convert_Input" owner="CompareStream">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.712906" level="INFO">${args} = []</msg>
<var>${args}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:47:45.712674" elapsed="0.000258"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.713364" level="INFO">${kwargs} = {}</msg>
<var>${kwargs}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.713107" elapsed="0.000281"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.714046" level="INFO">${arg} = BuiltIn.Set Variable</msg>
<var>${arg}</var>
<arg>${arg}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:45.713782" elapsed="0.000289"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:47:45.714483" level="INFO">${removed} = BuiltIn.SetVariable</msg>
<var>${removed}</var>
<arg>${arg}</arg>
<arg>\n</arg>
<arg>${Space}</arg>
<arg>\t</arg>
<arg>\r</arg>
<doc>Removes all `removables` from the given `string`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.714243" elapsed="0.000264"/>
</kw>
<if>
<branch type="IF" condition="&quot;${removed[0]}&quot; == &quot;&lt;&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${splitted}</var>
<arg>${arg}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.714812" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.714577" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Split String" owner="String">
<msg time="2026-10-11T00:47:45.715253" level="INFO">${splitted} = ['BuiltIn.Set Variable']</msg>
<var>${splitted}</var>
<arg>${arg}</arg>
<arg>separator==</arg>
<arg>max_split=1</arg>
<doc>Splits the `string` using `separator` as a delimiter string.</doc>
<status status="PASS" start="2026-10-11T00:47:45.715038" elapsed="0.000239"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.714885" elapsed="0.000428"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.714560" elapsed="0.000773"/>
</if>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.715737" level="INFO">Length is 1.</msg>
<msg time="2026-10-11T00:47:45.715811" level="INFO">${len} = 1</msg>
<var>${len}</var>
<arg>${splitted}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-10-11T00:47:45.715493" elapsed="0.000340"/>
</kw>
<if>
<branch type="IF" condition="${len}==1">
<kw name="Append To List" owner="Collections">
<arg>${args}</arg>
<arg>${splitted}[0]</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.716089" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.715895" elapsed="0.000545"/>
</branch>
<branch type="ELSE">
<kw name="Set To Dictionary" owner="Collections">
<arg>${kwargs}</arg>
<arg>@{splitted}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.716622" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.716464" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.715878" elapsed="0.000846"/>
</if>
<var name="${arg}">BuiltIn.Set Variable</var>
<status status="PASS" start="2026-10-11T00:47:45.713652" elapsed="0.003098"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.717345" level="INFO">${arg} = verify_peer_group.sulfur</msg>
<var>${arg}</var>
<arg>${arg}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:45.717055" elapsed="0.000314"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:47:45.717766" level="INFO">${removed} = verify_peer_group.sulfur</msg>
<var>${removed}</var>
<arg>${arg}</arg>
<arg>\n</arg>
<arg>${Space}</arg>
<arg>\t</arg>
<arg>\r</arg>
<doc>Removes all `removables` from the given `string`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.717544" elapsed="0.000246"/>
</kw>
<if>
<branch type="IF" condition="&quot;${removed[0]}&quot; == &quot;&lt;&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${splitted}</var>
<arg>${arg}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.718093" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.717859" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Split String" owner="String">
<msg time="2026-10-11T00:47:45.718543" level="INFO">${splitted} = ['verify_peer_group.sulfur']</msg>
<var>${splitted}</var>
<arg>${arg}</arg>
<arg>separator==</arg>
<arg>max_split=1</arg>
<doc>Splits the `string` using `separator` as a delimiter string.</doc>
<status status="PASS" start="2026-10-11T00:47:45.718330" elapsed="0.000238"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.718183" elapsed="0.000421"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.717842" elapsed="0.000781"/>
</if>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.719003" level="INFO">Length is 1.</msg>
<msg time="2026-10-11T00:47:45.719070" level="INFO">${len} = 1</msg>
<var>${len}</var>
<arg>${splitted}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-10-11T00:47:45.718767" elapsed="0.000325"/>
</kw>
<if>
<branch type="IF" condition="${len}==1">
<kw name="Append To List" owner="Collections">
<arg>${args}</arg>
<arg>${splitted}[0]</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.719362" elapsed="0.000167"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.719168" elapsed="0.000396"/>
</branch>
<branch type="ELSE">
<kw name="Set To Dictionary" owner="Collections">
<arg>${kwargs}</arg>
<arg>@{splitted}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.719750" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.719586" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.719151" elapsed="0.000668"/>
</if>
<var name="${arg}">verify_peer_group.sulfur</var>
<status status="PASS" start="2026-10-11T00:47:45.716925" elapsed="0.002916"/>
</iter>
<var>${arg}</var>
<value>@{arguments}</value>
<status status="PASS" start="2026-10-11T00:47:45.713448" elapsed="0.006418"/>
</for>
<return>
<value>${args}</value>
<value>${kwargs}</value>
<status status="PASS" start="2026-10-11T00:47:45.719901" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:45.720057" level="INFO">${args_if} = ['BuiltIn.Set Variable', 'verify_peer_group.sulfur']</msg>
<msg time="2026-10-11T00:47:45.720100" level="INFO">${kwargs_if} = {}</msg>
<var>${args_if}</var>
<var>${kwargs_if}</var>
<arg>@{varargs_if}</arg>
<doc>Splits arguments into args and kwargs is used in Run_Keyword_If_At_Least_Else and Run_Keyword_If_At_Most_Else.
The problem is, when the string contains =, but it is not a named argument (name=value). There can be many values containing =, but
for sure it is present in xmls. If the string starts with "&lt;" it will be treated as it is xml and splitting for
name and value will not be executed.
If named argument is passed into this kw, only string data are supported e.g. name=string. Complex variables such as lists or dictionaries
are not supported.</doc>
<status status="PASS" start="2026-10-11T00:47:45.712362" elapsed="0.007759"/>
</kw>
<kw name="CompareStream__Convert_Input" owner="CompareStream">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.721004" level="INFO">${args} = []</msg>
<var>${args}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:47:45.720773" elapsed="0.000255"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.721473" level="INFO">${kwargs} = {}</msg>
<var>${kwargs}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.721214" elapsed="0.000283"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.722155" level="INFO">${arg} = BuiltIn.Set Variable</msg>
<var>${arg}</var>
<arg>${arg}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:45.721876" elapsed="0.000304"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:47:45.722577" level="INFO">${removed} = BuiltIn.SetVariable</msg>
<var>${removed}</var>
<arg>${arg}</arg>
<arg>\n</arg>
<arg>${Space}</arg>
<arg>\t</arg>
<arg>\r</arg>
<doc>Removes all `removables` from the given `string`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.722342" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="&quot;${removed[0]}&quot; == &quot;&lt;&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${splitted}</var>
<arg>${arg}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.722906" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.722674" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Split String" owner="String">
<msg time="2026-10-11T00:47:45.723347" level="INFO">${splitted} = ['BuiltIn.Set Variable']</msg>
<var>${splitted}</var>
<arg>${arg}</arg>
<arg>separator==</arg>
<arg>max_split=1</arg>
<doc>Splits the `string` using `separator` as a delimiter string.</doc>
<status status="PASS" start="2026-10-11T00:47:45.723149" elapsed="0.000222"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.722979" elapsed="0.000440"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.722657" elapsed="0.000783"/>
</if>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.723822" level="INFO">Length is 1.</msg>
<msg time="2026-10-11T00:47:45.723889" level="INFO">${len} = 1</msg>
<var>${len}</var>
<arg>${splitted}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-10-11T00:47:45.723584" elapsed="0.000326"/>
</kw>
<if>
<branch type="IF" condition="${len}==1">
<kw name="Append To List" owner="Collections">
<arg>${args}</arg>
<arg>${splitted}[0]</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.724175" elapsed="0.000152"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.723970" elapsed="0.000391"/>
</branch>
<branch type="ELSE">
<kw name="Set To Dictionary" owner="Collections">
<arg>${kwargs}</arg>
<arg>@{splitted}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.724554" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.724383" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.723954" elapsed="0.000669"/>
</if>
<var name="${arg}">BuiltIn.Set Variable</var>
<status status="PASS" start="2026-10-11T00:47:45.721746" elapsed="0.002899"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.725233" level="INFO">${arg} = verify_peer_group</msg>
<var>${arg}</var>
<arg>${arg}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:45.724947" elapsed="0.000345"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:47:45.725687" level="INFO">${removed} = verify_peer_group</msg>
<var>${removed}</var>
<arg>${arg}</arg>
<arg>\n</arg>
<arg>${Space}</arg>
<arg>\t</arg>
<arg>\r</arg>
<doc>Removes all `removables` from the given `string`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.725467" elapsed="0.000244"/>
</kw>
<if>
<branch type="IF" condition="&quot;${removed[0]}&quot; == &quot;&lt;&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${splitted}</var>
<arg>${arg}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.726012" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.725780" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Split String" owner="String">
<msg time="2026-10-11T00:47:45.726458" level="INFO">${splitted} = ['verify_peer_group']</msg>
<var>${splitted}</var>
<arg>${arg}</arg>
<arg>separator==</arg>
<arg>max_split=1</arg>
<doc>Splits the `string` using `separator` as a delimiter string.</doc>
<status status="PASS" start="2026-10-11T00:47:45.726250" elapsed="0.000233"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.726087" elapsed="0.000432"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.725764" elapsed="0.000774"/>
</if>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.726918" level="INFO">Length is 1.</msg>
<msg time="2026-10-11T00:47:45.726986" level="INFO">${len} = 1</msg>
<var>${len}</var>
<arg>${splitted}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-10-11T00:47:45.726683" elapsed="0.000324"/>
</kw>
<if>
<branch type="IF" condition="${len}==1">
<kw name="Append To List" owner="Collections">
<arg>${args}</arg>
<arg>${splitted}[0]</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.727338" elapsed="0.000168"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.727069" elapsed="0.000472"/>
</branch>
<branch type="ELSE">
<kw name="Set To Dictionary" owner="Collections">
<arg>${kwargs}</arg>
<arg>@{splitted}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.727717" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.727563" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.727052" elapsed="0.000733"/>
</if>
<var name="${arg}">verify_peer_group</var>
<status status="PASS" start="2026-10-11T00:47:45.724814" elapsed="0.002993"/>
</iter>
<var>${arg}</var>
<value>@{arguments}</value>
<status status="PASS" start="2026-10-11T00:47:45.721540" elapsed="0.006292"/>
</for>
<return>
<value>${args}</value>
<value>${kwargs}</value>
<status status="PASS" start="2026-10-11T00:47:45.727867" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:47:45.728019" level="INFO">${args_else} = ['BuiltIn.Set Variable', 'verify_peer_group']</msg>
<msg time="2026-10-11T00:47:45.728061" level="INFO">${kwargs_else} = {}</msg>
<var>${args_else}</var>
<var>${kwargs_else}</var>
<arg>@{varargs_else}</arg>
<doc>Splits arguments into args and kwargs is used in Run_Keyword_If_At_Least_Else and Run_Keyword_If_At_Most_Else.
The problem is, when the string contains =, but it is not a named argument (name=value). There can be many values containing =, but
for sure it is present in xmls. If the string starts with "&lt;" it will be treated as it is xml and splitting for
name and value will not be executed.
If named argument is passed into this kw, only string data are supported e.g. name=string. Complex variables such as lists or dictionaries
are not supported.</doc>
<status status="PASS" start="2026-10-11T00:47:45.720466" elapsed="0.007616"/>
</kw>
<if>
<branch type="IF" condition="${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]">
<kw name="Run Keyword" owner="BuiltIn">
<kw name="Set Variable" owner="BuiltIn">
<arg>verify_peer_group.sulfur</arg>
<arg>&amp;{kwargs_if}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.728806" elapsed="0.000392"/>
</kw>
<msg time="2026-10-11T00:47:45.729277" level="INFO">${resp} = verify_peer_group.sulfur</msg>
<var>${resp}</var>
<arg>@{args_if}</arg>
<arg>&amp;{kwargs_if}</arg>
<doc>Executes the given keyword with the given arguments.</doc>
<status status="PASS" start="2026-10-11T00:47:45.728435" elapsed="0.000865"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.728161" elapsed="0.001172"/>
</branch>
<branch type="ELSE">
<kw name="Run Keyword" owner="BuiltIn">
<var>${resp}</var>
<arg>@{args_else}</arg>
<arg>&amp;{kwargs_else}</arg>
<doc>Executes the given keyword with the given arguments.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.729526" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.729355" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.728145" elapsed="0.001454"/>
</if>
<return>
<value>${resp}</value>
<status status="PASS" start="2026-10-11T00:47:45.729630" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:47:45.729754" level="INFO">${verify_peer_group_folder} = verify_peer_group.sulfur</msg>
<var>${verify_peer_group_folder}</var>
<arg>sulfur</arg>
<arg>BuiltIn.Set Variable</arg>
<arg>verify_${peer_group_folder}.sulfur</arg>
<arg>ELSE</arg>
<arg>BuiltIn.Set Variable</arg>
<arg>verify_${peer_group_folder}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run keyword defined before ELSE statement otherwise run keyword defined after ELSE statement and return its value.</doc>
<status status="PASS" start="2026-10-11T00:47:45.710204" elapsed="0.019573"/>
</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-10-11T00:47:45.740016" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.739716" elapsed="0.000327"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:45.740755" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_group.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given `path` points to an existing file.</doc>
<status status="FAIL" start="2026-10-11T00:47:45.740546" elapsed="0.000281">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_group.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-11T00:47:45.740911" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:45.740214" elapsed="0.000720"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.741446" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:45.741104" elapsed="0.000368"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:45.741794" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_group/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_group/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-11T00:47:45.741935" 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-10-11T00:47:45.741683" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.742389" 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/peer-groups/peer-group=$PEER_GROUP_NAME
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:45.742168" elapsed="0.000280"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.743358" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PEER_GROUP_NAME': 'internal-neighbors', 'RR_CLIENT': 'false'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:45.743109" elapsed="0.000291"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.743842" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.743595" elapsed="0.000271"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.744475" 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-10-11T00:47:45.744195" elapsed="0.000305"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.745525" 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-10-11T00:47:45.744982" elapsed="0.000569"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.745595" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:47:45.745721" 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-10-11T00:47:45.744668" elapsed="0.001075"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.745906" elapsed="0.000168"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:47:45.744054" elapsed="0.002057"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.746642" 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-10-11T00:47:45.746357" elapsed="0.000309"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.747556" 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-10-11T00:47:45.747170" elapsed="0.000410"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.747624" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:45.747747" 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-10-11T00:47:45.746834" elapsed="0.000935"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.747934" elapsed="0.000165"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:47:45.746227" elapsed="0.001923"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.748677" 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-10-11T00:47:45.748376" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.749578" 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-10-11T00:47:45.749205" elapsed="0.000397"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.749646" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:45.749770" 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-10-11T00:47:45.748868" elapsed="0.000923"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.749952" elapsed="0.000162"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:47:45.748248" elapsed="0.001920"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.750689" 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-10-11T00:47:45.750401" elapsed="0.000312"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.751626" 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-10-11T00:47:45.751243" elapsed="0.000407"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.751698" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:45.751862" 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-10-11T00:47:45.750881" 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-10-11T00:47:45.752048" elapsed="0.000180"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:47:45.750267" elapsed="0.001999"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.752787" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:45.752513" elapsed="0.000298"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.753692" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.753303" elapsed="0.000414"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.753761" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:45.753888" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:45.752980" 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-10-11T00:47:45.754071" elapsed="0.000180"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:47:45.752366" elapsed="0.001922"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.754799" 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-10-11T00:47:45.754534" elapsed="0.000288"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.755703" 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-10-11T00:47:45.755320" elapsed="0.000408"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.755771" elapsed="0.000032"/>
</return>
<msg time="2026-10-11T00:47:45.755900" 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-10-11T00:47:45.754989" 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-10-11T00:47:45.756082" elapsed="0.000323"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:47:45.754386" elapsed="0.002075"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.756954" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:45.756690" elapsed="0.000288"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.757840" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.757488" elapsed="0.000377"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.757908" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:45.758030" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:45.757159" 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-10-11T00:47:45.758226" elapsed="0.000163"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:47:45.756561" elapsed="0.001884"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.758937" level="INFO">${value} = internal-neighbors</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:45.758672" elapsed="0.000288"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.759829" level="INFO">${encoded} = internal-neighbors</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.759476" elapsed="0.000377"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.759897" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:45.760020" level="INFO">${encoded_value} = internal-neighbors</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:45.759140" elapsed="0.000901"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.760218" elapsed="0.000165"/>
</kw>
<var name="${key}">PEER_GROUP_NAME</var>
<var name="${value}">internal-neighbors</var>
<status status="PASS" start="2026-10-11T00:47:45.758544" elapsed="0.001894"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.760936" 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-10-11T00:47:45.760671" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.761863" 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-10-11T00:47:45.761511" elapsed="0.000377"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.761931" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:45.762090" 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-10-11T00:47:45.761139" 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-10-11T00:47:45.762291" elapsed="0.000186"/>
</kw>
<var name="${key}">RR_CLIENT</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:47:45.760541" elapsed="0.001972"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:47:45.743908" elapsed="0.018639"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:47:45.762586" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:47:45.762716" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PEER_...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:47:45.742761" elapsed="0.019979"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.742510" elapsed="0.020259"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.762937" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.762791" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.742492" elapsed="0.020513"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.763823" 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-10-11T00:47:45.763174" elapsed="0.000675"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:45.763893" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group/${file_name}.</doc>
<status status="PASS" start="2026-10-11T00:47:45.739202" elapsed="0.024789"/>
</kw>
<msg time="2026-10-11T00:47:45.764039" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:45.734919" elapsed="0.029164"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.769147" 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/bgpuser/../../../variables/bgpuser//peer_group.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.773144" 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/bgpuser/../../../variables/bgpuser//peer_group.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.777109" elapsed="0.000044"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.777311" 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-10-11T00:47:45.777505" 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-10-11T00:47:45.777842" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.777696" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:45.777683" 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-10-11T00:47:45.778068" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.778295" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.778476" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:45.777658" elapsed="0.000867"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.777571" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.778699" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.778765" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:47:45.778875" 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-10-11T00:47:45.734318" elapsed="0.044582"/>
</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-10-11T00:47:45.787768" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group.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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.787468" elapsed="0.000326"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:45.788462" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_group.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-10-11T00:47:45.788277" elapsed="0.000244">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_group.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-10-11T00:47:45.788604" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:45.787949" elapsed="0.000678"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.789099" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group/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-10-11T00:47:45.788795" elapsed="0.000342"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:45.789424" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_group/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_group/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-10-11T00:47:45.789545" level="INFO">${template} = &lt;peer-group xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;peer-group-name&gt;$PEER_GROUP_NAME&lt;/peer-group-name&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/co...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-10-11T00:47:45.789303" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.789985" level="INFO">&lt;peer-group xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;peer-group-name&gt;$PEER_GROUP_NAME&lt;/peer-group-name&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&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;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;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;/peer-group&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:45.789762" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:47:45.790365" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.790100" elapsed="0.000333"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.790866" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PEER_...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.790601" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.790456" elapsed="0.000467"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.790083" elapsed="0.000860"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.791866" level="INFO">${final_text} = &lt;peer-group xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;peer-group-name&gt;internal-neighbors&lt;/peer-group-name&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&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-10-11T00:47:45.791172" elapsed="0.000722"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:45.791938" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group/${file_name}.</doc>
<status status="PASS" start="2026-10-11T00:47:45.786934" elapsed="0.005104"/>
</kw>
<msg time="2026-10-11T00:47:45.792090" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:45.782637" elapsed="0.009512"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.796278" 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/bgpuser/../../../variables/bgpuser//peer_group.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.800289" 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/bgpuser/../../../variables/bgpuser//peer_group.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.804285" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.804478" 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-10-11T00:47:45.804659" 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-10-11T00:47:45.804991" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.804847" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:45.804834" 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-10-11T00:47:45.805228" 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-10-11T00:47:45.805422" 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-10-11T00:47:45.805586" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:45.804809" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.804724" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.805805" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.805870" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:47:45.805989" level="INFO">${data} = &lt;peer-group xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;peer-group-name&gt;internal-neighbors&lt;/peer-group-name&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&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-10-11T00:47:45.781913" elapsed="0.024102"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:45.807187" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_group/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given `path` points to an existing file.</doc>
<status status="FAIL" start="2026-10-11T00:47:45.806978" elapsed="0.000269">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_group/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-11T00:47:45.807330" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:45.806654" elapsed="0.000699"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.807649" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.807430" elapsed="0.000269"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.808160" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.807882" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.807722" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.807398" elapsed="0.000838"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.808748" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:45.808395" elapsed="0.000376"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:47:45.808816" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:45.808939" level="INFO">${jmes_expression} = </msg>
<var>${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//peer_group/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-10-11T00:47:45.806340" elapsed="0.002621"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.810204" 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/peer-groups/peer-group=internal-neighbors</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:45.809964" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.810668" level="INFO">&lt;peer-group xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;peer-group-name&gt;internal-neighbors&lt;/peer-group-name&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&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;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;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;/peer-group&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:45.810453" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.811140" 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-10-11T00:47:45.810911" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.811602" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:45.811368" elapsed="0.000274"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:45.812359" 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-10-11T00:47:45.812199" elapsed="0.000184"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:47:45.812699" 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-10-11T00:47:45.812553" elapsed="0.000170"/>
</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-10-11T00:47:45.812883" elapsed="0.000154"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.813487" 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-10-11T00:47:45.813248" elapsed="0.000279"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:47:45.813566" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:45.813693" 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-10-11T00:47:45.811824" elapsed="0.001892"/>
</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-10-11T00:47:45.831244" level="INFO">PUT Request : url=http://10.30.170.173: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/peer-groups/peer-group=internal-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/peer-groups/peer-group=internal-neighbors 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Content-Length': '1041', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;peer-group xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;peer-group-name&gt;internal-neighbors&lt;/peer-group-name&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&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;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;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;/peer-group&gt; 
 </msg>
<msg time="2026-10-11T00:47:45.831357" level="INFO">PUT Response : url=http://10.30.170.173: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/peer-groups/peer-group=internal-neighbors 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:45.831469" 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-10-11T00:47:45.814008" elapsed="0.017486"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.813778" elapsed="0.017763"/>
</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-10-11T00:47:45.831721" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.831566" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.813762" elapsed="0.018040"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.832956" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:45.832685" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.832442" elapsed="0.000585"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.832424" elapsed="0.000626"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.833629" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:45.833348" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.833099" elapsed="0.000602"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.833084" elapsed="0.000639"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.834250" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:45.833895" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.834561" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.834338" elapsed="0.000275"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.835053" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.834793" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.834635" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.834321" elapsed="0.000825"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.835676" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:45.835320" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.835968" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.835763" elapsed="0.000255"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.836497" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.836215" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.836039" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.835747" elapsed="0.000825"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:45.836713" elapsed="0.000287"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:47:45.837387" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:45.837168" elapsed="0.000257"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.837582" elapsed="0.000207"/>
</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-10-11T00:47:45.832134" elapsed="0.005709"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:47:45.837982" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:47:45.837901" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.837884" elapsed="0.000175"/>
</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-10-11T00:47:45.838215" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.838275" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:47:45.838449" 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-10-11T00:47:45.809273" elapsed="0.029201"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:45.838571" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:45.838697" 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-10-11T00:47:45.730647" elapsed="0.108073"/>
</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-10-11T00:47:45.839007" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.838805" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.838789" elapsed="0.000300"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:45.839118" elapsed="0.000037"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}${peer_group_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-10-11T00:47:45.730018" elapsed="0.109211"/>
</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-10-11T00:47:45.854135" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group.sulfur.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.853823" elapsed="0.000340"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:45.855829" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/verify_peer_group.sulfur.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given `path` points to an existing file.</doc>
<status status="FAIL" start="2026-10-11T00:47:45.855647" elapsed="0.000242">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/verify_peer_group.sulfur.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-11T00:47:45.855974" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:45.854321" elapsed="0.001675"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.856508" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group.sulfur/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:45.856181" elapsed="0.000351"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:45.856803" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/verify_peer_group.sulfur/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/verify_peer_group.sulfur/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-11T00:47:45.856923" 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-10-11T00:47:45.856697" elapsed="0.000250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.857379" 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/peer-groups/peer-group=$PEER_GROUP_NAME?content=config
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:45.857160" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.858336" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PEER_GROUP_NAME': 'internal-neighbors', 'RR_CLIENT': 'false'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:45.858088" elapsed="0.000290"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.858814" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.858568" elapsed="0.000270"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.859451" 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-10-11T00:47:45.859170" elapsed="0.000305"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.860321" 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-10-11T00:47:45.859946" elapsed="0.000400"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.860391" elapsed="0.000048"/>
</return>
<msg time="2026-10-11T00:47:45.860541" 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-10-11T00:47:45.859641" elapsed="0.000926"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.860734" elapsed="0.000167"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:47:45.859027" elapsed="0.001943"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.861503" 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-10-11T00:47:45.861214" elapsed="0.000318"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.862374" 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-10-11T00:47:45.862004" elapsed="0.000395"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.862463" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:45.862589" 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-10-11T00:47:45.861700" elapsed="0.000912"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.862780" elapsed="0.000166"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:47:45.861072" elapsed="0.001911"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.863713" 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-10-11T00:47:45.863266" elapsed="0.000471"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.864600" 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-10-11T00:47:45.864220" elapsed="0.000405"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.864670" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:45.864793" 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-10-11T00:47:45.863904" elapsed="0.000912"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.864976" elapsed="0.000183"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:47:45.863081" elapsed="0.002116"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.865716" 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-10-11T00:47:45.865449" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.866717" 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-10-11T00:47:45.866227" elapsed="0.000516"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.866790" elapsed="0.000032"/>
</return>
<msg time="2026-10-11T00:47:45.866923" 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-10-11T00:47:45.865905" 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-10-11T00:47:45.867111" elapsed="0.000185"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:47:45.865294" elapsed="0.002041"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.867882" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:45.867593" elapsed="0.000313"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.868782" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.868431" elapsed="0.000375"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.868850" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:45.868973" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:45.868079" elapsed="0.000916"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.869173" elapsed="0.000167"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:47:45.867462" elapsed="0.001915"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.869915" 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-10-11T00:47:45.869650" elapsed="0.000288"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.870799" 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-10-11T00:47:45.870446" elapsed="0.000378"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.870868" elapsed="0.000032"/>
</return>
<msg time="2026-10-11T00:47:45.870997" 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-10-11T00:47:45.870104" elapsed="0.000915"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.871191" elapsed="0.000163"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:47:45.869510" elapsed="0.001881"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.871966" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:45.871697" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.872910" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.872504" elapsed="0.000431"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.872981" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:45.873105" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:45.872172" 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-10-11T00:47:45.873305" elapsed="0.000193"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:47:45.871568" elapsed="0.001975"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.874037" level="INFO">${value} = internal-neighbors</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:45.873773" elapsed="0.000288"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.875069" level="INFO">${encoded} = internal-neighbors</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.874719" elapsed="0.000375"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.875156" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:45.875280" level="INFO">${encoded_value} = internal-neighbors</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:45.874240" 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-10-11T00:47:45.875492" elapsed="0.000164"/>
</kw>
<var name="${key}">PEER_GROUP_NAME</var>
<var name="${value}">internal-neighbors</var>
<status status="PASS" start="2026-10-11T00:47:45.873645" elapsed="0.002048"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.876198" 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-10-11T00:47:45.875919" elapsed="0.000303"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.877067" 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-10-11T00:47:45.876722" elapsed="0.000369"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.877147" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:47:45.877272" 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-10-11T00:47:45.876389" elapsed="0.000905"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.877489" elapsed="0.000175"/>
</kw>
<var name="${key}">RR_CLIENT</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:47:45.875792" elapsed="0.001909"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:47:45.858880" elapsed="0.018852"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:47:45.877771" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:47:45.877901" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PEER_...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:47:45.857746" elapsed="0.020179"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.857498" elapsed="0.020457"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.878143" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.877980" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.857480" elapsed="0.020732"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.879038" 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-10-11T00:47:45.878369" elapsed="0.000695"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:45.879108" 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/bgpuser/../../../variables/bgpuser//verify_peer_group.sulfur.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group.sulfur.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group.sulfur/${file_name}.</doc>
<status status="PASS" start="2026-10-11T00:47:45.853308" elapsed="0.025917"/>
</kw>
<msg time="2026-10-11T00:47:45.879274" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:45.849089" elapsed="0.030236"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group.sulfur.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group.sulfur.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group.sulfur/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.883435" 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/bgpuser/../../../variables/bgpuser//verify_peer_group.sulfur.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group.sulfur.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group.sulfur/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.887402" 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//verify_peer_group.sulfur.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group.sulfur.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group.sulfur/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.891371" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.891564" 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-10-11T00:47:45.891746" 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-10-11T00:47:45.892087" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.891942" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:45.891926" 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-10-11T00:47:45.892324" 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-10-11T00:47:45.892516" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.892681" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:45.891901" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.891813" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.892900" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.892964" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:47:45.893084" 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-10-11T00:47:45.848494" elapsed="0.044615"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:45.894257" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/verify_peer_group.sulfur/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given `path` points to an existing file.</doc>
<status status="FAIL" start="2026-10-11T00:47:45.894032" elapsed="0.000293">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/verify_peer_group.sulfur/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-11T00:47:45.894423" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:45.893706" elapsed="0.000741"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.894735" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.894510" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.895294" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.895014" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.894842" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.894493" elapsed="0.000876"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.895882" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:45.895546" elapsed="0.000359"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:47:45.895950" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:45.896148" level="INFO">${jmes_expression} = </msg>
<var>${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//verify_peer_group.sulfur/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-10-11T00:47:45.893391" elapsed="0.002781"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:45.897474" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/verify_peer_group.sulfur/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-10-11T00:47:45.897261" elapsed="0.000274">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/verify_peer_group.sulfur/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-11T00:47:45.897620" 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-10-11T00:47:45.896744" elapsed="0.000898"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:47:45.897805" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:47:45.897706" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.897689" elapsed="0.000191"/>
</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-10-11T00:47:45.898033" elapsed="0.000019"/>
</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-10-11T00:47:45.898220" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.898280" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:47:45.898417" 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//verify_peer_group.sulfur/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-10-11T00:47:45.896438" elapsed="0.002004"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.899679" 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/peer-groups/peer-group=internal-neighbors?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:45.899452" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.900149" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:45.899917" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:47:45.924530" level="INFO">GET Request : url=http://10.30.170.173: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/peer-groups/peer-group=internal-neighbors?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/bgp-openconfig-extensions:bgp/peer-groups/peer-group=internal-neighbors?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:45.924698" level="INFO">GET Response : url=http://10.30.170.173: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/peer-groups/peer-group=internal-neighbors?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '479'} 
 body={"bgp-openconfig-extensions:peer-group":[{"peer-group-name":"internal-neighbors","transport":{"config":{"passive-mode":true}},"route-reflector":{"config":{"route-reflector-client":false}},"timers":{"config":{"hold-time":"180.0","connect-retry":"5.0"}},"config":{"peer-type":"INTERNAL"},"afi-safis":{"afi-safi":[{"afi-safi-name":"openconfig-bgp-types:IPV4-UNICAST"},{"afi-safi-name":"openconfig-bgp-types:IPV6-UNICAST"},{"afi-safi-name":"bgp-openconfig-extensions:LINKSTATE"}]}}]} 
 </msg>
<msg time="2026-10-11T00:47:45.924788" 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-10-11T00:47:45.900490" elapsed="0.024322"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.900249" elapsed="0.024601"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.925025" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.924873" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.900232" elapsed="0.024867"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.926429" level="INFO">{"bgp-openconfig-extensions:peer-group":[{"peer-group-name":"internal-neighbors","transport":{"config":{"passive-mode":true}},"route-reflector":{"config":{"route-reflector-client":false}},"timers":{"config":{"hold-time":"180.0","connect-retry":"5.0"}},"config":{"peer-type":"INTERNAL"},"afi-safis":{"afi-safi":[{"afi-safi-name":"openconfig-bgp-types:IPV4-UNICAST"},{"afi-safi-name":"openconfig-bgp-types:IPV6-UNICAST"},{"afi-safi-name":"bgp-openconfig-extensions:LINKSTATE"}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:45.926067" elapsed="0.000409"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.925824" elapsed="0.000684"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.925807" elapsed="0.000727"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.927083" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:45.926821" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.926584" elapsed="0.000584"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.926569" elapsed="0.000621"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.927730" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:45.927364" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.928028" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.927818" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.928562" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.928282" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.928101" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.927802" elapsed="0.000835"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.929161" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:45.928809" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.929478" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.929257" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.929974" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.929711" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.929552" elapsed="0.000477"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.929235" elapsed="0.000813"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:45.930206" elapsed="0.000303"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:47:45.930894" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:45.930669" elapsed="0.000249"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.931070" elapsed="0.000225"/>
</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-10-11T00:47:45.925489" elapsed="0.005861"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.931509" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:45.931426" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.931395" elapsed="0.000180"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:47:45.932555" level="INFO">${text_normalized} = {
 "bgp-openconfig-extensions:peer-group": [
  {
   "afi-safis": {
    "afi-safi": [
     {
      "afi-safi-name": "bgp-openconfig-extensions:LINKSTATE"
     },
     {
      "afi-safi-name": "openconf...</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-10-11T00:47:45.931716" elapsed="0.000867"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:47:45.932630" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:47:45.932755" level="INFO">${response_text} = {
 "bgp-openconfig-extensions:peer-group": [
  {
   "afi-safis": {
    "afi-safi": [
     {
      "afi-safi-name": "bgp-openconfig-extensions:LINKSTATE"
     },
     {
      "afi-safi-name": "openconf...</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-10-11T00:47:45.898727" elapsed="0.034053"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:45.932834" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:47:45.932957" level="INFO">${response_text} = {
 "bgp-openconfig-extensions:peer-group": [
  {
   "afi-safis": {
    "afi-safi": [
     {
      "afi-safi-name": "bgp-openconfig-extensions:LINKSTATE"
     },
     {
      "afi-safi-name": "openconf...</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-10-11T00:47:45.841212" elapsed="0.091800"/>
</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-10-11T00:47:45.943309" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group.sulfur.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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.942997" elapsed="0.000339"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:45.944002" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/verify_peer_group.sulfur.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-10-11T00:47:45.943831" elapsed="0.000230">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/verify_peer_group.sulfur.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-10-11T00:47:45.944163" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:45.943509" elapsed="0.000678"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.944690" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group.sulfur/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-10-11T00:47:45.944361" elapsed="0.000354"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:45.944991" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/verify_peer_group.sulfur/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/verify_peer_group.sulfur/data.json&lt;/a&gt;'.</msg>
<msg time="2026-10-11T00:47:45.945149" level="INFO">${template} = {
    "bgp-openconfig-extensions:peer-group": [
        {
            "peer-group-name": "internal-neighbors",
            "transport": {
                "config": {
                    "passive-mode"...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-10-11T00:47:45.944881" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.945616" level="INFO">{
    "bgp-openconfig-extensions:peer-group": [
        {
            "peer-group-name": "internal-neighbors",
            "transport": {
                "config": {
                    "passive-mode": true
                }
            },
            "config": {
                "peer-type": "INTERNAL"
            },
            "afi-safis": {
                "afi-safi": [
                    {
                        "afi-safi-name": "openconfig-bgp-types:IPV6-UNICAST"
                    },
                    {
                        "afi-safi-name": "openconfig-bgp-types:IPV4-UNICAST"
                    },
                    {
                        "afi-safi-name": "bgp-openconfig-extensions:LINKSTATE"
                    }
                ]
            },
            "timers": {
                "config": {
                    "hold-time": "180.0",
                    "connect-retry": "5.0"
                }
            },
            "route-reflector": {
                "config": {
                    "route-reflector-client": false
                }
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:45.945373" 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-10-11T00:47:45.945974" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.945725" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.946487" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PEER_...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.946206" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.946047" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.945708" elapsed="0.000856"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.947163" level="INFO">${final_text} = {
    "bgp-openconfig-extensions:peer-group": [
        {
            "peer-group-name": "internal-neighbors",
            "transport": {
                "config": {
                    "passive-mode"...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:45.946723" elapsed="0.000468"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:45.947235" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group.sulfur.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group.sulfur.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group.sulfur/${file_name}.</doc>
<status status="PASS" start="2026-10-11T00:47:45.942489" elapsed="0.004846"/>
</kw>
<msg time="2026-10-11T00:47:45.947386" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:45.938247" elapsed="0.009198"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group.sulfur.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group.sulfur.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group.sulfur/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.951658" 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/bgpuser/../../../variables/bgpuser//verify_peer_group.sulfur.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group.sulfur.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group.sulfur/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.955720" 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/bgpuser/../../../variables/bgpuser//verify_peer_group.sulfur.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group.sulfur.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group.sulfur/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.959707" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.959888" 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-10-11T00:47:45.960068" 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-10-11T00:47:45.960438" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.960279" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:45.960265" 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-10-11T00:47:45.960664" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.960842" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.961005" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:45.960239" elapsed="0.000813"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.960147" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.961238" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:45.961305" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:47:45.961430" level="INFO">${expected_text} = {
    "bgp-openconfig-extensions:peer-group": [
        {
            "peer-group-name": "internal-neighbors",
            "transport": {
                "config": {
                    "passive-mode"...</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-10-11T00:47:45.937541" elapsed="0.023915"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:45.961622" elapsed="0.000318"/>
</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-10-11T00:47:45.963018" level="INFO">${expected_normalized} = {
 "bgp-openconfig-extensions:peer-group": [
  {
   "afi-safis": {
    "afi-safi": [
     {
      "afi-safi-name": "bgp-openconfig-extensions:LINKSTATE"
     },
     {
      "afi-safi-name": "openconf...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-10-11T00:47:45.962603" elapsed="0.000442"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:47:45.963637" level="INFO">${actual_normalized} = {
 "bgp-openconfig-extensions:peer-group": [
  {
   "afi-safis": {
    "afi-safi": [
     {
      "afi-safi-name": "bgp-openconfig-extensions:LINKSTATE"
     },
     {
      "afi-safi-name": "openconf...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-10-11T00:47:45.963204" 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-10-11T00:47:45.963881" elapsed="0.000296"/>
</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-10-11T00:47:45.962230" elapsed="0.002003"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.962010" 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-10-11T00:47:45.964472" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.964285" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.961993" elapsed="0.002549"/>
</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-10-11T00:47:45.933987" elapsed="0.030598"/>
</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-10-11T00:47:45.933321" elapsed="0.031328"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.933089" elapsed="0.031600"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.933073" elapsed="0.031636"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:45.964739" elapsed="0.000026"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}${verify_peer_group_folder}</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-10-11T00:47:45.840575" elapsed="0.124263"/>
</kw>
<doc>Configures peer group which is template for all the neighbors which are going
to be configured. Also after PUT, this case verifies presence of peer group within
peer-groups.</doc>
<status status="PASS" start="2026-10-11T00:47:45.706337" elapsed="0.258561"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.965754" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.171.7 | HOLDTIME=180 | PEER_PORT=17900 | PEER_GROUP_NAME=internal-neighbors | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_...</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>PEER_GROUP_NAME=${PEER_GROUP}</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-10-11T00:47:45.965089" elapsed="0.000693"/>
</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-10-11T00:47:45.976152" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer_group.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:45.975838" elapsed="0.000341"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:45.976843" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer_group.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given `path` points to an existing file.</doc>
<status status="FAIL" start="2026-10-11T00:47:45.976668" elapsed="0.000234">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer_group.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-11T00:47:45.976984" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:45.976336" elapsed="0.000671"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.977521" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer_group/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:45.977191" elapsed="0.000358"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:45.977821" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer_group/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer_group/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-11T00:47:45.977943" 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-10-11T00:47:45.977714" elapsed="0.000254"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.978396" 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-10-11T00:47:45.978179" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.979347" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_GROUP_NAME': 'internal-neighbors', '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-10-11T00:47:45.979100" elapsed="0.000342"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.979875" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.979620" elapsed="0.000279"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.980529" 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-10-11T00:47:45.980241" elapsed="0.000312"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.981218" 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-10-11T00:47:45.981026" elapsed="0.000215"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.981285" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:47:45.981424" 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-10-11T00:47:45.980721" elapsed="0.000727"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.981611" elapsed="0.000166"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:47:45.980094" elapsed="0.001719"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.982318" 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-10-11T00:47:45.982038" elapsed="0.000303"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.983003" 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-10-11T00:47:45.982828" elapsed="0.000198"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.983069" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:45.983205" 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-10-11T00:47:45.982525" elapsed="0.000702"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.983387" elapsed="0.000178"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-10-11T00:47:45.981911" elapsed="0.001691"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.984240" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:45.983825" elapsed="0.000439"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.984931" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.984756" elapsed="0.000198"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.984997" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:45.985118" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:45.984445" elapsed="0.000711"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.985319" elapsed="0.000179"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:47:45.983698" elapsed="0.001836"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.986021" 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-10-11T00:47:45.985758" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.986739" 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-10-11T00:47:45.986553" elapsed="0.000209"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.986805" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:45.986926" 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-10-11T00:47:45.986233" elapsed="0.000715"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.987107" elapsed="0.000185"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:47:45.985631" elapsed="0.001697"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.987839" 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-10-11T00:47:45.987568" elapsed="0.000296"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.988540" 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-10-11T00:47:45.988345" elapsed="0.000218"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.988605" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:45.988726" 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-10-11T00:47:45.988030" elapsed="0.000718"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.988947" elapsed="0.000165"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:47:45.987439" elapsed="0.001723"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.989666" level="INFO">${value} = internal-neighbors</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:45.989386" elapsed="0.000303"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.990348" level="INFO">${encoded} = internal-neighbors</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.990173" elapsed="0.000198"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.990431" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:45.990563" level="INFO">${encoded_value} = internal-neighbors</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:45.989861" elapsed="0.000724"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.990745" elapsed="0.000168"/>
</kw>
<var name="${key}">PEER_GROUP_NAME</var>
<var name="${value}">internal-neighbors</var>
<status status="PASS" start="2026-10-11T00:47:45.989259" elapsed="0.001690"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.991474" 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-10-11T00:47:45.991184" elapsed="0.000314"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.992177" 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-10-11T00:47:45.991988" elapsed="0.000213"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.992259" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:45.992383" 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-10-11T00:47:45.991666" elapsed="0.000739"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.992588" elapsed="0.000163"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:47:45.991046" elapsed="0.001742"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.993296" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:45.993010" elapsed="0.000309"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.994116" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.993942" elapsed="0.000210"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.994196" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:45.994318" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:45.993502" 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-10-11T00:47:45.994515" elapsed="0.000163"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:47:45.992884" elapsed="0.001829"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.995215" 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-10-11T00:47:45.994935" elapsed="0.000304"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.995896" 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-10-11T00:47:45.995722" elapsed="0.000197"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.995961" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:45.996083" 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-10-11T00:47:45.995405" elapsed="0.000700"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.996279" elapsed="0.000178"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:47:45.994810" elapsed="0.001684"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.996985" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:45.996723" elapsed="0.000286"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:45.997687" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.997512" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:45.997753" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:45.997875" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:45.997188" elapsed="0.000709"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:45.998057" elapsed="0.000209"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:47:45.996596" elapsed="0.001707"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:47:45.979943" elapsed="0.018391"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:47:45.998371" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:47:45.998517" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_GROUP_NAME': 'internal-neighbors', 'INITIATE': 'false', 'BGP_RI...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:47:45.978764" elapsed="0.019777"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:45.978514" elapsed="0.020056"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:45.998739" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:45.998591" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:45.978496" elapsed="0.020311"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:45.999624" 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-10-11T00:47:45.998961" elapsed="0.000689"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:45.999694" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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_group.vanadium/${file_name} 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_group.vanadium/${file_name},
remove endline, perform safe substitution, 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_group/${file_name}.</doc>
<status status="PASS" start="2026-10-11T00:47:45.975325" elapsed="0.024468"/>
</kw>
<msg time="2026-10-11T00:47:45.999841" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:45.971029" elapsed="0.028855"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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_group.vanadium/${file_name} 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_group.vanadium/${file_name},
remove endline, perform safe substitution, 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_group/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:46.003882" 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/bgpuser/../../../variables/bgpuser//bgp_peer_group.vanadium/${file_name} 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_group.vanadium/${file_name},
remove endline, perform safe substitution, 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_group/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:46.007857" 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/bgpuser/../../../variables/bgpuser//bgp_peer_group.vanadium/${file_name} 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_group.vanadium/${file_name},
remove endline, perform safe substitution, 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_group/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:46.012735" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:46.012918" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:46.013098" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:46.013458" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:46.013300" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:46.013287" 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-10-11T00:47:46.013687" 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-10-11T00:47:46.013864" 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-10-11T00:47:46.014032" elapsed="0.000045"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:46.013261" elapsed="0.000848"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:46.013174" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:46.014296" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:46.014362" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:47:46.014485" 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-10-11T00:47:45.970440" elapsed="0.044070"/>
</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-10-11T00:47:46.023322" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer_group.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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:46.022926" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:46.024017" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer_group.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-10-11T00:47:46.023847" elapsed="0.000230">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer_group.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-10-11T00:47:46.024174" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:46.023523" elapsed="0.000674"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:46.024689" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer_group/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-10-11T00:47:46.024367" elapsed="0.000347"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:46.024985" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer_group/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer_group/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-10-11T00:47:46.025105" 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-10-11T00:47:46.024878" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:46.025574" 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="$PEER_GROUP_NAME"]&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-10-11T00:47:46.025334" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:47:46.025927" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:46.025680" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:46.026437" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_GROUP_NAME': 'internal-neighbors', 'INITIATE': 'false', 'BGP_RI...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:46.026156" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:46.026001" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:46.025663" elapsed="0.000852"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:46.027308" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:46.026676" elapsed="0.000660"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:46.027380" 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/bgpuser/../../../variables/bgpuser//bgp_peer_group.vanadium/${file_name} 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_group.vanadium/${file_name},
remove endline, perform safe substitution, 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_group/${file_name}.</doc>
<status status="PASS" start="2026-10-11T00:47:46.022427" elapsed="0.005076"/>
</kw>
<msg time="2026-10-11T00:47:46.027597" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:46.018185" elapsed="0.009456"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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_group.vanadium/${file_name} 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_group.vanadium/${file_name},
remove endline, perform safe substitution, 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_group/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:46.031745" 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/bgpuser/../../../variables/bgpuser//bgp_peer_group.vanadium/${file_name} 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_group.vanadium/${file_name},
remove endline, perform safe substitution, 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_group/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:46.035781" 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/bgpuser/../../../variables/bgpuser//bgp_peer_group.vanadium/${file_name} 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_group.vanadium/${file_name},
remove endline, perform safe substitution, 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_group/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:46.039828" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:46.040008" 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-10-11T00:47:46.040200" 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-10-11T00:47:46.040552" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:46.040393" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:46.040379" 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-10-11T00:47:46.040778" 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-10-11T00:47:46.040956" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:46.041118" elapsed="0.000030"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:46.040355" elapsed="0.000823"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:46.040267" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:46.041352" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:46.041432" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:47:46.041544" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-...</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-10-11T00:47:46.017478" elapsed="0.024092"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:46.042704" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer_group/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given `path` points to an existing file.</doc>
<status status="FAIL" start="2026-10-11T00:47:46.042486" elapsed="0.000278">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer_group/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-11T00:47:46.042847" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:46.042148" elapsed="0.000722"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:46.043194" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:46.042964" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:46.043709" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:46.043444" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:46.043268" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:46.042946" elapsed="0.000839"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:46.044338" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:46.043943" elapsed="0.000419"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:47:46.044421" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:46.044547" level="INFO">${jmes_expression} = </msg>
<var>${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_group/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-10-11T00:47:46.041838" elapsed="0.002731"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:46.045773" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:46.045553" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:46.046231" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="internal-neighbors"]&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-10-11T00:47:46.046004" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:46.046692" 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-10-11T00:47:46.046475" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:46.047146" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:46.046918" elapsed="0.000268"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:46.047898" 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-10-11T00:47:46.047740" elapsed="0.000183"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:47:46.048234" 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-10-11T00:47:46.048075" elapsed="0.000183"/>
</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-10-11T00:47:46.048434" elapsed="0.000156"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:46.049010" 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-10-11T00:47:46.048788" elapsed="0.000262"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:47:46.049088" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:46.049228" 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-10-11T00:47:46.047373" elapsed="0.001878"/>
</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-10-11T00:47:46.062657" level="INFO">PUT Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Content-Length': '294', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-groups/peer-group[peer-group-name="internal-neighbors"]&lt;/peer-group&gt;
    &lt;/config&gt;
&lt;/neighbor&gt; 
 </msg>
<msg time="2026-10-11T00:47:46.062709" level="INFO">PUT Response : url=http://10.30.170.173: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.171.7 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:46.062797" 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-10-11T00:47:46.049573" elapsed="0.013248"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:46.049313" elapsed="0.013550"/>
</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-10-11T00:47:46.063040" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:46.062887" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:46.049297" elapsed="0.013870"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:46.064338" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:46.064039" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:46.063803" elapsed="0.000621"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:46.063786" elapsed="0.000662"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:46.065015" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:46.064740" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:46.064498" elapsed="0.000588"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:46.064483" elapsed="0.000625"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:46.065658" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:46.065296" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:46.065953" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:46.065746" elapsed="0.000259"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:46.066477" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:46.066199" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:46.066026" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:46.065729" elapsed="0.000824"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:46.067058" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:46.066725" elapsed="0.000357"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:46.067377" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:46.067164" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:46.067884" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:46.067624" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:46.067465" elapsed="0.000476"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:46.067147" elapsed="0.000813"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:46.068102" elapsed="0.000320"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:47:46.068810" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:46.068592" elapsed="0.000243"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:47:46.068986" elapsed="0.000227"/>
</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-10-11T00:47:46.063510" elapsed="0.005760"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:47:46.069427" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:47:46.069329" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:46.069312" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:46.069648" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:47:46.069707" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:47:46.069867" 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-10-11T00:47:46.044860" elapsed="0.025030"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:46.069946" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:47:46.070067" 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-10-11T00:47:45.966648" elapsed="0.103441"/>
</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-10-11T00:47:46.070390" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:46.070188" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:46.070172" elapsed="0.000352"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:46.070554" elapsed="0.000025"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}bgp_peer_group</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-10-11T00:47:45.966034" elapsed="0.104619"/>
</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-10-11T00:47:46.071817" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:46.071476" elapsed="0.000396"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:46.071460" elapsed="0.000435"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:46.072039" elapsed="0.000290"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:46.074748" 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-10-11T00:47:46.074320" elapsed="0.000457"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-10-11T00:47:46.074963" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-10-11T00:47:46.074852" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:46.074833" elapsed="0.000209"/>
</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-10-11T00:47:46.075220" elapsed="0.000020"/>
</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-10-11T00:47:46.075416" 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-10-11T00:47:46.075592" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:46.075759" elapsed="0.000018"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:46.075924" elapsed="0.000018"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message of the current test case.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:46.076094" elapsed="0.000027"/>
</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-10-11T00:47:46.076321" 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-10-11T00:47:46.073988" elapsed="0.002406"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:46.071267" elapsed="0.005188"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-10-11T00:47:46.070908" elapsed="0.005586"/>
</kw>
<doc>Configure BGP peer module with initiate-connection set to false.</doc>
<status status="PASS" start="2026-10-11T00:47:45.544934" elapsed="0.531599"/>
</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-10-11T00:47:46.078056" elapsed="0.000226"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:47:46.077808" 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-10-11T00:47:46.079253" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:46.079167" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:46.079150" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:46.081334" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:46.081253" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:46.081237" elapsed="0.000159"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:46.082334" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:46.081994" elapsed="0.000365"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:47:46.082797" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:47:46.082534" elapsed="0.000286"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:47:46.082905" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:46.083033" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:47:46.081630" elapsed="0.001426"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:46.085727" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:46.085643" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:46.085625" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:46.086866" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:46.086782" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:46.086765" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:46.087383" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:47:46.087076" elapsed="0.000347"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:47:46.087743" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:47:46.087600" elapsed="0.000166"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:46.129799" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:47:46.088265" elapsed="0.041629"/>
</kw>
<msg time="2026-10-11T00:47:46.130048" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:47:46.130088" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:46.087923" elapsed="0.042214"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:47:46.159498" 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-10-11T00:47:46.130670" elapsed="0.028922"/>
</kw>
<msg time="2026-10-11T00:47:46.159740" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:47:46.159780" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:46.130309" elapsed="0.029504"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:46.160093" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:46.159880" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:46.159862" elapsed="0.000321"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:46.160622" 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-10-11T00:47:46.160368" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:46.160938" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:46.160740" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:46.160724" elapsed="0.000284"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:47:46.161038" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:47:46.163506" elapsed="0.000120"/>
</kw>
<msg time="2026-10-11T00:47:46.163683" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:46.162438" elapsed="0.001377"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:46.164118" elapsed="0.000095"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:46.164495" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:47:46.161819" 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-10-11T00:47:46.161339" elapsed="0.003400"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:47:46.086527" elapsed="0.078319"/>
</kw>
<msg time="2026-10-11T00:47:46.164930" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:46.164970" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:46.085943" elapsed="0.079060"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:47:46.165170" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:47:46.165070" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:46.165052" elapsed="0.000195"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:46.165608" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:46.165918" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:47:46.165982" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:47:46.085341" elapsed="0.080725"/>
</kw>
<msg time="2026-10-11T00:47:46.166165" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:46.166206" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:46.083432" elapsed="0.082807"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:46.166548" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:46.166306" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:46.166290" elapsed="0.000331"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:47:46.083276" elapsed="0.083367"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:47:46.083107" elapsed="0.083564"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:47:46.080951" elapsed="0.085768"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:47:46.078903" elapsed="0.087870"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:46.078503" elapsed="0.088314"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:47:46.077443" elapsed="0.089421"/>
</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-10-11T00:47:46.168558" 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-10-11T00:47:46.168243" 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-10-11T00:47:46.168738" elapsed="0.000177"/>
</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-10-11T00:47:46.167782" elapsed="0.001186"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:47:46.192240" level="INFO">^C
[?2004h[jenkins@releng-26932-423-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-10-11T00:47:46.169494" elapsed="0.022804"/>
</kw>
<msg time="2026-10-11T00:47:46.192382" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:46.192439" level="INFO">${message} = ^C
[?2004h[jenkins@releng-26932-423-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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:46.169145" elapsed="0.023319"/>
</kw>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:47:46.193060" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-10-11T00:47:46.205650" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:47:46.205738" level="INFO">${output_log} = 2026-10-11 00:47:34,859 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:47:34,861 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:47:34,869 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-10-11T00:47:46.192944" elapsed="0.012818"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:46.206210" level="INFO">2026-10-11 00:47:34,859 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:47:34,861 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:47:34,869 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:47:34,869 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:47:34,869 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:47:34,869 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 3
2026-10-11 00:47:34,869 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-10-11 00:47:34,869 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 00:47:34,869 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 00:47:34,869 INFO BGP-Thread-1 (job):   My BGP Identifier: 169782023
2026-10-11 00:47:34,869 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 00:47:34,869 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 00:47:34,869 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 00:47:34,870 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 00:47:34,870 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 00:47:34,870 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 00:47:34,870 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 3
2026-10-11 00:47:34,870 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 00:47:34,870 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 00:47:34,872 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 3
2026-10-11 00:47:34,872 INFO BGP-Thread-1 (job): All update messages generated.
2026-10-11 00:47:34,872 INFO BGP-Thread-1 (job): Storing performance results.
2026-10-11 00:47:34,873 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-10-11 00:47:34,873 INFO BGP-Thread-1 (job): Number of iterations: 3
2026-10-11 00:47:34,873 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-10-11 00:47:34,873 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-10-11 00:47:34,873 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 3
2026-10-11 00:47:34,873 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.00017571449279785156s
2026-10-11 00:47:34,873 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-10-11 00:47:34,873 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-10-11 00:47:34,873 INFO BGP-Thread-1 (job):   
2026-10-11 00:47:34,873 INFO BGP-Thread-1 (job):   
2026-10-11 00:47:34,873 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-10-11 00:47:34,873 INFO BGP-Thread-1 (job):   
2026-10-11 00:47:34,874 INFO BGP-Thread-1 (job):   
2026-10-11 00:47:34,874 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-10-11 00:47:34,874 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:47:34,874 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:47:34,874 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:47:34,885 INFO BGP-Thread-1 (job): ... idle for 0.011s
2026-10-11 00:47:34,885 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.011s
2026-10-11 00:47:44,895 INFO BGP-Thread-1 (job): ... idle for 10.009s
2026-10-11 00:47:44,895 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.020s
2026-10-11 00:47:44,895 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:47:44,895 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:47:44,895 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:47:45,329 INFO BGP-Thread-1 (job): NOTIFICATION message received: 0xffffffffffffffffffffffffffffffff0015030600
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-10-11T00:47:46.205963" elapsed="0.000362"/>
</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-10-11T00:47:46.192643" elapsed="0.013734"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<status status="PASS" start="2026-10-11T00:47:46.206550" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:47:46.206454" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:46.206436" elapsed="0.000189"/>
</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-10-11T00:47:46.206810" elapsed="0.000020"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was not seen within timeout period.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:46.206982" elapsed="0.000019"/>
</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-10-11T00:47:46.167393" elapsed="0.039659"/>
</kw>
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:46.207855" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:47:46.207550" elapsed="0.000343"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-10-11T00:47:46.207239" elapsed="0.000706"/>
</kw>
<kw name="Start_BGP_Speaker" owner="BGPSpeaker">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:46.208812" level="INFO">${command} = python3 play.py --amount 3 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:46.208536" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:46.209257" level="INFO">python3 play.py --amount 3 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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-10-11T00:47:46.209028" elapsed="0.000270"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:46.246450" level="INFO">python3 play.py --amount 3 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --peerport=1790 --info &amp;&gt; play.py.out</msg>
<msg time="2026-10-11T00:47:46.246537" level="INFO">${output} =  python3 play.py --amount 3 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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-10-11T00:47:46.209467" elapsed="0.037095"/>
</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-10-11T00:47:46.208147" elapsed="0.038471"/>
</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-10-11T00:47:56.248484" 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-10-11T00:47:46.248157" elapsed="10.000999">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-10-11T00:47:56.249499" elapsed="0.000032"/>
</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-10-11T00:47:46.247869" elapsed="10.001775">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-10-11T00:47:46.247508" elapsed="10.002263"/>
</kw>
<msg time="2026-10-11T00:47:56.249873" 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-10-11T00:47:46.247105" elapsed="10.002793"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-10-11T00:47:56.250058" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-10-11T00:47:56.249987" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.249962" elapsed="0.000192"/>
</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-10-11T00:47:56.250374" elapsed="0.000026"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.250571" 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-10-11T00:47:46.246833" elapsed="10.003812"/>
</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="PASS" start="2026-10-11T00:47:46.167002" elapsed="10.083690"/>
</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-10-11T00:47:56.251281" elapsed="0.000265"/>
</kw>
<doc>This is just a more readable 'None' to override [Teardown].</doc>
<status status="PASS" start="2026-10-11T00:47:56.250945" elapsed="0.000652"/>
</kw>
<doc>Abort the Python speaker. Also, attempt to stop failing fast.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:47:46.076875" elapsed="10.174756"/>
</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">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.254422" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.254185" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.254167" 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-10-11T00:47:56.253869" elapsed="0.000673"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.255539" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:56.255452" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.255434" elapsed="0.000168"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.257640" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:56.257557" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.257541" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.258698" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:56.258339" elapsed="0.000384"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.259164" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:47:56.258884" elapsed="0.000303"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:47:56.259228" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:56.259360" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:47:56.257911" elapsed="0.001470"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.261920" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:56.261830" elapsed="0.000133"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.261812" elapsed="0.000170"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.263159" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:56.262990" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.262973" elapsed="0.000250"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:56.263575" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.263376" elapsed="0.000224"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:47:56.263910" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:47:56.263768" elapsed="0.000165"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:56.307606" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:47:56.264453" elapsed="0.043279"/>
</kw>
<msg time="2026-10-11T00:47:56.307925" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:47:56.307969" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:56.264108" elapsed="0.043894"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:47:56.341232" level="INFO">". "t "x "t ". "B "a "s "i "c ". "T "C "_ "P "G "_ "C "h "e "c "k "_ "T "a "l "k "i "n "g "_ "T "o "p "o "l "o "g "y "_ "I "s "_ "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-10-11T00:47:56.308657" elapsed="0.032676"/>
</kw>
<msg time="2026-10-11T00:47:56.341507" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:47:56.341550" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "P "G "_ "C "h "e "c "k "_ "T "a "l "k "i "n "g "_ "T "o "p "o "l "o "g "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:56.308246" elapsed="0.033338"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.341901" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.341664" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.341640" elapsed="0.000339"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.342475" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "P "G "_ "C "h "e "c "k "_ "T "a "l "k "i "n "g "_ "T "o "p "o "l "o "g "y "_ "I "s "_ "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-10-11T00:47:56.342201" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.342862" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.342656" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.342639" elapsed="0.000295"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:47:56.342966" 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-10-11T00:47:56.345650" elapsed="0.000128"/>
</kw>
<msg time="2026-10-11T00:47:56.345836" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:56.344465" 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-10-11T00:47:56.346288" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.346819" elapsed="0.000084"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:47:56.343831" elapsed="0.003193"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:47:56.343316" 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-10-11T00:47:56.262736" elapsed="0.084443"/>
</kw>
<msg time="2026-10-11T00:47:56.347267" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:56.347306" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "P "G "_ "C "h "e "c "k "_ "T "a "l "k "i "n "g "_ "T "o "p "o "l "o "g "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:56.262151" elapsed="0.085188"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:47:56.347515" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:47:56.347427" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.347391" elapsed="0.000200"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.347930" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.348248" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.348310" 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-10-11T00:47:56.261545" elapsed="0.086850"/>
</kw>
<msg time="2026-10-11T00:47:56.348556" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:56.348595" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "P "G "_ "C "h "e "c "k "_ "T "a "l "k "i "n "g "_ "T "o "p "o "l "o "g "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:56.259747" elapsed="0.088881"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.348913" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.348694" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.348678" elapsed="0.000304"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:47:56.259604" elapsed="0.089399"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:47:56.259449" elapsed="0.089585"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:47:56.257248" elapsed="0.091849"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:47:56.255173" elapsed="0.093976"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:56.254698" elapsed="0.094498"/>
</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-10-11T00:47:56.252729" elapsed="0.096516"/>
</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-10-11T00:47:56.365784" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:56.365470" elapsed="0.000380"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:56.366664" 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-10-11T00:47:56.366385" elapsed="0.000358">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-10-11T00:47:56.366829" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:56.366012" elapsed="0.000840"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.367355" 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-10-11T00:47:56.367023" elapsed="0.000356"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:56.367684" 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-10-11T00:47:56.367835" 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-10-11T00:47:56.367570" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.368292" 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-10-11T00:47:56.368051" 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-10-11T00:47:56.369586" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:56.369019" elapsed="0.000624"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.370313" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.369821" elapsed="0.000515"/>
</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-10-11T00:47:56.370715" 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-10-11T00:47:56.371446" 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-10-11T00:47:56.371794" elapsed="0.000044"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:47:56.370527" elapsed="0.001427"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.370385" elapsed="0.001630"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:47:56.372056" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T00:47:56.372203" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:47:56.368674" elapsed="0.003552"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.368394" elapsed="0.003860"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.372449" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.372276" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.368377" elapsed="0.004148"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.373094" 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-10-11T00:47:56.372682" elapsed="0.000438"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:56.373163" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:56.364935" elapsed="0.008328"/>
</kw>
<msg time="2026-10-11T00:47:56.373310" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:56.360556" elapsed="0.012798"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:56.377638" 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/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-10-11T00:47:56.381663" 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/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-10-11T00:47:56.385663" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.385843" 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-10-11T00:47:56.386023" 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-10-11T00:47:56.386393" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.386245" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:56.386232" 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-10-11T00:47:56.386638" 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-10-11T00:47:56.386815" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.386977" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:56.386207" elapsed="0.000818"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.386116" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.387217" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.387284" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:47:56.387390" 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-10-11T00:47:56.359918" elapsed="0.027510"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:56.388538" 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-10-11T00:47:56.388336" elapsed="0.000262">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-10-11T00:47:56.388680" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:56.387998" elapsed="0.000704"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.388995" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.388771" elapsed="0.000275"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.389534" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:56.389257" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.389069" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.388754" elapsed="0.000855"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.390112" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:56.389767" elapsed="0.000369"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:47:56.390180" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:56.390303" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:47:56.387702" elapsed="0.002655"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:56.391455" 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-10-11T00:47:56.391257" elapsed="0.000257">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-10-11T00:47:56.391598" 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-10-11T00:47:56.390925" elapsed="0.000695"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:47:56.391778" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:47:56.391681" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.391664" elapsed="0.000190"/>
</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-10-11T00:47:56.392011" elapsed="0.000020"/>
</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-10-11T00:47:56.392231" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.392291" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:47:56.392429" 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-10-11T00:47:56.390629" elapsed="0.001824"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.393675" 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-10-11T00:47:56.393452" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.394135" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:56.393906" elapsed="0.000268"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:47:56.403353" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:56.403535" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:47:56.403625" 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-10-11T00:47:56.394483" elapsed="0.009166"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.394232" elapsed="0.009456"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.403866" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.403711" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.394215" elapsed="0.009727"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.405224" 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-10-11T00:47:56.404879" elapsed="0.000390"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.404636" elapsed="0.000665"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.404619" elapsed="0.000704"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.405901" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:56.405633" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.405372" elapsed="0.000601"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.405357" elapsed="0.000638"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.406574" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:56.406186" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.406871" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.406662" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.407434" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:56.407156" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.406975" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.406646" elapsed="0.000866"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.408025" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:56.407684" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.408351" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.408141" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.408873" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:56.408608" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.408440" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.408118" elapsed="0.000832"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:56.409123" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:47:56.409967" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:56.409695" elapsed="0.000297"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.410161" elapsed="0.000224"/>
</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-10-11T00:47:56.404280" elapsed="0.006177"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.410600" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:56.410519" elapsed="0.000120"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.410502" elapsed="0.000156"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:47:56.411455" 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-10-11T00:47:56.410805" elapsed="0.000678"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:47:56.411529" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:47:56.411653" 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-10-11T00:47:56.392739" elapsed="0.018938"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:56.411730" elapsed="0.000023"/>
</return>
<msg time="2026-10-11T00:47:56.411846" 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-10-11T00:47:56.352467" elapsed="0.059402"/>
</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-10-11T00:47:56.422878" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:56.422139" elapsed="0.000766"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:56.424979" 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-10-11T00:47:56.424505" elapsed="0.000605">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-10-11T00:47:56.425237" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:56.423061" elapsed="0.002199"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.426140" 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-10-11T00:47:56.425494" elapsed="0.000672"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:56.426558" 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-10-11T00:47:56.426769" 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-10-11T00:47:56.426333" elapsed="0.000462"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.427537" 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-10-11T00:47:56.426994" elapsed="0.000604"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:47:56.428199" elapsed="0.000075"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.427661" elapsed="0.000689"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.429335" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:56.428731" elapsed="0.000643"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.428374" elapsed="0.001091"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.427643" elapsed="0.001845"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.430506" 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-10-11T00:47:56.429652" elapsed="0.000881"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:56.430578" 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-10-11T00:47:56.421622" elapsed="0.009058"/>
</kw>
<msg time="2026-10-11T00:47:56.430728" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:56.417271" elapsed="0.013501"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:56.434838" 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/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-10-11T00:47:56.438830" 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/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-10-11T00:47:56.444173" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.444358" 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-10-11T00:47:56.444610" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.444984" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.444835" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:56.444820" 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-10-11T00:47:56.445225" 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-10-11T00:47:56.445423" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.445591" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:56.444793" elapsed="0.000846"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.444680" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.445812" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.445878" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:47:56.445987" 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-10-11T00:47:56.416563" elapsed="0.029449"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:56.446191" elapsed="0.000344"/>
</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-10-11T00:47:56.447593" 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-10-11T00:47:56.447183" elapsed="0.000438"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:47:56.448162" 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-10-11T00:47:56.447770" 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-10-11T00:47:56.448373" elapsed="0.000308"/>
</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-10-11T00:47:56.446810" elapsed="0.001926"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.446606" elapsed="0.002160"/>
</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-10-11T00:47:56.448968" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.448788" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.446589" elapsed="0.002446"/>
</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-10-11T00:47:56.412838" elapsed="0.036252"/>
</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-10-11T00:47:56.412157" elapsed="0.037000"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.411940" elapsed="0.037256"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.411925" elapsed="0.037291"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:56.449246" elapsed="0.000026"/>
</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-10-11T00:47:56.351819" elapsed="0.097525"/>
</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-10-11T00:47:56.350255" elapsed="0.099141"/>
</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-10-11T00:47:56.349799" elapsed="0.099693"/>
</kw>
<arg>filled_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="PASS" start="2026-10-11T00:47:56.349375" elapsed="0.100171"/>
</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-10-11T00:47:56.450094" elapsed="0.000226"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:47:56.449791" elapsed="0.000587"/>
</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-10-11T00:47:56.252092" elapsed="0.198338"/>
</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">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.452201" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.451988" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.451971" elapsed="0.000303"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-10-11T00:47:56.451816" elapsed="0.000499"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.453265" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:56.453163" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.453141" 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-10-11T00:47:56.493658" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:56.493538" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.493514" elapsed="0.000230"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.494798" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:56.494395" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.495268" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:47:56.494983" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:47:56.495332" elapsed="0.000034"/>
</return>
<msg time="2026-10-11T00:47:56.495484" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:47:56.493998" 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-10-11T00:47:56.498012" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:56.497928" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.497911" elapsed="0.000181"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.499171" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:56.499086" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.499056" elapsed="0.000177"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:56.499572" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.499379" elapsed="0.000217"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:47:56.499896" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:47:56.499757" elapsed="0.000162"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:56.542259" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:47:56.500429" elapsed="0.041930"/>
</kw>
<msg time="2026-10-11T00:47:56.542536" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:47:56.542592" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:56.500088" elapsed="0.042540"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:47:56.606708" level="INFO">". "t "x "t ". "B "a "s "i "c ". "T "C "_ "P "G "_ "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "W "i "t "h "_ "P "e "e "r "_ "G "r "o "u "p "_ "W "i "t "h "o "u "t "_ "I "p "v "4 "_ "U "n "i "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-10-11T00:47:56.543180" elapsed="0.063634"/>
</kw>
<msg time="2026-10-11T00:47:56.606967" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:47:56.607068" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "P "G "_ "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "W "i "t "h "_ "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:56.542802" elapsed="0.064324"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.607433" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.607199" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.607180" elapsed="0.000327"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.607918" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "P "G "_ "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "W "i "t "h "_ "P "e "e "r "_ "G "r "o "u "p "_ "W "i "t "h "o "u "t "_ "I "p "v "4 "_ "U "n "i "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-10-11T00:47:56.607688" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.608323" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.608047" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.608031" elapsed="0.000397"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:47:56.608469" 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-10-11T00:47:56.611153" elapsed="0.000116"/>
</kw>
<msg time="2026-10-11T00:47:56.611327" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:56.610031" 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-10-11T00:47:56.611781" elapsed="0.000072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.612136" 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-10-11T00:47:56.609446" 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-10-11T00:47:56.608812" elapsed="0.003569"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:47:56.498815" elapsed="0.113660"/>
</kw>
<msg time="2026-10-11T00:47:56.612556" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:56.612596" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "P "G "_ "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "W "i "t "h "_ "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:56.498242" elapsed="0.114389"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:47:56.612782" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:47:56.612698" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.612681" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.613212" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.613575" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.613640" 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-10-11T00:47:56.497643" elapsed="0.116082"/>
</kw>
<msg time="2026-10-11T00:47:56.613808" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:56.613848" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "P "G "_ "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "W "i "t "h "_ "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:56.495862" elapsed="0.118020"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.614178" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.613948" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.613932" elapsed="0.000316"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:47:56.495714" elapsed="0.118556"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:47:56.495561" elapsed="0.118738"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:47:56.493068" elapsed="0.121280"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:47:56.452873" elapsed="0.161631"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:56.452480" elapsed="0.162069"/>
</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-10-11T00:47:56.451395" elapsed="0.163202"/>
</kw>
<kw name="Configure_Peer_Group">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.615701" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | PEER_GROUP_NAME=internal-neighbor...</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</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>
<arg>PEER_GROUP_NAME=${PEER_GROUP}</arg>
<arg>RR_CLIENT=false</arg>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.615115" elapsed="0.000614"/>
</kw>
<kw name="Run_Keyword_If_At_Least_Else" owner="CompareStream">
<kw name="Get Index From List" owner="Collections">
<msg time="2026-10-11T00:47:56.619157" level="INFO">${position} = 2</msg>
<var>${position}</var>
<arg>${varargs}</arg>
<arg>\ELSE</arg>
<doc>Returns the index of the first occurrence of the `value` on the list.</doc>
<status status="PASS" start="2026-10-11T00:47:56.618967" elapsed="0.000215"/>
</kw>
<if>
<branch type="IF" condition="&quot;${position}&quot; == &quot;-1&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>Missing else statement in defined expresion</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.619462" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.619246" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.619229" elapsed="0.000305"/>
</if>
<kw name="Get Slice From List" owner="Collections">
<msg time="2026-10-11T00:47:56.619903" level="INFO">${varargs_if} = ['BuiltIn.Set Variable', 'verify_peer_group_without_ipv4.sulfur']</msg>
<var>${varargs_if}</var>
<arg>${varargs}</arg>
<arg>0</arg>
<arg>${position}</arg>
<doc>Returns a slice of the given list between `start` and `end` indices.</doc>
<status status="PASS" start="2026-10-11T00:47:56.619686" elapsed="0.000241"/>
</kw>
<kw name="Get Slice From List" owner="Collections">
<msg time="2026-10-11T00:47:56.620342" level="INFO">${varargs_else} = ['BuiltIn.Set Variable', 'verify_peer_group_without_ipv4']</msg>
<var>${varargs_else}</var>
<arg>${varargs}</arg>
<arg>${position+1}</arg>
<doc>Returns a slice of the given list between `start` and `end` indices.</doc>
<status status="PASS" start="2026-10-11T00:47:56.620114" elapsed="0.000253"/>
</kw>
<kw name="CompareStream__Convert_Input" owner="CompareStream">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.621238" level="INFO">${args} = []</msg>
<var>${args}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:47:56.620995" elapsed="0.000267"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.621691" level="INFO">${kwargs} = {}</msg>
<var>${kwargs}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.621449" elapsed="0.000265"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.622370" level="INFO">${arg} = BuiltIn.Set Variable</msg>
<var>${arg}</var>
<arg>${arg}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:56.622105" elapsed="0.000289"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:47:56.622789" level="INFO">${removed} = BuiltIn.SetVariable</msg>
<var>${removed}</var>
<arg>${arg}</arg>
<arg>\n</arg>
<arg>${Space}</arg>
<arg>\t</arg>
<arg>\r</arg>
<doc>Removes all `removables` from the given `string`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.622567" elapsed="0.000245"/>
</kw>
<if>
<branch type="IF" condition="&quot;${removed[0]}&quot; == &quot;&lt;&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${splitted}</var>
<arg>${arg}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.623129" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.622881" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Split String" owner="String">
<msg time="2026-10-11T00:47:56.623716" level="INFO">${splitted} = ['BuiltIn.Set Variable']</msg>
<var>${splitted}</var>
<arg>${arg}</arg>
<arg>separator==</arg>
<arg>max_split=1</arg>
<doc>Splits the `string` using `separator` as a delimiter string.</doc>
<status status="PASS" start="2026-10-11T00:47:56.623350" elapsed="0.000389"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.623202" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.622863" elapsed="0.000933"/>
</if>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.624212" level="INFO">Length is 1.</msg>
<msg time="2026-10-11T00:47:56.624279" level="INFO">${len} = 1</msg>
<var>${len}</var>
<arg>${splitted}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-10-11T00:47:56.623940" elapsed="0.000360"/>
</kw>
<if>
<branch type="IF" condition="${len}==1">
<kw name="Append To List" owner="Collections">
<arg>${args}</arg>
<arg>${splitted}[0]</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.624573" elapsed="0.000157"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.624362" elapsed="0.000401"/>
</branch>
<branch type="ELSE">
<kw name="Set To Dictionary" owner="Collections">
<arg>${kwargs}</arg>
<arg>@{splitted}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.624942" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.624786" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.624344" elapsed="0.000666"/>
</if>
<var name="${arg}">BuiltIn.Set Variable</var>
<status status="PASS" start="2026-10-11T00:47:56.621964" elapsed="0.003068"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.625662" level="INFO">${arg} = verify_peer_group_without_ipv4.sulfur</msg>
<var>${arg}</var>
<arg>${arg}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:56.625379" elapsed="0.000308"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:47:56.626062" level="INFO">${removed} = verify_peer_group_without_ipv4.sulfur</msg>
<var>${removed}</var>
<arg>${arg}</arg>
<arg>\n</arg>
<arg>${Space}</arg>
<arg>\t</arg>
<arg>\r</arg>
<doc>Removes all `removables` from the given `string`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.625844" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="&quot;${removed[0]}&quot; == &quot;&lt;&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${splitted}</var>
<arg>${arg}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.626426" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.626180" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Split String" owner="String">
<msg time="2026-10-11T00:47:56.626873" level="INFO">${splitted} = ['verify_peer_group_without_ipv4.sulfur']</msg>
<var>${splitted}</var>
<arg>${arg}</arg>
<arg>separator==</arg>
<arg>max_split=1</arg>
<doc>Splits the `string` using `separator` as a delimiter string.</doc>
<status status="PASS" start="2026-10-11T00:47:56.626679" elapsed="0.000218"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.626501" elapsed="0.000431"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.626163" elapsed="0.000789"/>
</if>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.627355" level="INFO">Length is 1.</msg>
<msg time="2026-10-11T00:47:56.627436" level="INFO">${len} = 1</msg>
<var>${len}</var>
<arg>${splitted}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-10-11T00:47:56.627116" elapsed="0.000343"/>
</kw>
<if>
<branch type="IF" condition="${len}==1">
<kw name="Append To List" owner="Collections">
<arg>${args}</arg>
<arg>${splitted}[0]</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.627710" elapsed="0.000149"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.627520" elapsed="0.000373"/>
</branch>
<branch type="ELSE">
<kw name="Set To Dictionary" owner="Collections">
<arg>${kwargs}</arg>
<arg>@{splitted}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.628067" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.627915" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.627504" elapsed="0.000646"/>
</if>
<var name="${arg}">verify_peer_group_without_ipv4.sulfur</var>
<status status="PASS" start="2026-10-11T00:47:56.625252" elapsed="0.002920"/>
</iter>
<var>${arg}</var>
<value>@{arguments}</value>
<status status="PASS" start="2026-10-11T00:47:56.621760" elapsed="0.006437"/>
</for>
<return>
<value>${args}</value>
<value>${kwargs}</value>
<status status="PASS" start="2026-10-11T00:47:56.628231" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:47:56.628381" level="INFO">${args_if} = ['BuiltIn.Set Variable', 'verify_peer_group_without_ipv4.sulfur']</msg>
<msg time="2026-10-11T00:47:56.628439" level="INFO">${kwargs_if} = {}</msg>
<var>${args_if}</var>
<var>${kwargs_if}</var>
<arg>@{varargs_if}</arg>
<doc>Splits arguments into args and kwargs is used in Run_Keyword_If_At_Least_Else and Run_Keyword_If_At_Most_Else.
The problem is, when the string contains =, but it is not a named argument (name=value). There can be many values containing =, but
for sure it is present in xmls. If the string starts with "&lt;" it will be treated as it is xml and splitting for
name and value will not be executed.
If named argument is passed into this kw, only string data are supported e.g. name=string. Complex variables such as lists or dictionaries
are not supported.</doc>
<status status="PASS" start="2026-10-11T00:47:56.620693" elapsed="0.007768"/>
</kw>
<kw name="CompareStream__Convert_Input" owner="CompareStream">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.629326" level="INFO">${args} = []</msg>
<var>${args}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:47:56.629088" elapsed="0.000262"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.629783" level="INFO">${kwargs} = {}</msg>
<var>${kwargs}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.629541" elapsed="0.000265"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.630486" level="INFO">${arg} = BuiltIn.Set Variable</msg>
<var>${arg}</var>
<arg>${arg}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:56.630205" elapsed="0.000305"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:47:56.630882" level="INFO">${removed} = BuiltIn.SetVariable</msg>
<var>${removed}</var>
<arg>${arg}</arg>
<arg>\n</arg>
<arg>${Space}</arg>
<arg>\t</arg>
<arg>\r</arg>
<doc>Removes all `removables` from the given `string`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.630666" elapsed="0.000240"/>
</kw>
<if>
<branch type="IF" condition="&quot;${removed[0]}&quot; == &quot;&lt;&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${splitted}</var>
<arg>${arg}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.631261" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.630975" elapsed="0.000349"/>
</branch>
<branch type="ELSE">
<kw name="Split String" owner="String">
<msg time="2026-10-11T00:47:56.631744" level="INFO">${splitted} = ['BuiltIn.Set Variable']</msg>
<var>${splitted}</var>
<arg>${arg}</arg>
<arg>separator==</arg>
<arg>max_split=1</arg>
<doc>Splits the `string` using `separator` as a delimiter string.</doc>
<status status="PASS" start="2026-10-11T00:47:56.631548" elapsed="0.000219"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.631352" elapsed="0.000451"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.630958" elapsed="0.000864"/>
</if>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.632226" level="INFO">Length is 1.</msg>
<msg time="2026-10-11T00:47:56.632293" level="INFO">${len} = 1</msg>
<var>${len}</var>
<arg>${splitted}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-10-11T00:47:56.631964" elapsed="0.000350"/>
</kw>
<if>
<branch type="IF" condition="${len}==1">
<kw name="Append To List" owner="Collections">
<arg>${args}</arg>
<arg>${splitted}[0]</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.632583" elapsed="0.000150"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.632375" elapsed="0.000392"/>
</branch>
<branch type="ELSE">
<kw name="Set To Dictionary" owner="Collections">
<arg>${kwargs}</arg>
<arg>@{splitted}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.632944" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.632790" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.632358" elapsed="0.000653"/>
</if>
<var name="${arg}">BuiltIn.Set Variable</var>
<status status="PASS" start="2026-10-11T00:47:56.630045" elapsed="0.002988"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.633670" level="INFO">${arg} = verify_peer_group_without_ipv4</msg>
<var>${arg}</var>
<arg>${arg}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:56.633388" elapsed="0.000307"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:47:56.634064" level="INFO">${removed} = verify_peer_group_without_ipv4</msg>
<var>${removed}</var>
<arg>${arg}</arg>
<arg>\n</arg>
<arg>${Space}</arg>
<arg>\t</arg>
<arg>\r</arg>
<doc>Removes all `removables` from the given `string`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.633851" elapsed="0.000254"/>
</kw>
<if>
<branch type="IF" condition="&quot;${removed[0]}&quot; == &quot;&lt;&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${splitted}</var>
<arg>${arg}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.634402" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.634173" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Split String" owner="String">
<msg time="2026-10-11T00:47:56.634828" level="INFO">${splitted} = ['verify_peer_group_without_ipv4']</msg>
<var>${splitted}</var>
<arg>${arg}</arg>
<arg>separator==</arg>
<arg>max_split=1</arg>
<doc>Splits the `string` using `separator` as a delimiter string.</doc>
<status status="PASS" start="2026-10-11T00:47:56.634638" elapsed="0.000214"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.634491" elapsed="0.000428"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.634156" elapsed="0.000783"/>
</if>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.635389" level="INFO">Length is 1.</msg>
<msg time="2026-10-11T00:47:56.635487" level="INFO">${len} = 1</msg>
<var>${len}</var>
<arg>${splitted}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-10-11T00:47:56.635101" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="${len}==1">
<kw name="Append To List" owner="Collections">
<arg>${args}</arg>
<arg>${splitted}[0]</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.635767" elapsed="0.000153"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.635572" elapsed="0.000382"/>
</branch>
<branch type="ELSE">
<kw name="Set To Dictionary" owner="Collections">
<arg>${kwargs}</arg>
<arg>@{splitted}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.636175" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.635976" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.635556" elapsed="0.000704"/>
</if>
<var name="${arg}">verify_peer_group_without_ipv4</var>
<status status="PASS" start="2026-10-11T00:47:56.633251" elapsed="0.003031"/>
</iter>
<var>${arg}</var>
<value>@{arguments}</value>
<status status="PASS" start="2026-10-11T00:47:56.629848" elapsed="0.006460"/>
</for>
<return>
<value>${args}</value>
<value>${kwargs}</value>
<status status="PASS" start="2026-10-11T00:47:56.636343" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:47:56.636511" level="INFO">${args_else} = ['BuiltIn.Set Variable', 'verify_peer_group_without_ipv4']</msg>
<msg time="2026-10-11T00:47:56.636555" level="INFO">${kwargs_else} = {}</msg>
<var>${args_else}</var>
<var>${kwargs_else}</var>
<arg>@{varargs_else}</arg>
<doc>Splits arguments into args and kwargs is used in Run_Keyword_If_At_Least_Else and Run_Keyword_If_At_Most_Else.
The problem is, when the string contains =, but it is not a named argument (name=value). There can be many values containing =, but
for sure it is present in xmls. If the string starts with "&lt;" it will be treated as it is xml and splitting for
name and value will not be executed.
If named argument is passed into this kw, only string data are supported e.g. name=string. Complex variables such as lists or dictionaries
are not supported.</doc>
<status status="PASS" start="2026-10-11T00:47:56.628771" elapsed="0.007805"/>
</kw>
<if>
<branch type="IF" condition="${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]">
<kw name="Run Keyword" owner="BuiltIn">
<kw name="Set Variable" owner="BuiltIn">
<arg>verify_peer_group_without_ipv4.sulfur</arg>
<arg>&amp;{kwargs_if}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:56.637404" elapsed="0.000256"/>
</kw>
<msg time="2026-10-11T00:47:56.637737" level="INFO">${resp} = verify_peer_group_without_ipv4.sulfur</msg>
<var>${resp}</var>
<arg>@{args_if}</arg>
<arg>&amp;{kwargs_if}</arg>
<doc>Executes the given keyword with the given arguments.</doc>
<status status="PASS" start="2026-10-11T00:47:56.637019" elapsed="0.000741"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.636643" elapsed="0.001150"/>
</branch>
<branch type="ELSE">
<kw name="Run Keyword" owner="BuiltIn">
<var>${resp}</var>
<arg>@{args_else}</arg>
<arg>&amp;{kwargs_else}</arg>
<doc>Executes the given keyword with the given arguments.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.637968" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.637815" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.636627" elapsed="0.001412"/>
</if>
<return>
<value>${resp}</value>
<status status="PASS" start="2026-10-11T00:47:56.638081" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:47:56.638207" level="INFO">${verify_peer_group_folder} = verify_peer_group_without_ipv4.sulfur</msg>
<var>${verify_peer_group_folder}</var>
<arg>sulfur</arg>
<arg>BuiltIn.Set Variable</arg>
<arg>verify_${peer_group_folder}.sulfur</arg>
<arg>ELSE</arg>
<arg>BuiltIn.Set Variable</arg>
<arg>verify_${peer_group_folder}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium is at least ${lower_bound},
run keyword defined before ELSE statement otherwise run keyword defined after ELSE statement and return its value.</doc>
<status status="PASS" start="2026-10-11T00:47:56.618599" elapsed="0.019631"/>
</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-10-11T00:47:56.648589" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group_without_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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:56.648272" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:56.649333" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_group_without_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-10-11T00:47:56.649106" elapsed="0.000318">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_group_without_ipv4.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-11T00:47:56.649511" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:56.648775" elapsed="0.000759"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.650009" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group_without_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-10-11T00:47:56.649704" elapsed="0.000330"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:56.650331" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_group_without_ipv4/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_group_without_ipv4/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-11T00:47:56.650498" 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-10-11T00:47:56.650221" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.650934" 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/peer-groups/peer-group=$PEER_GROUP_NAME
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:56.650715" 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-10-11T00:47:56.651935" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PEER_GROUP_NAME': 'internal-neighbors', 'RR_CLIENT': 'false'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:56.651702" elapsed="0.000275"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.652444" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.652182" elapsed="0.000286"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.653050" 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-10-11T00:47:56.652786" elapsed="0.000300"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:56.654055" 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-10-11T00:47:56.653696" elapsed="0.000398"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:56.654141" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:47:56.654268" 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-10-11T00:47:56.653258" 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-10-11T00:47:56.654471" elapsed="0.000173"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:47:56.652658" elapsed="0.002023"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.655260" 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-10-11T00:47:56.654932" elapsed="0.000358"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:56.656210" 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-10-11T00:47:56.655818" elapsed="0.000422"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:56.656285" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:56.656427" 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-10-11T00:47:56.655512" elapsed="0.000938"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.656612" elapsed="0.000164"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:47:56.654781" elapsed="0.002031"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.657351" 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-10-11T00:47:56.657036" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:56.658255" 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-10-11T00:47:56.657886" elapsed="0.000393"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:56.658324" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:56.658470" 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-10-11T00:47:56.657571" elapsed="0.000922"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.658654" elapsed="0.000162"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:47:56.656910" elapsed="0.001943"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.659456" 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-10-11T00:47:56.659096" elapsed="0.000389"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:56.660363" 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-10-11T00:47:56.659962" elapsed="0.000425"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:56.660454" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:47:56.660580" 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-10-11T00:47:56.659656" 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-10-11T00:47:56.660765" elapsed="0.000165"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:47:56.658951" elapsed="0.002016"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.661554" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:56.661243" elapsed="0.000335"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:56.662498" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.662122" elapsed="0.000401"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:56.662568" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:56.662692" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:56.661786" elapsed="0.000928"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.662881" elapsed="0.000163"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:47:56.661065" elapsed="0.002047"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.663634" 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-10-11T00:47:56.663340" elapsed="0.000318"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:56.664659" 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-10-11T00:47:56.664286" elapsed="0.000397"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:56.664728" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:56.664850" 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-10-11T00:47:56.663827" 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-10-11T00:47:56.665032" elapsed="0.000177"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:47:56.663213" elapsed="0.002033"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.665766" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:56.665498" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:56.666677" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.666276" elapsed="0.000426"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:56.666747" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:56.666870" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:56.665958" 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-10-11T00:47:56.667054" elapsed="0.000178"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:47:56.665343" elapsed="0.001926"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.667780" level="INFO">${value} = internal-neighbors</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:56.667514" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:56.668662" level="INFO">${encoded} = internal-neighbors</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.668289" elapsed="0.000398"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:56.668731" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:56.668856" level="INFO">${encoded_value} = internal-neighbors</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:56.667972" elapsed="0.000906"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.669040" elapsed="0.000178"/>
</kw>
<var name="${key}">PEER_GROUP_NAME</var>
<var name="${value}">internal-neighbors</var>
<status status="PASS" start="2026-10-11T00:47:56.667367" elapsed="0.001886"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.669775" 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-10-11T00:47:56.669508" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:56.670662" 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-10-11T00:47:56.670290" elapsed="0.000396"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:56.670730" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:56.670863" 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-10-11T00:47:56.669971" elapsed="0.000915"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.671049" elapsed="0.000269"/>
</kw>
<var name="${key}">RR_CLIENT</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:47:56.669353" elapsed="0.002002"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:47:56.652511" elapsed="0.018875"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:47:56.671452" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:56.671586" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PEER_...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:47:56.651351" elapsed="0.020289"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.651087" elapsed="0.020585"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.671841" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.671694" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.651055" elapsed="0.020854"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.672742" 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-10-11T00:47:56.672065" elapsed="0.000704"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:56.672813" 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//peer_group_without_ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group_without_ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group_without_ipv4/${file_name}.</doc>
<status status="PASS" start="2026-10-11T00:47:56.647751" elapsed="0.025165"/>
</kw>
<msg time="2026-10-11T00:47:56.672965" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:56.643381" elapsed="0.029628"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group_without_ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group_without_ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group_without_ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.677241" 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/bgpuser/../../../variables/bgpuser//peer_group_without_ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group_without_ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group_without_ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.681233" 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/bgpuser/../../../variables/bgpuser//peer_group_without_ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group_without_ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group_without_ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.685566" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.685770" 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-10-11T00:47:56.685955" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.686318" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.686173" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:56.686158" 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-10-11T00:47:56.686558" 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-10-11T00:47:56.686738" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.686899" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:56.686130" elapsed="0.000816"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.686022" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.687140" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.687247" elapsed="0.000017"/>
</return>
<msg time="2026-10-11T00:47:56.687370" 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-10-11T00:47:56.642785" elapsed="0.044610"/>
</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-10-11T00:47:56.696284" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group_without_ipv4.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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:56.695948" elapsed="0.000362"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:56.696997" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_group_without_ipv4.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-10-11T00:47:56.696802" elapsed="0.000263">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_group_without_ipv4.vanadium/data.xml' does not exist.</status>
</kw>
<msg time="2026-10-11T00:47:56.697164" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:56.696485" elapsed="0.000701"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.697681" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group_without_ipv4/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-10-11T00:47:56.697358" elapsed="0.000348"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:56.697986" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_group_without_ipv4/data.xml"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_group_without_ipv4/data.xml&lt;/a&gt;'.</msg>
<msg time="2026-10-11T00:47:56.698146" level="INFO">${template} = &lt;peer-group xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;peer-group-name&gt;$PEER_GROUP_NAME&lt;/peer-group-name&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/co...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-10-11T00:47:56.697875" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.698598" level="INFO">&lt;peer-group xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;peer-group-name&gt;$PEER_GROUP_NAME&lt;/peer-group-name&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;passive-mode&gt;$PASSIVE_MODE&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&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;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;afi-safis&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;/peer-group&gt;
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:56.698364" 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-10-11T00:47:56.698963" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.698713" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.699483" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PEER_...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:56.699202" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.699038" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.698696" elapsed="0.000863"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.700436" level="INFO">${final_text} = &lt;peer-group xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;peer-group-name&gt;internal-neighbors&lt;/peer-group-name&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&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-10-11T00:47:56.699719" elapsed="0.000746"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:56.700509" 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//peer_group_without_ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group_without_ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group_without_ipv4/${file_name}.</doc>
<status status="PASS" start="2026-10-11T00:47:56.695446" elapsed="0.005164"/>
</kw>
<msg time="2026-10-11T00:47:56.700692" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:56.691132" elapsed="0.009606"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group_without_ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group_without_ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group_without_ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.704835" 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/bgpuser/../../../variables/bgpuser//peer_group_without_ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group_without_ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group_without_ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.708864" 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/bgpuser/../../../variables/bgpuser//peer_group_without_ipv4.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group_without_ipv4.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group_without_ipv4/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.713146" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.713328" 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-10-11T00:47:56.713524" 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-10-11T00:47:56.713858" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.713715" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:56.713701" 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-10-11T00:47:56.714096" 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-10-11T00:47:56.714277" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.714453" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:56.713676" elapsed="0.000831"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.713590" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.714678" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.714744" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:47:56.714860" level="INFO">${data} = &lt;peer-group xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;peer-group-name&gt;internal-neighbors&lt;/peer-group-name&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&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-10-11T00:47:56.690389" elapsed="0.024498"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:56.716001" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_group_without_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-10-11T00:47:56.715806" elapsed="0.000255">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_group_without_ipv4/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-11T00:47:56.716157" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:56.715484" elapsed="0.000724"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.716515" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.716273" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.717023" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:56.716763" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.716589" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.716256" elapsed="0.000858"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.717621" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:56.717274" elapsed="0.000371"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:47:56.717689" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:56.717811" level="INFO">${jmes_expression} = </msg>
<var>${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//peer_group_without_ipv4/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-10-11T00:47:56.715173" elapsed="0.002660"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.719063" 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/peer-groups/peer-group=internal-neighbors</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:56.718844" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.719549" level="INFO">&lt;peer-group xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;peer-group-name&gt;internal-neighbors&lt;/peer-group-name&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&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;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;afi-safis&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;/peer-group&gt;</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:56.719318" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.720008" 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-10-11T00:47:56.719792" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.720474" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:56.720247" elapsed="0.000268"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:56.721235" 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-10-11T00:47:56.721055" elapsed="0.000204"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:47:56.721579" 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-10-11T00:47:56.721429" elapsed="0.000174"/>
</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-10-11T00:47:56.721766" elapsed="0.000161"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.722375" 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-10-11T00:47:56.722154" elapsed="0.000277"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:47:56.722469" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:56.722596" 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-10-11T00:47:56.720697" elapsed="0.001923"/>
</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-10-11T00:47:56.741552" level="INFO">PUT Request : url=http://10.30.170.173: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/peer-groups/peer-group=internal-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/peer-groups/peer-group=internal-neighbors 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Content-Length': '897', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;peer-group xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;peer-group-name&gt;internal-neighbors&lt;/peer-group-name&gt;
    &lt;config&gt;
        &lt;peer-type&gt;INTERNAL&lt;/peer-type&gt;
    &lt;/config&gt;
    &lt;transport&gt;
        &lt;config&gt;
            &lt;passive-mode&gt;true&lt;/passive-mode&gt;
        &lt;/config&gt;
    &lt;/transport&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;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;afi-safis&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;/peer-group&gt; 
 </msg>
<msg time="2026-10-11T00:47:56.741644" level="INFO">PUT Response : url=http://10.30.170.173: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/peer-groups/peer-group=internal-neighbors 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:56.741746" 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-10-11T00:47:56.722911" elapsed="0.018860"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.722682" elapsed="0.019129"/>
</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-10-11T00:47:56.741988" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.741836" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.722665" elapsed="0.019403"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.743241" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:56.742956" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.742714" elapsed="0.000597"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.742697" elapsed="0.000637"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.743898" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:56.743635" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.743383" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.743368" elapsed="0.000623"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.744537" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:56.744175" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.744833" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.744625" elapsed="0.000260"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.745333" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:56.745064" elapsed="0.000294"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.744906" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.744608" elapsed="0.000815"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.745928" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:56.745597" elapsed="0.000355"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.746230" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.746015" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.746734" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:56.746476" elapsed="0.000282"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.746303" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.745998" elapsed="0.000811"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:56.746951" elapsed="0.000303"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:47:56.747653" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:56.747428" elapsed="0.000249"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.747829" elapsed="0.000213"/>
</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-10-11T00:47:56.742425" elapsed="0.005683"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:47:56.748248" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:47:56.748167" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.748151" elapsed="0.000173"/>
</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-10-11T00:47:56.748484" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.748545" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:47:56.748705" 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-10-11T00:47:56.718159" elapsed="0.030570"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:56.748817" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:47:56.748943" 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-10-11T00:47:56.639090" elapsed="0.109876"/>
</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-10-11T00:47:56.749278" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.749052" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.749036" elapsed="0.000324"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:56.749389" elapsed="0.000039"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}${peer_group_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-10-11T00:47:56.638485" elapsed="0.111019"/>
</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-10-11T00:47:56.764568" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group_without_ipv4.sulfur.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:56.764250" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:56.765297" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/verify_peer_group_without_ipv4.sulfur.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given `path` points to an existing file.</doc>
<status status="FAIL" start="2026-10-11T00:47:56.765068" elapsed="0.000290">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/verify_peer_group_without_ipv4.sulfur.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-11T00:47:56.765459" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:56.764752" elapsed="0.000730"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.765961" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group_without_ipv4.sulfur/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:56.765655" elapsed="0.000331"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:56.766271" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/verify_peer_group_without_ipv4.sulfur/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/verify_peer_group_without_ipv4.sulfur/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-11T00:47:56.766392" 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-10-11T00:47:56.766161" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.766844" 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/peer-groups/peer-group=$PEER_GROUP_NAME?content=config
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:56.766629" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.767799" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PEER_GROUP_NAME': 'internal-neighbors', 'RR_CLIENT': 'false'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:56.767566" elapsed="0.000278"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.768285" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.768021" elapsed="0.000288"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.768920" 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-10-11T00:47:56.768653" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:56.769923" 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-10-11T00:47:56.769540" elapsed="0.000408"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:56.769994" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:47:56.770139" 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-10-11T00:47:56.769137" 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-10-11T00:47:56.770325" elapsed="0.000188"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:47:56.768524" elapsed="0.002059"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.771094" 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-10-11T00:47:56.770812" elapsed="0.000310"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:56.771970" 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-10-11T00:47:56.771615" elapsed="0.000380"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:56.772040" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:56.772176" 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-10-11T00:47:56.771293" elapsed="0.000905"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.772361" elapsed="0.000185"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:47:56.770683" elapsed="0.001902"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.773231" 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-10-11T00:47:56.772948" elapsed="0.000308"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:56.774118" 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-10-11T00:47:56.773759" elapsed="0.000384"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:56.774187" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:56.774312" 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-10-11T00:47:56.773452" elapsed="0.000883"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.774517" elapsed="0.000172"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:47:56.772684" elapsed="0.002043"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.775231" 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-10-11T00:47:56.774952" elapsed="0.000303"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:56.776118" 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-10-11T00:47:56.775753" elapsed="0.000394"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:56.776192" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T00:47:56.776317" 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-10-11T00:47:56.775449" 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-10-11T00:47:56.776521" elapsed="0.000166"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:47:56.774825" elapsed="0.001900"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.777229" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:56.776951" elapsed="0.000302"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:56.778111" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.777754" elapsed="0.000382"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:56.778180" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:56.778302" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:56.777446" 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-10-11T00:47:56.778506" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:47:56.776823" elapsed="0.001883"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.779249" 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-10-11T00:47:56.778932" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:56.780142" 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-10-11T00:47:56.779782" elapsed="0.000385"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:56.780211" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:56.780334" 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-10-11T00:47:56.779472" elapsed="0.000884"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.780539" elapsed="0.000169"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:47:56.778803" elapsed="0.001976"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.781297" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:56.781012" elapsed="0.000309"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:56.782194" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.781823" elapsed="0.000396"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:56.782263" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:56.782388" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:56.781517" elapsed="0.000913"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.782595" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:47:56.780883" elapsed="0.001914"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.783307" level="INFO">${value} = internal-neighbors</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:56.783029" elapsed="0.000302"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:56.784329" level="INFO">${encoded} = internal-neighbors</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.783972" elapsed="0.000382"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:56.784398" elapsed="0.000048"/>
</return>
<msg time="2026-10-11T00:47:56.784546" level="INFO">${encoded_value} = internal-neighbors</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:56.783526" 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-10-11T00:47:56.784729" elapsed="0.000163"/>
</kw>
<var name="${key}">PEER_GROUP_NAME</var>
<var name="${value}">internal-neighbors</var>
<status status="PASS" start="2026-10-11T00:47:56.782901" elapsed="0.002027"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.785455" 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-10-11T00:47:56.785164" elapsed="0.000316"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:56.786311" 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-10-11T00:47:56.785953" elapsed="0.000383"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:56.786380" elapsed="0.000047"/>
</return>
<msg time="2026-10-11T00:47:56.786527" 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-10-11T00:47:56.785648" elapsed="0.000901"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.786712" elapsed="0.000168"/>
</kw>
<var name="${key}">RR_CLIENT</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:47:56.785026" elapsed="0.001891"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:47:56.768354" elapsed="0.018593"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:47:56.786985" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:47:56.787127" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PEER_...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:47:56.767207" elapsed="0.019944"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.766946" elapsed="0.020234"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.787349" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.787201" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.766929" elapsed="0.020513"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.788231" 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-10-11T00:47:56.787604" elapsed="0.000653"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:56.788302" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group_without_ipv4.sulfur.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group_without_ipv4.sulfur.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group_without_ipv4.sulfur/${file_name}.</doc>
<status status="PASS" start="2026-10-11T00:47:56.763730" elapsed="0.024671"/>
</kw>
<msg time="2026-10-11T00:47:56.788473" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:56.759470" elapsed="0.029048"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group_without_ipv4.sulfur.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group_without_ipv4.sulfur.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group_without_ipv4.sulfur/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.792593" 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/bgpuser/../../../variables/bgpuser//verify_peer_group_without_ipv4.sulfur.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group_without_ipv4.sulfur.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group_without_ipv4.sulfur/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.796655" 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/bgpuser/../../../variables/bgpuser//verify_peer_group_without_ipv4.sulfur.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group_without_ipv4.sulfur.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group_without_ipv4.sulfur/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.800719" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.800900" 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-10-11T00:47:56.801089" 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-10-11T00:47:56.801440" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.801282" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:56.801268" 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-10-11T00:47:56.801670" 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-10-11T00:47:56.801849" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.802011" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:56.801243" elapsed="0.000815"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.801156" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.802242" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.802308" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:47:56.802440" 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-10-11T00:47:56.758852" elapsed="0.043614"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:56.803576" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/verify_peer_group_without_ipv4.sulfur/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given `path` points to an existing file.</doc>
<status status="FAIL" start="2026-10-11T00:47:56.803359" elapsed="0.000279">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/verify_peer_group_without_ipv4.sulfur/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-11T00:47:56.803721" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:56.803024" elapsed="0.000720"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.804061" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.803838" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.804591" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:56.804311" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.804147" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.803820" elapsed="0.000848"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.805180" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:56.804829" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:47:56.805248" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:56.805371" level="INFO">${jmes_expression} = </msg>
<var>${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//verify_peer_group_without_ipv4.sulfur/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-10-11T00:47:56.802727" elapsed="0.002667"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:56.807366" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/verify_peer_group_without_ipv4.sulfur/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-10-11T00:47:56.807173" elapsed="0.000268">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/verify_peer_group_without_ipv4.sulfur/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-11T00:47:56.807528" 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-10-11T00:47:56.806837" elapsed="0.000714"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:47:56.807713" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-11T00:47:56.807614" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.807597" elapsed="0.000190"/>
</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-10-11T00:47:56.807938" elapsed="0.000019"/>
</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-10-11T00:47:56.808122" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.808181" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:47:56.808304" 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//verify_peer_group_without_ipv4.sulfur/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-10-11T00:47:56.805660" elapsed="0.002667"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.809563" 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/peer-groups/peer-group=internal-neighbors?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:56.809319" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.810008" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:56.809794" elapsed="0.000253"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:47:56.819818" level="INFO">GET Request : url=http://10.30.170.173: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/peer-groups/peer-group=internal-neighbors?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/bgp-openconfig-extensions:bgp/peer-groups/peer-group=internal-neighbors?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:56.819986" level="INFO">GET Response : url=http://10.30.170.173: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/peer-groups/peer-group=internal-neighbors?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '425'} 
 body={"bgp-openconfig-extensions:peer-group":[{"peer-group-name":"internal-neighbors","transport":{"config":{"passive-mode":true}},"route-reflector":{"config":{"route-reflector-client":false}},"timers":{"config":{"hold-time":"180.0","connect-retry":"5.0"}},"config":{"peer-type":"INTERNAL"},"afi-safis":{"afi-safi":[{"afi-safi-name":"openconfig-bgp-types:IPV6-UNICAST"},{"afi-safi-name":"bgp-openconfig-extensions:LINKSTATE"}]}}]} 
 </msg>
<msg time="2026-10-11T00:47:56.820098" 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-10-11T00:47:56.810345" elapsed="0.009782"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.810118" elapsed="0.010050"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.820344" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.820191" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.810101" elapsed="0.010371"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.821726" level="INFO">{"bgp-openconfig-extensions:peer-group":[{"peer-group-name":"internal-neighbors","transport":{"config":{"passive-mode":true}},"route-reflector":{"config":{"route-reflector-client":false}},"timers":{"config":{"hold-time":"180.0","connect-retry":"5.0"}},"config":{"peer-type":"INTERNAL"},"afi-safis":{"afi-safi":[{"afi-safi-name":"openconfig-bgp-types:IPV6-UNICAST"},{"afi-safi-name":"bgp-openconfig-extensions:LINKSTATE"}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:56.821379" elapsed="0.000392"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.821142" elapsed="0.000660"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.821125" elapsed="0.000700"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.822391" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:56.822124" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.821875" elapsed="0.000605"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.821860" elapsed="0.000642"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.823016" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:56.822676" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.823336" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.823123" elapsed="0.000264"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.823849" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:56.823586" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.823424" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.823103" elapsed="0.000824"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.824460" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:56.824108" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.824765" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.824557" elapsed="0.000258"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.825313" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:56.824995" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.824838" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.824540" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:56.825569" elapsed="0.000289"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:47:56.826262" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:56.826018" elapsed="0.000268"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.826453" elapsed="0.000211"/>
</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-10-11T00:47:56.820795" elapsed="0.005924"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.826862" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:56.826781" elapsed="0.000121"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.826764" elapsed="0.000157"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:47:56.827746" level="INFO">${text_normalized} = {
 "bgp-openconfig-extensions:peer-group": [
  {
   "afi-safis": {
    "afi-safi": [
     {
      "afi-safi-name": "bgp-openconfig-extensions:LINKSTATE"
     },
     {
      "afi-safi-name": "openconf...</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-10-11T00:47:56.827060" elapsed="0.000713"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:47:56.827820" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:47:56.827950" level="INFO">${response_text} = {
 "bgp-openconfig-extensions:peer-group": [
  {
   "afi-safis": {
    "afi-safi": [
     {
      "afi-safi-name": "bgp-openconfig-extensions:LINKSTATE"
     },
     {
      "afi-safi-name": "openconf...</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-10-11T00:47:56.808620" elapsed="0.019354"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:56.828028" elapsed="0.000023"/>
</return>
<msg time="2026-10-11T00:47:56.828171" level="INFO">${response_text} = {
 "bgp-openconfig-extensions:peer-group": [
  {
   "afi-safis": {
    "afi-safi": [
     {
      "afi-safi-name": "bgp-openconfig-extensions:LINKSTATE"
     },
     {
      "afi-safi-name": "openconf...</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-10-11T00:47:56.751653" elapsed="0.076574"/>
</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-10-11T00:47:56.838700" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group_without_ipv4.sulfur.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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:56.838384" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:56.839426" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/verify_peer_group_without_ipv4.sulfur.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-10-11T00:47:56.839237" elapsed="0.000251">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/verify_peer_group_without_ipv4.sulfur.vanadium/data.json' does not exist.</status>
</kw>
<msg time="2026-10-11T00:47:56.839572" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:56.838902" elapsed="0.000692"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.840088" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group_without_ipv4.sulfur/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-10-11T00:47:56.839767" elapsed="0.000348"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:56.840387" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/verify_peer_group_without_ipv4.sulfur/data.json"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/verify_peer_group_without_ipv4.sulfur/data.json&lt;/a&gt;'.</msg>
<msg time="2026-10-11T00:47:56.840525" level="INFO">${template} = {
    "bgp-openconfig-extensions:peer-group": [
        {
            "peer-group-name": "internal-neighbors",
            "transport": {
                "config": {
                    "passive-mode"...</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-10-11T00:47:56.840279" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.840957" level="INFO">{
    "bgp-openconfig-extensions:peer-group": [
        {
            "peer-group-name": "internal-neighbors",
            "transport": {
                "config": {
                    "passive-mode": true
                }
            },
            "config": {
                "peer-type": "INTERNAL"
            },
            "afi-safis": {
                "afi-safi": [
                    {
                        "afi-safi-name": "openconfig-bgp-types:IPV6-UNICAST"
                    },
                    {
                        "afi-safi-name": "bgp-openconfig-extensions:LINKSTATE"
                    }
                ]
            },
            "timers": {
                "config": {
                    "hold-time": "180.0",
                    "connect-retry": "5.0"
                }
            },
            "route-reflector": {
                "config": {
                    "route-reflector-client": false
                }
            }
        }
    ]
}
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:56.840741" elapsed="0.000264"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:47:56.841326" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.841065" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.841826" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PEER_...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:56.841562" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.841400" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.841047" elapsed="0.000856"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.842511" level="INFO">${final_text} = {
    "bgp-openconfig-extensions:peer-group": [
        {
            "peer-group-name": "internal-neighbors",
            "transport": {
                "config": {
                    "passive-mode"...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:56.842062" elapsed="0.000476"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:56.842582" 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//verify_peer_group_without_ipv4.sulfur.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group_without_ipv4.sulfur.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group_without_ipv4.sulfur/${file_name}.</doc>
<status status="PASS" start="2026-10-11T00:47:56.837866" elapsed="0.004817"/>
</kw>
<msg time="2026-10-11T00:47:56.842733" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:56.833578" elapsed="0.009199"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group_without_ipv4.sulfur.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group_without_ipv4.sulfur.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group_without_ipv4.sulfur/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.846946" 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/bgpuser/../../../variables/bgpuser//verify_peer_group_without_ipv4.sulfur.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group_without_ipv4.sulfur.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group_without_ipv4.sulfur/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.850947" 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/bgpuser/../../../variables/bgpuser//verify_peer_group_without_ipv4.sulfur.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group_without_ipv4.sulfur.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//verify_peer_group_without_ipv4.sulfur/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.855184" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.855377" 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-10-11T00:47:56.855573" 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-10-11T00:47:56.855917" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.855768" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:56.855754" 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-10-11T00:47:56.856184" 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-10-11T00:47:56.856367" 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-10-11T00:47:56.856555" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:56.855729" elapsed="0.000874"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.855640" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.856775" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.856841" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:47:56.856951" level="INFO">${expected_text} = {
    "bgp-openconfig-extensions:peer-group": [
        {
            "peer-group-name": "internal-neighbors",
            "transport": {
                "config": {
                    "passive-mode"...</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-10-11T00:47:56.832854" elapsed="0.024122"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:56.857173" elapsed="0.000340"/>
</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-10-11T00:47:56.858599" level="INFO">${expected_normalized} = {
 "bgp-openconfig-extensions:peer-group": [
  {
   "afi-safis": {
    "afi-safi": [
     {
      "afi-safi-name": "bgp-openconfig-extensions:LINKSTATE"
     },
     {
      "afi-safi-name": "openconf...</msg>
<var>${expected_normalized}</var>
<arg>${expected_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-10-11T00:47:56.858174" elapsed="0.000453"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:47:56.859191" level="INFO">${actual_normalized} = {
 "bgp-openconfig-extensions:peer-group": [
  {
   "afi-safis": {
    "afi-safi": [
     {
      "afi-safi-name": "bgp-openconfig-extensions:LINKSTATE"
     },
     {
      "afi-safi-name": "openconf...</msg>
<var>${actual_normalized}</var>
<arg>${actual_raw}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-10-11T00:47:56.858776" elapsed="0.000476"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:47:56.859452" elapsed="0.000284"/>
</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-10-11T00:47:56.857797" elapsed="0.001994"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.857593" elapsed="0.002228"/>
</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-10-11T00:47:56.860018" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.859844" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.857576" elapsed="0.002524"/>
</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-10-11T00:47:56.829348" elapsed="0.030796"/>
</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-10-11T00:47:56.828528" elapsed="0.031681"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.828304" elapsed="0.031945"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.828288" elapsed="0.031982"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:56.860300" elapsed="0.000027"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}${verify_peer_group_folder}</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-10-11T00:47:56.750993" elapsed="0.109407"/>
</kw>
<arg>peer_group_folder=peer_group_without_ipv4</arg>
<doc>Configures peer group which is template for all the neighbors which are going
to be configured. Also after PUT, this case verifies presence of peer group within
peer-groups.</doc>
<status status="PASS" start="2026-10-11T00:47:56.614746" elapsed="0.245727"/>
</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-10-11T00:47:56.861647" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.861295" elapsed="0.000408"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.861279" elapsed="0.000447"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:56.861865" elapsed="0.000291"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.864498" 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-10-11T00:47:56.864119" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-10-11T00:47:56.864693" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:47:56.864589" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.864572" elapsed="0.000194"/>
</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-10-11T00:47:56.864929" elapsed="0.000020"/>
</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-10-11T00:47:56.865120" elapsed="0.000019"/>
</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-10-11T00:47:56.865292" elapsed="0.000017"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.865468" elapsed="0.000019"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.865634" elapsed="0.000018"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message of the current test case.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.865800" elapsed="0.000017"/>
</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-10-11T00:47:56.865999" elapsed="0.000018"/>
</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-10-11T00:47:56.863796" elapsed="0.002284"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.861060" elapsed="0.005068"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-10-11T00:47:56.860726" elapsed="0.005440"/>
</kw>
<doc>Configure BGP peer module with initiate-connection set to false.</doc>
<status status="PASS" start="2026-10-11T00:47:56.450843" elapsed="0.415390"/>
</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">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.867783" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.867581" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.867564" elapsed="0.000292"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-10-11T00:47:56.867354" 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-10-11T00:47:56.868805" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:56.868723" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.868706" elapsed="0.000160"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.870814" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:56.870733" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.870716" elapsed="0.000160"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.871795" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:56.871474" elapsed="0.000347"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.872268" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:47:56.871972" elapsed="0.000320"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:47:56.872332" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:56.872473" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:47:56.871097" elapsed="0.001400"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.875108" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:56.875008" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.874990" elapsed="0.000183"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.876267" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:56.876168" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.876146" elapsed="0.000200"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:56.876726" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.876555" elapsed="0.000196"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:47:56.877055" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:47:56.876915" elapsed="0.000180"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:56.916250" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:47:56.877609" elapsed="0.038790"/>
</kw>
<msg time="2026-10-11T00:47:56.916629" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:47:56.916673" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:56.877256" elapsed="0.039452"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:47:56.950752" level="INFO">". "t "x "t ". "B "a "s "i "c ". "T "C "_ "P "G "_ "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 "_ "D "e "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-10-11T00:47:56.917372" elapsed="0.033490"/>
</kw>
<msg time="2026-10-11T00:47:56.951011" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:47:56.951053" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "P "G "_ "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:56.916932" elapsed="0.034168"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.951435" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.951183" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.951157" elapsed="0.000407"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.951989" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "P "G "_ "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 "_ "D "e "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-10-11T00:47:56.951753" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.952333" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.952132" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.952115" elapsed="0.000303"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:47:56.952454" 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-10-11T00:47:56.954996" elapsed="0.000134"/>
</kw>
<msg time="2026-10-11T00:47:56.955188" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:56.953908" 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-10-11T00:47:56.955653" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.955984" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:47:56.953281" 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-10-11T00:47:56.952776" elapsed="0.003470"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:47:56.875880" elapsed="0.080440"/>
</kw>
<msg time="2026-10-11T00:47:56.956422" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:56.956466" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "P "G "_ "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:56.875324" elapsed="0.081179"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:47:56.956658" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:47:56.956572" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.956555" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.957092" 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-10-11T00:47:56.957422" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.957489" 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-10-11T00:47:56.874722" elapsed="0.082855"/>
</kw>
<msg time="2026-10-11T00:47:56.957663" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:56.957703" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "P "G "_ "C "h "e "c "k "_ "F "o "r "_ "E "m "p "t "y "_ "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:56.872820" elapsed="0.084918"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.958030" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.957806" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.957791" elapsed="0.000322"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:47:56.872679" elapsed="0.085456"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:47:56.872543" elapsed="0.085623"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:47:56.870441" elapsed="0.087778"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:47:56.868474" elapsed="0.089796"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:56.868045" elapsed="0.090270"/>
</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-10-11T00:47:56.866971" elapsed="0.091393"/>
</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-10-11T00:47:56.974813" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:56.974485" elapsed="0.000355"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:56.975608" 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-10-11T00:47:56.975335" elapsed="0.000350">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-10-11T00:47:56.975771" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:56.975000" elapsed="0.000793"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.976299" 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-10-11T00:47:56.975972" elapsed="0.000351"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:56.976620" 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-10-11T00:47:56.976761" 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-10-11T00:47:56.976507" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.977216" 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-10-11T00:47:56.976977" elapsed="0.000279"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.978491" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:56.977939" elapsed="0.000608"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.979199" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:47:56.978726" elapsed="0.000496"/>
</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-10-11T00:47:56.979589" 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-10-11T00:47:56.980293" elapsed="0.000047"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:47:56.980655" elapsed="0.000043"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:47:56.979383" elapsed="0.001427"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.979269" elapsed="0.001602"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:47:56.980914" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:56.981046" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:47:56.977597" elapsed="0.003483"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.977318" elapsed="0.003792"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.981279" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.981133" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.977300" elapsed="0.004048"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.981908" 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-10-11T00:47:56.981524" elapsed="0.000409"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:56.981976" 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-10-11T00:47:56.973957" elapsed="0.008134"/>
</kw>
<msg time="2026-10-11T00:47:56.982140" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:56.969696" elapsed="0.012488"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:56.986555" 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/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-10-11T00:47:56.990580" 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/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-10-11T00:47:56.994568" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.994749" 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-10-11T00:47:56.994934" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.995304" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.995159" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:56.995145" 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-10-11T00:47:56.995544" 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-10-11T00:47:56.995722" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.995881" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:56.995117" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.994998" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.996115" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:56.996182" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:47:56.996289" 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-10-11T00:47:56.969084" elapsed="0.027229"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:56.997439" 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-10-11T00:47:56.997237" elapsed="0.000262">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-10-11T00:47:56.997584" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:56.996896" elapsed="0.000711"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:56.997892" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:56.997670" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.998419" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:56.998143" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:56.997966" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:56.997653" elapsed="0.000875"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:56.999026" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:56.998689" elapsed="0.000360"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:47:56.999109" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:56.999233" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:47:56.996596" elapsed="0.002659"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:57.000347" 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-10-11T00:47:57.000152" elapsed="0.000268">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-10-11T00:47:57.000507" 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-10-11T00:47:56.999819" elapsed="0.000710"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:47:57.000690" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:47:57.000593" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.000575" elapsed="0.000192"/>
</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-10-11T00:47:57.000921" elapsed="0.000020"/>
</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-10-11T00:47:57.001110" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.001169" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:47:57.001292" 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-10-11T00:47:56.999520" elapsed="0.001795"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.002558" 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-10-11T00:47:57.002317" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.003002" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:57.002788" elapsed="0.000254"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:47:57.012049" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:57.012218" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:47:57.012325" 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-10-11T00:47:57.003394" elapsed="0.008955"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.003164" elapsed="0.009226"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.012590" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.012434" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.003147" elapsed="0.009520"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.013938" 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-10-11T00:47:57.013604" elapsed="0.000376"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.013348" elapsed="0.000664"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.013331" elapsed="0.000704"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.014626" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:57.014337" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.014098" elapsed="0.000600"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.014082" elapsed="0.000638"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.015265" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:57.014892" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.015614" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.015386" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.016122" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:57.015846" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.015688" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.015368" elapsed="0.000831"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.016721" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:57.016370" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.017017" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.016809" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.017540" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:57.017261" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.017102" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.016792" elapsed="0.000824"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:57.017759" elapsed="0.000291"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:47:57.018505" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:57.018242" elapsed="0.000288"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.018684" elapsed="0.000214"/>
</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-10-11T00:47:57.012999" elapsed="0.005954"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.019107" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:57.019015" elapsed="0.000133"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.018998" elapsed="0.000170"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:47:57.019840" 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-10-11T00:47:57.019308" elapsed="0.000559"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:47:57.019913" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:47:57.020039" 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-10-11T00:47:57.001610" elapsed="0.018453"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:57.020129" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:47:57.020252" 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-10-11T00:47:56.961846" elapsed="0.058429"/>
</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-10-11T00:47:57.031353" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:57.030622" elapsed="0.000758"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:57.033460" 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-10-11T00:47:57.032947" elapsed="0.000627">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-10-11T00:47:57.033727" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:57.031580" elapsed="0.002171"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.034619" 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-10-11T00:47:57.033923" elapsed="0.000722"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:57.034999" 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-10-11T00:47:57.035222" 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-10-11T00:47:57.034811" elapsed="0.000436"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.036082" 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-10-11T00:47:57.035574" elapsed="0.000568"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:47:57.036743" elapsed="0.000075"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.036206" elapsed="0.000686"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.037729" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:57.037104" elapsed="0.000664"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.036917" elapsed="0.000927"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.036188" elapsed="0.001678"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.038827" 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-10-11T00:47:57.038029" elapsed="0.000829"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:57.038903" 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-10-11T00:47:57.030102" elapsed="0.008901"/>
</kw>
<msg time="2026-10-11T00:47:57.039050" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:57.025761" elapsed="0.013347"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:57.043210" 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/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-10-11T00:47:57.047192" 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/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-10-11T00:47:57.051278" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.051473" 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-10-11T00:47:57.051693" 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-10-11T00:47:57.052078" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.051921" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:57.051908" 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-10-11T00:47:57.052306" 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-10-11T00:47:57.052503" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.052668" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:57.051880" elapsed="0.000836"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.051761" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.052889" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.052955" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:47:57.053061" 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-10-11T00:47:57.025029" elapsed="0.028068"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:57.053264" elapsed="0.000328"/>
</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-10-11T00:47:57.054538" 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-10-11T00:47:57.054251" elapsed="0.000314"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:47:57.054969" 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-10-11T00:47:57.054714" elapsed="0.000281"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:47:57.055186" elapsed="0.000299"/>
</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-10-11T00:47:57.053862" elapsed="0.001677"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.053661" elapsed="0.001907"/>
</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-10-11T00:47:57.055767" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.055592" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.053645" elapsed="0.002189"/>
</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-10-11T00:47:57.021301" elapsed="0.034576"/>
</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-10-11T00:47:57.020634" elapsed="0.035306"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.020350" elapsed="0.035630"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.020332" elapsed="0.035669"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:57.056030" elapsed="0.000026"/>
</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-10-11T00:47:56.961173" elapsed="0.094972"/>
</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-10-11T00:47:56.959429" elapsed="0.096770"/>
</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-10-11T00:47:56.958960" elapsed="0.097317"/>
</kw>
<arg>empty_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="PASS" start="2026-10-11T00:47:56.958603" elapsed="0.097728"/>
</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-10-11T00:47:57.056890" elapsed="0.000241"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:47:57.056597" elapsed="0.000591"/>
</kw>
<doc>See example-ipv4-topology empty after resetting session.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:47:56.866458" elapsed="0.190766"/>
</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">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.058839" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.058636" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.058619" elapsed="0.000294"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-10-11T00:47:57.058462" elapsed="0.000493"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.059900" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:57.059815" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.059798" elapsed="0.000163"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.062047" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:57.061965" elapsed="0.000134"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.061948" elapsed="0.000172"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.063026" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:57.062702" elapsed="0.000349"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.063495" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:47:57.063218" elapsed="0.000301"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:47:57.063559" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:57.063686" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:47:57.062328" elapsed="0.001381"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.066190" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:57.066103" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.066085" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.067284" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:57.067199" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.067182" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:57.067680" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.067511" elapsed="0.000194"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:47:57.068001" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:47:57.067867" elapsed="0.000157"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:57.108044" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:47:57.068540" elapsed="0.039643"/>
</kw>
<msg time="2026-10-11T00:47:57.108363" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:47:57.108422" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:57.068191" elapsed="0.040268"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:47:57.143903" level="INFO">". "t "x "t ". "B "a "s "i "c ". "T "C "_ "P "G "_ "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-10-11T00:47:57.109044" elapsed="0.034959"/>
</kw>
<msg time="2026-10-11T00:47:57.144167" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:47:57.144208" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "P "G "_ "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:57.108661" elapsed="0.035630"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.144615" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.144371" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.144349" elapsed="0.000341"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.145122" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "P "G "_ "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-10-11T00:47:57.144873" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.145461" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.145246" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.145229" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:47:57.145565" 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-10-11T00:47:57.148292" elapsed="0.000135"/>
</kw>
<msg time="2026-10-11T00:47:57.148486" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:57.146981" 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-10-11T00:47:57.148925" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.149273" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:47:57.146373" 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-10-11T00:47:57.145874" elapsed="0.003667"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:47:57.066934" elapsed="0.082681"/>
</kw>
<msg time="2026-10-11T00:47:57.149695" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:57.149734" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "P "G "_ "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:57.066401" elapsed="0.083367"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:47:57.149922" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:47:57.149837" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.149820" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.150348" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.150718" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.150783" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:47:57.065812" elapsed="0.085054"/>
</kw>
<msg time="2026-10-11T00:47:57.150948" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:57.150988" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "T "C "_ "P "G "_ "R "e "c "o "n "f "i "g "u "r "e "_ "O "D "L "_ "T "o "_ "A "c "c "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:57.064031" elapsed="0.086992"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.151324" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.151106" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.151089" elapsed="0.000305"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:47:57.063890" elapsed="0.087600"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:47:57.063754" elapsed="0.087768"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:47:57.061676" elapsed="0.089896"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:47:57.059564" elapsed="0.092059"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:57.059142" elapsed="0.092558"/>
</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-10-11T00:47:57.058061" elapsed="0.093688"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.152631" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.171.7 | HOLDTIME=180 | PEER_PORT=17900 | PEER_GROUP_NAME=internal-neighbors | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_...</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>PEER_GROUP_NAME=${PEER_GROUP}</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-10-11T00:47:57.151956" elapsed="0.000704"/>
</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-10-11T00:47:57.165625" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer_group.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:57.165307" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:57.166338" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer_group.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given `path` points to an existing file.</doc>
<status status="FAIL" start="2026-10-11T00:47:57.166139" elapsed="0.000287">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer_group.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-11T00:47:57.166514" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:57.165812" elapsed="0.000725"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.167016" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//bgp_peer_group/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:57.166709" elapsed="0.000331"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:57.167334" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer_group/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/bgp_peer_group/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-11T00:47:57.167486" 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-10-11T00:47:57.167222" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.167920" 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-10-11T00:47:57.167706" elapsed="0.000255"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.168878" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_GROUP_NAME': 'internal-neighbors', '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-10-11T00:47:57.168642" elapsed="0.000279"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.169353" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.169108" elapsed="0.000269"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.171625" 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-10-11T00:47:57.169731" elapsed="0.001919"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:57.172338" 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-10-11T00:47:57.172144" elapsed="0.000218"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:57.172421" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T00:47:57.172549" 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-10-11T00:47:57.171826" elapsed="0.000745"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.172736" elapsed="0.000188"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:47:57.169597" elapsed="0.003365"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.173486" 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-10-11T00:47:57.173202" elapsed="0.000309"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:57.174213" 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-10-11T00:47:57.173984" elapsed="0.000253"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:57.174282" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:57.174419" 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-10-11T00:47:57.173679" elapsed="0.000764"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.174605" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-10-11T00:47:57.173062" elapsed="0.001745"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.175313" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:57.175032" elapsed="0.000305"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:57.176001" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.175824" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:57.176099" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:47:57.176226" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:57.175519" elapsed="0.000729"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.176423" elapsed="0.000166"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:47:57.174904" elapsed="0.001722"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.177129" 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-10-11T00:47:57.176851" elapsed="0.000302"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:57.177815" 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-10-11T00:47:57.177639" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:57.177881" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:57.178003" 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-10-11T00:47:57.177320" elapsed="0.000705"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.178200" elapsed="0.000165"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:47:57.176723" elapsed="0.001693"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.178913" 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-10-11T00:47:57.178647" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:57.179614" 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-10-11T00:47:57.179436" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:57.179681" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:57.179803" 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-10-11T00:47:57.179120" elapsed="0.000705"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.179986" elapsed="0.000177"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:47:57.178518" elapsed="0.001682"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.180708" level="INFO">${value} = internal-neighbors</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:57.180441" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:57.181565" level="INFO">${encoded} = internal-neighbors</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.181369" elapsed="0.000219"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:57.181631" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:57.181753" level="INFO">${encoded_value} = internal-neighbors</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:57.180900" elapsed="0.000876"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.181937" elapsed="0.000179"/>
</kw>
<var name="${key}">PEER_GROUP_NAME</var>
<var name="${value}">internal-neighbors</var>
<status status="PASS" start="2026-10-11T00:47:57.180298" elapsed="0.001855"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.182660" 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-10-11T00:47:57.182379" elapsed="0.000304"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:57.183345" 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-10-11T00:47:57.183169" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:57.183462" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:47:57.183589" 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-10-11T00:47:57.182850" elapsed="0.000761"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.183772" elapsed="0.000164"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:47:57.182251" elapsed="0.001722"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.184499" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:57.184216" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:57.185183" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.184993" elapsed="0.000214"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:57.185250" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:57.185372" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:57.184690" elapsed="0.000704"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.185575" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:47:57.184086" elapsed="0.001688"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.186282" 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-10-11T00:47:57.186002" elapsed="0.000304"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:57.186967" 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-10-11T00:47:57.186793" elapsed="0.000197"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:57.187033" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:57.187189" 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-10-11T00:47:57.186491" elapsed="0.000720"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.187371" elapsed="0.000179"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:47:57.185873" elapsed="0.001714"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.188090" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:57.187812" elapsed="0.000303"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:57.188776" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.188602" elapsed="0.000198"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:57.188843" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:57.188966" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:57.188284" elapsed="0.000705"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.189164" elapsed="0.000162"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:47:57.187684" elapsed="0.001678"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:47:57.169442" elapsed="0.019951"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:47:57.189447" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:47:57.189579" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_GROUP_NAME': 'internal-neighbors', 'INITIATE': 'false', 'BGP_RI...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:47:57.168290" elapsed="0.021313"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.168022" elapsed="0.021609"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.189800" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.189653" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.168005" elapsed="0.021864"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.190704" 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-10-11T00:47:57.190024" elapsed="0.000706"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:57.190774" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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_group.vanadium/${file_name} 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_group.vanadium/${file_name},
remove endline, perform safe substitution, 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_group/${file_name}.</doc>
<status status="PASS" start="2026-10-11T00:47:57.164776" elapsed="0.026097"/>
</kw>
<msg time="2026-10-11T00:47:57.190953" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:57.160571" elapsed="0.030426"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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_group.vanadium/${file_name} 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_group.vanadium/${file_name},
remove endline, perform safe substitution, 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_group/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.195254" 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/bgpuser/../../../variables/bgpuser//bgp_peer_group.vanadium/${file_name} 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_group.vanadium/${file_name},
remove endline, perform safe substitution, 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_group/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.199291" 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/bgpuser/../../../variables/bgpuser//bgp_peer_group.vanadium/${file_name} 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_group.vanadium/${file_name},
remove endline, perform safe substitution, 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_group/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.203289" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.203483" 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-10-11T00:47:57.203665" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.204000" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.203857" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:57.203843" 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-10-11T00:47:57.204238" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.204429" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.204593" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:57.203818" elapsed="0.000821"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.203730" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.204813" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.204879" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:47:57.204987" 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-10-11T00:47:57.159935" elapsed="0.045077"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.206020" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:57.205797" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:47:57.219260" level="INFO">DELETE Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:57.219307" level="INFO">DELETE Response : url=http://10.30.170.173: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.171.7 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:57.219402" 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-10-11T00:47:57.206422" elapsed="0.013024"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.206176" elapsed="0.013307"/>
</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-10-11T00:47:57.219661" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.219507" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.206159" elapsed="0.013576"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.220938" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:57.220662" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.220421" elapsed="0.000588"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.220390" elapsed="0.000642"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.221616" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:57.221331" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.221095" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.221079" elapsed="0.000631"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.222266" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:57.221890" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.222581" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.222354" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.223102" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:57.222814" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.222653" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.222338" elapsed="0.000841"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.223701" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:57.223351" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.223992" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.223788" elapsed="0.000255"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.224519" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:57.224238" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.224064" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.223772" elapsed="0.000822"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:57.224737" elapsed="0.000288"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:47:57.225441" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:57.225198" elapsed="0.000268"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.225619" elapsed="0.000215"/>
</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-10-11T00:47:57.220053" elapsed="0.005841"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:47:57.225933" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:57.226118" 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-10-11T00:47:57.205260" elapsed="0.020882"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:57.226221" elapsed="0.000026"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}bgp_peer_group</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-10-11T00:47:57.152887" elapsed="0.073432"/>
</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-10-11T00:47:57.236677" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:57.236360" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:57.237367" 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-10-11T00:47:57.237192" elapsed="0.000254">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-10-11T00:47:57.237530" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:57.236860" elapsed="0.000692"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.238028" 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-10-11T00:47:57.237724" elapsed="0.000329"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:57.238340" 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-10-11T00:47:57.238472" 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-10-11T00:47:57.238232" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.238905" 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-10-11T00:47:57.238688" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.239855" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_GROUP_NAME': 'internal-neighbors', '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-10-11T00:47:57.239623" elapsed="0.000275"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.240332" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.240084" elapsed="0.000271"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.240957" 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-10-11T00:47:57.240693" elapsed="0.000288"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:57.241665" 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-10-11T00:47:57.241486" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:57.241732" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:47:57.241857" 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-10-11T00:47:57.241164" elapsed="0.000716"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.242042" elapsed="0.000202"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:47:57.240562" elapsed="0.001718"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.242792" 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-10-11T00:47:57.242524" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:57.243501" 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-10-11T00:47:57.243308" elapsed="0.000218"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:57.243570" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:57.243694" 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-10-11T00:47:57.242984" elapsed="0.000732"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.243924" elapsed="0.000198"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-10-11T00:47:57.242379" elapsed="0.001780"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.244821" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:57.244387" elapsed="0.000458"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:57.245530" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.245336" elapsed="0.000219"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:57.245599" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:57.245723" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:57.245015" elapsed="0.000730"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.245909" elapsed="0.000177"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:47:57.244258" elapsed="0.001866"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.246640" 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-10-11T00:47:57.246353" elapsed="0.000311"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:57.247330" 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-10-11T00:47:57.247154" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:57.247397" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T00:47:57.247536" 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-10-11T00:47:57.246833" elapsed="0.000725"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.247720" elapsed="0.000163"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:47:57.246224" elapsed="0.001696"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.248449" 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-10-11T00:47:57.248164" elapsed="0.000310"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:57.249182" 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-10-11T00:47:57.248987" elapsed="0.000220"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:57.249250" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:57.249373" 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-10-11T00:47:57.248643" elapsed="0.000752"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.249574" elapsed="0.000165"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:47:57.248019" elapsed="0.001756"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.250287" level="INFO">${value} = internal-neighbors</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:57.250003" elapsed="0.000308"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:57.250978" level="INFO">${encoded} = internal-neighbors</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.250803" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:57.251045" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:47:57.251184" level="INFO">${encoded_value} = internal-neighbors</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:57.250496" elapsed="0.000710"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.251369" elapsed="0.000182"/>
</kw>
<var name="${key}">PEER_GROUP_NAME</var>
<var name="${value}">internal-neighbors</var>
<status status="PASS" start="2026-10-11T00:47:57.249874" elapsed="0.001714"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.252095" 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-10-11T00:47:57.251816" elapsed="0.000304"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:57.252781" 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-10-11T00:47:57.252607" elapsed="0.000198"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:57.252848" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:57.252969" 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-10-11T00:47:57.252287" elapsed="0.000704"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.253166" elapsed="0.000163"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:47:57.251687" elapsed="0.001717"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.253936" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:57.253667" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:57.254833" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.254649" elapsed="0.000209"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:57.254904" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:57.255030" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:57.254141" elapsed="0.000912"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.255272" elapsed="0.000182"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:47:57.253522" elapsed="0.001970"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.255990" 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-10-11T00:47:57.255721" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:57.256700" 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-10-11T00:47:57.256524" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:57.256768" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:57.256891" 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-10-11T00:47:57.256200" elapsed="0.000713"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.257091" elapsed="0.000165"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:47:57.255591" elapsed="0.001701"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.257823" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:57.257555" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:57.258525" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.258335" elapsed="0.000214"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:57.258593" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:57.258716" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:57.258016" elapsed="0.000722"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.258901" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:47:57.257391" elapsed="0.001730"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:47:57.240398" elapsed="0.018754"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:47:57.259191" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:47:57.259323" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_GROUP_NAME': 'internal-neighbors', 'INITIATE': 'false', 'BGP_RI...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:47:57.239270" elapsed="0.020078"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.239008" elapsed="0.020368"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.259563" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.259398" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.238991" elapsed="0.020642"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.260440" 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-10-11T00:47:57.259790" elapsed="0.000678"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:57.260512" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:57.235844" elapsed="0.024768"/>
</kw>
<msg time="2026-10-11T00:47:57.260660" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:57.231590" elapsed="0.029146"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:57.264778" 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/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-10-11T00:47:57.268824" 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/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-10-11T00:47:57.272883" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.273065" 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-10-11T00:47:57.273260" 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-10-11T00:47:57.273614" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.273467" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:57.273454" 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-10-11T00:47:57.273840" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.274018" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.274196" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:57.273427" elapsed="0.000817"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.273325" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.274431" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.274499" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:47:57.274609" 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-10-11T00:47:57.230965" elapsed="0.043669"/>
</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-10-11T00:47:57.283702" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:57.283386" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:57.284386" 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-10-11T00:47:57.284216" elapsed="0.000244">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-10-11T00:47:57.284580" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:57.283886" elapsed="0.000718"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.285103" 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-10-11T00:47:57.284777" elapsed="0.000352"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:57.285416" 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-10-11T00:47:57.285536" 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-10-11T00:47:57.285295" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.285972" 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-10-11T00:47:57.285755" elapsed="0.000272"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:47:57.286351" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.286102" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.286856" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'PEER_GROUP_NAME': 'internal-neighbors', 'INITIATE': 'false', 'BGP_RI...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:57.286589" elapsed="0.000294"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.286441" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.286084" elapsed="0.000850"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.287827" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflecto...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:57.287108" elapsed="0.000747"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:57.287900" 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-10-11T00:47:57.282865" elapsed="0.005136"/>
</kw>
<msg time="2026-10-11T00:47:57.288054" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:57.278569" elapsed="0.009560"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:57.292136" 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/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-10-11T00:47:57.296149" 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/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-10-11T00:47:57.300358" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.300553" 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-10-11T00:47:57.300735" 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-10-11T00:47:57.301092" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.300933" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:57.300919" 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-10-11T00:47:57.301320" 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-10-11T00:47:57.301514" 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-10-11T00:47:57.301680" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:57.300893" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.300801" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.301901" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.301967" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:47:57.302099" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflecto...</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-10-11T00:47:57.277830" elapsed="0.024297"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:57.303240" 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-10-11T00:47:57.303040" elapsed="0.000259">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-10-11T00:47:57.303381" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:57.302716" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.303702" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.303484" elapsed="0.000269"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.304216" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:57.303939" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.303776" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.303466" elapsed="0.000826"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.304809" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:57.304470" elapsed="0.000363"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:47:57.304878" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:57.305002" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:47:57.302400" elapsed="0.002625"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.307593" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:57.306750" elapsed="0.001097"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.308358" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T00:47:57.308130" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.308853" 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-10-11T00:47:57.308626" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.309322" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:57.309103" elapsed="0.000260"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:57.310280" 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-10-11T00:47:57.310048" elapsed="0.000258"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:47:57.310627" 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-10-11T00:47:57.310477" elapsed="0.000174"/>
</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-10-11T00:47:57.310818" elapsed="0.000177"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.311446" 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-10-11T00:47:57.311203" elapsed="0.000285"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:47:57.311533" elapsed="0.000047"/>
</return>
<msg time="2026-10-11T00:47:57.311691" 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-10-11T00:47:57.309627" elapsed="0.002088"/>
</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-10-11T00:47:57.326084" level="INFO">PUT Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Content-Length': '1077', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T00:47:57.326150" level="INFO">PUT Response : url=http://10.30.170.173: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.171.7 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:57.326251" 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-10-11T00:47:57.312094" elapsed="0.014183"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.311798" elapsed="0.014521"/>
</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-10-11T00:47:57.326539" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.326346" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.311774" elapsed="0.014847"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.328125" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:57.327825" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.327543" elapsed="0.000656"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.327272" elapsed="0.000950"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.328795" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:57.328526" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.328272" elapsed="0.000596"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.328257" elapsed="0.000633"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.329491" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:57.329101" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.329794" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.329580" elapsed="0.000265"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.330307" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:57.330029" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.329867" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.329563" elapsed="0.000820"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.330911" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:57.330571" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.331220" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.330998" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.331732" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:57.331470" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.331293" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.330982" elapsed="0.000827"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:57.331959" elapsed="0.000313"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:47:57.332682" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:57.332447" elapsed="0.000259"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.332859" elapsed="0.000231"/>
</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-10-11T00:47:57.326975" elapsed="0.006171"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:47:57.333289" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:47:57.333205" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.333188" elapsed="0.000181"/>
</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-10-11T00:47:57.333529" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.333590" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:47:57.333752" 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-10-11T00:47:57.305337" elapsed="0.028441"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:57.333835" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:57.333966" 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-10-11T00:47:57.227176" elapsed="0.106813"/>
</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-10-11T00:47:57.334309" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.334096" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.334065" elapsed="0.000328"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:57.334472" 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-10-11T00:47:57.226569" elapsed="0.108009"/>
</kw>
<kw name="Deconfigure_Peer_Group">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.335644" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=example-bgp-rib | PEER_GROUP_NAME=internal-neighbor...</msg>
<var>&amp;{mapping}</var>
<arg>DEVICE_NAME=${DEVICE_NAME}</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>
<arg>PEER_GROUP_NAME=${PEER_GROUP}</arg>
<arg>RR_CLIENT=false</arg>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.335035" elapsed="0.000637"/>
</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-10-11T00:47:57.350902" level="INFO">${file_path_stream} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:57.350377" elapsed="0.000569"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:57.352236" level="FAIL">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_group.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given `path` points to an existing file.</doc>
<status status="FAIL" start="2026-10-11T00:47:57.351883" elapsed="0.000471">File '/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_group.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-11T00:47:57.352517" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:57.351329" elapsed="0.001228"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.353379" level="INFO">${file_path} = /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:57.352847" elapsed="0.000593"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:57.353895" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_group/location.uri"&gt;/w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/variables/bgpuser/peer_group/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-11T00:47:57.354137" 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-10-11T00:47:57.353716" elapsed="0.000463"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.354885" 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/peer-groups/peer-group=$PEER_GROUP_NAME
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:57.354523" elapsed="0.000434"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.356290" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PEER_GROUP_NAME': 'internal-neighbors', 'RR_CLIENT': 'false'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:57.356025" elapsed="0.000311"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.356826" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.356549" elapsed="0.000301"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.357521" 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-10-11T00:47:57.357226" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:57.358242" 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-10-11T00:47:57.358038" elapsed="0.000229"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:57.358312" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:57.358453" 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-10-11T00:47:57.357722" elapsed="0.000754"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.358640" elapsed="0.000168"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:47:57.357086" elapsed="0.001757"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.359451" 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-10-11T00:47:57.359087" elapsed="0.000390"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:57.360150" 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-10-11T00:47:57.359958" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:57.360262" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:47:57.360389" 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-10-11T00:47:57.359649" 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-10-11T00:47:57.360593" elapsed="0.000165"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:47:57.358943" elapsed="0.001852"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.361305" 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-10-11T00:47:57.361022" elapsed="0.000308"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:57.362001" 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-10-11T00:47:57.361824" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:57.362086" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:57.362212" 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-10-11T00:47:57.361516" elapsed="0.000719"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.362400" elapsed="0.000332"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:47:57.360894" elapsed="0.001876"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.363289" 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-10-11T00:47:57.363000" elapsed="0.000313"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:57.363976" 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-10-11T00:47:57.363803" elapsed="0.000197"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:57.364044" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:47:57.364179" 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-10-11T00:47:57.363498" elapsed="0.000704"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.364363" elapsed="0.000178"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:47:57.362870" elapsed="0.001707"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.365085" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:57.364803" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:57.365775" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.365600" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:57.365841" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:57.365964" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:57.365279" elapsed="0.000707"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.366163" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:47:57.364675" elapsed="0.001690"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.366875" 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-10-11T00:47:57.366608" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:57.367577" 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-10-11T00:47:57.367385" elapsed="0.000215"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:57.367642" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:47:57.367765" 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-10-11T00:47:57.367064" elapsed="0.000723"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.367947" elapsed="0.000180"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:47:57.366479" elapsed="0.001685"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.368672" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:57.368390" elapsed="0.000305"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:57.369363" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.369186" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:57.369485" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:47:57.369614" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:57.368862" 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-10-11T00:47:57.369800" elapsed="0.000167"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:47:57.368261" elapsed="0.001743"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.370531" level="INFO">${value} = internal-neighbors</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:47:57.370249" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:57.371221" level="INFO">${encoded} = internal-neighbors</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.371030" elapsed="0.000216"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:57.371289" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:57.371426" level="INFO">${encoded_value} = internal-neighbors</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:47:57.370725" elapsed="0.000724"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.371612" elapsed="0.000165"/>
</kw>
<var name="${key}">PEER_GROUP_NAME</var>
<var name="${value}">internal-neighbors</var>
<status status="PASS" start="2026-10-11T00:47:57.370119" elapsed="0.001695"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.372495" 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-10-11T00:47:57.372044" elapsed="0.000475"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:47:57.373183" 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-10-11T00:47:57.372991" elapsed="0.000216"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:47:57.373251" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:57.373373" 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-10-11T00:47:57.372689" elapsed="0.000706"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.373574" elapsed="0.000181"/>
</kw>
<var name="${key}">RR_CLIENT</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:47:57.371915" elapsed="0.001879"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:47:57.356905" elapsed="0.016921"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:47:57.373867" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:57.374003" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'true', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'PEER_...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:47:57.355578" elapsed="0.018450"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.355058" elapsed="0.018999"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.374251" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.374097" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.355030" elapsed="0.019292"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.375178" 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-10-11T00:47:57.374500" elapsed="0.000705"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:57.375249" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group/${file_name}.</doc>
<status status="PASS" start="2026-10-11T00:47:57.349507" elapsed="0.025842"/>
</kw>
<msg time="2026-10-11T00:47:57.375398" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:57.344030" elapsed="0.031430"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.379500" 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/bgpuser/../../../variables/bgpuser//peer_group.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.383524" 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/bgpuser/../../../variables/bgpuser//peer_group.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/bgpcep-csit-1node-userfeatures-all-vanadium/test/csit/suites/bgpcep/bgpuser/../../../variables/bgpuser//peer_group/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.387544" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.387726" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.387909" 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-10-11T00:47:57.388263" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.388116" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:57.388102" 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-10-11T00:47:57.388505" 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-10-11T00:47:57.388687" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.388849" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:57.388062" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.387974" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.389082" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.389151" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:47:57.389261" 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-10-11T00:47:57.343018" elapsed="0.046268"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.390302" 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/peer-groups/peer-group=internal-neighbors</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:57.390078" elapsed="0.000267"/>
</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-10-11T00:47:57.407401" level="INFO">DELETE Request : url=http://10.30.170.173: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/peer-groups/peer-group=internal-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/peer-groups/peer-group=internal-neighbors 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:57.407470" level="INFO">DELETE Response : url=http://10.30.170.173: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/peer-groups/peer-group=internal-neighbors 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:57.407552" 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-10-11T00:47:57.390649" elapsed="0.016927"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.390419" elapsed="0.017194"/>
</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-10-11T00:47:57.407816" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.407636" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.390388" elapsed="0.017505"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.409103" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:57.408819" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.408577" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.408560" elapsed="0.000637"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.409763" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:57.409497" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.409245" elapsed="0.000589"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.409231" elapsed="0.000625"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.410395" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:57.410039" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.410706" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.410498" elapsed="0.000261"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.412394" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:57.410938" elapsed="0.001495"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.410780" elapsed="0.001687"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.410482" elapsed="0.002005"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.413004" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:57.412662" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.413312" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.413105" elapsed="0.000259"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.413824" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:57.413561" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.413386" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.413088" elapsed="0.000814"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:57.414045" elapsed="0.000306"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:47:57.414752" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:57.414528" elapsed="0.000248"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.414929" elapsed="0.000373"/>
</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-10-11T00:47:57.408231" elapsed="0.007128"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:47:57.415400" elapsed="0.000044"/>
</return>
<msg time="2026-10-11T00:47:57.415593" 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-10-11T00:47:57.389542" elapsed="0.026074"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:57.415663" elapsed="0.000025"/>
</return>
<arg>${BGP_VARIABLES_FOLDER}${/}peer_group</arg>
<arg>mapping=${mapping}</arg>
<arg>session=${CONFIG_SESSION}</arg>
<doc>Resolve URI from folder, issue DELETE request.</doc>
<status status="PASS" start="2026-10-11T00:47:57.335893" elapsed="0.079865"/>
</kw>
<doc>Deconfigures peer group which is template for all the neighbors</doc>
<status status="PASS" start="2026-10-11T00:47:57.334717" elapsed="0.081093"/>
</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-10-11T00:47:57.416971" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.416631" elapsed="0.000395"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.416615" elapsed="0.000433"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:57.417202" elapsed="0.000292"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.419753" 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-10-11T00:47:57.419374" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-10-11T00:47:57.419951" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:47:57.419845" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.419828" elapsed="0.000195"/>
</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-10-11T00:47:57.420202" elapsed="0.000020"/>
</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-10-11T00:47:57.420380" elapsed="0.000018"/>
</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-10-11T00:47:57.420567" elapsed="0.000018"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.420730" elapsed="0.000017"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.420893" elapsed="0.000018"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message of the current test case.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.421062" elapsed="0.000029"/>
</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-10-11T00:47:57.421274" elapsed="0.000018"/>
</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-10-11T00:47:57.419051" elapsed="0.002292"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.416434" elapsed="0.004954"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-10-11T00:47:57.416064" elapsed="0.005377"/>
</kw>
<doc>Configure BGP peer module with initiate-connection set to false.</doc>
<status status="PASS" start="2026-10-11T00:47:57.057537" elapsed="0.363940"/>
</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-10-11T00:47:57.422960" elapsed="0.000218"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:47:57.422712" elapsed="0.000516"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.424144" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:57.424042" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.424025" elapsed="0.000181"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.426360" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:57.426277" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.426259" elapsed="0.000179"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.427354" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:57.427003" elapsed="0.000376"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.427814" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:47:57.427550" elapsed="0.000288"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:47:57.427879" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:57.428006" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:47:57.426649" elapsed="0.001380"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.430531" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:57.430446" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.430427" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.431719" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:57.431635" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.431617" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:57.432168" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.431933" elapsed="0.000260"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:47:57.432557" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:47:57.432395" elapsed="0.000186"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:57.475899" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:47:57.433103" elapsed="0.042911"/>
</kw>
<msg time="2026-10-11T00:47:57.476199" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:47:57.476242" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:57.432752" elapsed="0.043526"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:47:57.499942" 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-10-11T00:47:57.476855" elapsed="0.023194"/>
</kw>
<msg time="2026-10-11T00:47:57.500221" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:47:57.500264" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:57.476485" elapsed="0.023828"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.500680" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.500433" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.500383" elapsed="0.000381"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.501248" 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-10-11T00:47:57.500950" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.501588" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.501368" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.501351" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:47:57.501694" 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-10-11T00:47:57.504379" elapsed="0.000326"/>
</kw>
<msg time="2026-10-11T00:47:57.504765" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:57.503258" 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-10-11T00:47:57.505235" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.505595" 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-10-11T00:47:57.502589" elapsed="0.003196"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:47:57.502028" elapsed="0.003819"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:47:57.431352" elapsed="0.074572"/>
</kw>
<msg time="2026-10-11T00:47:57.506006" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:57.506047" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:57.430745" elapsed="0.075353"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:47:57.506256" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:47:57.506169" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.506152" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.506711" 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-10-11T00:47:57.507029" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.507111" 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-10-11T00:47:57.430146" elapsed="0.077104"/>
</kw>
<msg time="2026-10-11T00:47:57.507338" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:57.507378" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:57.428373" elapsed="0.079063"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.507729" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.507506" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.507490" elapsed="0.000310"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:47:57.428231" elapsed="0.079591"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:47:57.428090" elapsed="0.079764"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:47:57.425967" 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-10-11T00:47:57.423793" elapsed="0.084168"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:57.423380" elapsed="0.084624"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:47:57.422353" elapsed="0.085701"/>
</kw>
<kw name="Kill_BGP_Speaker" owner="BGPSpeaker">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.509343" 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-10-11T00:47:57.508994" 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-10-11T00:47:57.509556" elapsed="0.000242"/>
</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-10-11T00:47:57.508714" elapsed="0.001138"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:47:57.534031" level="INFO">^C
[?2004h[jenkins@releng-26932-423-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-10-11T00:47:57.510390" elapsed="0.023735"/>
</kw>
<msg time="2026-10-11T00:47:57.534215" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:57.534253" level="INFO">${message} = ^C
[?2004h[jenkins@releng-26932-423-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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:57.510020" elapsed="0.024257"/>
</kw>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:47:57.534915" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-10-11T00:47:57.547352" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:47:57.547458" level="INFO">${output_log} = 2026-10-11 00:47:46,338 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:47:46,339 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:47:46,345 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-10-11T00:47:57.534796" elapsed="0.012688"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.547925" level="INFO">2026-10-11 00:47:46,338 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:47:46,339 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:47:46,345 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:47:46,346 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:47:46,346 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:47:46,346 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 3
2026-10-11 00:47:46,346 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-10-11 00:47:46,346 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 00:47:46,346 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 00:47:46,346 INFO BGP-Thread-1 (job):   My BGP Identifier: 169782023
2026-10-11 00:47:46,346 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 00:47:46,346 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 00:47:46,346 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 00:47:46,346 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 00:47:46,346 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 00:47:46,346 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 00:47:46,346 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 3
2026-10-11 00:47:46,346 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 00:47:46,347 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 00:47:46,348 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 3
2026-10-11 00:47:46,349 INFO BGP-Thread-1 (job): All update messages generated.
2026-10-11 00:47:46,349 INFO BGP-Thread-1 (job): Storing performance results.
2026-10-11 00:47:46,349 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-10-11 00:47:46,349 INFO BGP-Thread-1 (job): Number of iterations: 3
2026-10-11 00:47:46,349 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-10-11 00:47:46,349 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-10-11 00:47:46,349 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 3
2026-10-11 00:47:46,349 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.00017404556274414062s
2026-10-11 00:47:46,349 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-10-11 00:47:46,349 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-10-11 00:47:46,349 INFO BGP-Thread-1 (job):   
2026-10-11 00:47:46,350 INFO BGP-Thread-1 (job):   
2026-10-11 00:47:46,350 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-10-11 00:47:46,350 INFO BGP-Thread-1 (job):   
2026-10-11 00:47:46,350 INFO BGP-Thread-1 (job):   
2026-10-11 00:47:46,350 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-10-11 00:47:46,350 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:47:46,350 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:47:46,350 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:47:46,361 INFO BGP-Thread-1 (job): ... idle for 0.010s
2026-10-11 00:47:46,361 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.010s
2026-10-11 00:47:56,371 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-10-11 00:47:56,371 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.020s
2026-10-11 00:47:56,372 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:47:56,372 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:47:56,372 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:47:56,748 INFO BGP-Thread-1 (job): NOTIFICATION message received: 0xffffffffffffffffffffffffffffffff0015030600
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-10-11T00:47:57.547684" elapsed="0.000375"/>
</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-10-11T00:47:57.534479" elapsed="0.013649"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<status status="PASS" start="2026-10-11T00:47:57.548290" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-10-11T00:47:57.548190" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.548170" elapsed="0.000203"/>
</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-10-11T00:47:57.548575" elapsed="0.000019"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was not seen within timeout period.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.548740" elapsed="0.000018"/>
</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-10-11T00:47:57.508324" elapsed="0.040487"/>
</kw>
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.549623" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:47:57.549307" elapsed="0.000355"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-10-11T00:47:57.548993" elapsed="0.000721"/>
</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-10-11T00:47:57.550243" elapsed="0.000215"/>
</kw>
<doc>This is just a more readable 'None' to override [Teardown].</doc>
<status status="PASS" start="2026-10-11T00:47:57.549951" elapsed="0.000556"/>
</kw>
<doc>Abort the Python speaker. Also, attempt to stop failing fast.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:47:57.421817" elapsed="0.128724"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.552183" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.551932" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.551914" elapsed="0.000343"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-10-11T00:47:57.551758" 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-10-11T00:47:57.553503" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:57.553399" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.553381" elapsed="0.000186"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.557607" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:57.557338" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.557320" elapsed="0.000363"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.558628" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:57.558276" elapsed="0.000378"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.559090" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:47:57.558807" elapsed="0.000307"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:47:57.559155" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:57.559283" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:47:57.557899" elapsed="0.001407"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.561830" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:57.561746" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.561728" elapsed="0.000168"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.562962" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:57.562880" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.562863" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:57.563364" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.563190" elapsed="0.000199"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:47:57.563714" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:47:57.563574" elapsed="0.000165"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:57.614377" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:47:57.564236" elapsed="0.050310"/>
</kw>
<msg time="2026-10-11T00:47:57.614706" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:47:57.614748" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:57.563893" elapsed="0.050890"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:47:57.645337" 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-10-11T00:47:57.615331" elapsed="0.030124"/>
</kw>
<msg time="2026-10-11T00:47:57.645605" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:47:57.645647" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:57.614959" elapsed="0.030723"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.645971" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.645756" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.645736" elapsed="0.000308"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.646491" 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-10-11T00:47:57.646243" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.646813" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.646614" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.646598" elapsed="0.000286"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:47:57.646916" 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-10-11T00:47:57.649622" elapsed="0.000119"/>
</kw>
<msg time="2026-10-11T00:47:57.649798" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:57.648528" 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-10-11T00:47:57.650262" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.650620" 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-10-11T00:47:57.647900" elapsed="0.002906"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:47:57.647237" 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-10-11T00:47:57.562625" elapsed="0.088313"/>
</kw>
<msg time="2026-10-11T00:47:57.651018" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:57.651057" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:57.562046" elapsed="0.089060"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:47:57.651262" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:47:57.651176" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.651158" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.651695" 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-10-11T00:47:57.652008" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.652087" 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-10-11T00:47:57.561462" elapsed="0.090712"/>
</kw>
<msg time="2026-10-11T00:47:57.652259" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:57.652300" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:57.559671" elapsed="0.092665"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.652748" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.652520" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.652502" elapsed="0.000318"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:47:57.559526" elapsed="0.093316"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:47:57.559357" elapsed="0.093517"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:47:57.557024" elapsed="0.095899"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:47:57.553136" elapsed="0.099837"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:57.552458" elapsed="0.100556"/>
</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-10-11T00:47:57.551357" elapsed="0.101705"/>
</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-10-11T00:47:57.669287" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:57.668967" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:57.670085" 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-10-11T00:47:57.669809" elapsed="0.000357">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-10-11T00:47:57.670252" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:57.669489" elapsed="0.000786"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.670781" 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-10-11T00:47:57.670470" elapsed="0.000336"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:57.671198" 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-10-11T00:47:57.671347" 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-10-11T00:47:57.670973" elapsed="0.000398"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.671800" 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-10-11T00:47:57.671582" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.673062" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:57.672536" elapsed="0.000604"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.673804" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.673316" elapsed="0.000512"/>
</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-10-11T00:47:57.674187" 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-10-11T00:47:57.674894" elapsed="0.000047"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:47:57.675276" elapsed="0.000042"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:47:57.673988" elapsed="0.001468"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.673875" elapsed="0.001644"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:47:57.675561" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:47:57.675693" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:47:57.672173" elapsed="0.003544"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.671902" elapsed="0.003843"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.675912" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.675766" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.671885" elapsed="0.004129"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.676616" 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-10-11T00:47:57.676188" elapsed="0.000454"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:57.676685" 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-10-11T00:47:57.668459" elapsed="0.008326"/>
</kw>
<msg time="2026-10-11T00:47:57.676833" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:57.664214" elapsed="0.012664"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:57.681121" 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/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-10-11T00:47:57.685107" 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/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-10-11T00:47:57.689097" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.689279" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.689474" 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-10-11T00:47:57.689814" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.689667" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:57.689653" 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-10-11T00:47:57.690039" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.690233" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.690394" elapsed="0.000033"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:57.689628" elapsed="0.000829"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.689540" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.690633" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.690699" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:47:57.690805" 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-10-11T00:47:57.663598" elapsed="0.027232"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:57.691982" 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-10-11T00:47:57.691796" elapsed="0.000245">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-10-11T00:47:57.692135" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:57.691469" elapsed="0.000689"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.692457" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.692222" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.692961" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:57.692699" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.692532" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.692205" elapsed="0.000830"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.693560" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:57.693210" elapsed="0.000374"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:47:57.693629" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:57.693753" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:47:57.691150" elapsed="0.002625"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:57.694864" 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-10-11T00:47:57.694678" elapsed="0.000246">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-10-11T00:47:57.695007" 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-10-11T00:47:57.694341" elapsed="0.000688"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:47:57.695211" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:47:57.695113" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.695095" elapsed="0.000194"/>
</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-10-11T00:47:57.695458" elapsed="0.000020"/>
</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-10-11T00:47:57.695635" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.695693" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:47:57.695816" 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-10-11T00:47:57.694030" elapsed="0.001809"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.697082" 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-10-11T00:47:57.696848" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.697551" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:57.697316" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:47:57.705013" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:47:57.705180" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:47:57.705269" 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-10-11T00:47:57.697882" elapsed="0.007411"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.697650" elapsed="0.007681"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.705528" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.705355" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.697633" elapsed="0.008004"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.706898" 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-10-11T00:47:57.706570" elapsed="0.000372"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.706315" elapsed="0.000659"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.706297" elapsed="0.000699"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.707584" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:47:57.707297" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.707045" elapsed="0.000611"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.707030" elapsed="0.000648"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.708221" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:57.707854" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.708536" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.708308" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.709035" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:57.708773" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.708611" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.708292" elapsed="0.000832"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.709654" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:57.709299" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.709950" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.709743" elapsed="0.000259"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.710473" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:47:57.710198" elapsed="0.000299"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.710024" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.709727" elapsed="0.000821"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:57.710691" elapsed="0.000288"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:47:57.711478" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:47:57.711219" elapsed="0.000283"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.711655" elapsed="0.000214"/>
</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-10-11T00:47:57.705964" elapsed="0.005960"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.712080" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:57.711986" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.711969" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:47:57.712791" 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-10-11T00:47:57.712284" elapsed="0.000534"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:47:57.712864" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:47:57.712988" 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-10-11T00:47:57.696136" elapsed="0.016876"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:57.713081" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:47:57.713201" 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-10-11T00:47:57.656289" elapsed="0.056965"/>
</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-10-11T00:47:57.724451" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:57.723688" elapsed="0.000792"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:47:57.726614" 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-10-11T00:47:57.726081" elapsed="0.000654">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-10-11T00:47:57.726859" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:47:57.724640" elapsed="0.002242"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.727768" 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-10-11T00:47:57.727057" elapsed="0.000738"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:47:57.728173" 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-10-11T00:47:57.728554" 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-10-11T00:47:57.727961" elapsed="0.000621"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.729288" 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-10-11T00:47:57.728777" elapsed="0.000569"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:47:57.729997" elapsed="0.000091"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.729434" elapsed="0.000732"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.730999" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:57.730367" elapsed="0.000670"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.730192" elapsed="0.000939"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.729395" elapsed="0.001758"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.732145" 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-10-11T00:47:57.731316" elapsed="0.000857"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:47:57.732221" 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-10-11T00:47:57.723170" elapsed="0.009162"/>
</kw>
<msg time="2026-10-11T00:47:57.732381" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:57.718664" elapsed="0.013789"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:47:57.736588" 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/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-10-11T00:47:57.740601" 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/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-10-11T00:47:57.744782" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.744971" 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-10-11T00:47:57.745165" 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-10-11T00:47:57.745574" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.745403" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:47:57.745389" 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-10-11T00:47:57.745800" 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-10-11T00:47:57.745978" 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-10-11T00:47:57.746153" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:47:57.745360" elapsed="0.000842"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.745239" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.746379" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.746462" elapsed="0.000154"/>
</return>
<msg time="2026-10-11T00:47:57.746715" 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-10-11T00:47:57.717929" elapsed="0.028811"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:57.746909" elapsed="0.000329"/>
</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-10-11T00:47:57.748229" 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-10-11T00:47:57.747908" elapsed="0.000348"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:47:57.748688" 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-10-11T00:47:57.748426" elapsed="0.000288"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:47:57.748897" elapsed="0.000302"/>
</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-10-11T00:47:57.747533" elapsed="0.001719"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.747307" elapsed="0.001975"/>
</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-10-11T00:47:57.749496" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.749305" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.747290" elapsed="0.002276"/>
</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-10-11T00:47:57.714230" elapsed="0.035410"/>
</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-10-11T00:47:57.713552" elapsed="0.036158"/>
</kw>
<status status="PASS" start="2026-10-11T00:47:57.713331" elapsed="0.036419"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.713314" elapsed="0.036457"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:47:57.749803" elapsed="0.000026"/>
</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-10-11T00:47:57.655655" elapsed="0.094251"/>
</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-10-11T00:47:57.654060" elapsed="0.095903"/>
</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-10-11T00:47:57.653606" elapsed="0.096401"/>
</kw>
<arg>empty_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="PASS" start="2026-10-11T00:47:57.653208" elapsed="0.096853"/>
</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-10-11T00:47:57.750652" elapsed="0.000227"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:47:57.750331" elapsed="0.000610"/>
</kw>
<doc>See example-ipv4-topology empty again.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:47:57.550835" elapsed="0.200142"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.752498" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.752268" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.752252" 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-10-11T00:47:57.752097" elapsed="0.000517"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.753532" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:57.753445" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.753427" elapsed="0.000167"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.755732" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:57.755649" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.755632" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.756712" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:47:57.756375" elapsed="0.000362"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.757161" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:47:57.756887" elapsed="0.000298"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:47:57.757225" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:47:57.757351" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:47:57.756008" elapsed="0.001366"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.759852" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:57.759769" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.759751" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.760957" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:47:57.760873" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.760856" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:47:57.761350" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:47:57.761179" elapsed="0.000196"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:47:57.761706" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:47:57.761563" elapsed="0.000166"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:57.801565" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:47:57.762269" elapsed="0.039393"/>
</kw>
<msg time="2026-10-11T00:47:57.801817" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:47:57.801859" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:57.761921" elapsed="0.039973"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:47:57.825952" 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-10-11T00:47:57.802438" elapsed="0.023607"/>
</kw>
<msg time="2026-10-11T00:47:57.826211" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:47:57.826253" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:57.802062" elapsed="0.024228"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.826591" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.826359" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.826341" elapsed="0.000322"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.827083" 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-10-11T00:47:57.826845" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.827403" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.827204" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.827188" elapsed="0.000303"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:47:57.827522" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:47:57.830037" elapsed="0.000131"/>
</kw>
<msg time="2026-10-11T00:47:57.830228" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:47:57.828896" 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-10-11T00:47:57.830786" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.831134" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:47:57.828295" elapsed="0.003024"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:47:57.827813" elapsed="0.003566"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:47:57.760618" elapsed="0.070856"/>
</kw>
<msg time="2026-10-11T00:47:57.831556" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:57.831595" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:57.760076" elapsed="0.071556"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:47:57.831785" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:47:57.831700" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.831682" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.832210" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.832534" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:47:57.832598" 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-10-11T00:47:57.759486" elapsed="0.073197"/>
</kw>
<msg time="2026-10-11T00:47:57.832766" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:47:57.832805" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:57.757721" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:47:57.833176" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:47:57.832943" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-11T00:47:57.832927" elapsed="0.000320"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:47:57.757580" elapsed="0.075688"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:47:57.757436" elapsed="0.075860"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:47:57.755340" elapsed="0.078004"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:47:57.753172" elapsed="0.080223"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:47:57.752761" elapsed="0.080789"/>
</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-10-11T00:47:57.751716" elapsed="0.081883"/>
</kw>
<kw name="Start_BGP_Speaker" owner="BGPSpeaker">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.834488" level="INFO">${command} = python3 play.py --amount 3 --listen --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T00:47:57.834187" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:47:57.834926" level="INFO">python3 play.py --amount 3 --listen --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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-10-11T00:47:57.834710" elapsed="0.000257"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:47:57.837779" level="INFO">python3 play.py --amount 3 --listen --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --info &amp;&gt; play.py.out</msg>
<msg time="2026-10-11T00:47:57.837861" level="INFO">${output} =  python3 play.py --amount 3 --listen --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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-10-11T00:47:57.835138" elapsed="0.002748"/>
</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-10-11T00:47:57.833801" elapsed="0.004138"/>
</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-10-11T00:48:07.839804" 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-10-11T00:47:57.839484" elapsed="10.000972">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-10-11T00:48:07.840787" elapsed="0.000030"/>
</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-10-11T00:47:57.839192" elapsed="10.001735">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-10-11T00:47:57.838820" elapsed="10.002249"/>
</kw>
<msg time="2026-10-11T00:48:07.841175" 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-10-11T00:47:57.838451" elapsed="10.002748"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-10-11T00:48:07.841370" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-10-11T00:48:07.841291" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:07.841263" elapsed="0.000212"/>
</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-10-11T00:48:07.841697" elapsed="0.000024"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:07.841873" elapsed="0.000019"/>
</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-10-11T00:47:57.838166" elapsed="10.003782"/>
</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-10-11T00:48:07.842568" elapsed="0.000274"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:48:07.842219" elapsed="0.000681"/>
</kw>
<doc>Start Python speaker in listening mode, verify that the tool does not exit quickly.</doc>
<status status="PASS" start="2026-10-11T00:47:57.751204" elapsed="10.091729"/>
</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">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:07.846477" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:07.844517" elapsed="0.002015"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:07.844499" elapsed="0.002057"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-10-11T00:48:07.844309" elapsed="0.002291"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:07.847547" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:07.847460" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:07.847442" elapsed="0.000169"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:07.849610" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:07.849526" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:07.849509" elapsed="0.000164"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:07.850788" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:07.850252" elapsed="0.000561"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:48:07.851282" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:48:07.850966" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:48:07.851346" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:48:07.851493" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:48:07.849881" 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-10-11T00:48:07.853983" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:07.853898" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:07.853881" elapsed="0.000187"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:07.855127" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:07.855043" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:07.855025" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:48:07.855531" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:48:07.855335" elapsed="0.000220"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:48:07.855856" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:48:07.855716" elapsed="0.000163"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:48:07.895656" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:48:07.856376" elapsed="0.039383"/>
</kw>
<msg time="2026-10-11T00:48:07.895919" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:48:07.895962" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:07.856050" elapsed="0.039948"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:48:07.933304" level="INFO">". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "i "n "g "_ "C "o "n "n "e "c "t "i "o "n "_ "I "s "_ "N "o "t "_ "E "s "t "a "b "l "i "s "h "e "d "_ "Y "e "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-10-11T00:48:07.896548" elapsed="0.036884"/>
</kw>
<msg time="2026-10-11T00:48:07.933586" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:48:07.933628" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "i "n "g "_ "C "o "n "n "e "c "t "i "o "n "_ "I "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:07.896183" elapsed="0.037479"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:07.933933" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:07.933730" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:07.933712" elapsed="0.000307"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:07.934445" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "i "n "g "_ "C "o "n "n "e "c "t "i "o "n "_ "I "s "_ "N "o "t "_ "E "s "t "a "b "l "i "s "h "e "d "_ "Y "e "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-10-11T00:48:07.934201" elapsed="0.000350"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:07.934924" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:07.934612" elapsed="0.000362"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:07.934596" elapsed="0.000399"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:48:07.935039" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:48:07.937488" elapsed="0.000115"/>
</kw>
<msg time="2026-10-11T00:48:07.937660" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:07.936425" elapsed="0.001367"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:07.938111" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:07.938472" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:48:07.935814" elapsed="0.002842"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:48:07.935326" elapsed="0.003389"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:48:07.854772" elapsed="0.084016"/>
</kw>
<msg time="2026-10-11T00:48:07.938868" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:07.938907" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "i "n "g "_ "C "o "n "n "e "c "t "i "o "n "_ "I "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:07.854217" elapsed="0.084725"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:48:07.939106" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:48:07.939020" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:07.938992" elapsed="0.000190"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:07.939525" 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-10-11T00:48:07.939827" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:48:07.939890" 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-10-11T00:48:07.853615" elapsed="0.086359"/>
</kw>
<msg time="2026-10-11T00:48:07.940070" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:07.940110" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "i "n "g "_ "C "o "n "n "e "c "t "i "o "n "_ "I "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:07.851851" elapsed="0.088293"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:07.940538" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:07.940211" elapsed="0.000379"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:07.940195" elapsed="0.000416"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:48:07.851710" elapsed="0.088922"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:48:07.851565" elapsed="0.089097"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:48:07.849217" elapsed="0.091495"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:48:07.847178" elapsed="0.093582"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:07.846750" elapsed="0.094049"/>
</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-10-11T00:48:07.843906" elapsed="0.096939"/>
</kw>
<kw name="Check_Speaker_Is_Not_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-10-11T00:48:07.944247" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-10-11T00:48:07.957067" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:48:07.957153" 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-10-11T00:48:07.944153" elapsed="0.013052"/>
</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-10-11T00:48:07.957570" elapsed="0.000023"/>
</kw>
<msg time="2026-10-11T00:48:07.957624" 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-10-11T00:48:07.957273" elapsed="0.000398">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-10-11T00:48:07.957255" elapsed="0.000454">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-10-11T00:48:07.943841" elapsed="0.013972">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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:07.943479" elapsed="0.014391"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:48:07.958221" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17900 .+ ESTABLISHED .+python" | wc -l'.</msg>
<msg time="2026-10-11T00:48:08.008532" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:48:08.008722" level="INFO">${output} = 0</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="PASS" start="2026-10-11T00:48:07.958069" elapsed="0.050703"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-11T00:48:08.008868" elapsed="0.000062"/>
</return>
<msg time="2026-10-11T00:48:08.009169" level="INFO">${output} = 0</msg>
<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="PASS" start="2026-10-11T00:48:07.943153" elapsed="0.066065"/>
</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="PASS" start="2026-10-11T00:48:08.009603" elapsed="0.000645"/>
</kw>
<arg>0</arg>
<doc>Run netstat in mininet machine and parse it for number of established connections. Check it is ${howmany}.</doc>
<status status="PASS" start="2026-10-11T00:48:07.942811" elapsed="0.067558"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Check_Number_Of_Speaker_Connections</arg>
<arg>0</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-10-11T00:48:07.941265" elapsed="0.069226"/>
</kw>
<doc>Give it a few tries to see zero established connections.</doc>
<status status="PASS" start="2026-10-11T00:48:07.940964" elapsed="0.069640"/>
</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-10-11T00:48:08.011623" elapsed="0.000324"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:48:08.011171" elapsed="0.000878"/>
</kw>
<doc>See no TCP connection, as both ODL and tool are in listening mode.</doc>
<status status="PASS" start="2026-10-11T00:48:07.843349" elapsed="0.168750"/>
</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">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:08.014338" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:08.014041" elapsed="0.000394"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:08.013998" elapsed="0.000472"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-10-11T00:48:08.013775" 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-10-11T00:48:08.015863" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:08.015741" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:08.015717" 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-10-11T00:48:08.018842" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:08.018723" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:08.018699" elapsed="0.000235"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:08.020308" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:08.019818" elapsed="0.000527"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:48:08.020980" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:48:08.020599" elapsed="0.000471"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:48:08.021130" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T00:48:08.021315" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:48:08.019273" 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-10-11T00:48:08.025342" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:08.025217" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:08.025190" elapsed="0.000280"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:08.026998" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:08.026877" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:08.026852" elapsed="0.000265"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:48:08.027612" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:48:08.027355" elapsed="0.000291"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:48:08.028075" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:48:08.027872" elapsed="0.000235"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:48:08.071676" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:48:08.028819" elapsed="0.042953"/>
</kw>
<msg time="2026-10-11T00:48:08.071922" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:48:08.071963" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:08.028329" elapsed="0.043667"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:48:08.107298" 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 "_ "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-10-11T00:48:08.072536" elapsed="0.034866"/>
</kw>
<msg time="2026-10-11T00:48:08.107577" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:48:08.107618" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:08.072180" elapsed="0.035472"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:08.107966" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:08.107754" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:08.107735" elapsed="0.000318"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:08.108496" 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 "_ "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-10-11T00:48:08.108234" elapsed="0.000326"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:08.108822" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:08.108620" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:08.108604" elapsed="0.000289"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:48:08.108923" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:48:08.111452" elapsed="0.000119"/>
</kw>
<msg time="2026-10-11T00:48:08.111628" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:08.110292" 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-10-11T00:48:08.112074" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:08.112425" 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-10-11T00:48:08.109697" 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-10-11T00:48:08.109211" 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-10-11T00:48:08.026504" elapsed="0.086235"/>
</kw>
<msg time="2026-10-11T00:48:08.112820" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:08.112860" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:08.025695" elapsed="0.087198"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:48:08.113062" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:48:08.112961" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:08.112944" elapsed="0.000193"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:08.113479" 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-10-11T00:48:08.113785" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:48:08.113849" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:48:08.024777" elapsed="0.089156"/>
</kw>
<msg time="2026-10-11T00:48:08.114032" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:08.114073" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:08.021845" elapsed="0.092261"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:08.114392" elapsed="0.000096"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:08.114173" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:08.114157" elapsed="0.000385"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:48:08.021636" elapsed="0.092928"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:48:08.021435" elapsed="0.093155"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:48:08.018281" elapsed="0.096357"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:48:08.015346" elapsed="0.099340"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:08.014750" elapsed="0.099974"/>
</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-10-11T00:48:08.013212" elapsed="0.101557"/>
</kw>
<kw name="Verify_That_Topology_Does_Not_Change_From">
<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="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-10-11T00:48:08.134872" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:08.134566" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:08.135624" 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-10-11T00:48:08.135392" elapsed="0.000299">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-10-11T00:48:08.135776" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:08.135074" elapsed="0.000724"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:08.136289" 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-10-11T00:48:08.135968" elapsed="0.000347"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:08.136610" 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-10-11T00:48:08.136751" 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-10-11T00:48:08.136496" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:08.137221" 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-10-11T00:48:08.136969" 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-10-11T00:48:08.138176" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:08.137931" elapsed="0.000287"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:48:08.138663" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:48:08.138393" 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-10-11T00:48:08.138970" elapsed="0.000020"/>
</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-10-11T00:48:08.139174" elapsed="0.000022"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:48:08.139356" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:48:08.138840" elapsed="0.000583"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:48:08.138731" elapsed="0.000720"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:48:08.139489" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:48:08.139619" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:48:08.137592" elapsed="0.002051"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:08.137325" elapsed="0.002346"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:08.139839" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:08.139693" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:08.137306" elapsed="0.002601"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:08.140500" 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-10-11T00:48:08.140096" elapsed="0.000430"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:08.140569" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:08.134024" elapsed="0.006645"/>
</kw>
<msg time="2026-10-11T00:48:08.140748" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:08.129702" elapsed="0.011094"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:08.144829" 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/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-10-11T00:48:08.148867" 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/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-10-11T00:48:08.153044" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:08.153227" 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-10-11T00:48:08.153421" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:08.153764" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:08.153619" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:08.153604" 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-10-11T00:48:08.153991" 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-10-11T00:48:08.154192" 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-10-11T00:48:08.154357" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:08.153579" elapsed="0.000839"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:08.153491" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:08.154594" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:08.154661" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:48:08.154767" 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-10-11T00:48:08.129093" elapsed="0.025698"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:08.155900" 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-10-11T00:48:08.155710" elapsed="0.000249">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-10-11T00:48:08.156056" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:08.155371" elapsed="0.000708"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:08.156399" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:08.156145" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:08.156923" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:08.156658" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:08.156491" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:08.156127" elapsed="0.000872"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:08.157528" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:08.157174" elapsed="0.000378"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:48:08.157597" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:48:08.157722" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:48:08.155072" elapsed="0.002672"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:08.158837" 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-10-11T00:48:08.158649" elapsed="0.000247">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-10-11T00:48:08.158979" 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-10-11T00:48:08.158312" elapsed="0.000707"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:48:08.159184" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:48:08.159085" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:08.159067" elapsed="0.000193"/>
</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-10-11T00:48:08.159427" 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-10-11T00:48:08.159603" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:48:08.159661" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:48:08.159784" 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-10-11T00:48:08.157995" elapsed="0.001813"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:08.161044" 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-10-11T00:48:08.160809" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:08.161510" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:08.161277" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:48:08.170499" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:48:08.170648" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:48:08.170748" 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-10-11T00:48:08.161838" elapsed="0.008935"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:08.161610" elapsed="0.009201"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:08.170988" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:08.170836" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:08.161592" elapsed="0.009489"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:08.172530" 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-10-11T00:48:08.172181" elapsed="0.000394"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:08.171915" elapsed="0.000693"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:08.171742" elapsed="0.000889"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:08.173233" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:08.172922" elapsed="0.000386"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:08.172682" elapsed="0.000658"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:08.172666" elapsed="0.000697"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:08.173911" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:08.173554" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:08.174222" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:08.174000" elapsed="0.000275"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:08.174746" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:08.174478" elapsed="0.000293"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:08.174297" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:08.173983" elapsed="0.000841"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:08.175347" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:08.174995" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:08.175663" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:08.175453" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:08.176180" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:08.175897" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:08.175737" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:08.175435" elapsed="0.000822"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:08.176399" elapsed="0.000306"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:48:08.177117" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:08.176865" elapsed="0.000277"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:48:08.177294" elapsed="0.000231"/>
</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-10-11T00:48:08.171405" elapsed="0.006176"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:08.177727" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:08.177644" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:08.177627" elapsed="0.000160"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:48:08.178441" 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-10-11T00:48:08.177927" elapsed="0.000543"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:48:08.178517" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:48:08.178644" 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-10-11T00:48:08.160104" elapsed="0.018565"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:08.178723" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:48:08.178843" 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-10-11T00:48:08.121839" elapsed="0.057028"/>
</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-10-11T00:48:08.189261" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:08.188943" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:08.189993" 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-10-11T00:48:08.189816" elapsed="0.000250">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-10-11T00:48:08.190151" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:08.189496" elapsed="0.000677"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:08.190674" 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-10-11T00:48:08.190346" elapsed="0.000353"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:08.190974" 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-10-11T00:48:08.191104" 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-10-11T00:48:08.190864" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:08.191560" 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-10-11T00:48:08.191322" elapsed="0.000280"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:48:08.191912" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:08.191663" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:08.192422" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:08.192148" elapsed="0.000299"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:08.191987" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:08.191646" elapsed="0.000854"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:08.193037" 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-10-11T00:48:08.192659" elapsed="0.000405"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:08.193108" 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-10-11T00:48:08.188435" elapsed="0.004775"/>
</kw>
<msg time="2026-10-11T00:48:08.193257" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:08.184072" elapsed="0.009231"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:08.197303" 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/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-10-11T00:48:08.201292" 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/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-10-11T00:48:08.205277" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:08.205504" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:08.205690" 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-10-11T00:48:08.206067" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:08.205888" elapsed="0.000233"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:08.205874" 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-10-11T00:48:08.206301" 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-10-11T00:48:08.206498" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:08.206666" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:08.205848" elapsed="0.000867"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:08.205757" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:08.206890" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:08.206956" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:48:08.207076" 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-10-11T00:48:08.183335" elapsed="0.023766"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:08.207267" elapsed="0.000333"/>
</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-10-11T00:48:08.208516" 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-10-11T00:48:08.208249" elapsed="0.000294"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:48:08.208937" 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-10-11T00:48:08.208693" elapsed="0.000269"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:48:08.209159" elapsed="0.000296"/>
</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-10-11T00:48:08.207873" elapsed="0.001637"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:08.207670" elapsed="0.001870"/>
</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-10-11T00:48:08.209738" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:08.209563" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:08.207653" elapsed="0.002154"/>
</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-10-11T00:48:08.179826" elapsed="0.030023"/>
</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-10-11T00:48:08.179156" elapsed="0.030758"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:08.178939" elapsed="0.031014"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:08.178923" elapsed="0.031051"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:08.210014" 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-10-11T00:48:08.121063" elapsed="0.089149"/>
</kw>
<arg>empty_topology</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="PASS" start="2026-10-11T00:48:08.119120" elapsed="0.091217"/>
</kw>
<msg time="2026-10-11T00:48:08.210514" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:08.210554" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:08.118618" elapsed="0.091957"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-10-11T00:48:08.210723" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:08.210637" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:08.210621" elapsed="0.000162"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:48:08.211358" 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-10-11T00:48:08.210922" elapsed="0.000460"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-10-11T00:48:08.212152" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-10-11T00:48:08.211555" elapsed="0.000655">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-10-11T00:48:08.118283" elapsed="0.094027">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" 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-10-11T00:48:09.250662" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:09.249930" elapsed="0.000792"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:09.252258" 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-10-11T00:48:09.251842" 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-10-11T00:48:09.252618" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:09.251098" elapsed="0.001570"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:09.253828" 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-10-11T00:48:09.253070" elapsed="0.000813"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:09.254610" 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-10-11T00:48:09.254871" 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-10-11T00:48:09.254297" elapsed="0.000626"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:09.256174" 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-10-11T00:48:09.255601" elapsed="0.000668"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:09.258686" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:09.258132" elapsed="0.000648"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:48:09.259550" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:48:09.259177" elapsed="0.000407"/>
</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-10-11T00:48:09.259987" elapsed="0.000043"/>
</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-10-11T00:48:09.260264" 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-10-11T00:48:09.260544" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:48:09.259806" elapsed="0.000811"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:48:09.259648" elapsed="0.001007"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:48:09.260708" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:48:09.260892" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:48:09.257031" elapsed="0.003893"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:09.256438" elapsed="0.004526"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:09.261215" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:09.261010" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:09.256369" elapsed="0.004989"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:09.262153" 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-10-11T00:48:09.261605" elapsed="0.000584"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:09.262249" 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/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-10-11T00:48:09.248717" elapsed="0.013671"/>
</kw>
<msg time="2026-10-11T00:48:09.262476" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:09.239185" elapsed="0.023359"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:09.268144" 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-10-11T00:48:09.273759" 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-10-11T00:48:09.279313" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:09.279582" 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-10-11T00:48:09.279835" 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-10-11T00:48:09.280326" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:09.280124" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:09.280105" elapsed="0.000339"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:09.280661" 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-10-11T00:48:09.280911" 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-10-11T00:48:09.281156" elapsed="0.000027"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:09.280067" elapsed="0.001158"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:09.279925" elapsed="0.001332"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:09.281483" elapsed="0.000028"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:09.281577" elapsed="0.000022"/>
</return>
<msg time="2026-10-11T00:48:09.281727" 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-10-11T00:48:09.237769" elapsed="0.043991"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:09.283366" 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-10-11T00:48:09.283101" elapsed="0.000369">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-10-11T00:48:09.283589" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:09.282634" elapsed="0.000987"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:09.284036" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:09.283709" elapsed="0.000401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:09.284801" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:09.284427" elapsed="0.000408"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:09.284141" elapsed="0.000740"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:09.283685" elapsed="0.001223"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:09.285554" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:09.285160" elapsed="0.000418"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:48:09.285622" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:48:09.285745" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:48:09.282193" elapsed="0.003574"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:09.286852" 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-10-11T00:48:09.286665" elapsed="0.000246">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-10-11T00:48:09.287043" 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-10-11T00:48:09.286331" elapsed="0.000736"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:48:09.287232" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:48:09.287132" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:09.287115" elapsed="0.000368"/>
</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-10-11T00:48:09.287639" 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-10-11T00:48:09.287815" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:48:09.287874" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:48:09.288014" 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-10-11T00:48:09.286030" elapsed="0.002009"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:09.289269" 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-10-11T00:48:09.289040" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:09.289738" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:09.289520" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:48:09.297664" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:48:09.297870" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:48:09.298054" 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-10-11T00:48:09.290075" elapsed="0.008025"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:09.289836" elapsed="0.008348"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:09.298561" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:09.298236" elapsed="0.000431"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:09.289819" elapsed="0.008869"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:09.300314" 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-10-11T00:48:09.299842" elapsed="0.000533"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:09.299505" elapsed="0.000933"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:09.299480" elapsed="0.000992"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:09.301267" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:09.300873" elapsed="0.000451"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:09.300542" elapsed="0.000825"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:09.300520" elapsed="0.000878"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:09.302166" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:09.301660" elapsed="0.000541"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:09.302600" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:09.302290" elapsed="0.000385"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:09.303313" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:09.302926" elapsed="0.000421"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:09.302705" elapsed="0.000687"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:09.302266" elapsed="0.001173"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:09.304166" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:09.303680" elapsed="0.000521"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:09.304597" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:09.304289" elapsed="0.000381"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:09.305299" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:09.304920" elapsed="0.000413"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:09.304701" elapsed="0.000676"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:09.304265" elapsed="0.001138"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:09.305624" elapsed="0.000424"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:48:09.306609" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:09.306272" elapsed="0.000371"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:48:09.306854" elapsed="0.000311"/>
</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-10-11T00:48:09.299018" elapsed="0.008224"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:09.307465" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:09.307329" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:09.307305" elapsed="0.000245"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:48:09.308434" 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-10-11T00:48:09.307744" elapsed="0.000730"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:48:09.308538" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:48:09.308714" 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-10-11T00:48:09.288314" elapsed="0.020434"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:09.308825" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T00:48:09.308993" 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-10-11T00:48:09.221622" elapsed="0.087465"/>
</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-10-11T00:48:09.325298" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:09.324844" elapsed="0.000491"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:09.326350" 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-10-11T00:48:09.326046" elapsed="0.000419">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-10-11T00:48:09.326565" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:09.325578" elapsed="0.001009"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:09.327088" 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-10-11T00:48:09.326761" elapsed="0.000353"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:09.327392" 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-10-11T00:48:09.327531" 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-10-11T00:48:09.327283" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:09.327968" 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-10-11T00:48:09.327750" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:48:09.328336" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:09.328087" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:09.328836" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:09.328576" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:09.328428" elapsed="0.000465"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:09.328069" elapsed="0.000844"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:09.329471" 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-10-11T00:48:09.329087" elapsed="0.000410"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:09.329541" 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-10-11T00:48:09.324059" elapsed="0.005584"/>
</kw>
<msg time="2026-10-11T00:48:09.329690" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:09.317981" elapsed="0.011756"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:09.333858" 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-10-11T00:48:09.338024" 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-10-11T00:48:09.342101" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:09.342285" 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-10-11T00:48:09.342482" 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-10-11T00:48:09.342826" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:09.342682" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:09.342668" 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-10-11T00:48:09.343065" 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-10-11T00:48:09.343246" 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-10-11T00:48:09.343423" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:09.342642" elapsed="0.000831"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:09.342550" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:09.343649" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:09.343716" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:48:09.343823" 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-10-11T00:48:09.316969" elapsed="0.026879"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:09.344037" elapsed="0.000317"/>
</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-10-11T00:48:09.345268" 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-10-11T00:48:09.345018" elapsed="0.000277"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:48:09.345699" 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-10-11T00:48:09.345460" elapsed="0.000266"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:48:09.345906" 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-10-11T00:48:09.344643" elapsed="0.001654"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:09.344440" elapsed="0.001888"/>
</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-10-11T00:48:09.346542" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:09.346351" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:09.344422" elapsed="0.002190"/>
</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-10-11T00:48:09.310442" elapsed="0.036249"/>
</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-10-11T00:48:09.309504" elapsed="0.037254"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:09.309194" elapsed="0.037604"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:09.309171" elapsed="0.037648"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:09.346849" elapsed="0.000027"/>
</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-10-11T00:48:09.219749" elapsed="0.127303"/>
</kw>
<arg>empty_topology</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="PASS" start="2026-10-11T00:48:09.215159" elapsed="0.131963"/>
</kw>
<msg time="2026-10-11T00:48:09.347269" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:09.347310" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:09.213937" elapsed="0.133394"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-10-11T00:48:09.347500" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:09.347393" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:09.347377" elapsed="0.000183"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:48:09.348105" 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-10-11T00:48:09.347699" elapsed="0.000430"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-10-11T00:48:09.348708" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-10-11T00:48:09.348285" elapsed="0.000479">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-10-11T00:48:09.213135" elapsed="0.135727">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" 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-10-11T00:48:10.394353" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:10.393698" elapsed="0.000699"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:10.395441" 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-10-11T00:48:10.395122" elapsed="0.000419">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-10-11T00:48:10.395661" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:10.394655" elapsed="0.001038"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:10.396388" 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-10-11T00:48:10.395935" elapsed="0.000508"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:10.396840" 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-10-11T00:48:10.397054" 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-10-11T00:48:10.396679" elapsed="0.000409"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:10.397691" 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-10-11T00:48:10.397359" 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-10-11T00:48:10.399063" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:10.398727" elapsed="0.000395"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:48:10.399740" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:48:10.399367" 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-10-11T00:48:10.400233" 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-10-11T00:48:10.400591" elapsed="0.000034"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:48:10.400856" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:48:10.400047" elapsed="0.000883"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:48:10.399840" elapsed="0.001129"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:48:10.401046" elapsed="0.000046"/>
</return>
<msg time="2026-10-11T00:48:10.401241" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:48:10.398232" elapsed="0.003042"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:10.397847" elapsed="0.003467"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:10.401572" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:10.401347" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:10.397816" elapsed="0.003855"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:10.402465" 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-10-11T00:48:10.401891" elapsed="0.000612"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:10.402563" 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//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-10-11T00:48:10.392517" elapsed="0.010184"/>
</kw>
<msg time="2026-10-11T00:48:10.402769" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:10.382626" elapsed="0.020211"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:10.409008" 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/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-10-11T00:48:10.414901" 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/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-10-11T00:48:10.420556" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:10.420739" 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-10-11T00:48:10.420920" 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-10-11T00:48:10.421274" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:10.421129" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:10.421114" 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-10-11T00:48:10.421515" 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-10-11T00:48:10.421695" 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-10-11T00:48:10.421913" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:10.421088" elapsed="0.000876"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:10.420995" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:10.422154" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:10.422223" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:48:10.422331" 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-10-11T00:48:10.381175" elapsed="0.041181"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:10.423527" 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-10-11T00:48:10.423303" elapsed="0.000288">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-10-11T00:48:10.423675" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:10.422963" elapsed="0.000735"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:10.423999" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:10.423762" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:10.424540" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:10.424260" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:10.424074" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:10.423743" elapsed="0.000873"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:10.425130" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:10.424779" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:48:10.425198" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:48:10.425323" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:48:10.422643" elapsed="0.002703"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:10.426444" 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-10-11T00:48:10.426243" elapsed="0.000260">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-10-11T00:48:10.426587" 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-10-11T00:48:10.425912" elapsed="0.000698"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:48:10.426771" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:48:10.426673" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:10.426655" elapsed="0.000192"/>
</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-10-11T00:48:10.427025" 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-10-11T00:48:10.427202" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:48:10.427260" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:48:10.427387" 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-10-11T00:48:10.425615" elapsed="0.001814"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:10.428663" 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-10-11T00:48:10.428438" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:10.429123" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:10.428893" elapsed="0.000269"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:48:10.439251" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:48:10.439607" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:48:10.439849" 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-10-11T00:48:10.429518" elapsed="0.010391"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:10.429269" elapsed="0.010766"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:10.440505" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:10.440099" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:10.429250" elapsed="0.011448"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:10.442689" 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-10-11T00:48:10.442203" elapsed="0.000547"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:10.441846" elapsed="0.000949"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:10.441821" elapsed="0.001005"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:10.443647" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:10.443250" elapsed="0.000453"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:10.442896" elapsed="0.000850"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:10.442874" elapsed="0.000903"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:10.444567" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:10.444040" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:10.445000" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:10.444690" elapsed="0.000385"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:10.445722" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:10.445330" elapsed="0.000425"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:10.445106" elapsed="0.000694"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:10.444667" elapsed="0.001160"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:10.446572" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:10.446081" elapsed="0.000526"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:10.446980" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:10.446694" elapsed="0.000397"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:10.447734" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:10.447346" elapsed="0.000429"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:10.447122" elapsed="0.000697"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:10.446671" elapsed="0.001175"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:10.448060" elapsed="0.000426"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:48:10.449066" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:10.448710" elapsed="0.000391"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:48:10.449314" elapsed="0.000325"/>
</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-10-11T00:48:10.441349" elapsed="0.008368"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:10.449917" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:10.449804" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:10.449779" elapsed="0.000242"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:48:10.450977" 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-10-11T00:48:10.450264" elapsed="0.000766"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:48:10.451095" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:48:10.451274" 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-10-11T00:48:10.427715" elapsed="0.023593"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:10.451385" elapsed="0.000055"/>
</return>
<msg time="2026-10-11T00:48:10.451579" 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-10-11T00:48:10.361838" elapsed="0.089775"/>
</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-10-11T00:48:10.466227" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:10.465786" elapsed="0.000478"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:10.467212" 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-10-11T00:48:10.466947" elapsed="0.000349">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-10-11T00:48:10.467433" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:10.466503" elapsed="0.000964"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:10.468156" 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-10-11T00:48:10.467706" elapsed="0.000486"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:10.468597" 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-10-11T00:48:10.468777" 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-10-11T00:48:10.468440" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:10.469399" 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-10-11T00:48:10.469093" 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-10-11T00:48:10.469917" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:10.469564" elapsed="0.000444"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:10.470648" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:10.470279" elapsed="0.000393"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:10.470040" elapsed="0.000665"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:10.469539" elapsed="0.001186"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:10.471272" 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-10-11T00:48:10.470887" elapsed="0.000411"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:10.471341" 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-10-11T00:48:10.465069" elapsed="0.006387"/>
</kw>
<msg time="2026-10-11T00:48:10.471536" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:10.459151" elapsed="0.012436"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:10.475618" 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/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-10-11T00:48:10.479614" 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/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-10-11T00:48:10.483805" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:10.484005" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:10.484192" 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-10-11T00:48:10.484560" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:10.484398" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:10.484384" 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-10-11T00:48:10.484788" 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-10-11T00:48:10.484966" 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-10-11T00:48:10.485143" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:10.484357" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:10.484261" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:10.485367" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:10.485447" elapsed="0.000017"/>
</return>
<msg time="2026-10-11T00:48:10.485555" 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-10-11T00:48:10.458133" elapsed="0.027447"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:10.485745" elapsed="0.000325"/>
</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-10-11T00:48:10.486996" 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-10-11T00:48:10.486719" elapsed="0.000305"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:48:10.487489" 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-10-11T00:48:10.487212" 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-10-11T00:48:10.487700" elapsed="0.000285"/>
</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-10-11T00:48:10.486344" elapsed="0.001708"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:10.486141" elapsed="0.001941"/>
</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-10-11T00:48:10.488280" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:10.488105" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:10.486124" elapsed="0.002225"/>
</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-10-11T00:48:10.452961" elapsed="0.035431"/>
</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-10-11T00:48:10.452021" elapsed="0.036452"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:10.451717" elapsed="0.036796"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:10.451694" elapsed="0.036841"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:10.488564" elapsed="0.000026"/>
</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-10-11T00:48:10.359339" elapsed="0.129441"/>
</kw>
<arg>empty_topology</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="PASS" start="2026-10-11T00:48:10.352636" elapsed="0.136222"/>
</kw>
<msg time="2026-10-11T00:48:10.489026" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:10.489068" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:10.351088" elapsed="0.138001"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-10-11T00:48:10.489242" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:10.489154" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:10.489137" elapsed="0.000164"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:48:10.489851" 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-10-11T00:48:10.489465" elapsed="0.000411"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-10-11T00:48:10.490464" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-10-11T00:48:10.490045" elapsed="0.000477">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-10-11T00:48:10.349874" elapsed="0.140757">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" 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-10-11T00:48:11.529173" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:11.528457" elapsed="0.000777"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:11.530798" 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-10-11T00:48:11.530363" elapsed="0.000568">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-10-11T00:48:11.531144" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:11.529620" elapsed="0.001578"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:11.532331" 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-10-11T00:48:11.531611" elapsed="0.000777"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:11.533061" 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-10-11T00:48:11.533435" 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-10-11T00:48:11.532790" elapsed="0.000705"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:11.534364" 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-10-11T00:48:11.533931" elapsed="0.000513"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:11.535764" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:11.535439" elapsed="0.000384"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:48:11.536491" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:48:11.536087" elapsed="0.000442"/>
</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-10-11T00:48:11.536935" 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-10-11T00:48:11.537216" elapsed="0.000032"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:48:11.537494" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:48:11.536750" elapsed="0.000818"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:48:11.536593" elapsed="0.001013"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:48:11.537662" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:48:11.537846" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:48:11.534894" elapsed="0.002986"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:11.534536" elapsed="0.003384"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:11.538175" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:11.537951" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:11.534508" elapsed="0.003765"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:11.539192" 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-10-11T00:48:11.538510" elapsed="0.000719"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:11.539291" 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/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-10-11T00:48:11.527243" elapsed="0.012211"/>
</kw>
<msg time="2026-10-11T00:48:11.539523" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:11.517599" elapsed="0.021990"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:11.545401" elapsed="0.000051"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:11.551008" 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/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-10-11T00:48:11.556598" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:11.556894" 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-10-11T00:48:11.557169" 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-10-11T00:48:11.557668" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:11.557466" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:11.557446" elapsed="0.000323"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:11.558000" 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-10-11T00:48:11.558254" 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-10-11T00:48:11.558502" elapsed="0.000027"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:11.557390" elapsed="0.001181"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:11.557264" elapsed="0.001339"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:11.558813" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:11.558906" elapsed="0.000022"/>
</return>
<msg time="2026-10-11T00:48:11.559078" 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-10-11T00:48:11.516167" elapsed="0.042944"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:11.560674" 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-10-11T00:48:11.560389" elapsed="0.000367">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-10-11T00:48:11.560872" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:11.559924" elapsed="0.000980"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:11.561317" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:11.561012" elapsed="0.000377"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:11.562060" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:11.561675" elapsed="0.000420"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:11.561440" elapsed="0.000699"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:11.560968" elapsed="0.001197"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:11.562877" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:11.562393" elapsed="0.000518"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:48:11.562973" elapsed="0.000055"/>
</return>
<msg time="2026-10-11T00:48:11.563163" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:48:11.559507" elapsed="0.003687"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:11.564720" 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-10-11T00:48:11.564457" elapsed="0.000343">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-10-11T00:48:11.564916" 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-10-11T00:48:11.563976" elapsed="0.000972"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:48:11.565193" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-10-11T00:48:11.565056" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:11.565029" 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-10-11T00:48:11.565532" 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-10-11T00:48:11.565823" elapsed="0.000027"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:48:11.565906" elapsed="0.000020"/>
</return>
<msg time="2026-10-11T00:48:11.566100" 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-10-11T00:48:11.563562" elapsed="0.002570"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:11.567849" 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-10-11T00:48:11.567538" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:11.568511" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:11.568184" 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-10-11T00:48:11.578058" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:48:11.578230" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:48:11.578350" 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-10-11T00:48:11.568966" elapsed="0.009418"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:11.568651" elapsed="0.009817"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:11.578715" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:11.578503" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:11.568627" elapsed="0.010195"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:11.580601" 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-10-11T00:48:11.580126" elapsed="0.000537"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:11.579774" elapsed="0.000934"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:11.579749" elapsed="0.000989"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:11.581543" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:11.581152" elapsed="0.000450"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:11.580808" elapsed="0.000838"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:11.580786" elapsed="0.000890"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:11.582432" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:11.581915" elapsed="0.000553"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:11.582847" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:11.582558" elapsed="0.000362"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:11.583571" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:11.583186" elapsed="0.000419"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:11.582949" elapsed="0.000702"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:11.582534" elapsed="0.001143"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:11.584394" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:11.583914" elapsed="0.000534"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:11.584824" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:11.584536" elapsed="0.000360"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:11.585546" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:11.585163" elapsed="0.000416"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:11.584927" elapsed="0.000697"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:11.584513" elapsed="0.001138"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:11.585848" elapsed="0.000422"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:48:11.586879" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:11.586555" 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-10-11T00:48:11.587139" elapsed="0.000319"/>
</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-10-11T00:48:11.579283" elapsed="0.008253"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:11.587736" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:11.587623" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:11.587599" elapsed="0.000221"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:48:11.588704" 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-10-11T00:48:11.588030" elapsed="0.000712"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:48:11.588806" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:48:11.588996" 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-10-11T00:48:11.566540" elapsed="0.022492"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:11.589109" elapsed="0.000034"/>
</return>
<msg time="2026-10-11T00:48:11.589276" 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-10-11T00:48:11.500099" elapsed="0.089211"/>
</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-10-11T00:48:11.601996" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:11.601686" elapsed="0.000338"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:11.602686" 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-10-11T00:48:11.602510" elapsed="0.000234">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-10-11T00:48:11.602828" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:11.602181" elapsed="0.000670"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:11.603344" 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-10-11T00:48:11.603035" elapsed="0.000334"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:11.603658" 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-10-11T00:48:11.603774" 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-10-11T00:48:11.603549" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:11.604219" 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-10-11T00:48:11.604001" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:48:11.604585" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:11.604322" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:11.605115" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:11.604839" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:11.604661" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:11.604304" elapsed="0.000887"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:11.605735" 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-10-11T00:48:11.605352" elapsed="0.000410"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:11.605805" 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-10-11T00:48:11.601168" elapsed="0.004739"/>
</kw>
<msg time="2026-10-11T00:48:11.605954" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:11.596747" elapsed="0.009270"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:11.609994" 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/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-10-11T00:48:11.613958" 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//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-10-11T00:48:11.618069" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:11.618250" 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-10-11T00:48:11.618444" 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-10-11T00:48:11.618785" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:11.618641" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:11.618627" 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-10-11T00:48:11.619023" 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-10-11T00:48:11.619204" 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-10-11T00:48:11.619367" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:11.618601" elapsed="0.000827"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:11.618512" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:11.619604" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:11.619671" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:48:11.619775" 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-10-11T00:48:11.595735" elapsed="0.024096"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:11.620011" elapsed="0.000312"/>
</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-10-11T00:48:11.621229" 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-10-11T00:48:11.620971" elapsed="0.000284"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:48:11.621658" 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-10-11T00:48:11.621417" elapsed="0.000267"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:48:11.621865" elapsed="0.000293"/>
</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-10-11T00:48:11.620611" elapsed="0.001602"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:11.620394" elapsed="0.001849"/>
</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-10-11T00:48:11.622456" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:11.622266" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:11.620377" elapsed="0.002150"/>
</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-10-11T00:48:11.590661" elapsed="0.031909"/>
</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-10-11T00:48:11.589718" elapsed="0.032916"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:11.589431" elapsed="0.033242"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:11.589389" elapsed="0.033305"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:11.622724" elapsed="0.000026"/>
</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-10-11T00:48:11.498191" elapsed="0.124722"/>
</kw>
<arg>empty_topology</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="PASS" start="2026-10-11T00:48:11.493405" elapsed="0.129592"/>
</kw>
<msg time="2026-10-11T00:48:11.623147" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:11.623188" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:11.492268" elapsed="0.130941"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-10-11T00:48:11.623357" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:11.623272" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:11.623255" elapsed="0.000185"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:48:11.623964" 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-10-11T00:48:11.623580" elapsed="0.000420"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-10-11T00:48:11.624577" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-10-11T00:48:11.624157" elapsed="0.000475">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-10-11T00:48:11.491489" elapsed="0.133246">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" 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-10-11T00:48:12.665337" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:12.664625" elapsed="0.000773"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:12.667078" 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-10-11T00:48:12.666650" elapsed="0.000570">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-10-11T00:48:12.667443" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:12.665866" elapsed="0.001630"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:12.668632" 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-10-11T00:48:12.667884" elapsed="0.000805"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:12.669328" 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-10-11T00:48:12.669620" 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-10-11T00:48:12.669081" elapsed="0.000591"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:12.670649" 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-10-11T00:48:12.670121" elapsed="0.000622"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:12.672823" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:12.672278" elapsed="0.000637"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:48:12.673923" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:48:12.673331" elapsed="0.000673"/>
</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-10-11T00:48:12.674671" 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-10-11T00:48:12.675116" 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-10-11T00:48:12.675434" elapsed="0.000029"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:48:12.674350" elapsed="0.001160"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:48:12.674105" elapsed="0.001443"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:48:12.675602" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:48:12.675785" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:48:12.671495" elapsed="0.004322"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:12.670883" elapsed="0.004975"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:12.676109" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:12.675889" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:12.670841" elapsed="0.005366"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:12.676998" 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-10-11T00:48:12.676445" elapsed="0.000590"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:12.677096" 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/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-10-11T00:48:12.663448" elapsed="0.013791"/>
</kw>
<msg time="2026-10-11T00:48:12.677305" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:12.653826" elapsed="0.023544"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:12.683257" 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-10-11T00:48:12.688920" 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/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-10-11T00:48:12.694558" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:12.694810" 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-10-11T00:48:12.695079" 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-10-11T00:48:12.695572" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:12.695351" elapsed="0.000293"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:12.695332" elapsed="0.000343"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:12.695891" 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-10-11T00:48:12.696155" 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-10-11T00:48:12.696382" elapsed="0.000044"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:12.695296" elapsed="0.001173"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:12.695173" elapsed="0.001328"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:12.696709" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:12.696801" elapsed="0.000021"/>
</return>
<msg time="2026-10-11T00:48:12.696950" 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-10-11T00:48:12.652445" elapsed="0.044554"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:12.698750" 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-10-11T00:48:12.698484" elapsed="0.000350">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-10-11T00:48:12.698952" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:12.698003" elapsed="0.000996"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:12.699399" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:12.699089" elapsed="0.000404"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:12.700137" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:12.699756" elapsed="0.000415"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:12.699524" elapsed="0.000692"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:12.699065" elapsed="0.001179"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:12.700959" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:12.700488" elapsed="0.000520"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:48:12.701071" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:48:12.701253" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:48:12.697369" elapsed="0.003956"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:12.702440" 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-10-11T00:48:12.702237" elapsed="0.000263">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-10-11T00:48:12.702584" 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-10-11T00:48:12.701902" elapsed="0.000704"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:48:12.702770" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:48:12.702670" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:12.702653" elapsed="0.000194"/>
</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-10-11T00:48:12.703011" 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-10-11T00:48:12.703187" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:48:12.703249" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:48:12.703374" 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-10-11T00:48:12.701602" elapsed="0.001795"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:12.704628" 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-10-11T00:48:12.704390" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:12.705087" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:12.704860" elapsed="0.000267"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:48:12.712888" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:48:12.713021" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:48:12.713117" 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-10-11T00:48:12.705425" elapsed="0.007717"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:12.705186" elapsed="0.007995"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:12.713358" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:12.713205" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:12.705169" elapsed="0.008291"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:12.714718" 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-10-11T00:48:12.714375" elapsed="0.000387"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:12.714134" elapsed="0.000660"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:12.714116" elapsed="0.000702"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:12.715393" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:12.715120" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:12.714869" elapsed="0.000619"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:12.714854" elapsed="0.000656"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:12.716047" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:12.715685" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:12.716348" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:12.716137" elapsed="0.000263"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:12.716864" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:12.716602" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:12.716439" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:12.716119" elapsed="0.000865"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:12.717514" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:12.717160" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:12.717810" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:12.717602" elapsed="0.000260"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:12.718316" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:12.718056" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:12.717884" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:12.717585" elapsed="0.000808"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:12.718552" elapsed="0.000291"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:48:12.719241" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:12.719013" elapsed="0.000253"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:48:12.719433" elapsed="0.000215"/>
</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-10-11T00:48:12.713780" elapsed="0.005925"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:12.719851" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:12.719769" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:12.719751" elapsed="0.000162"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:48:12.720548" 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-10-11T00:48:12.720065" elapsed="0.000510"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:48:12.720621" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:48:12.720750" 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-10-11T00:48:12.703686" elapsed="0.017089"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:12.720830" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:48:12.720951" 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-10-11T00:48:12.636247" elapsed="0.084740"/>
</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-10-11T00:48:12.731466" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:12.731147" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:12.732163" 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-10-11T00:48:12.731984" elapsed="0.000238">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-10-11T00:48:12.732308" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:12.731652" elapsed="0.000679"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:12.732833" 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-10-11T00:48:12.732521" elapsed="0.000367"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:12.733182" 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-10-11T00:48:12.733298" 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-10-11T00:48:12.733071" elapsed="0.000252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:12.733757" 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-10-11T00:48:12.733532" elapsed="0.000267"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:48:12.734125" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:12.733862" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:12.734631" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:12.734351" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:12.734203" elapsed="0.000485"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:12.733844" elapsed="0.000864"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:12.735253" 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-10-11T00:48:12.734869" elapsed="0.000411"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:12.735324" 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-10-11T00:48:12.730629" elapsed="0.004813"/>
</kw>
<msg time="2026-10-11T00:48:12.735490" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:12.726354" elapsed="0.009183"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:12.739544" 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/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-10-11T00:48:12.743555" 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/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-10-11T00:48:12.747691" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:12.747873" 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-10-11T00:48:12.748068" 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-10-11T00:48:12.748437" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:12.748269" elapsed="0.000262"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:12.748254" 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-10-11T00:48:12.748718" 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-10-11T00:48:12.748901" 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-10-11T00:48:12.749079" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:12.748227" elapsed="0.000901"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:12.748136" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:12.749305" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:12.749373" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:48:12.749496" 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-10-11T00:48:12.725631" elapsed="0.023890"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:12.749687" elapsed="0.000326"/>
</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-10-11T00:48:12.750908" 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-10-11T00:48:12.750662" elapsed="0.000273"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:48:12.751334" 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-10-11T00:48:12.751097" elapsed="0.000263"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:48:12.751558" elapsed="0.000425"/>
</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-10-11T00:48:12.750284" elapsed="0.001756"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:12.750084" elapsed="0.001987"/>
</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-10-11T00:48:12.752268" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:12.752093" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:12.750066" elapsed="0.002272"/>
</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-10-11T00:48:12.721939" elapsed="0.030442"/>
</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-10-11T00:48:12.721267" elapsed="0.031198"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:12.721061" elapsed="0.031444"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:12.721045" elapsed="0.031481"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:12.752556" elapsed="0.000026"/>
</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-10-11T00:48:12.634464" elapsed="0.118288"/>
</kw>
<arg>empty_topology</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="PASS" start="2026-10-11T00:48:12.627543" elapsed="0.125279"/>
</kw>
<msg time="2026-10-11T00:48:12.752985" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:12.753028" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:12.626373" elapsed="0.126676"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-10-11T00:48:12.753196" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:12.753111" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:12.753095" elapsed="0.000195"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:48:12.753849" 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-10-11T00:48:12.753456" elapsed="0.000418"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-10-11T00:48:12.754466" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-10-11T00:48:12.754045" elapsed="0.000478">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-10-11T00:48:12.625594" elapsed="0.129028">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" 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-10-11T00:48:13.794339" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:13.793629" elapsed="0.000772"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:13.796063" 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-10-11T00:48:13.795586" elapsed="0.000615">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-10-11T00:48:13.796451" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:13.794792" elapsed="0.001715"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:13.797633" 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-10-11T00:48:13.796892" elapsed="0.000796"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:13.798330" 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-10-11T00:48:13.798622" 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-10-11T00:48:13.798083" elapsed="0.000593"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:13.799648" 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-10-11T00:48:13.799129" elapsed="0.000612"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:13.801223" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:13.800888" elapsed="0.000392"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:48:13.801896" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:48:13.801546" elapsed="0.000384"/>
</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-10-11T00:48:13.802360" 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-10-11T00:48:13.802641" elapsed="0.000032"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:48:13.802909" elapsed="0.000029"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:48:13.802175" elapsed="0.000819"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:48:13.802018" elapsed="0.001015"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:48:13.803088" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:48:13.803271" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:48:13.800390" elapsed="0.002914"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:13.799879" elapsed="0.003465"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:13.803603" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:13.803375" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:13.799837" elapsed="0.003863"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:13.804486" 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-10-11T00:48:13.803919" elapsed="0.000603"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:13.804582" 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/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-10-11T00:48:13.792454" elapsed="0.012267"/>
</kw>
<msg time="2026-10-11T00:48:13.804875" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:13.782730" elapsed="0.022215"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:13.810791" 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-10-11T00:48:13.816440" 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/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-10-11T00:48:13.822059" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:13.822312" 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-10-11T00:48:13.822587" 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-10-11T00:48:13.823109" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:13.822881" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:13.822859" elapsed="0.000352"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:13.823448" 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-10-11T00:48:13.823702" 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-10-11T00:48:13.823931" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:13.822804" elapsed="0.001209"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:13.822681" elapsed="0.001366"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:13.824255" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:13.824347" elapsed="0.000022"/>
</return>
<msg time="2026-10-11T00:48:13.824517" 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-10-11T00:48:13.781181" elapsed="0.043370"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:13.825904" 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-10-11T00:48:13.825715" elapsed="0.000262">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-10-11T00:48:13.826095" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:13.825366" 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-10-11T00:48:13.826421" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:13.826183" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:13.826931" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:13.826663" elapsed="0.000292"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:13.826497" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:13.826165" elapsed="0.000860"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:13.827547" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:13.827186" elapsed="0.000386"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:48:13.827617" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:48:13.827741" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:48:13.824921" elapsed="0.002842"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:13.828856" 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-10-11T00:48:13.828667" elapsed="0.000247">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-10-11T00:48:13.829015" 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-10-11T00:48:13.828327" elapsed="0.000711"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:48:13.829201" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:48:13.829102" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:13.829085" elapsed="0.000196"/>
</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-10-11T00:48:13.829457" 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-10-11T00:48:13.829635" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:48:13.829693" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:48:13.829816" 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-10-11T00:48:13.828027" elapsed="0.001813"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:13.831086" 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-10-11T00:48:13.830845" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:13.831551" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:13.831317" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:48:13.840014" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:48:13.840129" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:48:13.840216" 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-10-11T00:48:13.831876" elapsed="0.008369"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:13.831651" 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-10-11T00:48:13.840604" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:13.840348" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:13.831633" elapsed="0.009082"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:13.842485" 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-10-11T00:48:13.842007" elapsed="0.000584"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:13.841661" elapsed="0.000976"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:13.841636" elapsed="0.001033"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:13.843489" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:13.843095" elapsed="0.000453"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:13.842741" elapsed="0.000852"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:13.842719" elapsed="0.000904"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:13.844363" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:13.843866" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:13.844804" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:13.844511" elapsed="0.000367"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:13.845538" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:13.845148" elapsed="0.000424"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:13.844909" elapsed="0.000709"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:13.844486" elapsed="0.001158"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:13.846380" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:13.845885" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:13.846815" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:13.846525" elapsed="0.000363"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:13.847541" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:13.847156" elapsed="0.000423"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:13.846918" elapsed="0.000706"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:13.846501" elapsed="0.001150"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:13.847851" elapsed="0.000424"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:48:13.848833" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:13.848519" 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-10-11T00:48:13.849095" elapsed="0.000299"/>
</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-10-11T00:48:13.841171" elapsed="0.008323"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:13.849698" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:13.849582" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:13.849557" elapsed="0.000226"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:48:13.850657" 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-10-11T00:48:13.849993" elapsed="0.000703"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:48:13.850760" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:48:13.850939" 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-10-11T00:48:13.830133" elapsed="0.020856"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:13.851067" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T00:48:13.851238" 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-10-11T00:48:13.764077" elapsed="0.087196"/>
</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-10-11T00:48:13.866289" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:13.865849" elapsed="0.000477"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:13.867266" 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-10-11T00:48:13.867020" elapsed="0.000328">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-10-11T00:48:13.867486" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:13.866564" elapsed="0.000954"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:13.868199" 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-10-11T00:48:13.867759" elapsed="0.000476"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:13.868637" 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-10-11T00:48:13.868799" 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-10-11T00:48:13.868484" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:13.869438" 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-10-11T00:48:13.869116" 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-10-11T00:48:13.869929" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:13.869585" elapsed="0.000435"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:13.870641" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:13.870256" elapsed="0.000419"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:13.870051" elapsed="0.000669"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:13.869559" elapsed="0.001189"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:13.871550" 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-10-11T00:48:13.871019" elapsed="0.000568"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:13.871649" 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/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-10-11T00:48:13.865125" elapsed="0.006666"/>
</kw>
<msg time="2026-10-11T00:48:13.871856" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:13.858843" elapsed="0.013078"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:13.876945" 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-10-11T00:48:13.881008" 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/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-10-11T00:48:13.885152" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:13.885335" 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-10-11T00:48:13.885532" 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-10-11T00:48:13.885872" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:13.885727" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:13.885713" 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-10-11T00:48:13.886111" 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-10-11T00:48:13.886292" 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-10-11T00:48:13.886477" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:13.885687" elapsed="0.000840"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:13.885600" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:13.886700" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:13.886766" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:48:13.886872" 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-10-11T00:48:13.857770" elapsed="0.029127"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:13.887073" elapsed="0.000313"/>
</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-10-11T00:48:13.888295" 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-10-11T00:48:13.888048" elapsed="0.000274"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:48:13.888721" 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-10-11T00:48:13.888485" elapsed="0.000261"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:48:13.888927" elapsed="0.000285"/>
</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-10-11T00:48:13.887674" elapsed="0.001592"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:13.887474" elapsed="0.001822"/>
</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-10-11T00:48:13.889509" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:13.889319" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:13.887455" elapsed="0.002125"/>
</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-10-11T00:48:13.852633" elapsed="0.036990"/>
</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-10-11T00:48:13.851686" elapsed="0.038002"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:13.851377" elapsed="0.038384"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:13.851353" elapsed="0.038430"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:13.889814" elapsed="0.000027"/>
</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-10-11T00:48:13.762188" elapsed="0.127838"/>
</kw>
<arg>empty_topology</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="PASS" start="2026-10-11T00:48:13.757395" elapsed="0.132705"/>
</kw>
<msg time="2026-10-11T00:48:13.890250" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:13.890291" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:13.756254" elapsed="0.134058"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-10-11T00:48:13.890484" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:13.890375" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:13.890359" elapsed="0.000184"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:48:13.891101" 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-10-11T00:48:13.890681" elapsed="0.000445"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-10-11T00:48:13.891700" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-10-11T00:48:13.891282" elapsed="0.000474">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-10-11T00:48:13.755482" elapsed="0.136371">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" 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-10-11T00:48:14.931163" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:14.930437" elapsed="0.000793"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:14.932844" 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-10-11T00:48:14.932363" elapsed="0.000654">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-10-11T00:48:14.933221" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:14.931628" elapsed="0.001646"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:14.934451" 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-10-11T00:48:14.933689" elapsed="0.000822"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:14.935165" 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-10-11T00:48:14.935489" 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-10-11T00:48:14.934882" elapsed="0.000661"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:14.936457" 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-10-11T00:48:14.936004" elapsed="0.000512"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:14.937809" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:14.937489" elapsed="0.000378"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:48:14.938517" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:48:14.938141" elapsed="0.000410"/>
</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-10-11T00:48:14.938984" 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-10-11T00:48:14.939246" 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-10-11T00:48:14.939524" elapsed="0.000029"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:48:14.938786" elapsed="0.000812"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:48:14.938620" elapsed="0.001082"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:48:14.939769" elapsed="0.000047"/>
</return>
<msg time="2026-10-11T00:48:14.939983" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:48:14.936996" elapsed="0.003022"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:14.936616" elapsed="0.003443"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:14.940310" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:14.940092" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:14.936583" elapsed="0.003869"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:14.941285" 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-10-11T00:48:14.940715" elapsed="0.000614"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:14.941404" elapsed="0.000073"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:14.929237" elapsed="0.012356"/>
</kw>
<msg time="2026-10-11T00:48:14.941659" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:14.919625" elapsed="0.022099"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:14.947606" 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//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-10-11T00:48:14.953359" 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-10-11T00:48:14.958939" elapsed="0.000055"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:14.959230" 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-10-11T00:48:14.959503" 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-10-11T00:48:14.959997" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:14.959774" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:14.959755" elapsed="0.000344"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:14.960315" 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-10-11T00:48:14.960585" 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-10-11T00:48:14.960814" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:14.959720" elapsed="0.001161"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:14.959597" elapsed="0.001315"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:14.961136" elapsed="0.000027"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:14.961279" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:48:14.961493" 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-10-11T00:48:14.918200" elapsed="0.043336"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:14.962902" 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-10-11T00:48:14.962699" elapsed="0.000273">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-10-11T00:48:14.963056" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:14.962357" elapsed="0.000722"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:14.963364" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:14.963143" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:14.963903" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:14.963638" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:14.963455" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:14.963125" elapsed="0.000867"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:14.964509" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:14.964154" elapsed="0.000379"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:48:14.964578" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:48:14.964701" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:48:14.961941" elapsed="0.002783"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:14.965821" 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-10-11T00:48:14.965622" elapsed="0.000257">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-10-11T00:48:14.965974" 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-10-11T00:48:14.965287" elapsed="0.000710"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:48:14.966160" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:48:14.966061" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:14.966044" elapsed="0.000197"/>
</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-10-11T00:48:14.966400" elapsed="0.000036"/>
</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-10-11T00:48:14.966592" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:48:14.966650" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:48:14.966773" 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-10-11T00:48:14.964989" elapsed="0.001807"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:14.968033" 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-10-11T00:48:14.967799" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:14.968494" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:14.968264" elapsed="0.000270"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:48:14.978367" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:48:14.978659" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:48:14.978798" 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-10-11T00:48:14.968821" elapsed="0.010010"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:14.968593" elapsed="0.010294"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:14.979156" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:14.978920" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:14.968575" elapsed="0.010690"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:14.981167" 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-10-11T00:48:14.980688" elapsed="0.000541"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:14.980252" elapsed="0.001021"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:14.980226" elapsed="0.001079"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:14.982118" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:14.981729" elapsed="0.000447"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:14.981376" elapsed="0.000843"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:14.981354" elapsed="0.000896"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:14.983071" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:14.982563" elapsed="0.000544"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:14.983512" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:14.983195" elapsed="0.000395"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:14.984233" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:14.983848" elapsed="0.000419"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:14.983621" elapsed="0.000691"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:14.983171" elapsed="0.001168"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:14.985083" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:14.984598" elapsed="0.000520"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:14.985695" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:14.985206" elapsed="0.000570"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:14.986582" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:14.986071" elapsed="0.000555"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:14.985807" elapsed="0.000867"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:14.985182" elapsed="0.001520"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:14.986914" elapsed="0.000460"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:48:14.987951" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:14.987620" elapsed="0.000381"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:48:14.988213" elapsed="0.000339"/>
</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-10-11T00:48:14.979748" elapsed="0.008887"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:14.988845" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:14.988725" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:14.988700" elapsed="0.000234"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:48:14.989852" 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-10-11T00:48:14.989145" elapsed="0.000745"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:48:14.989954" elapsed="0.000057"/>
</return>
<msg time="2026-10-11T00:48:14.990153" 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-10-11T00:48:14.967092" elapsed="0.023148"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:14.990320" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T00:48:14.990514" 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-10-11T00:48:14.902119" elapsed="0.088430"/>
</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-10-11T00:48:15.005495" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:15.005045" elapsed="0.000487"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:15.006568" 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-10-11T00:48:15.006219" elapsed="0.000430">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-10-11T00:48:15.006740" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:15.005753" elapsed="0.001009"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:15.007264" 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-10-11T00:48:15.006938" elapsed="0.000352"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:15.007593" 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-10-11T00:48:15.007739" 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-10-11T00:48:15.007476" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:15.008198" 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-10-11T00:48:15.007973" elapsed="0.000268"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:48:15.008584" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:15.008308" elapsed="0.000330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:15.009100" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:15.008807" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:15.008661" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:15.008287" elapsed="0.000889"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:15.009732" 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-10-11T00:48:15.009338" elapsed="0.000420"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:15.009801" 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-10-11T00:48:15.004300" elapsed="0.005604"/>
</kw>
<msg time="2026-10-11T00:48:15.009953" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:14.998156" elapsed="0.011860"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:15.014110" 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/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-10-11T00:48:15.018157" 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/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-10-11T00:48:15.022193" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:15.022376" 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-10-11T00:48:15.022574" 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-10-11T00:48:15.022926" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:15.022780" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:15.022767" 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-10-11T00:48:15.023167" 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-10-11T00:48:15.023348" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:15.023527" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:15.022740" elapsed="0.000836"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:15.022646" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:15.023762" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:15.023828" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:48:15.023936" 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-10-11T00:48:14.997124" elapsed="0.026847"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:15.024138" elapsed="0.000329"/>
</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-10-11T00:48:15.025538" 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-10-11T00:48:15.025114" elapsed="0.000452"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:48:15.025975" 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-10-11T00:48:15.025718" 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-10-11T00:48:15.026220" elapsed="0.000302"/>
</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-10-11T00:48:15.024741" elapsed="0.001837"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:15.024539" elapsed="0.002069"/>
</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-10-11T00:48:15.026806" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:15.026631" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:15.024522" elapsed="0.002355"/>
</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-10-11T00:48:14.991926" elapsed="0.034994"/>
</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-10-11T00:48:14.990947" elapsed="0.036051"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:14.990653" elapsed="0.036385"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:14.990630" elapsed="0.036429"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:15.027090" elapsed="0.000027"/>
</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-10-11T00:48:14.900238" elapsed="0.127063"/>
</kw>
<arg>empty_topology</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="PASS" start="2026-10-11T00:48:14.895199" elapsed="0.132173"/>
</kw>
<msg time="2026-10-11T00:48:15.027552" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:15.027593" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:14.893983" elapsed="0.133631"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-10-11T00:48:15.027762" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:15.027677" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:15.027660" elapsed="0.000162"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:48:15.028363" 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-10-11T00:48:15.027974" elapsed="0.000412"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-10-11T00:48:15.028979" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-10-11T00:48:15.028562" elapsed="0.000488">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-10-11T00:48:14.893005" elapsed="0.136177">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" 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-10-11T00:48:16.068621" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:16.067863" elapsed="0.000825"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:16.070310" 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-10-11T00:48:16.069837" elapsed="0.000653">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-10-11T00:48:16.070684" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:16.069080" elapsed="0.001655"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:16.071877" 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-10-11T00:48:16.071145" elapsed="0.000789"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:16.072617" 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-10-11T00:48:16.072914" 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-10-11T00:48:16.072332" elapsed="0.000656"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:16.073984" 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-10-11T00:48:16.073460" elapsed="0.000783"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:16.075717" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:16.075362" elapsed="0.000413"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:48:16.076396" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:48:16.076039" elapsed="0.000417"/>
</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-10-11T00:48:16.076880" 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-10-11T00:48:16.077193" elapsed="0.000033"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:48:16.077485" elapsed="0.000030"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:48:16.076694" elapsed="0.000867"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:48:16.076526" elapsed="0.001076"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:48:16.077664" elapsed="0.000045"/>
</return>
<msg time="2026-10-11T00:48:16.077861" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:48:16.074856" elapsed="0.003038"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:16.074397" elapsed="0.003537"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:16.078205" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:16.077988" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:16.074357" elapsed="0.003944"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:16.079101" 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-10-11T00:48:16.078544" elapsed="0.000593"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:16.079197" 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/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-10-11T00:48:16.066671" elapsed="0.012728"/>
</kw>
<msg time="2026-10-11T00:48:16.079488" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:16.056607" elapsed="0.022950"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:16.085219" 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-10-11T00:48:16.090861" 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-10-11T00:48:16.096676" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:16.096933" elapsed="0.000045"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:16.097216" 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-10-11T00:48:16.097767" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:16.097560" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:16.097540" elapsed="0.000328"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:16.098116" 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-10-11T00:48:16.098372" 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-10-11T00:48:16.098624" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:16.097502" elapsed="0.001189"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:16.097354" elapsed="0.001369"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:16.098935" elapsed="0.000038"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:16.099041" elapsed="0.000022"/>
</return>
<msg time="2026-10-11T00:48:16.099192" 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-10-11T00:48:16.055187" elapsed="0.044039"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:16.100667" 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-10-11T00:48:16.100475" elapsed="0.000251">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-10-11T00:48:16.100809" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:16.100058" 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-10-11T00:48:16.101127" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:16.100895" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:16.101661" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:16.101382" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:16.101201" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:16.100878" elapsed="0.000858"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:16.102245" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:16.101896" elapsed="0.000372"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:48:16.102312" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:48:16.102451" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:48:16.099623" elapsed="0.002853"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:16.103561" 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-10-11T00:48:16.103359" elapsed="0.000260">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-10-11T00:48:16.103703" 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-10-11T00:48:16.103035" elapsed="0.000690"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:48:16.103887" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:48:16.103788" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:16.103771" elapsed="0.000211"/>
</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-10-11T00:48:16.104138" elapsed="0.000020"/>
</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-10-11T00:48:16.104314" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:48:16.104405" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T00:48:16.104548" 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-10-11T00:48:16.102727" elapsed="0.001844"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:16.105923" 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-10-11T00:48:16.105700" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:16.106389" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:16.106168" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:48:16.114718" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:48:16.114882" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:48:16.114988" 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-10-11T00:48:16.106738" elapsed="0.008287"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:16.106504" elapsed="0.008561"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:16.115242" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:16.115089" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:16.106487" elapsed="0.008833"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:16.116764" 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-10-11T00:48:16.116433" elapsed="0.000376"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:16.116173" elapsed="0.000668"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:16.116155" elapsed="0.000709"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:16.117449" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:16.117168" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:16.116914" elapsed="0.000610"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:16.116898" elapsed="0.000649"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:16.118108" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:16.117723" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:16.118428" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:16.118197" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:16.118934" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:16.118668" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:16.118505" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:16.118180" elapsed="0.000848"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:16.119557" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:16.119201" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:16.119854" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:16.119645" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:16.120365" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:16.120102" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:16.119928" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:16.119628" elapsed="0.000831"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:16.120605" elapsed="0.000293"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:48:16.121321" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:16.121073" elapsed="0.000276"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:48:16.121550" elapsed="0.000219"/>
</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-10-11T00:48:16.115820" elapsed="0.006004"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:16.121983" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:16.121887" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:16.121870" elapsed="0.000176"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:48:16.122687" 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-10-11T00:48:16.122186" elapsed="0.000528"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:48:16.122760" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:48:16.122886" 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-10-11T00:48:16.104851" elapsed="0.018060"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:16.122978" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:48:16.123101" 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-10-11T00:48:16.038991" elapsed="0.084134"/>
</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-10-11T00:48:16.133425" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:16.133112" elapsed="0.000340"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:16.134110" 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-10-11T00:48:16.133924" elapsed="0.000245">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-10-11T00:48:16.134252" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:16.133608" elapsed="0.000666"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:16.134767" 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-10-11T00:48:16.134460" elapsed="0.000332"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:16.135087" 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-10-11T00:48:16.135203" 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-10-11T00:48:16.134970" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:16.135653" 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-10-11T00:48:16.135434" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:48:16.136032" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:16.135755" elapsed="0.000342"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:16.136609" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:16.136309" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:16.136125" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:16.135737" elapsed="0.000977"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:16.137269" 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-10-11T00:48:16.136880" elapsed="0.000415"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:16.137339" 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-10-11T00:48:16.132605" elapsed="0.004852"/>
</kw>
<msg time="2026-10-11T00:48:16.137505" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:16.128424" elapsed="0.009129"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:16.141561" 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/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-10-11T00:48:16.145531" 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/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-10-11T00:48:16.149640" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:16.149823" 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-10-11T00:48:16.150017" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:16.150360" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:16.150216" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:16.150202" 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-10-11T00:48:16.150603" 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-10-11T00:48:16.150782" 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-10-11T00:48:16.150943" elapsed="0.000030"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:16.150175" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:16.150086" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:16.151177" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:16.151244" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:48:16.151349" 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-10-11T00:48:16.127700" elapsed="0.023674"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:16.151591" elapsed="0.000313"/>
</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-10-11T00:48:16.152814" 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-10-11T00:48:16.152567" elapsed="0.000273"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:48:16.153238" 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-10-11T00:48:16.153000" elapsed="0.000264"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:48:16.153464" elapsed="0.000280"/>
</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-10-11T00:48:16.152189" elapsed="0.001610"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:16.151987" elapsed="0.001842"/>
</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-10-11T00:48:16.154036" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:16.153852" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:16.151969" elapsed="0.002137"/>
</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-10-11T00:48:16.124079" elapsed="0.030070"/>
</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-10-11T00:48:16.123401" elapsed="0.030813"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:16.123197" elapsed="0.031056"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:16.123181" elapsed="0.031093"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:16.154303" elapsed="0.000027"/>
</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-10-11T00:48:16.037079" elapsed="0.117438"/>
</kw>
<arg>empty_topology</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="PASS" start="2026-10-11T00:48:16.032490" elapsed="0.122098"/>
</kw>
<msg time="2026-10-11T00:48:16.154736" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:16.154777" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:16.031258" elapsed="0.123541"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-10-11T00:48:16.154958" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:16.154862" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:16.154846" elapsed="0.000173"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:48:16.155558" 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-10-11T00:48:16.155156" elapsed="0.000426"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-10-11T00:48:16.156162" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-10-11T00:48:16.155739" elapsed="0.000479">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-10-11T00:48:16.030273" elapsed="0.126048">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" 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-10-11T00:48:17.196499" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:17.195708" elapsed="0.000858"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:17.198319" 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-10-11T00:48:17.197836" elapsed="0.000778">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-10-11T00:48:17.198813" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:17.196933" elapsed="0.001931"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:17.199790" 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-10-11T00:48:17.199298" elapsed="0.000528"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:17.200253" 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-10-11T00:48:17.200465" 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-10-11T00:48:17.200089" elapsed="0.000412"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:17.201137" 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-10-11T00:48:17.200773" elapsed="0.000422"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:17.202650" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:17.202255" elapsed="0.000452"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:48:17.203338" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:48:17.202979" elapsed="0.000393"/>
</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-10-11T00:48:17.203814" 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-10-11T00:48:17.204096" elapsed="0.000032"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:48:17.204356" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:48:17.203628" elapsed="0.000821"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:48:17.203461" elapsed="0.001029"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:48:17.204553" elapsed="0.000045"/>
</return>
<msg time="2026-10-11T00:48:17.204746" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:48:17.201681" elapsed="0.003097"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:17.201294" elapsed="0.003524"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:17.205083" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:17.204852" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:17.201263" elapsed="0.003919"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:17.205997" 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-10-11T00:48:17.205439" elapsed="0.000594"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:17.206094" 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/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-10-11T00:48:17.194522" elapsed="0.011710"/>
</kw>
<msg time="2026-10-11T00:48:17.206299" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:17.184497" elapsed="0.021868"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:17.212376" 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/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-10-11T00:48:17.218025" 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/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-10-11T00:48:17.223930" elapsed="0.000049"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:17.224200" 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-10-11T00:48:17.224472" 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-10-11T00:48:17.224968" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:17.224744" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:17.224726" elapsed="0.000344"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:17.225285" 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-10-11T00:48:17.225496" 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-10-11T00:48:17.225665" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:17.224690" elapsed="0.001022"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:17.224568" elapsed="0.001167"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:17.225882" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:17.225962" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:48:17.226071" 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-10-11T00:48:17.183056" elapsed="0.043039"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:17.227220" 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-10-11T00:48:17.227028" elapsed="0.000252">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-10-11T00:48:17.227368" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:17.226677" elapsed="0.000713"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:17.227692" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:17.227471" elapsed="0.000271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:17.228223" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:17.227958" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:17.227765" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:17.227453" elapsed="0.000845"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:17.228809" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:17.228473" elapsed="0.000359"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:48:17.228877" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:48:17.229027" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:48:17.226362" elapsed="0.002692"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:17.230193" 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-10-11T00:48:17.230004" elapsed="0.000246">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-10-11T00:48:17.230336" 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-10-11T00:48:17.229664" elapsed="0.000698"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:48:17.230540" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:48:17.230440" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:17.230421" elapsed="0.000195"/>
</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-10-11T00:48:17.230771" elapsed="0.000020"/>
</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-10-11T00:48:17.230959" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:48:17.231019" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:48:17.231143" 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-10-11T00:48:17.229348" elapsed="0.001818"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:17.232396" 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-10-11T00:48:17.232174" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:17.232856" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:17.232642" elapsed="0.000254"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:48:17.241618" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:48:17.241778" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:48:17.241870" 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-10-11T00:48:17.233200" elapsed="0.008694"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:17.232969" elapsed="0.008964"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:17.242137" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:17.241977" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:17.232938" elapsed="0.009276"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:17.243509" 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-10-11T00:48:17.243158" elapsed="0.000395"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:17.242892" elapsed="0.000693"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:17.242874" elapsed="0.000733"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:17.244185" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:17.243897" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:17.243657" elapsed="0.000600"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:17.243642" elapsed="0.000636"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:17.244837" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:17.244467" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:17.245172" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:17.244925" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:17.245683" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:17.245420" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:17.245247" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:17.244908" elapsed="0.000851"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:17.246349" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:17.245990" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:17.246691" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:17.246462" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:17.247202" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:17.246924" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:17.246767" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:17.246444" elapsed="0.000833"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:17.247437" elapsed="0.000293"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:48:17.248181" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:17.247891" 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-10-11T00:48:17.248361" elapsed="0.000235"/>
</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-10-11T00:48:17.242558" elapsed="0.006095"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:17.248798" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:17.248716" elapsed="0.000121"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:17.248698" elapsed="0.000159"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:48:17.249546" 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-10-11T00:48:17.249018" elapsed="0.000555"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:48:17.249619" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:48:17.249746" 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-10-11T00:48:17.231467" elapsed="0.018303"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:17.249824" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:48:17.249957" 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-10-11T00:48:17.166690" elapsed="0.083293"/>
</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-10-11T00:48:17.260547" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:17.260230" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:17.261237" 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-10-11T00:48:17.261061" elapsed="0.000235">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-10-11T00:48:17.261379" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:17.260731" elapsed="0.000670"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:17.261901" 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-10-11T00:48:17.261593" elapsed="0.000333"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:17.262261" 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-10-11T00:48:17.262383" 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-10-11T00:48:17.262115" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:17.262835" 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-10-11T00:48:17.262615" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:48:17.263226" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:17.262938" elapsed="0.000342"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:17.263733" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:17.263463" elapsed="0.000294"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:17.263302" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:17.262920" elapsed="0.000888"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:17.264346" 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-10-11T00:48:17.263979" elapsed="0.000393"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:17.264430" 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-10-11T00:48:17.259718" elapsed="0.004815"/>
</kw>
<msg time="2026-10-11T00:48:17.264580" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:17.255384" elapsed="0.009243"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:17.268616" 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/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-10-11T00:48:17.272728" 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/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-10-11T00:48:17.278185" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:17.278416" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:17.278605" 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-10-11T00:48:17.278979" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:17.278816" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:17.278801" 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-10-11T00:48:17.279210" 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-10-11T00:48:17.279448" 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-10-11T00:48:17.279618" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:17.278771" elapsed="0.000896"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:17.278675" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:17.279844" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:17.279914" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:48:17.280056" 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-10-11T00:48:17.254635" elapsed="0.025447"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:17.280251" elapsed="0.000373"/>
</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-10-11T00:48:17.281570" 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-10-11T00:48:17.281291" elapsed="0.000306"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:48:17.282008" 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-10-11T00:48:17.281745" elapsed="0.000289"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:48:17.282216" elapsed="0.000306"/>
</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-10-11T00:48:17.280907" elapsed="0.001670"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:17.280696" elapsed="0.001912"/>
</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-10-11T00:48:17.282806" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:17.282630" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:17.280678" elapsed="0.002198"/>
</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-10-11T00:48:17.250966" elapsed="0.031953"/>
</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-10-11T00:48:17.250275" elapsed="0.032727"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:17.250066" elapsed="0.032975"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:17.250048" elapsed="0.033014"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:17.283093" 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-10-11T00:48:17.164842" elapsed="0.118464"/>
</kw>
<arg>empty_topology</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="PASS" start="2026-10-11T00:48:17.159892" elapsed="0.123485"/>
</kw>
<msg time="2026-10-11T00:48:17.283557" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:17.283598" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:17.158673" elapsed="0.124947"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-10-11T00:48:17.283769" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:17.283683" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:17.283667" elapsed="0.000161"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:48:17.284386" 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-10-11T00:48:17.283987" elapsed="0.000439"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-10-11T00:48:17.285082" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-10-11T00:48:17.284634" elapsed="0.000510">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-10-11T00:48:17.157618" elapsed="0.127627">None</status>
</kw>
<kw name="Invert_Failure" owner="WaitForFailure">
<kw name="Run Keyword And Ignore Error" 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-10-11T00:48:18.325817" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:18.325063" elapsed="0.000822"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:18.327719" 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-10-11T00:48:18.327230" elapsed="0.000639">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-10-11T00:48:18.328134" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:18.326373" elapsed="0.001827"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.329480" 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-10-11T00:48:18.328670" elapsed="0.000869"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:18.330248" 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-10-11T00:48:18.330513" 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-10-11T00:48:18.329916" elapsed="0.000631"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.331209" 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-10-11T00:48:18.330842" 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-10-11T00:48:18.332700" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:18.332344" elapsed="0.000414"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.333447" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:48:18.333051" elapsed="0.000431"/>
</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-10-11T00:48:18.333906" 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-10-11T00:48:18.334187" 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-10-11T00:48:18.334467" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:48:18.333719" elapsed="0.000822"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.333552" elapsed="0.001032"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:48:18.334647" elapsed="0.000045"/>
</return>
<msg time="2026-10-11T00:48:18.334843" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:48:18.331764" elapsed="0.003111"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:18.331370" elapsed="0.003546"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.335171" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.334963" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.331337" elapsed="0.003930"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.336079" 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-10-11T00:48:18.335508" elapsed="0.000607"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:18.336175" 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/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-10-11T00:48:18.323684" elapsed="0.012631"/>
</kw>
<msg time="2026-10-11T00:48:18.336470" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:18.313679" elapsed="0.022863"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:18.342584" 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-10-11T00:48:18.348380" elapsed="0.000054"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${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-10-11T00:48:18.354176" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.354455" 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-10-11T00:48:18.354714" 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-10-11T00:48:18.355235" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.355018" elapsed="0.000288"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:18.354994" elapsed="0.000342"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.355576" 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-10-11T00:48:18.355831" 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-10-11T00:48:18.356119" elapsed="0.000035"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:18.354949" elapsed="0.001258"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.354809" elapsed="0.001438"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.356476" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.356547" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:48:18.356657" 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-10-11T00:48:18.312249" elapsed="0.044432"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:18.357835" 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-10-11T00:48:18.357644" elapsed="0.000251">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-10-11T00:48:18.357999" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:18.357300" elapsed="0.000722"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.358341" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.358086" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.358884" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:18.358617" elapsed="0.000292"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:18.358433" elapsed="0.000589"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.358069" elapsed="0.000974"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.359559" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:18.359208" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:48:18.359628" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:48:18.359753" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:48:18.356971" elapsed="0.002804"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:18.360927" 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-10-11T00:48:18.360740" elapsed="0.000272">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-10-11T00:48:18.361113" 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-10-11T00:48:18.360418" elapsed="0.000717"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:48:18.361300" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:48:18.361200" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.361182" elapsed="0.000196"/>
</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-10-11T00:48:18.361551" 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-10-11T00:48:18.361728" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.361786" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:48:18.361909" 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-10-11T00:48:18.360068" elapsed="0.001877"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.363217" 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-10-11T00:48:18.362990" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.363681" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:18.363463" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:48:18.372295" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:48:18.372479" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:48:18.372592" 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-10-11T00:48:18.364028" elapsed="0.008589"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:18.363782" elapsed="0.008875"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.372836" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.372681" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.363763" elapsed="0.009151"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.374223" 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-10-11T00:48:18.373876" elapsed="0.000390"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:18.373634" elapsed="0.000664"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.373616" elapsed="0.000705"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.374892" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:18.374625" elapsed="0.000359"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:18.374371" elapsed="0.000648"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.374355" elapsed="0.000687"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.375606" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:18.375219" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.375907" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.375695" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.376446" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:18.376161" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:18.375998" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.375678" elapsed="0.000846"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.377053" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:18.376698" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.377348" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.377140" elapsed="0.000259"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.377858" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:18.377598" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:18.377437" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.377123" elapsed="0.000824"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:18.378108" elapsed="0.000312"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:48:18.378837" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:18.378586" elapsed="0.000275"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:48:18.379042" elapsed="0.000220"/>
</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-10-11T00:48:18.373274" elapsed="0.006044"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.379479" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:18.379380" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.379362" elapsed="0.000178"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:48:18.380207" 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-10-11T00:48:18.379681" elapsed="0.000553"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:48:18.380281" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:48:18.380434" 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-10-11T00:48:18.362258" elapsed="0.018202"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:18.380516" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:48:18.380640" 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-10-11T00:48:18.295792" elapsed="0.084872"/>
</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-10-11T00:48:18.391190" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:18.390876" elapsed="0.000340"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:18.391968" 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-10-11T00:48:18.391773" elapsed="0.000266">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-10-11T00:48:18.392126" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:18.391450" elapsed="0.000698"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.392650" 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-10-11T00:48:18.392322" elapsed="0.000353"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:18.392965" 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-10-11T00:48:18.393122" 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-10-11T00:48:18.392842" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.393582" 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-10-11T00:48:18.393342" 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-10-11T00:48:18.393957" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.393687" elapsed="0.000336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.394547" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:18.394237" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:18.394052" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.393669" elapsed="0.000956"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.395179" 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-10-11T00:48:18.394788" elapsed="0.000418"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:18.395250" 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-10-11T00:48:18.390357" elapsed="0.004993"/>
</kw>
<msg time="2026-10-11T00:48:18.395397" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:18.386106" elapsed="0.009355"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:18.399695" 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-10-11T00:48:18.403728" 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/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-10-11T00:48:18.407854" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.408088" 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-10-11T00:48:18.408273" 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-10-11T00:48:18.408646" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.408495" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:18.408482" 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-10-11T00:48:18.408875" 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-10-11T00:48:18.409119" 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-10-11T00:48:18.409332" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:18.408453" elapsed="0.000935"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.408340" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.409581" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.409649" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:48:18.409757" 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-10-11T00:48:18.385369" elapsed="0.024413"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:18.409966" elapsed="0.000321"/>
</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-10-11T00:48:18.411206" 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-10-11T00:48:18.410956" elapsed="0.000276"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:48:18.411647" 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-10-11T00:48:18.411386" elapsed="0.000287"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:48:18.411858" elapsed="0.000298"/>
</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-10-11T00:48:18.410580" elapsed="0.001630"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:18.410358" elapsed="0.001882"/>
</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-10-11T00:48:18.412459" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.412263" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.410341" elapsed="0.002189"/>
</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-10-11T00:48:18.381674" elapsed="0.030899"/>
</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-10-11T00:48:18.380984" elapsed="0.031653"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:18.380740" elapsed="0.031937"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.380723" elapsed="0.031975"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:18.412728" elapsed="0.000026"/>
</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-10-11T00:48:18.293928" elapsed="0.119018"/>
</kw>
<arg>empty_topology</arg>
<doc>Get current example-ipv4-topology as json, and compare it to expected result.</doc>
<status status="PASS" start="2026-10-11T00:48:18.288399" elapsed="0.124657"/>
</kw>
<msg time="2026-10-11T00:48:18.413219" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:18.413260" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:18.287184" elapsed="0.126097"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.413461" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:18.413345" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.413328" elapsed="0.000194"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.414065" 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-10-11T00:48:18.413661" elapsed="0.000428"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.414698" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-10-11T00:48:18.414248" elapsed="0.000507">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-10-11T00:48:18.286233" elapsed="0.128630">None</status>
</kw>
<msg time="2026-10-11T00:48:18.414961" 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-10-11T00:48:08.117711" elapsed="10.297341">Keyword 'Invert_Failure' failed after retrying for 10 seconds. The last error was: None</status>
</kw>
<msg time="2026-10-11T00:48:18.415103" 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-10-11T00:48:08.117330" elapsed="10.297818"/>
</kw>
<arg>10s</arg>
<arg>1s</arg>
<arg>Compare_Topology</arg>
<arg>empty_topology</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-10-11T00:48:08.116998" elapsed="10.298243">Keyword 'Invert_Failure' failed after retrying for 10 seconds. The last error was: None</status>
</kw>
<msg time="2026-10-11T00:48:18.415341" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T00:48:18.415381" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:08.116640" elapsed="10.298785"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-11T00:48:18.415584" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-11T00:48:18.415495" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.415477" elapsed="0.000182"/>
</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-10-11T00:48:18.415801" elapsed="0.000020"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.415983" 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-10-11T00:48:08.116282" elapsed="10.299799"/>
</kw>
<msg time="2026-10-11T00:48:18.416127" 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-10-11T00:48:08.115692" elapsed="10.300480"/>
</kw>
<arg>${timeout}</arg>
<arg>${refresh}</arg>
<arg>Compare_Topology</arg>
<arg>${folder_name}</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-10-11T00:48:08.115279" elapsed="10.300966"/>
</kw>
<arg>empty_topology</arg>
<doc>Verify that Compare_Topology keeps passing, it will hold its last result.</doc>
<status status="PASS" start="2026-10-11T00:48:08.114914" elapsed="10.301388"/>
</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-10-11T00:48:18.416883" elapsed="0.000243"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:48:18.416586" elapsed="0.000597"/>
</kw>
<doc>Sanity check example-ipv4-topology is still empty.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:48:08.012468" elapsed="10.404750"/>
</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">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.419722" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.419507" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.419488" 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-10-11T00:48:18.419276" 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-10-11T00:48:18.420769" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:18.420686" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.420669" elapsed="0.000162"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.423135" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:18.423035" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.423014" elapsed="0.000184"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.424122" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:18.423781" elapsed="0.000366"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.424585" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:48:18.424300" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:48:18.424650" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:48:18.424776" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:48:18.423421" elapsed="0.001378"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.427323" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:18.427232" elapsed="0.000134"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.427214" elapsed="0.000175"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.428463" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:18.428356" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.428339" elapsed="0.000187"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:48:18.428844" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:48:18.428675" elapsed="0.000194"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:48:18.429196" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:48:18.429050" elapsed="0.000169"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:48:18.469619" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:48:18.429728" elapsed="0.039991"/>
</kw>
<msg time="2026-10-11T00:48:18.469875" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:48:18.469916" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:18.429376" elapsed="0.040594"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:48:18.502098" 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 "_ "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-10-11T00:48:18.470510" elapsed="0.031690"/>
</kw>
<msg time="2026-10-11T00:48:18.502347" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:48:18.502387" 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 "_ "I "n "i "t "i "a "t "e "_ "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:18.470148" elapsed="0.032297"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.502723" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.502516" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.502498" elapsed="0.000295"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.503227" 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 "_ "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-10-11T00:48:18.502996" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.503571" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.503351" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.503334" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:48:18.503671" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:48:18.506260" elapsed="0.000117"/>
</kw>
<msg time="2026-10-11T00:48:18.506450" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:18.505059" elapsed="0.001555"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.506919" elapsed="0.000090"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.507272" 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-10-11T00:48:18.504454" 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-10-11T00:48:18.503965" elapsed="0.003574"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:48:18.428100" elapsed="0.079517"/>
</kw>
<msg time="2026-10-11T00:48:18.507699" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:18.507739" 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 "_ "I "n "i "t "i "a "t "e "_ "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:18.427558" elapsed="0.080215"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:48:18.507927" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-10-11T00:48:18.507842" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.507824" elapsed="0.000191"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.508342" elapsed="0.000022"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.508682" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.508747" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:48:18.426924" elapsed="0.081907"/>
</kw>
<msg time="2026-10-11T00:48:18.508913" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:18.508974" 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 "_ "I "n "i "t "i "a "t "e "_ "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:18.425156" elapsed="0.083862"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.509310" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.509086" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.509070" elapsed="0.000310"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:48:18.425009" elapsed="0.084392"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:48:18.424845" elapsed="0.084609"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:48:18.422710" elapsed="0.086792"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:48:18.420433" elapsed="0.089119"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:18.420014" elapsed="0.089588"/>
</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-10-11T00:48:18.418892" elapsed="0.090764"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.510560" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.171.7 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=true | BGP_RIB=example-bgp-rib | PASSIVE_MODE=false | BGP_RIB_OPENCONFIG=exampl...</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=true</arg>
<arg>BGP_RIB=${RIB_NAME}</arg>
<arg>PASSIVE_MODE=false</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-10-11T00:48:18.509856" elapsed="0.000734"/>
</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-10-11T00:48:18.521108" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:18.520758" elapsed="0.000383"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:18.521844" 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-10-11T00:48:18.521662" elapsed="0.000248">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-10-11T00:48:18.522056" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:18.521321" elapsed="0.000758"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.522590" 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-10-11T00:48:18.522253" elapsed="0.000363"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:18.522951" 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-10-11T00:48:18.523123" 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-10-11T00:48:18.522815" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.523609" 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-10-11T00:48:18.523364" 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-10-11T00:48:18.524909" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'true', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'false', '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-10-11T00:48:18.524463" elapsed="0.000513"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.525495" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:48:18.525206" elapsed="0.000313"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.526149" 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-10-11T00:48:18.525861" elapsed="0.000312"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:48:18.526868" 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-10-11T00:48:18.526672" elapsed="0.000219"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:48:18.526950" elapsed="0.000034"/>
</return>
<msg time="2026-10-11T00:48:18.527086" 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-10-11T00:48:18.526346" elapsed="0.000763"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:48:18.527276" elapsed="0.000203"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:48:18.525726" elapsed="0.001790"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.528050" 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-10-11T00:48:18.527745" elapsed="0.000336"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:48:18.528761" 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-10-11T00:48:18.528584" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:48:18.528828" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:48:18.528970" 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-10-11T00:48:18.528261" elapsed="0.000742"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:48:18.529168" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-10-11T00:48:18.527617" elapsed="0.001752"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.529872" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:48:18.529608" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:48:18.530601" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:48:18.530404" elapsed="0.000221"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:48:18.530668" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:48:18.530792" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:48:18.530094" elapsed="0.000720"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:48:18.531001" elapsed="0.000168"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:48:18.529481" elapsed="0.001765"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.531766" 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-10-11T00:48:18.531496" elapsed="0.000294"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:48:18.532549" 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-10-11T00:48:18.532347" elapsed="0.000227"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:48:18.532618" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:48:18.532741" 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-10-11T00:48:18.531981" 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-10-11T00:48:18.532925" elapsed="0.000222"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:48:18.531349" elapsed="0.001836"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.533701" 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-10-11T00:48:18.533427" elapsed="0.000298"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:48:18.534396" 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-10-11T00:48:18.534220" elapsed="0.000214"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:48:18.534479" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:48:18.534601" 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-10-11T00:48:18.533894" elapsed="0.000729"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:48:18.534788" elapsed="0.000344"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:48:18.533284" elapsed="0.001887"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.535682" 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-10-11T00:48:18.535399" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:48:18.536570" 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-10-11T00:48:18.536365" elapsed="0.000229"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:48:18.536638" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:48:18.536760" 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-10-11T00:48:18.535872" elapsed="0.000910"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:48:18.536976" elapsed="0.000190"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:48:18.535270" elapsed="0.001975"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.537761" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:48:18.537492" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:48:18.538493" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:48:18.538296" elapsed="0.000221"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:48:18.538560" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:48:18.538683" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:48:18.537990" elapsed="0.000715"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:48:18.538866" elapsed="0.000203"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:48:18.537348" elapsed="0.001766"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.539626" 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-10-11T00:48:18.539342" elapsed="0.000308"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:48:18.540398" 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-10-11T00:48:18.540203" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:48:18.540482" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:48:18.540606" 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-10-11T00:48:18.539818" 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-10-11T00:48:18.540790" elapsed="0.000186"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:48:18.539213" elapsed="0.001802"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.541569" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:48:18.541278" elapsed="0.000315"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:48:18.542308" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:48:18.542123" elapsed="0.000209"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:48:18.542376" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:48:18.542516" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:48:18.541763" 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-10-11T00:48:18.542701" elapsed="0.000163"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:48:18.541147" elapsed="0.001754"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:48:18.525568" elapsed="0.017380"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:48:18.543000" elapsed="0.000033"/>
</return>
<msg time="2026-10-11T00:48:18.543149" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'true', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'fa...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:48:18.524030" elapsed="0.019144"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:18.523716" elapsed="0.019486"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.543376" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.543226" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.523697" elapsed="0.019763"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.544307" 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-10-11T00:48:18.543621" elapsed="0.000712"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:18.544377" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:18.520240" elapsed="0.024252"/>
</kw>
<msg time="2026-10-11T00:48:18.544541" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:18.515881" elapsed="0.028706"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:18.548961" 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-10-11T00:48:18.553074" 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/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-10-11T00:48:18.557477" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.557693" 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-10-11T00:48:18.557874" 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-10-11T00:48:18.558317" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.558168" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:18.558154" 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-10-11T00:48:18.558567" 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-10-11T00:48:18.558746" elapsed="0.000017"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.558907" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:18.558127" elapsed="0.000851"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.558011" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.559160" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.559227" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:48:18.559339" 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-10-11T00:48:18.515274" elapsed="0.044089"/>
</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-10-11T00:48:18.568465" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:18.568145" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:18.569174" 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-10-11T00:48:18.568987" elapsed="0.000253">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-10-11T00:48:18.569323" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:18.568649" elapsed="0.000696"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.569845" 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-10-11T00:48:18.569538" elapsed="0.000332"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:18.570194" 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-10-11T00:48:18.570311" 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-10-11T00:48:18.570074" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.570763" 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-10-11T00:48:18.570544" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:48:18.571190" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.570877" elapsed="0.000400"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.571736" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'true', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 'fa...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:18.571467" elapsed="0.000294"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:18.571302" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.570860" elapsed="0.000953"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.572720" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflecto...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:18.572004" elapsed="0.000744"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:18.572792" 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-10-11T00:48:18.567601" elapsed="0.005292"/>
</kw>
<msg time="2026-10-11T00:48:18.572964" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:18.563132" elapsed="0.009884"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:18.577192" 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/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-10-11T00:48:18.581199" 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/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-10-11T00:48:18.585202" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.585382" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.585577" 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-10-11T00:48:18.585908" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.585766" elapsed="0.000242"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:18.585753" 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-10-11T00:48:18.586185" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.586361" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.586539" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:18.585728" elapsed="0.000858"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.585641" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.586757" elapsed="0.000017"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.586849" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:48:18.586985" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflecto...</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-10-11T00:48:18.562417" elapsed="0.024596"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:18.588127" 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-10-11T00:48:18.587929" elapsed="0.000256">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-10-11T00:48:18.588267" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:18.587607" elapsed="0.000682"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.588594" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.588351" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.589116" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:18.588840" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:18.588669" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.588334" elapsed="0.000856"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.589697" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:18.589348" elapsed="0.000372"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:48:18.589764" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:48:18.589886" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:48:18.587289" elapsed="0.002619"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.591181" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:18.590959" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.591644" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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;/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-10-11T00:48:18.591431" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.592114" 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-10-11T00:48:18.591884" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.592575" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:18.592345" elapsed="0.000269"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:48:18.593343" 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-10-11T00:48:18.593173" elapsed="0.000194"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:48:18.593679" 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-10-11T00:48:18.593535" elapsed="0.000168"/>
</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-10-11T00:48:18.593860" elapsed="0.000175"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.594470" 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-10-11T00:48:18.594224" elapsed="0.000322"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:48:18.594585" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:48:18.594711" 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-10-11T00:48:18.592794" elapsed="0.001940"/>
</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-10-11T00:48:18.611333" level="INFO">PUT Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Content-Length': '1078', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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;/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-10-11T00:48:18.611395" level="INFO">PUT Response : url=http://10.30.170.173: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.171.7 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-10-11T00:48:18.611512" 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-10-11T00:48:18.595036" elapsed="0.016500"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:18.594795" elapsed="0.016782"/>
</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-10-11T00:48:18.611756" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.611602" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.594779" elapsed="0.017057"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.613014" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:18.612725" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:18.612484" elapsed="0.000602"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.612467" elapsed="0.000641"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.613679" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:18.613395" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:18.613157" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.613142" elapsed="0.000630"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.614378" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:18.613965" elapsed="0.000459"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.614759" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.614502" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.615275" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:18.615009" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:18.614835" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.614481" elapsed="0.000870"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.615875" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:18.615538" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.616238" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.615983" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.616749" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:18.616487" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:18.616313" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.615961" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:18.617043" elapsed="0.000305"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:48:18.617751" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:18.617524" elapsed="0.000252"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:48:18.617927" elapsed="0.000279"/>
</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-10-11T00:48:18.612178" elapsed="0.006092"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:48:18.618427" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:48:18.618330" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.618313" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.618650" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.618709" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:48:18.618866" 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-10-11T00:48:18.590246" elapsed="0.028644"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:18.618962" elapsed="0.000032"/>
</return>
<msg time="2026-10-11T00:48:18.619093" 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-10-11T00:48:18.511492" elapsed="0.107622"/>
</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-10-11T00:48:18.619400" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.619199" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.619183" elapsed="0.000317"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:18.619530" elapsed="0.000023"/>
</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-10-11T00:48:18.510848" elapsed="0.108776"/>
</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-10-11T00:48:18.620219" elapsed="0.000253"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:48:18.619878" elapsed="0.000653"/>
</kw>
<doc>Replace BGP peer config module, now with initiate-connection set to true.</doc>
<status status="PASS" start="2026-10-11T00:48:18.418355" elapsed="0.202212"/>
</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">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.622220" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.622018" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.622001" elapsed="0.000293"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-10-11T00:48:18.621818" elapsed="0.000518"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.623314" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:18.623217" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.623195" elapsed="0.000181"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.625606" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:18.625522" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.625504" elapsed="0.000165"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.626645" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:18.626302" elapsed="0.000369"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.627189" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:48:18.626857" elapsed="0.000361"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:48:18.627265" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:48:18.627393" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:48:18.625878" 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-10-11T00:48:18.629975" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:18.629871" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.629853" 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-10-11T00:48:18.631182" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:18.631072" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.631050" elapsed="0.000203"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:48:18.631595" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:48:18.631400" elapsed="0.000219"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:48:18.631918" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:48:18.631780" elapsed="0.000176"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:48:18.671002" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:48:18.632509" elapsed="0.038612"/>
</kw>
<msg time="2026-10-11T00:48:18.671294" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:48:18.671335" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:18.632151" elapsed="0.039219"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:48:18.700631" level="INFO">". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "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-10-11T00:48:18.671894" elapsed="0.028837"/>
</kw>
<msg time="2026-10-11T00:48:18.700880" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:48:18.700921" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "i "n "g "_ "C "o "n "n "e "c "t "i "o "n "_ "I "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:18.671558" elapsed="0.029420"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.701275" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.701066" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.701043" elapsed="0.000304"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.701781" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "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-10-11T00:48:18.701555" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.702143" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.701904" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.701887" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:48:18.702244" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:48:18.704774" elapsed="0.000268"/>
</kw>
<msg time="2026-10-11T00:48:18.705107" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:18.703679" elapsed="0.001560"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.705566" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.705906" 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-10-11T00:48:18.703052" elapsed="0.003075"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:48:18.702551" 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-10-11T00:48:18.630775" elapsed="0.075519"/>
</kw>
<msg time="2026-10-11T00:48:18.706377" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:18.706447" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "i "n "g "_ "C "o "n "n "e "c "t "i "o "n "_ "I "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:18.630216" elapsed="0.076268"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:48:18.706639" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:48:18.706553" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.706535" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.707083" 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-10-11T00:48:18.707439" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.707506" 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-10-11T00:48:18.629583" elapsed="0.078009"/>
</kw>
<msg time="2026-10-11T00:48:18.707675" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:18.707714" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "i "n "g "_ "C "o "n "n "e "c "t "i "o "n "_ "I "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:18.627764" elapsed="0.079985"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.708079" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.707815" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.707799" elapsed="0.000352"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:48:18.627622" elapsed="0.080551"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:48:18.627481" elapsed="0.080718"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:48:18.625209" elapsed="0.083038"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:48:18.622900" elapsed="0.085396"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:18.622501" elapsed="0.085834"/>
</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-10-11T00:48:18.621441" elapsed="0.086942"/>
</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-10-11T00:48:18.712145" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-10-11T00:48:18.726503" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:48:18.726602" 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-10-11T00:48:18.712027" elapsed="0.014600"/>
</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-10-11T00:48:18.727065" elapsed="0.000028"/>
</kw>
<msg time="2026-10-11T00:48:18.727132" 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-10-11T00:48:18.726700" elapsed="0.000492">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-10-11T00:48:18.726679" elapsed="0.000610">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-10-11T00:48:18.711689" elapsed="0.015766">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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:18.711306" elapsed="0.016222"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:48:18.727948" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17900 .+ ESTABLISHED .+python" | wc -l'.</msg>
<msg time="2026-10-11T00:48:18.777377" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:48:18.777593" level="INFO">${output} = 1</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="PASS" start="2026-10-11T00:48:18.727756" elapsed="0.049872"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-11T00:48:18.777720" elapsed="0.000064"/>
</return>
<msg time="2026-10-11T00:48:18.777963" level="INFO">${output} = 1</msg>
<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="PASS" start="2026-10-11T00:48:18.710922" elapsed="0.067075"/>
</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="PASS" start="2026-10-11T00:48:18.778280" elapsed="0.000516"/>
</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="PASS" start="2026-10-11T00:48:18.710576" elapsed="0.068302"/>
</kw>
<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="PASS" start="2026-10-11T00:48:18.708887" elapsed="0.070072"/>
</kw>
<doc>Give it several tries to see exactly one established connection.</doc>
<status status="PASS" start="2026-10-11T00:48:18.708594" elapsed="0.070467"/>
</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-10-11T00:48:18.779948" elapsed="0.000389"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:48:18.779480" elapsed="0.000960"/>
</kw>
<doc>See TCP (BGP) connection in established state.</doc>
<status status="PASS" start="2026-10-11T00:48:18.620878" elapsed="0.159613"/>
</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">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.783582" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.783240" elapsed="0.000418"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.782703" elapsed="0.000987"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-10-11T00:48:18.782478" elapsed="0.001275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.785174" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:18.785027" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.784995" 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-10-11T00:48:18.788343" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:18.788197" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.788166" elapsed="0.000288"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.789850" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:18.789365" elapsed="0.000521"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.790583" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:48:18.790178" elapsed="0.000440"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:48:18.790735" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:48:18.790915" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:48:18.788752" elapsed="0.002221"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.794706" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:18.794588" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.794562" elapsed="0.000232"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.796404" elapsed="0.000052"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:18.796286" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.796262" elapsed="0.000264"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:48:18.797002" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:48:18.796733" elapsed="0.000312"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:48:18.797572" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:48:18.797342" elapsed="0.000263"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:48:18.838348" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:48:18.798359" elapsed="0.040107"/>
</kw>
<msg time="2026-10-11T00:48:18.838642" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:48:18.838683" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:18.797825" elapsed="0.040893"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:48:18.867427" level="INFO">". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "i "n "g "_ "T "o "p "o "l "o "g "y "_ "I "s "_ "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-10-11T00:48:18.839291" elapsed="0.028235"/>
</kw>
<msg time="2026-10-11T00:48:18.867676" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:48:18.867717" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "i "n "g "_ "T "o "p "o "l "o "g "y "_ "I "s "_ "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:18.838888" elapsed="0.028868"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.868051" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.867826" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.867808" elapsed="0.000316"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.868567" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "i "n "g "_ "T "o "p "o "l "o "g "y "_ "I "s "_ "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-10-11T00:48:18.868313" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.869019" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.868690" elapsed="0.000381"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.868673" elapsed="0.000420"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:48:18.869123" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:48:18.871566" elapsed="0.000114"/>
</kw>
<msg time="2026-10-11T00:48:18.871736" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:18.870513" elapsed="0.001357"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.872251" elapsed="0.000092"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.872635" 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-10-11T00:48:18.869904" 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-10-11T00:48:18.869438" elapsed="0.003445"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:48:18.795858" elapsed="0.077159"/>
</kw>
<msg time="2026-10-11T00:48:18.873099" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:18.873138" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "i "n "g "_ "T "o "p "o "l "o "g "y "_ "I "s "_ "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:18.795042" elapsed="0.078132"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:48:18.873325" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:48:18.873241" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.873223" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.873759" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.874115" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.874199" 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-10-11T00:48:18.794163" elapsed="0.080145"/>
</kw>
<msg time="2026-10-11T00:48:18.874400" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:18.874466" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "i "n "g "_ "T "o "p "o "l "o "g "y "_ "I "s "_ "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:18.791531" elapsed="0.082970"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.874797" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.874569" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.874552" elapsed="0.000317"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:48:18.791305" elapsed="0.083585"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:48:18.791065" elapsed="0.083856"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:48:18.787717" elapsed="0.087274"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:48:18.784634" elapsed="0.090407"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:18.783993" elapsed="0.091087"/>
</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-10-11T00:48:18.781822" elapsed="0.093305"/>
</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-10-11T00:48:18.891854" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:18.891547" elapsed="0.000333"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:18.892690" 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-10-11T00:48:18.892393" elapsed="0.000376">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-10-11T00:48:18.892854" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:18.892064" elapsed="0.000812"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.893483" 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-10-11T00:48:18.893096" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:18.893790" 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-10-11T00:48:18.893952" 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-10-11T00:48:18.893679" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.894458" 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-10-11T00:48:18.894208" 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-10-11T00:48:18.895808" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:18.895249" elapsed="0.000616"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.896560" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:48:18.896071" elapsed="0.000514"/>
</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-10-11T00:48:18.896922" 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-10-11T00:48:18.897658" elapsed="0.000047"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:48:18.898034" elapsed="0.000055"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:48:18.896737" elapsed="0.001492"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.896628" elapsed="0.001681"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:48:18.898361" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T00:48:18.898524" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:48:18.894821" elapsed="0.003727"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:18.894562" elapsed="0.004014"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.898746" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.898598" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.894544" elapsed="0.004270"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.899377" 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-10-11T00:48:18.898992" elapsed="0.000411"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:18.899472" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:18.890963" elapsed="0.008609"/>
</kw>
<msg time="2026-10-11T00:48:18.899620" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:18.886544" elapsed="0.013120"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:18.904215" 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/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-10-11T00:48:18.908223" 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/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-10-11T00:48:18.912352" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.912549" 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-10-11T00:48:18.912763" 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-10-11T00:48:18.913119" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.912971" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:18.912957" 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-10-11T00:48:18.913346" 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-10-11T00:48:18.913541" 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-10-11T00:48:18.913706" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:18.912920" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.912831" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.913945" elapsed="0.000024"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.914030" elapsed="0.000020"/>
</return>
<msg time="2026-10-11T00:48:18.914164" 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-10-11T00:48:18.885920" elapsed="0.028275"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:18.915433" 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-10-11T00:48:18.915230" elapsed="0.000263">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-10-11T00:48:18.915576" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:18.914844" 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-10-11T00:48:18.915880" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.915661" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.916400" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:18.916139" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:18.915973" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.915644" elapsed="0.000847"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.916997" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:18.916650" elapsed="0.000370"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:48:18.917064" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:48:18.917186" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:48:18.914538" elapsed="0.002670"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:18.918301" 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-10-11T00:48:18.918117" elapsed="0.000242">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-10-11T00:48:18.918457" 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-10-11T00:48:18.917781" elapsed="0.000699"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:48:18.918641" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:48:18.918543" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.918526" elapsed="0.000190"/>
</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-10-11T00:48:18.918868" elapsed="0.000019"/>
</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-10-11T00:48:18.919137" elapsed="0.000026"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.919214" elapsed="0.000018"/>
</return>
<msg time="2026-10-11T00:48:18.919373" 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-10-11T00:48:18.917485" elapsed="0.001911"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.920712" 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-10-11T00:48:18.920489" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.921181" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:18.920963" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:48:18.929719" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:48:18.929885" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:48:18.929993" 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-10-11T00:48:18.921530" elapsed="0.008491"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:18.921280" elapsed="0.008780"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.930237" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.930084" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.921264" elapsed="0.009049"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.931611" 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-10-11T00:48:18.931261" elapsed="0.000395"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:18.931016" elapsed="0.000671"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.930998" elapsed="0.000712"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.932293" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:18.932023" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:18.931759" elapsed="0.000604"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.931744" elapsed="0.000643"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.932965" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:18.932581" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.933271" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.933062" elapsed="0.000260"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.933789" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:18.933520" elapsed="0.000294"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:18.933344" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.933045" elapsed="0.000820"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.934390" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:18.934056" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.934697" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.934492" elapsed="0.000256"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.935260" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:18.934926" elapsed="0.000364"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:18.934770" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.934476" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:18.935534" elapsed="0.000328"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:48:18.936334" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:18.936063" 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-10-11T00:48:18.936528" elapsed="0.000215"/>
</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-10-11T00:48:18.930666" elapsed="0.006132"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.936956" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:18.936859" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.936843" elapsed="0.000180"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:48:18.937786" 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-10-11T00:48:18.937163" elapsed="0.000649"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:48:18.937857" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:48:18.938013" 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-10-11T00:48:18.919697" elapsed="0.018347"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:18.938111" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T00:48:18.938244" 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-10-11T00:48:18.878436" elapsed="0.059833"/>
</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-10-11T00:48:18.949769" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:18.948946" elapsed="0.000851"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:18.951990" 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-10-11T00:48:18.951460" elapsed="0.000678">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-10-11T00:48:18.952260" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:18.949980" elapsed="0.002303"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.953173" 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-10-11T00:48:18.952499" elapsed="0.000705"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:18.953648" 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-10-11T00:48:18.953892" 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-10-11T00:48:18.953447" elapsed="0.000470"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.954783" 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-10-11T00:48:18.954130" elapsed="0.000713"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:48:18.955520" elapsed="0.000075"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.954962" elapsed="0.000708"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.956565" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:18.955869" elapsed="0.000735"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:18.955696" elapsed="0.000982"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.954939" elapsed="0.001761"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.957694" 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-10-11T00:48:18.956864" elapsed="0.000857"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:18.957764" 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-10-11T00:48:18.948433" elapsed="0.009433"/>
</kw>
<msg time="2026-10-11T00:48:18.957915" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:18.944063" elapsed="0.013910"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:18.962126" 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/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-10-11T00:48:18.966136" 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/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-10-11T00:48:18.970372" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.970573" 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-10-11T00:48:18.970753" 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-10-11T00:48:18.971138" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.970993" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:18.970979" 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-10-11T00:48:18.971361" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.971616" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.971783" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:18.970950" elapsed="0.000880"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.970823" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:18.972016" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.972115" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:48:18.972226" 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-10-11T00:48:18.943291" elapsed="0.028960"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:18.972433" elapsed="0.000317"/>
</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-10-11T00:48:18.973855" 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-10-11T00:48:18.973435" elapsed="0.000447"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:48:18.974441" 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-10-11T00:48:18.974041" 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-10-11T00:48:18.974655" elapsed="0.000296"/>
</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-10-11T00:48:18.973046" elapsed="0.001969"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:18.972819" 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-10-11T00:48:18.975240" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:18.975068" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.972802" elapsed="0.002506"/>
</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-10-11T00:48:18.939366" elapsed="0.035983"/>
</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-10-11T00:48:18.938581" elapsed="0.036848"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:18.938343" elapsed="0.037127"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.938327" elapsed="0.037164"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:18.975520" elapsed="0.000026"/>
</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-10-11T00:48:18.877687" elapsed="0.097932"/>
</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-10-11T00:48:18.876146" elapsed="0.099528"/>
</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-10-11T00:48:18.875696" elapsed="0.100020"/>
</kw>
<arg>filled_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="PASS" start="2026-10-11T00:48:18.875246" elapsed="0.100523"/>
</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-10-11T00:48:18.976324" elapsed="0.000251"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:48:18.976032" elapsed="0.000600"/>
</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-10-11T00:48:18.780923" elapsed="0.195745"/>
</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-10-11T00:48:18.978123" elapsed="0.000204"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:48:18.977835" 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-10-11T00:48:18.979375" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:18.979276" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.979255" 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-10-11T00:48:18.981648" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:18.981566" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.981549" elapsed="0.000160"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.982626" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:18.982288" elapsed="0.000363"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:48:18.983083" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:48:18.982801" elapsed="0.000306"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:48:18.983147" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:48:18.983272" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:48:18.981916" elapsed="0.001378"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.985958" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:18.985856" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.985838" elapsed="0.000186"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:18.987080" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:18.986992" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:18.986975" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:48:18.987489" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:48:18.987292" elapsed="0.000222"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:48:18.987817" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:48:18.987676" elapsed="0.000164"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:48:19.028120" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:48:18.988402" elapsed="0.039817"/>
</kw>
<msg time="2026-10-11T00:48:19.028373" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:48:19.028438" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:18.988028" elapsed="0.040447"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:48:19.052554" 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-10-11T00:48:19.029006" elapsed="0.023678"/>
</kw>
<msg time="2026-10-11T00:48:19.052858" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:48:19.052900" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:19.028642" elapsed="0.024307"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.053249" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:19.053036" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.053017" elapsed="0.000303"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:19.053770" 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-10-11T00:48:19.053521" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.054110" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:19.053890" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.053873" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:48:19.054209" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:48:19.056677" elapsed="0.000113"/>
</kw>
<msg time="2026-10-11T00:48:19.056879" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:19.055568" 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-10-11T00:48:19.057328" elapsed="0.000071"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.057677" elapsed="0.000070"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:48:19.054979" 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-10-11T00:48:19.054506" elapsed="0.003410"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:48:18.986726" elapsed="0.071288"/>
</kw>
<msg time="2026-10-11T00:48:19.058114" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:19.058161" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:18.986175" elapsed="0.072032"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:48:19.058380" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-10-11T00:48:19.058291" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.058269" 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-10-11T00:48:19.058811" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.059136" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:48:19.059203" 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-10-11T00:48:18.985515" elapsed="0.073772"/>
</kw>
<msg time="2026-10-11T00:48:19.059370" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:19.059492" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:18.983638" elapsed="0.075892"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.059815" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:19.059598" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.059582" elapsed="0.000302"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:48:18.983496" elapsed="0.076409"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:48:18.983340" elapsed="0.076604"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:48:18.981258" elapsed="0.078734"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:48:18.978955" elapsed="0.081085"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:18.978550" elapsed="0.081529"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:48:18.977488" elapsed="0.082636"/>
</kw>
<kw name="Kill_BGP_Speaker" owner="BGPSpeaker">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:19.061335" 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-10-11T00:48:19.061029" elapsed="0.000332"/>
</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-10-11T00:48:19.061529" elapsed="0.000184"/>
</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-10-11T00:48:19.060725" elapsed="0.001041"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:48:19.085836" level="INFO">^C
[?2004h[jenkins@releng-26932-423-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-10-11T00:48:19.062272" elapsed="0.023622"/>
</kw>
<msg time="2026-10-11T00:48:19.085992" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:19.086031" level="INFO">${message} = ^C
[?2004h[jenkins@releng-26932-423-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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:19.061942" elapsed="0.024113"/>
</kw>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:48:19.086682" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-10-11T00:48:19.099883" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:48:19.099992" level="INFO">${output_log} = 2026-10-11 00:47:57,935 INFO BGP-Thread-1 (job): Connecting in the listening mode.
2026-10-11 00:48:18,622 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:48:18,622 INFO BGP-Thread-1 (job): O...</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-10-11T00:48:19.086562" elapsed="0.013461"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:19.100488" level="INFO">2026-10-11 00:47:57,935 INFO BGP-Thread-1 (job): Connecting in the listening mode.
2026-10-11 00:48:18,622 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:48:18,622 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:48:18,623 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:48:18,623 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:48:18,623 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 3
2026-10-11 00:48:18,623 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-10-11 00:48:18,623 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 00:48:18,623 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 00:48:18,623 INFO BGP-Thread-1 (job):   My BGP Identifier: 169782023
2026-10-11 00:48:18,623 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 00:48:18,623 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 00:48:18,623 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 00:48:18,623 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 00:48:18,623 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 00:48:18,623 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 00:48:18,624 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 3
2026-10-11 00:48:18,624 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 00:48:18,624 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 00:48:18,627 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 3
2026-10-11 00:48:18,627 INFO BGP-Thread-1 (job): All update messages generated.
2026-10-11 00:48:18,627 INFO BGP-Thread-1 (job): Storing performance results.
2026-10-11 00:48:18,627 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-10-11 00:48:18,628 INFO BGP-Thread-1 (job): Number of iterations: 3
2026-10-11 00:48:18,628 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-10-11 00:48:18,628 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-10-11 00:48:18,628 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 3
2026-10-11 00:48:18,628 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.00019621849060058594s
2026-10-11 00:48:18,628 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-10-11 00:48:18,628 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-10-11 00:48:18,628 INFO BGP-Thread-1 (job):   
2026-10-11 00:48:18,628 INFO BGP-Thread-1 (job):   
2026-10-11 00:48:18,628 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-10-11 00:48:18,628 INFO BGP-Thread-1 (job):   
2026-10-11 00:48:18,628 INFO BGP-Thread-1 (job):   
2026-10-11 00:48:18,629 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-10-11 00:48:18,629 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:48:18,629 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:48:18,629 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:48:18,635 INFO BGP-Thread-1 (job): ... idle for 0.006s
2026-10-11 00:48:18,635 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.006s
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-10-11T00:48:19.100241" elapsed="0.000322"/>
</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-10-11T00:48:19.086232" elapsed="0.014381"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<status status="PASS" start="2026-10-11T00:48:19.100759" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:48:19.100668" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.100652" elapsed="0.000182"/>
</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-10-11T00:48:19.101067" elapsed="0.000021"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was not seen within timeout period.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.101236" elapsed="0.000018"/>
</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-10-11T00:48:19.060368" elapsed="0.040937"/>
</kw>
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:19.102117" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:48:19.101805" elapsed="0.000350"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-10-11T00:48:19.101498" elapsed="0.000709"/>
</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-10-11T00:48:19.102738" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Teardown].</doc>
<status status="PASS" start="2026-10-11T00:48:19.102456" elapsed="0.000539"/>
</kw>
<doc>Abort the Python speaker. Also, attempt to stop failing fast.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:48:18.976990" elapsed="0.126037"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.104552" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:19.104326" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.104309" 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-10-11T00:48:19.104142" 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-10-11T00:48:19.107168" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:19.107083" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.107065" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:19.109247" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:19.109165" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.109148" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:19.110230" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:19.109887" elapsed="0.000368"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:48:19.110683" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:48:19.110422" elapsed="0.000285"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:48:19.110747" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:48:19.110871" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:48:19.109534" elapsed="0.001359"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:19.113401" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:19.113318" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.113300" elapsed="0.000178"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:19.114512" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:19.114426" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.114388" elapsed="0.000185"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:48:19.114883" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:48:19.114717" elapsed="0.000191"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:48:19.115287" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:48:19.115124" elapsed="0.000192"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:48:19.153687" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:48:19.115855" elapsed="0.037961"/>
</kw>
<msg time="2026-10-11T00:48:19.154010" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:48:19.154057" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:19.115528" elapsed="0.038564"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:48:19.185182" 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-10-11T00:48:19.154681" elapsed="0.030624"/>
</kw>
<msg time="2026-10-11T00:48:19.185482" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:48:19.185524" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:19.154284" elapsed="0.031274"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.185856" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:19.185636" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.185613" elapsed="0.000335"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:19.186438" 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-10-11T00:48:19.186190" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.186762" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:19.186563" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.186547" elapsed="0.000285"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:48:19.186912" 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-10-11T00:48:19.189735" elapsed="0.000118"/>
</kw>
<msg time="2026-10-11T00:48:19.189910" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:19.188642" elapsed="0.001452"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.190435" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.190775" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:48:19.187976" elapsed="0.003012"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:48:19.187294" elapsed="0.003772"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:48:19.114153" elapsed="0.077005"/>
</kw>
<msg time="2026-10-11T00:48:19.191252" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:19.191292" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:19.113628" elapsed="0.077699"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:48:19.191514" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:48:19.191396" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.191379" 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-10-11T00:48:19.191922" elapsed="0.000044"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.192250" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:48:19.192314" 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-10-11T00:48:19.113035" elapsed="0.079363"/>
</kw>
<msg time="2026-10-11T00:48:19.192509" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:19.192549" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:19.111306" elapsed="0.081278"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.192876" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:19.192652" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.192636" elapsed="0.000331"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:48:19.111166" elapsed="0.081828"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:48:19.111028" elapsed="0.082001"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:48:19.108854" elapsed="0.084236"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:48:19.106802" elapsed="0.086349"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:19.104847" elapsed="0.088358"/>
</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-10-11T00:48:19.103738" elapsed="0.089528"/>
</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-10-11T00:48:19.209862" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:19.209554" elapsed="0.000335"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:19.210674" 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-10-11T00:48:19.210380" elapsed="0.000370">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-10-11T00:48:19.210868" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:19.210065" elapsed="0.000826"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:19.211384" 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-10-11T00:48:19.211076" elapsed="0.000355"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:19.211712" 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-10-11T00:48:19.211859" 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-10-11T00:48:19.211599" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:19.212312" 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-10-11T00:48:19.212089" elapsed="0.000266"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:19.213608" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:19.213050" elapsed="0.000616"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:48:19.214327" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:48:19.213844" 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-10-11T00:48:19.214721" elapsed="0.000043"/>
</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-10-11T00:48:19.215448" elapsed="0.000048"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:48:19.215786" elapsed="0.000043"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:48:19.214535" elapsed="0.001428"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:48:19.214398" elapsed="0.001636"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:48:19.216078" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:48:19.216211" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:48:19.212695" elapsed="0.003539"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:19.212435" elapsed="0.003828"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.216453" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:19.216284" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.212400" elapsed="0.004123"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:19.217088" 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-10-11T00:48:19.216680" elapsed="0.000433"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:19.217156" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:19.209032" elapsed="0.008222"/>
</kw>
<msg time="2026-10-11T00:48:19.217302" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:19.204524" elapsed="0.012823"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:19.221515" 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/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-10-11T00:48:19.225496" 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/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-10-11T00:48:19.229658" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.229839" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.230063" 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-10-11T00:48:19.230488" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:19.230304" elapsed="0.000237"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:19.230287" 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-10-11T00:48:19.230722" 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-10-11T00:48:19.230901" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.231087" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:19.230256" elapsed="0.000879"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:19.230148" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.231307" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:19.231373" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:48:19.231495" 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-10-11T00:48:19.203899" elapsed="0.027621"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:19.232628" 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-10-11T00:48:19.232439" elapsed="0.000247">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-10-11T00:48:19.232769" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:19.232101" elapsed="0.000690"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.233090" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:19.232854" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:19.233780" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:19.233514" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:19.233326" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.232837" elapsed="0.001020"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:19.234398" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:19.234057" elapsed="0.000380"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:48:19.234482" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:48:19.234607" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:48:19.231788" elapsed="0.002841"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:19.235709" 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-10-11T00:48:19.235524" elapsed="0.000243">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-10-11T00:48:19.235884" 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-10-11T00:48:19.235192" elapsed="0.000715"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:48:19.236086" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:48:19.235986" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.235969" elapsed="0.000192"/>
</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-10-11T00:48:19.236314" elapsed="0.000019"/>
</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-10-11T00:48:19.236503" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:48:19.236564" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:48:19.236687" 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-10-11T00:48:19.234880" elapsed="0.001829"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:19.237975" 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-10-11T00:48:19.237739" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:19.238437" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:19.238208" elapsed="0.000270"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:48:19.247065" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:48:19.247763" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:48:19.247871" 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-10-11T00:48:19.238763" elapsed="0.009133"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:19.238538" elapsed="0.009411"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.248134" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:19.247976" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.238521" elapsed="0.009693"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:19.249519" 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-10-11T00:48:19.249171" elapsed="0.000392"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:19.248915" elapsed="0.000680"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.248898" elapsed="0.000719"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:19.250194" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:19.249902" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:19.249665" elapsed="0.000601"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.249651" elapsed="0.000636"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:19.250831" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:19.250478" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.251171" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:19.250919" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:19.251694" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:19.251428" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:19.251244" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.250902" elapsed="0.000867"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:19.252295" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:19.251959" elapsed="0.000361"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.252603" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:19.252383" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:19.253148" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:19.252872" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:19.252713" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.252365" elapsed="0.000858"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:19.253365" elapsed="0.000303"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:48:19.254086" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:19.253828" elapsed="0.000282"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:48:19.254261" elapsed="0.000235"/>
</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-10-11T00:48:19.248574" elapsed="0.005977"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:19.254696" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:19.254613" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.254596" elapsed="0.000161"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:48:19.255589" 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-10-11T00:48:19.254898" elapsed="0.000718"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:48:19.255663" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:48:19.255791" 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-10-11T00:48:19.237035" elapsed="0.018780"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:19.255870" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:48:19.256021" 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-10-11T00:48:19.196607" elapsed="0.059443"/>
</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-10-11T00:48:19.267164" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:19.266425" elapsed="0.000766"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:19.269270" 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-10-11T00:48:19.268760" elapsed="0.000626">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-10-11T00:48:19.269535" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:19.267349" elapsed="0.002209"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:19.270390" 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-10-11T00:48:19.269732" elapsed="0.000747"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:19.270840" 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-10-11T00:48:19.271074" 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-10-11T00:48:19.270649" elapsed="0.000450"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:19.272006" 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-10-11T00:48:19.271324" elapsed="0.000741"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:48:19.272672" elapsed="0.000075"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:19.272129" elapsed="0.000693"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:19.273683" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:19.273034" elapsed="0.000688"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:19.272847" elapsed="0.000950"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.272111" elapsed="0.001708"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:19.274811" 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-10-11T00:48:19.274012" elapsed="0.000825"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:19.274881" 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-10-11T00:48:19.265886" elapsed="0.009137"/>
</kw>
<msg time="2026-10-11T00:48:19.275070" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:19.261559" elapsed="0.013556"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:19.279365" 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/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-10-11T00:48:19.283617" 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/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-10-11T00:48:19.287665" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.287845" 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-10-11T00:48:19.288041" 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-10-11T00:48:19.288438" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:19.288267" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:19.288253" 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-10-11T00:48:19.288670" 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-10-11T00:48:19.288849" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.289023" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:19.288225" elapsed="0.000882"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:19.288109" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.289295" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:19.289362" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:48:19.289487" 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-10-11T00:48:19.260817" elapsed="0.028695"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:19.289677" elapsed="0.000325"/>
</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-10-11T00:48:19.290921" 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-10-11T00:48:19.290654" elapsed="0.000312"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:48:19.291379" 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-10-11T00:48:19.291121" 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-10-11T00:48:19.291611" elapsed="0.000283"/>
</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-10-11T00:48:19.290272" elapsed="0.001689"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:19.290072" elapsed="0.001919"/>
</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-10-11T00:48:19.292188" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:19.292014" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.290054" elapsed="0.002202"/>
</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-10-11T00:48:19.257148" elapsed="0.035150"/>
</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-10-11T00:48:19.256396" elapsed="0.035965"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:19.256142" elapsed="0.036276"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.256123" elapsed="0.036319"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:19.292472" elapsed="0.000026"/>
</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-10-11T00:48:19.195968" elapsed="0.096603"/>
</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-10-11T00:48:19.194390" elapsed="0.098235"/>
</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-10-11T00:48:19.193877" elapsed="0.098789"/>
</kw>
<arg>empty_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="PASS" start="2026-10-11T00:48:19.193521" elapsed="0.099195"/>
</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-10-11T00:48:19.293270" elapsed="0.000250"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:48:19.292979" elapsed="0.000598"/>
</kw>
<doc>Post-condition: Check example-ipv4-topology is empty again.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:48:19.103204" elapsed="0.190409"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.295524" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:19.295297" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.295280" elapsed="0.000352"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-10-11T00:48:19.295126" 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-10-11T00:48:19.296613" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:19.296527" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.296510" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:19.298799" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:19.298717" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.298700" elapsed="0.000160"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:19.299793" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:19.299468" elapsed="0.000351"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:48:19.300324" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:48:19.299997" elapsed="0.000357"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:48:19.300422" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T00:48:19.300554" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:48:19.299094" elapsed="0.001483"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:19.303069" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:19.302984" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.302967" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:19.304177" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:19.304094" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.304077" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:48:19.304637" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:48:19.304464" elapsed="0.000197"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:48:19.304979" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:48:19.304825" elapsed="0.000178"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:48:19.343689" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:48:19.305506" elapsed="0.038281"/>
</kw>
<msg time="2026-10-11T00:48:19.343959" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:48:19.344007" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:19.305159" elapsed="0.038884"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:48:19.407204" 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-10-11T00:48:19.344572" elapsed="0.062757"/>
</kw>
<msg time="2026-10-11T00:48:19.407525" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:48:19.407567" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:19.344211" elapsed="0.063391"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.407938" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:19.407683" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.407659" elapsed="0.000379"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:19.408574" 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-10-11T00:48:19.408285" elapsed="0.000353"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.408897" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:19.408699" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.408682" elapsed="0.000384"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:48:19.409100" 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-10-11T00:48:19.411600" elapsed="0.000276"/>
</kw>
<msg time="2026-10-11T00:48:19.411948" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:19.410569" elapsed="0.001517"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.412392" elapsed="0.000093"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.412747" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:48:19.409952" 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-10-11T00:48:19.409446" elapsed="0.003569"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:48:19.303826" elapsed="0.109263"/>
</kw>
<msg time="2026-10-11T00:48:19.413171" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:19.413211" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:19.303284" elapsed="0.109963"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:48:19.413400" elapsed="0.000047"/>
</return>
<status status="PASS" start="2026-10-11T00:48:19.413315" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.413298" elapsed="0.000203"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.413839" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.414247" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:48:19.414326" 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-10-11T00:48:19.302689" elapsed="0.111804"/>
</kw>
<msg time="2026-10-11T00:48:19.414582" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:19.414623" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:19.300904" elapsed="0.113761"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:19.414988" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:19.414736" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:19.414720" elapsed="0.000358"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:48:19.300761" elapsed="0.114344"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:48:19.300622" elapsed="0.114519"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:48:19.298426" elapsed="0.116765"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:48:19.296259" elapsed="0.118984"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:19.295824" elapsed="0.119463"/>
</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-10-11T00:48:19.294661" elapsed="0.120675"/>
</kw>
<kw name="Start_BGP_Speaker" owner="BGPSpeaker">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:19.416273" level="INFO">${command} = python3 play.py --amount 3 --listen --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:19.415990" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:19.416730" level="INFO">python3 play.py --amount 3 --listen --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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-10-11T00:48:19.416514" elapsed="0.000258"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:48:19.420773" level="INFO">python3 play.py --amount 3 --listen --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --prefill=2 --insert=2 --withdraw=1 --updates=single --firstprefix=8.0.0.240 --info &amp;&gt; play.py.out</msg>
<msg time="2026-10-11T00:48:19.420862" level="INFO">${output} =  python3 play.py --amount 3 --listen --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --prefill=2 --insert=2 --withdraw=1 --updates=single --firstprefix=8.0.0.240 --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-10-11T00:48:19.416984" elapsed="0.003905"/>
</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-10-11T00:48:19.415601" elapsed="0.005363"/>
</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-10-11T00:48:29.422820" 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-10-11T00:48:19.422537" elapsed="10.001014">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-10-11T00:48:29.423901" elapsed="0.000032"/>
</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-10-11T00:48:19.422241" elapsed="10.001807">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-10-11T00:48:19.421864" elapsed="10.002309"/>
</kw>
<msg time="2026-10-11T00:48:29.424287" 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-10-11T00:48:19.421476" elapsed="10.002836"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-10-11T00:48:29.424495" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-10-11T00:48:29.424401" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.424376" elapsed="0.000203"/>
</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-10-11T00:48:29.424798" elapsed="0.000024"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.424988" elapsed="0.000019"/>
</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-10-11T00:48:19.421187" elapsed="10.003877"/>
</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-10-11T00:48:29.425677" elapsed="0.000314"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:48:29.425316" elapsed="0.000733"/>
</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="PASS" start="2026-10-11T00:48:19.293990" elapsed="10.132093"/>
</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">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.427600" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:29.427368" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.427351" elapsed="0.000323"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-10-11T00:48:29.427196" 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-10-11T00:48:29.428995" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:29.428907" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.428889" elapsed="0.000170"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:29.431063" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:29.430980" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.430963" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.432064" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:29.431709" elapsed="0.000381"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.432533" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:48:29.432245" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:48:29.432598" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:48:29.432732" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:48:29.431334" elapsed="0.001421"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:29.435437" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:29.435336" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.435319" elapsed="0.000181"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:29.436598" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:29.436513" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.436496" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:48:29.437010" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:48:29.436811" elapsed="0.000224"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:48:29.437344" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:48:29.437202" elapsed="0.000166"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:48:29.480138" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:48:29.437900" elapsed="0.042352"/>
</kw>
<msg time="2026-10-11T00:48:29.480427" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:48:29.480488" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:29.437541" elapsed="0.042988"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:48:29.516689" level="INFO">". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "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 "_ "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-10-11T00:48:29.481062" elapsed="0.035730"/>
</kw>
<msg time="2026-10-11T00:48:29.516963" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:48:29.517005" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "i "n "g "_ "C "o "n "n "e "c "t "i "o "n "_ "I "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:29.480698" elapsed="0.036342"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.517324" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:29.517111" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.517092" elapsed="0.000306"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.517845" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "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 "_ "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-10-11T00:48:29.517604" elapsed="0.000345"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.518213" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:29.518010" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.517993" elapsed="0.000292"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:48:29.518315" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:48:29.520914" elapsed="0.000115"/>
</kw>
<msg time="2026-10-11T00:48:29.521088" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:29.519892" elapsed="0.001326"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.521547" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.521903" 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-10-11T00:48:29.519110" elapsed="0.002979"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:48:29.518627" 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-10-11T00:48:29.436233" elapsed="0.085989"/>
</kw>
<msg time="2026-10-11T00:48:29.522304" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:29.522345" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "i "n "g "_ "C "o "n "n "e "c "t "i "o "n "_ "I "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:29.435652" elapsed="0.086782"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:48:29.522596" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:48:29.522508" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.522490" elapsed="0.000183"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.523011" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.523320" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:48:29.523385" 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-10-11T00:48:29.435047" elapsed="0.088453"/>
</kw>
<msg time="2026-10-11T00:48:29.523584" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:29.523625" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "i "n "g "_ "C "o "n "n "e "c "t "i "o "n "_ "I "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:29.433238" elapsed="0.090422"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.523969" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:29.523727" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.523711" elapsed="0.000329"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:48:29.433093" elapsed="0.090970"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:48:29.432942" elapsed="0.091150"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:48:29.430670" elapsed="0.093470"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:48:29.428625" elapsed="0.095564"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:29.427877" elapsed="0.096351"/>
</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-10-11T00:48:29.426792" elapsed="0.097482"/>
</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-10-11T00:48:29.527829" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-10-11T00:48:29.541126" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:48:29.541222" 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-10-11T00:48:29.527735" elapsed="0.013513"/>
</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-10-11T00:48:29.541631" elapsed="0.000024"/>
</kw>
<msg time="2026-10-11T00:48:29.541687" 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-10-11T00:48:29.541316" elapsed="0.000418">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-10-11T00:48:29.541296" elapsed="0.000516">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-10-11T00:48:29.527426" elapsed="0.014523">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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:29.527049" elapsed="0.014961"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:48:29.542345" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17900 .+ ESTABLISHED .+python" | wc -l'.</msg>
<msg time="2026-10-11T00:48:29.589338" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:48:29.589492" level="INFO">${output} = 1</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="PASS" start="2026-10-11T00:48:29.542198" elapsed="0.047337"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-11T00:48:29.589602" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T00:48:29.589787" level="INFO">${output} = 1</msg>
<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="PASS" start="2026-10-11T00:48:29.526723" elapsed="0.063098"/>
</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="PASS" start="2026-10-11T00:48:29.590087" elapsed="0.000443"/>
</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="PASS" start="2026-10-11T00:48:29.526380" elapsed="0.064231"/>
</kw>
<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="PASS" start="2026-10-11T00:48:29.524796" elapsed="0.065879"/>
</kw>
<doc>Give it several tries to see exactly one established connection.</doc>
<status status="PASS" start="2026-10-11T00:48:29.524394" elapsed="0.066356"/>
</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-10-11T00:48:29.591551" elapsed="0.000655"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:48:29.591103" elapsed="0.001189"/>
</kw>
<doc>See TCP (BGP) connection in established state.</doc>
<status status="PASS" start="2026-10-11T00:48:29.426294" elapsed="0.166046"/>
</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">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.594555" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:29.594233" elapsed="0.000398"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.594208" elapsed="0.000459"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-10-11T00:48:29.593977" elapsed="0.000753"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:29.596068" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:29.595946" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.595922" 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-10-11T00:48:29.599088" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:29.598968" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.598943" elapsed="0.000235"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.600540" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:29.600045" elapsed="0.000532"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.601205" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:48:29.600803" elapsed="0.000477"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:48:29.601343" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T00:48:29.601557" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:48:29.599507" elapsed="0.002084"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:29.605449" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:29.605304" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.605278" 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-10-11T00:48:29.607116" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:29.606994" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.606969" elapsed="0.000237"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:48:29.607695" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:48:29.607446" elapsed="0.000284"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:48:29.608327" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:48:29.608128" elapsed="0.000232"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:48:29.649795" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:48:29.609132" elapsed="0.040771"/>
</kw>
<msg time="2026-10-11T00:48:29.650053" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:48:29.650094" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:29.608622" elapsed="0.041525"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:48:29.683784" level="INFO">". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "i "n "g "_ "T "o "p "o "l "o "g "y "_ "I "s "_ "F "i "l "l "e "d "_ "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-10-11T00:48:29.650680" elapsed="0.033220"/>
</kw>
<msg time="2026-10-11T00:48:29.684047" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:48:29.684088" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "i "n "g "_ "T "o "p "o "l "o "g "y "_ "I "s "_ "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:29.650316" elapsed="0.033806"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.684394" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:29.684190" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.684172" elapsed="0.000317"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.684930" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "i "n "g "_ "T "o "p "o "l "o "g "y "_ "I "s "_ "F "i "l "l "e "d "_ "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-10-11T00:48:29.684674" elapsed="0.000321"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.685260" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:29.685054" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.685038" elapsed="0.000292"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:48:29.685359" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:48:29.687774" elapsed="0.000133"/>
</kw>
<msg time="2026-10-11T00:48:29.687964" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:29.686740" elapsed="0.001354"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.688399" elapsed="0.000097"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.688757" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:48:29.686126" elapsed="0.002829"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:48:29.685656" elapsed="0.003357"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:48:29.606584" elapsed="0.082543"/>
</kw>
<msg time="2026-10-11T00:48:29.689209" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:29.689248" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "i "n "g "_ "T "o "p "o "l "o "g "y "_ "I "s "_ "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:29.605765" elapsed="0.083518"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:48:29.689460" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:48:29.689351" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.689333" elapsed="0.000203"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.689869" 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-10-11T00:48:29.690181" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:48:29.690244" 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-10-11T00:48:29.604883" elapsed="0.085446"/>
</kw>
<msg time="2026-10-11T00:48:29.690436" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:29.690478" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "i "n "g "_ "T "o "p "o "l "o "g "y "_ "I "s "_ "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:29.602087" elapsed="0.088426"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.690797" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:29.690579" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.690563" elapsed="0.000318"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:48:29.601875" elapsed="0.089027"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:48:29.601658" elapsed="0.089271"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:48:29.598519" elapsed="0.092457"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:48:29.595563" elapsed="0.095461"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:29.594963" elapsed="0.096099"/>
</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-10-11T00:48:29.593386" elapsed="0.097722"/>
</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-10-11T00:48:29.708534" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:29.708214" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:29.709307" 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-10-11T00:48:29.709057" elapsed="0.000318">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-10-11T00:48:29.709483" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:29.708719" elapsed="0.000786"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.709999" 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-10-11T00:48:29.709677" elapsed="0.000347"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:29.710299" 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-10-11T00:48:29.710456" 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-10-11T00:48:29.710189" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.710944" 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-10-11T00:48:29.710707" elapsed="0.000279"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.712218" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:29.711674" elapsed="0.000602"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.712965" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:48:29.712478" elapsed="0.000512"/>
</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-10-11T00:48:29.713327" 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-10-11T00:48:29.714055" elapsed="0.000047"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:48:29.714396" elapsed="0.000066"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:48:29.713142" elapsed="0.001437"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:48:29.713032" elapsed="0.001609"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:48:29.714683" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:48:29.714816" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:48:29.711304" elapsed="0.003535"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:29.711047" elapsed="0.003837"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.715054" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:29.714906" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.711029" elapsed="0.004093"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.715699" 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-10-11T00:48:29.715278" elapsed="0.000446"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:29.715767" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:29.707697" elapsed="0.008181"/>
</kw>
<msg time="2026-10-11T00:48:29.715927" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:29.703486" elapsed="0.012486"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:29.761036" 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/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-10-11T00:48:29.765167" 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/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-10-11T00:48:29.769149" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.769351" 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-10-11T00:48:29.769626" 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-10-11T00:48:29.770017" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:29.769864" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:29.769836" 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-10-11T00:48:29.770250" 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-10-11T00:48:29.770444" 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-10-11T00:48:29.770610" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:29.769801" elapsed="0.000860"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:29.769699" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.770841" elapsed="0.000032"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:29.770925" elapsed="0.000018"/>
</return>
<msg time="2026-10-11T00:48:29.771065" 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-10-11T00:48:29.702881" elapsed="0.068210"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:29.772356" 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-10-11T00:48:29.772116" elapsed="0.000329">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-10-11T00:48:29.772530" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:29.771698" elapsed="0.000855"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.772870" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:29.772616" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.773382" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:29.773116" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:29.772945" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.772598" elapsed="0.000878"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.773993" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:29.773637" elapsed="0.000380"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:48:29.774061" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T00:48:29.774188" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:48:29.771356" elapsed="0.002855"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:29.775334" 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-10-11T00:48:29.775150" elapsed="0.000242">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-10-11T00:48:29.775493" 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-10-11T00:48:29.774769" elapsed="0.000747"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:48:29.775677" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:48:29.775579" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.775562" elapsed="0.000192"/>
</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-10-11T00:48:29.775921" elapsed="0.000020"/>
</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-10-11T00:48:29.776132" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:48:29.776191" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:48:29.776314" 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-10-11T00:48:29.774473" elapsed="0.001864"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.777712" 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-10-11T00:48:29.777333" elapsed="0.000423"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.778181" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:29.777960" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:48:29.790061" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:48:29.790212" level="INFO">GET Response : url=http://10.30.170.173: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.16/28"},{"prefix":"8.0.1.0/28"},{"prefix":"8.0.1.32/28"}]}}]}]} 
 </msg>
<msg time="2026-10-11T00:48:29.790314" 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-10-11T00:48:29.778524" elapsed="0.011815"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:29.778281" elapsed="0.012098"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.790581" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:29.790404" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.778264" elapsed="0.012399"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.792000" 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.16/28"},{"prefix":"8.0.1.0/28"},{"prefix":"8.0.1.32/28"}]}}]}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:29.791655" elapsed="0.000390"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:29.791396" elapsed="0.000681"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.791379" elapsed="0.000720"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.792675" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:29.792386" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:29.792148" elapsed="0.000600"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.792133" elapsed="0.000637"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.793322" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:29.792967" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.793638" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:29.793425" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.794154" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:29.793889" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:29.793714" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.793394" elapsed="0.000837"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.794758" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:29.794405" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.795079" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:29.794868" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.795613" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:29.795335" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:29.795153" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.794829" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:29.795835" elapsed="0.000365"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:48:29.796629" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:29.796363" elapsed="0.000291"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:48:29.796807" elapsed="0.000239"/>
</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-10-11T00:48:29.791058" elapsed="0.006044"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:29.797246" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:29.797164" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.797146" elapsed="0.000160"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:48:29.798081" 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-10-11T00:48:29.797463" elapsed="0.000646"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:48:29.798156" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:48:29.798283" 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-10-11T00:48:29.776628" elapsed="0.021680"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:29.798362" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:48:29.798501" 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-10-11T00:48:29.695838" elapsed="0.102688"/>
</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-10-11T00:48:29.809684" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:29.808920" elapsed="0.000792"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:29.811824" 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-10-11T00:48:29.811308" elapsed="0.000649">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-10-11T00:48:29.812081" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:29.809885" elapsed="0.002220"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.812986" 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-10-11T00:48:29.812278" elapsed="0.000735"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:29.813376" 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-10-11T00:48:29.813641" 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-10-11T00:48:29.813179" elapsed="0.000488"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.814383" 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-10-11T00:48:29.813871" elapsed="0.000726"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:48:29.815250" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:29.814698" elapsed="0.000703"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.816237" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:29.815620" elapsed="0.000656"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:29.815442" elapsed="0.000910"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.814679" elapsed="0.001695"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.817400" 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-10-11T00:48:29.816582" elapsed="0.000865"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:29.817492" 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-10-11T00:48:29.808380" elapsed="0.009214"/>
</kw>
<msg time="2026-10-11T00:48:29.817644" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:29.804021" elapsed="0.013669"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:29.821838" 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//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-10-11T00:48:29.825877" 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/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-10-11T00:48:29.830054" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.830238" 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-10-11T00:48:29.830432" 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-10-11T00:48:29.830800" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:29.830655" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:29.830641" 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-10-11T00:48:29.831043" 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-10-11T00:48:29.831220" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.831382" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:29.830614" elapsed="0.000838"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:29.830501" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.831628" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:29.831726" elapsed="0.000017"/>
</return>
<msg time="2026-10-11T00:48:29.831837" 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-10-11T00:48:29.803293" elapsed="0.028587"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:29.832048" elapsed="0.000317"/>
</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-10-11T00:48:29.833449" 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-10-11T00:48:29.833034" elapsed="0.000444"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:48:29.834033" 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-10-11T00:48:29.833628" 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-10-11T00:48:29.834243" 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-10-11T00:48:29.832658" elapsed="0.001964"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:29.832454" elapsed="0.002200"/>
</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-10-11T00:48:29.834867" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:29.834678" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.832436" elapsed="0.002502"/>
</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-10-11T00:48:29.799490" elapsed="0.035491"/>
</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-10-11T00:48:29.798808" elapsed="0.036239"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:29.798601" elapsed="0.036485"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.798585" elapsed="0.036523"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:29.835138" elapsed="0.000026"/>
</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-10-11T00:48:29.695201" elapsed="0.140035"/>
</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-10-11T00:48:29.692143" elapsed="0.143149"/>
</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-10-11T00:48:29.691703" elapsed="0.143631"/>
</kw>
<arg>filled_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="PASS" start="2026-10-11T00:48:29.691245" elapsed="0.144140"/>
</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-10-11T00:48:29.835962" elapsed="0.000228"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:48:29.835654" elapsed="0.000593"/>
</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-10-11T00:48:29.592624" elapsed="0.243658"/>
</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-10-11T00:48:29.837613" elapsed="0.000196"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:48:29.837345" 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-10-11T00:48:29.838768" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:29.838682" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.838665" 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-10-11T00:48:29.841004" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:29.840921" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.840903" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.841985" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:29.841646" elapsed="0.000371"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.842447" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:48:29.842169" elapsed="0.000304"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:48:29.842513" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:48:29.842639" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:48:29.841273" elapsed="0.001389"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:29.845177" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:29.845093" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.845075" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:29.846293" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:29.846209" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.846191" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:48:29.846697" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:48:29.846526" elapsed="0.000195"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:48:29.847047" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:48:29.846902" elapsed="0.000168"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:48:29.897998" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:48:29.847575" elapsed="0.050514"/>
</kw>
<msg time="2026-10-11T00:48:29.898241" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:48:29.898283" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:29.847226" elapsed="0.051090"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:48:29.927760" 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-10-11T00:48:29.898879" elapsed="0.029008"/>
</kw>
<msg time="2026-10-11T00:48:29.928040" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:48:29.928082" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:29.898522" elapsed="0.029593"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.928390" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:29.928185" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.928167" elapsed="0.000319"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.928919" 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-10-11T00:48:29.928674" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.929240" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:29.929040" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.929023" elapsed="0.000287"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:48:29.929340" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:48:29.931890" elapsed="0.000116"/>
</kw>
<msg time="2026-10-11T00:48:29.932094" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:29.930727" 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-10-11T00:48:29.932550" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.932897" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:48:29.930127" 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-10-11T00:48:29.929632" 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-10-11T00:48:29.845951" elapsed="0.087262"/>
</kw>
<msg time="2026-10-11T00:48:29.933294" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:29.933334" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:29.845392" elapsed="0.087975"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:48:29.933547" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:48:29.933462" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.933443" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.933970" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.934276" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:48:29.934339" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:48:29.844788" elapsed="0.089661"/>
</kw>
<msg time="2026-10-11T00:48:29.934534" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:29.934574" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:29.843008" elapsed="0.091599"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.934911" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:29.934675" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.934659" elapsed="0.000324"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:48:29.842864" elapsed="0.092140"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:48:29.842708" elapsed="0.092323"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:48:29.840604" elapsed="0.094474"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:48:29.838429" elapsed="0.096698"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:29.838024" elapsed="0.097144"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:48:29.837008" elapsed="0.098206"/>
</kw>
<kw name="Kill_BGP_Speaker" owner="BGPSpeaker">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.936476" 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-10-11T00:48:29.936160" elapsed="0.000343"/>
</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-10-11T00:48:29.936656" elapsed="0.000177"/>
</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-10-11T00:48:29.935878" elapsed="0.001027"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:48:29.963724" level="INFO">^C
[?2004h[jenkins@releng-26932-423-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-10-11T00:48:29.937391" elapsed="0.026391"/>
</kw>
<msg time="2026-10-11T00:48:29.963885" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:29.963925" level="INFO">${message} = ^C
[?2004h[jenkins@releng-26932-423-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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:29.937060" elapsed="0.026888"/>
</kw>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:48:29.964598" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-10-11T00:48:29.977592" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:48:29.977682" level="INFO">${output_log} = 2026-10-11 00:48:19,515 INFO BGP-Thread-1 (job): Connecting in the listening mode.
2026-10-11 00:48:24,104 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:48:24,105 INFO BGP-Thread-1 (job): O...</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-10-11T00:48:29.964446" elapsed="0.013260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.978150" level="INFO">2026-10-11 00:48:19,515 INFO BGP-Thread-1 (job): Connecting in the listening mode.
2026-10-11 00:48:24,104 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:48:24,105 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:48:24,106 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:48:24,107 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:48:24,107 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 3
2026-10-11 00:48:24,107 INFO BGP-Thread-1 (job):   Prefix base: 8.0.0.240/28
2026-10-11 00:48:24,107 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 00:48:24,107 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 00:48:24,107 INFO BGP-Thread-1 (job):   My BGP Identifier: 169782023
2026-10-11 00:48:24,107 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 00:48:24,107 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 00:48:24,107 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 00:48:24,107 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 2
2026-10-11 00:48:24,107 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 1
2026-10-11 00:48:24,107 INFO BGP-Thread-1 (job):   Fast pre-fill up to 2 prefixes
2026-10-11 00:48:24,107 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 1
2026-10-11 00:48:24,108 INFO BGP-Thread-1 (job):   Common single UPDATE will be generated for both NLRI &amp; WITHDRAWN lists
2026-10-11 00:48:24,108 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 00:48:24,110 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 3
2026-10-11 00:48:24,110 INFO BGP-Thread-1 (job): All update messages generated.
2026-10-11 00:48:24,110 INFO BGP-Thread-1 (job): Storing performance results.
2026-10-11 00:48:24,110 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-10-11 00:48:24,110 INFO BGP-Thread-1 (job): Number of iterations: 2
2026-10-11 00:48:24,110 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 1
2026-10-11 00:48:24,110 INFO BGP-Thread-1 (job): The pre-fill phase duration: 5.745887756347656e-05s
2026-10-11 00:48:24,110 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 1
2026-10-11 00:48:24,110 INFO BGP-Thread-1 (job): The 2nd test phase duration: 3.0994415283203125e-05s
2026-10-11 00:48:24,110 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-10-11 00:48:24,111 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-10-11 00:48:24,111 INFO BGP-Thread-1 (job):   
2026-10-11 00:48:24,111 INFO BGP-Thread-1 (job):   
2026-10-11 00:48:24,111 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-10-11 00:48:24,111 INFO BGP-Thread-1 (job):   
2026-10-11 00:48:24,111 INFO BGP-Thread-1 (job):   
2026-10-11 00:48:24,111 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-10-11 00:48:24,111 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:48:24,112 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:48:24,112 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:48:24,119 INFO BGP-Thread-1 (job): ... idle for 0.007s
2026-10-11 00:48:24,119 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.007s
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-10-11T00:48:29.977921" elapsed="0.000304"/>
</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-10-11T00:48:29.964125" elapsed="0.014152"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<status status="PASS" start="2026-10-11T00:48:29.978443" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-10-11T00:48:29.978334" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.978317" elapsed="0.000206"/>
</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-10-11T00:48:29.978711" elapsed="0.000020"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was not seen within timeout period.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.978891" elapsed="0.000020"/>
</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-10-11T00:48:29.935565" elapsed="0.043398"/>
</kw>
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.979744" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:48:29.979455" elapsed="0.000327"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-10-11T00:48:29.979139" elapsed="0.000696"/>
</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-10-11T00:48:29.980349" elapsed="0.000213"/>
</kw>
<doc>This is just a more readable 'None' to override [Teardown].</doc>
<status status="PASS" start="2026-10-11T00:48:29.980075" elapsed="0.000537"/>
</kw>
<doc>Abort the Python speaker. Also, attempt to stop failing fast.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:48:29.836507" elapsed="0.144137"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:29.982091" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:29.981889" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.981871" elapsed="0.000293"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-10-11T00:48:29.981700" 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-10-11T00:48:29.983383" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:29.983299" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.983281" elapsed="0.000182"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:29.985457" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:29.985358" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.985340" elapsed="0.000179"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.986428" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:29.986091" elapsed="0.000363"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:48:29.986879" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:48:29.986606" elapsed="0.000298"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:48:29.986944" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:48:29.987069" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:48:29.985724" elapsed="0.001368"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:29.989570" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:29.989485" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.989466" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:29.990678" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:29.990594" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:29.990577" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:48:29.991066" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:48:29.990897" elapsed="0.000193"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:48:29.991384" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:48:29.991252" elapsed="0.000170"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:48:30.035487" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:48:29.991933" elapsed="0.043647"/>
</kw>
<msg time="2026-10-11T00:48:30.035727" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:48:30.035787" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:29.991580" elapsed="0.044242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:48:30.070072" 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-10-11T00:48:30.036357" elapsed="0.033815"/>
</kw>
<msg time="2026-10-11T00:48:30.070321" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:48:30.070362" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:30.036015" elapsed="0.034380"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:30.070704" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:30.070491" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:30.070472" elapsed="0.000304"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:30.071205" 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-10-11T00:48:30.070974" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:30.071547" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:30.071330" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:30.071313" elapsed="0.000339"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:48:30.071684" 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-10-11T00:48:30.074197" elapsed="0.000113"/>
</kw>
<msg time="2026-10-11T00:48:30.074366" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:30.073174" elapsed="0.001341"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:30.074814" elapsed="0.000109"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:30.075181" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:48:30.072581" elapsed="0.002783"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:48:30.071978" elapsed="0.003468"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:48:29.990316" elapsed="0.085205"/>
</kw>
<msg time="2026-10-11T00:48:30.075604" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:30.075643" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:29.989783" elapsed="0.085893"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:48:30.075829" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-10-11T00:48:30.075744" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:30.075727" elapsed="0.000195"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:30.076241" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:30.076588" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:48:30.076652" 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-10-11T00:48:29.989183" elapsed="0.087556"/>
</kw>
<msg time="2026-10-11T00:48:30.076822" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:30.076878" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:29.987432" elapsed="0.089481"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:30.077202" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:30.076981" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:30.076964" elapsed="0.000310"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:48:29.987273" elapsed="0.090022"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:48:29.987136" elapsed="0.090184"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:48:29.985065" elapsed="0.092303"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:48:29.983046" elapsed="0.094397"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:29.982386" elapsed="0.095100"/>
</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-10-11T00:48:29.981316" elapsed="0.096216"/>
</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-10-11T00:48:30.093891" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:30.093565" elapsed="0.000353"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:30.094635" 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-10-11T00:48:30.094396" elapsed="0.000336">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-10-11T00:48:30.094817" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:30.094078" elapsed="0.000762"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:30.095340" 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-10-11T00:48:30.095031" elapsed="0.000334"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:30.095668" 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-10-11T00:48:30.095796" 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-10-11T00:48:30.095553" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:30.096250" 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-10-11T00:48:30.096031" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:30.097535" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:30.096993" elapsed="0.000600"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:48:30.098256" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:48:30.097772" elapsed="0.000508"/>
</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-10-11T00:48:30.098639" 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-10-11T00:48:30.099337" elapsed="0.000046"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:48:30.099703" elapsed="0.000043"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:48:30.098453" elapsed="0.001423"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:48:30.098324" elapsed="0.001616"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:48:30.099983" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:48:30.100117" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:48:30.096622" elapsed="0.003518"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:30.096353" elapsed="0.003816"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:30.100339" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:30.100191" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:30.096335" elapsed="0.004107"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:30.101002" 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-10-11T00:48:30.100603" elapsed="0.000425"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:30.101074" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:30.093044" elapsed="0.008129"/>
</kw>
<msg time="2026-10-11T00:48:30.101221" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:30.088751" elapsed="0.012514"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:30.105512" 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/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-10-11T00:48:30.109539" 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/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-10-11T00:48:30.113611" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:30.113795" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:30.113987" 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-10-11T00:48:30.114324" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:30.114180" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:30.114167" 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-10-11T00:48:30.114568" 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-10-11T00:48:30.114752" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:30.114927" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:30.114142" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:30.114054" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:30.115147" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:30.115214" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:48:30.115322" 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-10-11T00:48:30.088133" elapsed="0.027213"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:30.116474" 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-10-11T00:48:30.116272" elapsed="0.000263">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-10-11T00:48:30.116618" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:30.115949" elapsed="0.000692"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:30.116939" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:30.116705" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:30.117461" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:30.117179" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:30.117015" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:30.116688" elapsed="0.000849"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:30.118055" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:30.117703" elapsed="0.000376"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:48:30.118124" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:48:30.118247" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:48:30.115629" elapsed="0.002640"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:30.119688" 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-10-11T00:48:30.119501" elapsed="0.000245">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-10-11T00:48:30.119831" 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-10-11T00:48:30.119165" elapsed="0.000703"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:48:30.120030" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:48:30.119931" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:30.119914" elapsed="0.000193"/>
</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-10-11T00:48:30.120262" elapsed="0.000019"/>
</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-10-11T00:48:30.120452" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:48:30.120512" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:48:30.120636" 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-10-11T00:48:30.118568" elapsed="0.002091"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:30.121901" 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-10-11T00:48:30.121660" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:30.122349" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:30.122133" elapsed="0.000255"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:48:30.129103" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:48:30.129222" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:48:30.129310" 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-10-11T00:48:30.122690" elapsed="0.006645"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:30.122464" elapsed="0.006910"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:30.129576" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:30.129398" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:30.122447" elapsed="0.007207"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:30.130930" 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-10-11T00:48:30.130587" elapsed="0.000387"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:30.130329" elapsed="0.000676"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:30.130312" elapsed="0.000716"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:30.131603" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:30.131317" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:30.131078" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:30.131063" elapsed="0.000636"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:30.132257" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:30.131901" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:30.132571" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:30.132346" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:30.133085" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:30.132807" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:30.132646" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:30.132329" elapsed="0.000832"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:30.133726" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:30.133365" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:30.134045" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:30.133815" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:30.134564" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:30.134279" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:30.134119" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:30.133798" elapsed="0.000842"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:30.134784" elapsed="0.000310"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:48:30.135503" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:30.135255" elapsed="0.000272"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:48:30.135680" elapsed="0.000228"/>
</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-10-11T00:48:30.129993" elapsed="0.005972"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:30.136109" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:30.136027" elapsed="0.000122"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:30.136010" elapsed="0.000159"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:48:30.136795" 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-10-11T00:48:30.136309" elapsed="0.000513"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:48:30.136889" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:48:30.137016" 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-10-11T00:48:30.120957" elapsed="0.016084"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:30.137094" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:48:30.137215" 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-10-11T00:48:30.080803" elapsed="0.056436"/>
</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-10-11T00:48:30.148201" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:30.147475" elapsed="0.000753"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:30.150261" 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-10-11T00:48:30.149777" elapsed="0.000596">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-10-11T00:48:30.150518" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:30.148387" elapsed="0.002155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:30.151371" 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-10-11T00:48:30.150723" elapsed="0.000674"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:30.151834" 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-10-11T00:48:30.152061" 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-10-11T00:48:30.151606" elapsed="0.000481"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:30.152814" 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-10-11T00:48:30.152283" elapsed="0.000604"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:48:30.153635" elapsed="0.000075"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:30.152951" elapsed="0.000833"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:30.154623" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:30.154016" elapsed="0.000646"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:30.153808" elapsed="0.000939"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:30.152933" elapsed="0.001836"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:30.155782" 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-10-11T00:48:30.154947" elapsed="0.000861"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:30.155872" 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-10-11T00:48:30.146957" elapsed="0.009019"/>
</kw>
<msg time="2026-10-11T00:48:30.156022" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:30.142620" elapsed="0.013447"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:30.160124" 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/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-10-11T00:48:30.164138" 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/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-10-11T00:48:30.169177" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:30.169361" 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-10-11T00:48:30.169558" 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-10-11T00:48:30.169972" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:30.169814" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:30.169800" 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-10-11T00:48:30.170199" 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-10-11T00:48:30.170438" 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-10-11T00:48:30.170605" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:30.169772" elapsed="0.000881"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:30.169626" elapsed="0.001050"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:30.170872" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:30.170940" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:48:30.171047" 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-10-11T00:48:30.141900" elapsed="0.029172"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:30.171237" elapsed="0.000332"/>
</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-10-11T00:48:30.172510" 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-10-11T00:48:30.172218" elapsed="0.000320"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:48:30.172962" 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-10-11T00:48:30.172688" 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-10-11T00:48:30.173169" elapsed="0.000299"/>
</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-10-11T00:48:30.171839" elapsed="0.001683"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:30.171639" elapsed="0.001913"/>
</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-10-11T00:48:30.173749" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:30.173575" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:30.171622" elapsed="0.002195"/>
</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-10-11T00:48:30.138202" elapsed="0.035671"/>
</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-10-11T00:48:30.137534" elapsed="0.036405"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:30.137312" elapsed="0.036666"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:30.137295" elapsed="0.036704"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:30.174028" elapsed="0.000026"/>
</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-10-11T00:48:30.080169" elapsed="0.093958"/>
</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-10-11T00:48:30.078533" elapsed="0.095646"/>
</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-10-11T00:48:30.078024" elapsed="0.096194"/>
</kw>
<arg>empty_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="PASS" start="2026-10-11T00:48:30.077654" elapsed="0.096613"/>
</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-10-11T00:48:30.174818" elapsed="0.000238"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:48:30.174525" elapsed="0.000587"/>
</kw>
<doc>Post-condition: Check example-ipv4-topology is empty again.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:48:29.980824" elapsed="0.194360"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:30.176951" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:30.176738" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:30.176721" elapsed="0.000303"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-10-11T00:48:30.176568" elapsed="0.000497"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:30.177968" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:30.177885" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:30.177867" elapsed="0.000163"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:30.180246" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:30.180164" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:30.180147" elapsed="0.000160"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:30.181218" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:30.180896" elapsed="0.000347"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:48:30.181677" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:48:30.181396" elapsed="0.000305"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:48:30.181741" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:48:30.181888" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:48:30.180527" elapsed="0.001386"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:30.184460" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:30.184322" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:30.184304" elapsed="0.000219"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:30.185586" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:30.185503" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:30.185486" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:48:30.185983" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:48:30.185793" elapsed="0.000214"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:48:30.186306" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:48:30.186171" elapsed="0.000159"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:48:30.226364" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:48:30.186830" elapsed="0.039647"/>
</kw>
<msg time="2026-10-11T00:48:30.226631" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:48:30.226671" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:30.186502" elapsed="0.040202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:48:30.253791" 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-10-11T00:48:30.227221" elapsed="0.026676"/>
</kw>
<msg time="2026-10-11T00:48:30.254047" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:48:30.254088" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:30.226885" elapsed="0.027235"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:30.254396" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:30.254189" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:30.254171" elapsed="0.000321"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:30.254952" 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-10-11T00:48:30.254673" elapsed="0.000339"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:30.255273" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:30.255072" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:30.255055" elapsed="0.000288"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:48:30.255373" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:48:30.257730" elapsed="0.000249"/>
</kw>
<msg time="2026-10-11T00:48:30.258039" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:30.256745" 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-10-11T00:48:30.258491" elapsed="0.000072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:30.258819" 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-10-11T00:48:30.256131" 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-10-11T00:48:30.255660" elapsed="0.003416"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:48:30.185222" elapsed="0.073927"/>
</kw>
<msg time="2026-10-11T00:48:30.259230" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:30.259269" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:30.184686" elapsed="0.074616"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:48:30.259480" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:48:30.259370" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:30.259353" elapsed="0.000204"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:30.259892" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:30.260198" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:48:30.260261" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:48:30.184039" elapsed="0.076307"/>
</kw>
<msg time="2026-10-11T00:48:30.260452" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:30.260493" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:30.182234" elapsed="0.078291"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:30.260817" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:30.260593" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:30.260577" elapsed="0.000321"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:48:30.182094" elapsed="0.078825"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:48:30.181958" elapsed="0.078988"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:48:30.179872" elapsed="0.081120"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:48:30.177623" elapsed="0.083417"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:30.177210" 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-10-11T00:48:30.176180" elapsed="0.084945"/>
</kw>
<kw name="Start_BGP_Speaker" owner="BGPSpeaker">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:30.262099" level="INFO">${command} = python3 play.py --amount 2 --listen --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:30.261793" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:30.262595" level="INFO">python3 play.py --amount 2 --listen --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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-10-11T00:48:30.262358" elapsed="0.000280"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:48:30.266317" level="INFO">python3 play.py --amount 2 --listen --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --prefill=0 --insert=3 --withdraw=1 --updates=single --info &amp;&gt; play.py.out</msg>
<msg time="2026-10-11T00:48:30.266400" level="INFO">${output} =  python3 play.py --amount 2 --listen --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --prefill=0 --insert=3 --withdraw=1 --updates=single --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-10-11T00:48:30.262793" elapsed="0.003646"/>
</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-10-11T00:48:30.261321" elapsed="0.005173"/>
</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-10-11T00:48:40.268312" 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-10-11T00:48:30.268032" elapsed="10.000930">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-10-11T00:48:40.269285" elapsed="0.000029"/>
</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-10-11T00:48:30.267742" elapsed="10.001701">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-10-11T00:48:30.267367" elapsed="10.002201"/>
</kw>
<msg time="2026-10-11T00:48:40.269670" 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-10-11T00:48:30.266999" elapsed="10.002696"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-10-11T00:48:40.269873" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-10-11T00:48:40.269799" elapsed="0.000135"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.269772" elapsed="0.000186"/>
</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-10-11T00:48:40.270183" elapsed="0.000026"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.270363" 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-10-11T00:48:30.266713" elapsed="10.003742"/>
</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-10-11T00:48:40.271063" elapsed="0.000278"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:48:40.270709" elapsed="0.000692"/>
</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="PASS" start="2026-10-11T00:48:30.175628" elapsed="10.095822"/>
</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">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.272998" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.272745" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.272728" elapsed="0.000345"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-10-11T00:48:40.272569" 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-10-11T00:48:40.274398" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:40.274312" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.274294" elapsed="0.000184"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:40.276496" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:40.276397" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.276380" elapsed="0.000179"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.277503" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:40.277153" elapsed="0.000376"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.277972" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:48:40.277682" elapsed="0.000412"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:48:40.278139" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:48:40.278270" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:48:40.276786" 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-10-11T00:48:40.280818" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:40.280715" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.280698" elapsed="0.000183"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:40.281966" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:40.281881" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.281864" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:48:40.282353" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:48:40.282178" elapsed="0.000200"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:48:40.282710" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:48:40.282568" elapsed="0.000166"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:48:40.323862" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:48:40.283349" elapsed="0.040616"/>
</kw>
<msg time="2026-10-11T00:48:40.324126" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:48:40.324171" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:40.282908" elapsed="0.041297"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:48:40.362638" level="INFO">". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "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 "_ "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-10-11T00:48:40.324753" elapsed="0.037984"/>
</kw>
<msg time="2026-10-11T00:48:40.362912" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:48:40.362954" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "i "n "g "_ "C "o "n "n "e "c "t "i "o "n "_ "I "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:40.324380" elapsed="0.038609"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.363272" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.363059" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.363041" elapsed="0.000304"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.363817" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "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 "_ "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-10-11T00:48:40.363566" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.364144" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.363943" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.363926" elapsed="0.000290"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:48:40.364245" 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-10-11T00:48:40.366817" elapsed="0.000117"/>
</kw>
<msg time="2026-10-11T00:48:40.366993" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:40.365801" elapsed="0.001325"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.367543" elapsed="0.000081"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.367904" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:48:40.365040" 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-10-11T00:48:40.364551" elapsed="0.003634"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:48:40.281606" elapsed="0.086656"/>
</kw>
<msg time="2026-10-11T00:48:40.368344" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:40.368383" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "i "n "g "_ "C "o "n "n "e "c "t "i "o "n "_ "I "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:40.281033" elapsed="0.087409"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:48:40.368601" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:48:40.368514" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.368496" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.369017" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.369319" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:48:40.369384" 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-10-11T00:48:40.280428" elapsed="0.089067"/>
</kw>
<msg time="2026-10-11T00:48:40.369579" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:40.369619" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "i "n "g "_ "C "o "n "n "e "c "t "i "o "n "_ "I "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:40.278649" elapsed="0.091003"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.369951" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.369719" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.369703" elapsed="0.000319"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:48:40.278505" elapsed="0.091538"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:48:40.278343" elapsed="0.091730"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:48:40.276101" elapsed="0.094021"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:48:40.274047" elapsed="0.096124"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:40.273264" elapsed="0.096948"/>
</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-10-11T00:48:40.272148" elapsed="0.098111"/>
</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-10-11T00:48:40.373884" level="INFO">Executing command 'netstat --version'.</msg>
<msg time="2026-10-11T00:48:40.386773" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:48:40.386865" 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-10-11T00:48:40.373793" elapsed="0.013095"/>
</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-10-11T00:48:40.387229" elapsed="0.000022"/>
</kw>
<msg time="2026-10-11T00:48:40.387282" 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-10-11T00:48:40.386955" elapsed="0.000374">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-10-11T00:48:40.386937" elapsed="0.000464">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-10-11T00:48:40.373480" elapsed="0.014056">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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:40.373100" elapsed="0.014496"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:48:40.387945" level="INFO">Executing command 'netstat -punta 2&gt; /dev/null | grep -E ":17900 .+ ESTABLISHED .+python" | wc -l'.</msg>
<msg time="2026-10-11T00:48:40.436689" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:48:40.436828" level="INFO">${output} = 1</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="PASS" start="2026-10-11T00:48:40.387797" elapsed="0.049065"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-11T00:48:40.436927" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T00:48:40.437111" level="INFO">${output} = 1</msg>
<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="PASS" start="2026-10-11T00:48:40.372787" elapsed="0.064356"/>
</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="PASS" start="2026-10-11T00:48:40.437383" elapsed="0.000470"/>
</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="PASS" start="2026-10-11T00:48:40.372434" elapsed="0.065502"/>
</kw>
<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="PASS" start="2026-10-11T00:48:40.370789" elapsed="0.067208"/>
</kw>
<doc>Give it several tries to see exactly one established connection.</doc>
<status status="PASS" start="2026-10-11T00:48:40.370378" elapsed="0.067693"/>
</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-10-11T00:48:40.438887" elapsed="0.000658"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:48:40.438430" elapsed="0.001204"/>
</kw>
<doc>See TCP (BGP) connection in established state.</doc>
<status status="PASS" start="2026-10-11T00:48:40.271653" elapsed="0.168031"/>
</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">
<arg>SKIPPED due to a failure in a previous fundamental test case.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.442038" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.441720" elapsed="0.000394"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.441695" elapsed="0.000452"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-10-11T00:48:40.441464" elapsed="0.000747"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:40.443580" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:40.443455" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.443402" elapsed="0.000270"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:40.446593" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:40.446470" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.446444" elapsed="0.000239"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.448053" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:40.447555" elapsed="0.000535"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.448728" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:48:40.448316" elapsed="0.000507"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:48:40.448887" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T00:48:40.449079" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:48:40.447008" elapsed="0.002104"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:40.452978" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:40.452854" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.452828" elapsed="0.000242"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:40.454626" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:40.454503" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.454477" elapsed="0.000240"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:48:40.455201" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:48:40.454954" elapsed="0.000284"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:48:40.455701" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:48:40.455502" elapsed="0.000233"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:48:40.497050" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:48:40.456497" elapsed="0.040648"/>
</kw>
<msg time="2026-10-11T00:48:40.497294" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:48:40.497336" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:40.455986" elapsed="0.041382"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:48:40.531272" level="INFO">". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "i "n "g "_ "T "o "p "o "l "o "g "y "_ "I "s "_ "F "i "l "l "e "d "_ "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-10-11T00:48:40.497910" elapsed="0.033459"/>
</kw>
<msg time="2026-10-11T00:48:40.531543" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:48:40.531584" level="INFO">${message_wait} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "i "n "g "_ "T "o "p "o "l "o "g "y "_ "I "s "_ "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:40.497559" elapsed="0.034059"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.531905" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.531686" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.531668" elapsed="0.000308"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.532382" level="INFO"> ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "i "n "g "_ "T "o "p "o "l "o "g "y "_ "I "s "_ "F "i "l "l "e "d "_ "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-10-11T00:48:40.532157" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.532722" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.532523" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.532506" elapsed="0.000303"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:48:40.532838" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:48:40.535287" elapsed="0.000135"/>
</kw>
<msg time="2026-10-11T00:48:40.535481" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:40.534193" 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-10-11T00:48:40.535929" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.536258" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:48:40.533589" elapsed="0.002873"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:48:40.533109" elapsed="0.003413"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:48:40.454096" elapsed="0.082534"/>
</kw>
<msg time="2026-10-11T00:48:40.536714" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:40.536753" level="INFO">${message} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "i "n "g "_ "T "o "p "o "l "o "g "y "_ "I "s "_ "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:40.453292" elapsed="0.083511"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:48:40.536958" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:48:40.536872" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.536855" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.537358" 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-10-11T00:48:40.537692" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:48:40.537776" 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-10-11T00:48:40.452394" elapsed="0.085472"/>
</kw>
<msg time="2026-10-11T00:48:40.537949" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:40.537989" level="INFO">${output} =  ". "t "x "t ". "B "a "s "i "c ". "C "h "e "c "k "_ "L "i "s "t "e "n "i "n "g "_ "T "o "p "o "l "o "g "y "_ "I "s "_ "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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:40.449618" elapsed="0.088403"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.538309" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.538089" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.538073" elapsed="0.000306"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:48:40.449382" elapsed="0.089018"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:48:40.449179" elapsed="0.089344"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:48:40.446023" elapsed="0.092551"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:48:40.443059" elapsed="0.095564"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:40.442450" elapsed="0.096213"/>
</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-10-11T00:48:40.440896" elapsed="0.097814"/>
</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-10-11T00:48:40.555027" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:40.554707" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:40.555804" 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-10-11T00:48:40.555544" elapsed="0.000329">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-10-11T00:48:40.555957" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:40.555211" elapsed="0.000768"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.556482" 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-10-11T00:48:40.556151" elapsed="0.000356"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:40.556799" 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-10-11T00:48:40.556942" 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-10-11T00:48:40.556674" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.557431" 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-10-11T00:48:40.557193" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.558707" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:40.558160" elapsed="0.000620"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.559440" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:48:40.558961" elapsed="0.000504"/>
</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-10-11T00:48:40.559811" elapsed="0.000043"/>
</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-10-11T00:48:40.560511" elapsed="0.000046"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:48:40.560863" elapsed="0.000043"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:48:40.559616" elapsed="0.001403"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:48:40.559508" elapsed="0.001572"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:48:40.561121" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:48:40.561253" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:48:40.557820" elapsed="0.003455"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:40.557536" elapsed="0.003768"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.561497" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.561326" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.557518" elapsed="0.004050"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.562147" 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-10-11T00:48:40.561727" elapsed="0.000445"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:40.562215" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:40.554189" elapsed="0.008124"/>
</kw>
<msg time="2026-10-11T00:48:40.562361" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:40.549750" elapsed="0.012655"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:40.566664" 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/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-10-11T00:48:40.570660" 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/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-10-11T00:48:40.574700" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.574894" 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-10-11T00:48:40.575110" 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-10-11T00:48:40.575469" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.575305" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:40.575291" 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-10-11T00:48:40.575697" 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-10-11T00:48:40.575892" 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-10-11T00:48:40.576056" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:40.575266" elapsed="0.000838"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:40.575178" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.576279" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:40.576345" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:48:40.576468" 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-10-11T00:48:40.549144" elapsed="0.027349"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:40.577602" 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-10-11T00:48:40.577400" elapsed="0.000261">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-10-11T00:48:40.577743" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:40.577078" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.578067" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.577845" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.578585" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:40.578304" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:40.578140" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.577828" elapsed="0.000832"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.579169" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:40.578835" elapsed="0.000357"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:48:40.579236" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:48:40.579359" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:48:40.576771" elapsed="0.002610"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:40.580479" 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-10-11T00:48:40.580278" elapsed="0.000259">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-10-11T00:48:40.580620" 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-10-11T00:48:40.579962" elapsed="0.000679"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:48:40.580819" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:48:40.580703" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.580686" elapsed="0.000211"/>
</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-10-11T00:48:40.581049" elapsed="0.000019"/>
</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-10-11T00:48:40.581260" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:48:40.581321" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:48:40.581463" 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-10-11T00:48:40.579650" elapsed="0.001837"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.582714" 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-10-11T00:48:40.582489" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.583175" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:40.582959" elapsed="0.000255"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:48:40.591366" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:48:40.591544" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:48:40.591649" 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-10-11T00:48:40.583518" elapsed="0.008157"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:40.583272" 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-10-11T00:48:40.591925" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.591739" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.583256" elapsed="0.008767"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.593318" 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-10-11T00:48:40.592974" elapsed="0.000389"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:40.592710" elapsed="0.000685"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.592693" elapsed="0.000739"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.594007" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:40.593723" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:40.593483" elapsed="0.000597"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.593468" elapsed="0.000635"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.594655" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:40.594275" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.594985" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.594741" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.595495" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:40.595218" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:40.595059" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.594725" elapsed="0.000845"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.596113" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:40.595741" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.596404" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.596199" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.596934" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:40.596655" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:40.596494" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.596183" elapsed="0.000826"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:40.597151" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:48:40.597914" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:40.597655" elapsed="0.000283"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:48:40.598093" elapsed="0.000212"/>
</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-10-11T00:48:40.592358" elapsed="0.006002"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:40.598522" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:40.598437" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.598419" elapsed="0.000162"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:48:40.599338" 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-10-11T00:48:40.598723" elapsed="0.000641"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:48:40.599426" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:48:40.599554" 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-10-11T00:48:40.581784" elapsed="0.017795"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:40.599633" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:48:40.599752" 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-10-11T00:48:40.542024" elapsed="0.057767"/>
</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-10-11T00:48:40.610793" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:40.610043" elapsed="0.000778"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:40.612862" 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-10-11T00:48:40.612355" elapsed="0.000620">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-10-11T00:48:40.613096" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:40.610980" elapsed="0.002139"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.613951" 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-10-11T00:48:40.613291" elapsed="0.000685"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:40.614334" 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-10-11T00:48:40.614573" 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-10-11T00:48:40.614143" elapsed="0.000456"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.615394" 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-10-11T00:48:40.614893" elapsed="0.000724"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:48:40.616262" elapsed="0.000074"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.615712" elapsed="0.000717"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.617248" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:40.616633" elapsed="0.000654"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:40.616456" elapsed="0.000907"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.615693" elapsed="0.001691"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.618392" 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-10-11T00:48:40.617589" elapsed="0.000848"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:40.618482" 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-10-11T00:48:40.609528" elapsed="0.009057"/>
</kw>
<msg time="2026-10-11T00:48:40.618634" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:40.605164" elapsed="0.013514"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:40.622779" 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/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-10-11T00:48:40.626778" 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/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-10-11T00:48:40.630911" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.631091" 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-10-11T00:48:40.631271" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.631658" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.631513" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:40.631499" 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-10-11T00:48:40.631898" 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-10-11T00:48:40.632075" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.632236" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:40.631471" elapsed="0.000812"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:40.631336" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.632470" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:40.632577" elapsed="0.000017"/>
</return>
<msg time="2026-10-11T00:48:40.632689" 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-10-11T00:48:40.604453" elapsed="0.028262"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:40.632900" elapsed="0.000314"/>
</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-10-11T00:48:40.634270" 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-10-11T00:48:40.633882" elapsed="0.000415"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:48:40.634862" 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-10-11T00:48:40.634463" 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-10-11T00:48:40.635099" elapsed="0.000279"/>
</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-10-11T00:48:40.633508" elapsed="0.001949"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:40.633284" elapsed="0.002204"/>
</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-10-11T00:48:40.635683" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.635510" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.633267" elapsed="0.002484"/>
</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-10-11T00:48:40.600747" elapsed="0.035060"/>
</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-10-11T00:48:40.600076" elapsed="0.035796"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:40.599864" elapsed="0.036047"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.599848" elapsed="0.036084"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:40.635962" elapsed="0.000025"/>
</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-10-11T00:48:40.541372" elapsed="0.094689"/>
</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-10-11T00:48:40.539662" elapsed="0.096452"/>
</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-10-11T00:48:40.539190" elapsed="0.096964"/>
</kw>
<arg>filled_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="PASS" start="2026-10-11T00:48:40.538841" elapsed="0.097363"/>
</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-10-11T00:48:40.636751" elapsed="0.000237"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:48:40.636459" elapsed="0.000585"/>
</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-10-11T00:48:40.440060" elapsed="0.197018"/>
</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-10-11T00:48:40.638565" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:48:40.638298" 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-10-11T00:48:40.639720" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:40.639633" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.639615" 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-10-11T00:48:40.643053" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:40.642969" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.642952" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.644037" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:40.643691" elapsed="0.000371"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.644491" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:48:40.644214" elapsed="0.000302"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:48:40.644556" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:48:40.644681" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:48:40.643319" elapsed="0.001385"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:40.647155" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:40.647072" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.647054" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:40.648288" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:40.648205" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.648188" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:48:40.648691" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:48:40.648520" elapsed="0.000195"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:48:40.649033" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:48:40.648894" elapsed="0.000162"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:48:40.679683" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:48:40.649554" elapsed="0.030254"/>
</kw>
<msg time="2026-10-11T00:48:40.679988" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:48:40.680031" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:40.649210" elapsed="0.030854"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:48:40.708887" 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-10-11T00:48:40.680608" elapsed="0.028376"/>
</kw>
<msg time="2026-10-11T00:48:40.709135" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:48:40.709176" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:40.680237" elapsed="0.028973"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.709512" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.709280" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.709261" elapsed="0.000325"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.710014" 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-10-11T00:48:40.709780" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.710335" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.710136" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.710119" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:48:40.710455" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:48:40.712886" elapsed="0.000235"/>
</kw>
<msg time="2026-10-11T00:48:40.713209" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:40.711834" elapsed="0.001507"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.713666" elapsed="0.000072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.714014" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:48:40.711207" elapsed="0.002990"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:48:40.710729" 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-10-11T00:48:40.647949" elapsed="0.066382"/>
</kw>
<msg time="2026-10-11T00:48:40.714437" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:40.714479" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:40.647366" elapsed="0.067147"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:48:40.714668" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:48:40.714582" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.714565" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.715082" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.715386" elapsed="0.000046"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:48:40.715476" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:48:40.646781" elapsed="0.068780"/>
</kw>
<msg time="2026-10-11T00:48:40.715644" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:40.715684" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:40.645039" elapsed="0.070678"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.716048" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.715830" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.715813" elapsed="0.000307"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:48:40.644899" elapsed="0.071242"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:48:40.644749" elapsed="0.071418"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:48:40.642647" elapsed="0.073567"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:48:40.639359" elapsed="0.076906"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:40.638976" elapsed="0.077329"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:48:40.637960" elapsed="0.078390"/>
</kw>
<kw name="Kill_BGP_Speaker" owner="BGPSpeaker">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.717623" 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-10-11T00:48:40.717312" elapsed="0.000337"/>
</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-10-11T00:48:40.717814" elapsed="0.000180"/>
</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-10-11T00:48:40.717037" elapsed="0.001010"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:48:40.741021" level="INFO">^C
[?2004h[jenkins@releng-26932-423-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-10-11T00:48:40.718552" elapsed="0.022526"/>
</kw>
<msg time="2026-10-11T00:48:40.741163" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:40.741201" level="INFO">${message} = ^C
[?2004h[jenkins@releng-26932-423-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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:40.718207" elapsed="0.023016"/>
</kw>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:48:40.741876" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-10-11T00:48:40.753915" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:48:40.754001" level="INFO">${output_log} = 2026-10-11 00:48:30,362 INFO BGP-Thread-1 (job): Connecting in the listening mode.
2026-10-11 00:48:34,974 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:48:34,974 INFO BGP-Thread-1 (job): O...</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-10-11T00:48:40.741713" elapsed="0.012313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.754472" level="INFO">2026-10-11 00:48:30,362 INFO BGP-Thread-1 (job): Connecting in the listening mode.
2026-10-11 00:48:34,974 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:48:34,974 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:48:34,976 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:48:34,976 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:48:34,976 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 2
2026-10-11 00:48:34,976 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-10-11 00:48:34,976 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 00:48:34,976 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 00:48:34,977 INFO BGP-Thread-1 (job):   My BGP Identifier: 169782023
2026-10-11 00:48:34,977 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 00:48:34,977 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 00:48:34,977 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 00:48:34,977 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 3
2026-10-11 00:48:34,977 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 1
2026-10-11 00:48:34,977 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 00:48:34,977 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 2
2026-10-11 00:48:34,977 INFO BGP-Thread-1 (job):   Common single UPDATE will be generated for both NLRI &amp; WITHDRAWN lists
2026-10-11 00:48:34,977 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 00:48:34,979 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 2
2026-10-11 00:48:34,979 INFO BGP-Thread-1 (job): All update messages generated.
2026-10-11 00:48:34,979 INFO BGP-Thread-1 (job): Storing performance results.
2026-10-11 00:48:34,979 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-10-11 00:48:34,979 INFO BGP-Thread-1 (job): Number of iterations: 1
2026-10-11 00:48:34,979 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-10-11 00:48:34,980 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-10-11 00:48:34,980 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 1
2026-10-11 00:48:34,980 INFO BGP-Thread-1 (job): The 2nd test phase duration: 6.532669067382812e-05s
2026-10-11 00:48:34,980 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-10-11 00:48:34,980 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-10-11 00:48:34,980 INFO BGP-Thread-1 (job):   
2026-10-11 00:48:34,980 INFO BGP-Thread-1 (job):   
2026-10-11 00:48:34,980 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-10-11 00:48:34,980 INFO BGP-Thread-1 (job):   
2026-10-11 00:48:34,980 INFO BGP-Thread-1 (job):   
2026-10-11 00:48:34,981 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-10-11 00:48:34,981 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:48:34,981 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:48:34,981 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:48:34,987 INFO BGP-Thread-1 (job): ... idle for 0.006s
2026-10-11 00:48:34,987 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.006s
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-10-11T00:48:40.754223" elapsed="0.000325"/>
</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-10-11T00:48:40.741397" elapsed="0.013201"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<status status="PASS" start="2026-10-11T00:48:40.754741" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-10-11T00:48:40.754654" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.754637" elapsed="0.000196"/>
</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-10-11T00:48:40.755022" elapsed="0.000019"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was not seen within timeout period.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.755187" elapsed="0.000018"/>
</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-10-11T00:48:40.716700" elapsed="0.038556"/>
</kw>
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.756038" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:48:40.755739" elapsed="0.000337"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-10-11T00:48:40.755445" elapsed="0.000684"/>
</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-10-11T00:48:40.756641" elapsed="0.000215"/>
</kw>
<doc>This is just a more readable 'None' to override [Teardown].</doc>
<status status="PASS" start="2026-10-11T00:48:40.756352" elapsed="0.000554"/>
</kw>
<doc>Abort the Python speaker. Also, attempt to stop failing fast.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:48:40.637449" elapsed="0.119490"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.758480" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.758263" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.758247" elapsed="0.000307"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-10-11T00:48:40.758095" 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-10-11T00:48:40.759747" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:40.759657" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.759434" 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-10-11T00:48:40.761839" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:40.761736" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.761719" elapsed="0.000182"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.762815" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:40.762477" elapsed="0.000363"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.763255" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:48:40.762994" elapsed="0.000285"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:48:40.763319" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:48:40.763460" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:48:40.762106" elapsed="0.001378"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:40.765956" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:40.765873" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.765855" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:40.767050" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:40.766966" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.766949" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:48:40.767446" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:48:40.767257" elapsed="0.000215"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:48:40.767783" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:48:40.767634" elapsed="0.000174"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:48:40.804372" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:48:40.768290" elapsed="0.036199"/>
</kw>
<msg time="2026-10-11T00:48:40.804656" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:48:40.804699" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:40.767965" elapsed="0.036767"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:48:40.838052" 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-10-11T00:48:40.805312" elapsed="0.032841"/>
</kw>
<msg time="2026-10-11T00:48:40.838305" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:48:40.838347" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:40.804925" elapsed="0.033455"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.838685" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.838476" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.838457" elapsed="0.000331"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.839202" 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-10-11T00:48:40.838973" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.839543" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.839325" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.839309" elapsed="0.000342"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:48:40.839682" 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-10-11T00:48:40.842276" elapsed="0.000116"/>
</kw>
<msg time="2026-10-11T00:48:40.842466" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:40.841063" elapsed="0.001536"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.842918" elapsed="0.000072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.843252" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:48:40.840463" elapsed="0.002992"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:48:40.839975" elapsed="0.003543"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:48:40.766698" elapsed="0.076895"/>
</kw>
<msg time="2026-10-11T00:48:40.843677" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:40.843717" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:40.766168" elapsed="0.077583"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:48:40.843919" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:48:40.843833" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.843816" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.844314" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.844663" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:48:40.844728" 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-10-11T00:48:40.765572" elapsed="0.079260"/>
</kw>
<msg time="2026-10-11T00:48:40.844916" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:40.844956" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:40.763823" elapsed="0.081167"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.845279" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.845058" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.845042" elapsed="0.000309"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:48:40.763667" elapsed="0.081705"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:48:40.763530" elapsed="0.081870"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:48:40.761444" elapsed="0.084029"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:48:40.759186" elapsed="0.086338"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:40.758793" elapsed="0.086772"/>
</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-10-11T00:48:40.757711" elapsed="0.087901"/>
</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-10-11T00:48:40.861906" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:40.861575" elapsed="0.000360"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:40.862665" 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-10-11T00:48:40.862426" elapsed="0.000351">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-10-11T00:48:40.862865" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:40.862093" elapsed="0.000795"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.863373" 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-10-11T00:48:40.863063" elapsed="0.000335"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:40.863701" 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-10-11T00:48:40.863844" 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-10-11T00:48:40.863589" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.864283" 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-10-11T00:48:40.864063" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.865569" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:40.865026" elapsed="0.000600"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.866285" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:48:40.865827" elapsed="0.000482"/>
</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-10-11T00:48:40.866666" 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-10-11T00:48:40.867355" elapsed="0.000047"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:48:40.867715" elapsed="0.000057"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:48:40.866482" elapsed="0.001407"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:48:40.866352" elapsed="0.001604"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:48:40.867999" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:48:40.868132" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:48:40.864658" elapsed="0.003497"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:40.864386" elapsed="0.003798"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.868355" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.868207" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.864368" elapsed="0.004087"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.869007" 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-10-11T00:48:40.868615" elapsed="0.000418"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:40.869077" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:40.861052" elapsed="0.008123"/>
</kw>
<msg time="2026-10-11T00:48:40.869223" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:40.856593" elapsed="0.012675"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:40.873571" 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/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-10-11T00:48:40.877575" 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/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-10-11T00:48:40.881621" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.881816" 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-10-11T00:48:40.881998" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.882336" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.882190" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:40.882176" 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-10-11T00:48:40.882581" 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-10-11T00:48:40.882789" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.882957" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:40.882151" elapsed="0.000854"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:40.882063" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.883177" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:40.883242" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:48:40.883349" 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-10-11T00:48:40.855982" elapsed="0.027391"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:40.884501" 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-10-11T00:48:40.884299" elapsed="0.000262">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-10-11T00:48:40.884645" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:40.883978" elapsed="0.000690"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.884970" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.884732" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.885669" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:40.885386" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:40.885214" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.884715" elapsed="0.001030"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.886265" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:40.885924" elapsed="0.000365"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:48:40.886335" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:48:40.886475" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:48:40.883659" elapsed="0.002840"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:40.887625" 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-10-11T00:48:40.887440" elapsed="0.000243">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-10-11T00:48:40.887786" 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-10-11T00:48:40.887104" elapsed="0.000706"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:48:40.887972" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:48:40.887874" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.887856" elapsed="0.000192"/>
</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-10-11T00:48:40.888202" elapsed="0.000020"/>
</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-10-11T00:48:40.888378" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:48:40.888454" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:48:40.888580" 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-10-11T00:48:40.886799" elapsed="0.001804"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.889858" 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-10-11T00:48:40.889618" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.890310" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:40.890092" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:48:40.897720" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:48:40.897870" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:48:40.897974" 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-10-11T00:48:40.890656" elapsed="0.007343"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:40.890425" elapsed="0.007614"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.898216" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.898062" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.890394" 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-10-11T00:48:40.899574" 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-10-11T00:48:40.899230" elapsed="0.000387"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:40.898985" elapsed="0.000663"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.898968" elapsed="0.000703"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.900243" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:40.899975" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:40.899720" elapsed="0.000596"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.899705" elapsed="0.000632"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.900894" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:40.900526" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.901190" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.900982" elapsed="0.000259"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.901701" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:40.901436" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:40.901262" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.900966" elapsed="0.000830"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.902374" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:40.902001" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.902691" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.902481" elapsed="0.000261"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.903211" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:40.902948" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:40.902780" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.902464" elapsed="0.000822"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:40.903444" elapsed="0.000293"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:48:40.904146" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:40.903911" elapsed="0.000259"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:48:40.904324" elapsed="0.000230"/>
</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-10-11T00:48:40.898635" elapsed="0.005975"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:40.904753" elapsed="0.000044"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:40.904671" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.904654" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:48:40.905644" 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-10-11T00:48:40.904989" elapsed="0.000682"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:48:40.905719" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:48:40.905862" 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-10-11T00:48:40.888902" elapsed="0.016985"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:40.905941" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:48:40.906062" 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-10-11T00:48:40.848779" elapsed="0.057307"/>
</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-10-11T00:48:40.916895" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:40.916140" elapsed="0.000783"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:40.918963" 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-10-11T00:48:40.918477" elapsed="0.000598">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-10-11T00:48:40.919195" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:40.917079" elapsed="0.002139"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.920054" 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-10-11T00:48:40.919391" elapsed="0.000689"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:40.920500" 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-10-11T00:48:40.920715" 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-10-11T00:48:40.920246" elapsed="0.000494"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.921616" 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-10-11T00:48:40.920952" elapsed="0.000723"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:48:40.922280" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.921740" elapsed="0.000706"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.923256" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:40.922649" elapsed="0.000646"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:40.922472" elapsed="0.000898"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.921721" elapsed="0.001671"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.924401" 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-10-11T00:48:40.923612" elapsed="0.000834"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:40.924491" 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-10-11T00:48:40.915610" elapsed="0.008984"/>
</kw>
<msg time="2026-10-11T00:48:40.924639" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:40.911300" elapsed="0.013384"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:40.928961" 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/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-10-11T00:48:40.932960" 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/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-10-11T00:48:40.937098" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.937282" 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-10-11T00:48:40.937477" 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-10-11T00:48:40.937878" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.937699" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:40.937685" 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-10-11T00:48:40.938107" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.938328" 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-10-11T00:48:40.938514" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:40.937658" elapsed="0.000905"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:40.937544" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.938737" elapsed="0.000034"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:40.938821" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:48:40.938928" 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-10-11T00:48:40.910595" elapsed="0.028358"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:40.939118" elapsed="0.000334"/>
</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-10-11T00:48:40.940376" 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-10-11T00:48:40.940107" elapsed="0.000318"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:48:40.940854" 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-10-11T00:48:40.940579" 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-10-11T00:48:40.941063" elapsed="0.000277"/>
</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-10-11T00:48:40.939723" elapsed="0.001670"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:40.939523" elapsed="0.001922"/>
</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-10-11T00:48:40.941645" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.941469" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.939506" elapsed="0.002207"/>
</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-10-11T00:48:40.907048" elapsed="0.034720"/>
</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-10-11T00:48:40.906364" elapsed="0.035471"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:40.906159" elapsed="0.035715"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.906142" elapsed="0.035754"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:40.941925" elapsed="0.000026"/>
</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-10-11T00:48:40.848131" elapsed="0.093893"/>
</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-10-11T00:48:40.846605" elapsed="0.095473"/>
</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-10-11T00:48:40.846098" elapsed="0.096020"/>
</kw>
<arg>empty_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="PASS" start="2026-10-11T00:48:40.845727" elapsed="0.096441"/>
</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-10-11T00:48:40.942719" elapsed="0.000239"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:48:40.942426" elapsed="0.000588"/>
</kw>
<doc>Post-condition: Check example-ipv4-topology is empty again.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:48:40.757186" elapsed="0.185905"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:40.944683" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:40.944478" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.944461" elapsed="0.000307"/>
</if>
<doc>Mark (immediately) this test case as failed when fast-fail is enabled in suite.</doc>
<status status="PASS" start="2026-10-11T00:48:40.944285" 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-10-11T00:48:40.945710" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:40.945625" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.945608" elapsed="0.000182"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:40.947896" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:40.947813" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.947795" elapsed="0.000164"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.948896" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:40.948532" elapsed="0.000389"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:48:40.949334" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:48:40.949074" elapsed="0.000284"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:48:40.949398" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T00:48:40.949541" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:48:40.948164" elapsed="0.001400"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:40.952015" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:40.951932" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.951914" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:40.953125" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:40.953042" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:40.953026" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:48:40.953527" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:48:40.953335" elapsed="0.000216"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:48:40.953867" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:48:40.953716" elapsed="0.000175"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:48:40.990012" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:48:40.954375" elapsed="0.035738"/>
</kw>
<msg time="2026-10-11T00:48:40.990267" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:48:40.990308" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:40.954046" elapsed="0.036295"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:48:41.012612" 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-10-11T00:48:40.990897" elapsed="0.021814"/>
</kw>
<msg time="2026-10-11T00:48:41.012876" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:48:41.012917" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:40.990531" elapsed="0.022419"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:41.013224" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:41.013019" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:41.013001" elapsed="0.000294"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.013724" 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-10-11T00:48:41.013499" elapsed="0.000335"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:41.014104" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:41.013897" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:41.013879" elapsed="0.000296"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:48:41.014205" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:48:41.016623" elapsed="0.000245"/>
</kw>
<msg time="2026-10-11T00:48:41.016926" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:41.015580" 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-10-11T00:48:41.017358" elapsed="0.000095"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:41.017712" 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-10-11T00:48:41.014990" 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-10-11T00:48:41.014495" elapsed="0.003473"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:48:40.952781" elapsed="0.065259"/>
</kw>
<msg time="2026-10-11T00:48:41.018119" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:41.018159" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:40.952226" elapsed="0.065966"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:48:41.018345" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:48:41.018260" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:41.018242" 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-10-11T00:48:41.018792" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:41.019095" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:48:41.019159" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:48:40.951637" elapsed="0.067605"/>
</kw>
<msg time="2026-10-11T00:48:41.019324" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:41.019363" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:40.949901" elapsed="0.069496"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:41.019710" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:41.019490" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:41.019473" elapsed="0.000323"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:48:40.949747" elapsed="0.070071"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:48:40.949608" elapsed="0.070237"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:48:40.947507" elapsed="0.072385"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:48:40.945357" elapsed="0.074584"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:40.944959" elapsed="0.075023"/>
</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-10-11T00:48:40.943913" elapsed="0.076116"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.020826" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.171.7 | 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-10-11T00:48:41.020208" elapsed="0.000646"/>
</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-10-11T00:48:41.033827" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:41.033509" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:48:41.034510" 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-10-11T00:48:41.034323" elapsed="0.000247">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-10-11T00:48:41.034653" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:48:41.034010" elapsed="0.000665"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.035164" 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-10-11T00:48:41.034859" elapsed="0.000330"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:48:41.035478" 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-10-11T00:48:41.035598" 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-10-11T00:48:41.035354" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.036050" 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-10-11T00:48:41.035831" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.037016" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', '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-10-11T00:48:41.036783" elapsed="0.000275"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.037492" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:48:41.037231" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.038103" 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-10-11T00:48:41.037839" elapsed="0.000288"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:48:41.039017" 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-10-11T00:48:41.038827" elapsed="0.000216"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:48:41.039088" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:48:41.039214" 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-10-11T00:48:41.038476" elapsed="0.000761"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:48:41.039401" elapsed="0.000189"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:48:41.037694" elapsed="0.001934"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.040137" 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-10-11T00:48:41.039869" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:48:41.040849" 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-10-11T00:48:41.040653" elapsed="0.000220"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:48:41.040917" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:48:41.041038" 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-10-11T00:48:41.040329" elapsed="0.000732"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:48:41.041223" elapsed="0.000163"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-10-11T00:48:41.039726" elapsed="0.001711"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.041943" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:48:41.041664" elapsed="0.000303"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:48:41.042673" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:48:41.042496" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:48:41.042741" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T00:48:41.042882" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:48:41.042172" elapsed="0.000732"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:48:41.043066" elapsed="0.000162"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:48:41.041536" elapsed="0.001729"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.043789" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:48:41.043505" elapsed="0.000309"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:48:41.044476" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:48:41.044287" elapsed="0.000214"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:48:41.044545" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:48:41.044668" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:48:41.043982" elapsed="0.000709"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:48:41.044866" elapsed="0.000167"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:48:41.043363" elapsed="0.001707"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:48:41.037558" elapsed="0.007542"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:48:41.045138" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:48:41.045264" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:48:41.036401" elapsed="0.008886"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:41.036152" elapsed="0.009163"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:41.045498" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:41.045337" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:41.036135" elapsed="0.009432"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.046269" 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-10-11T00:48:41.045725" elapsed="0.000570"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:48:41.046338" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:41.032993" elapsed="0.013464"/>
</kw>
<msg time="2026-10-11T00:48:41.046506" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:41.028779" elapsed="0.017769"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:48:41.050730" 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/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-10-11T00:48:41.054722" 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/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-10-11T00:48:41.058812" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:41.059057" 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-10-11T00:48:41.059239" 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-10-11T00:48:41.059593" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:41.059448" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:48:41.059434" 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-10-11T00:48:41.059834" 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-10-11T00:48:41.060016" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:41.060179" elapsed="0.000017"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:48:41.059393" elapsed="0.000833"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:48:41.059305" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:41.060398" elapsed="0.000033"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:48:41.060480" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:48:41.060590" 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-10-11T00:48:41.028142" elapsed="0.032473"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.061633" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:41.061394" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:48:41.074988" level="INFO">DELETE Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01abrclsuom0vg61hgi1sl4f8e1.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:48:41.075033" level="INFO">DELETE Response : url=http://10.30.170.173: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.171.7 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-10-11T00:48:41.075113" 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-10-11T00:48:41.061990" elapsed="0.013146"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:41.061737" elapsed="0.013437"/>
</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-10-11T00:48:41.075346" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:41.075198" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:41.061720" elapsed="0.013726"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.076674" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:41.076385" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:41.076145" elapsed="0.000600"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:41.076128" elapsed="0.000655"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.077369" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:41.077070" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:41.076833" elapsed="0.000624"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:41.076818" elapsed="0.000661"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.078013" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:41.077653" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:41.078309" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:41.078101" elapsed="0.000259"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.078841" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:41.078557" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:41.078382" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:41.078085" elapsed="0.000832"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.079445" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:41.079090" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:41.079740" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:41.079533" elapsed="0.000276"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.080250" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:41.079990" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:41.079830" elapsed="0.000477"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:41.079517" elapsed="0.000809"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:41.080484" elapsed="0.000323"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:48:41.081186" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:48:41.080967" elapsed="0.000243"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:48:41.081363" elapsed="0.000223"/>
</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-10-11T00:48:41.075779" elapsed="0.005863"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:48:41.081683" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:48:41.081870" 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-10-11T00:48:41.060864" elapsed="0.021030"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:48:41.081942" elapsed="0.000024"/>
</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-10-11T00:48:41.021102" elapsed="0.060935"/>
</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-10-11T00:48:41.082579" elapsed="0.001443"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:48:41.082275" elapsed="0.001811"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-10-11T00:48:40.943356" elapsed="0.140764"/>
</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-10-11T00:48:41.085544" level="INFO">Executing command 'ps -elf | egrep python | egrep 'play.py' | egrep -v grep'.</msg>
<msg time="2026-10-11T00:48:41.108187" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-10-11T00:48:41.108274" 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-10-11T00:48:41.085431" elapsed="0.022867"/>
</kw>
<return>
<value>${processes}</value>
<status status="PASS" start="2026-10-11T00:48:41.108342" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:48:41.108490" 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-10-11T00:48:41.085144" elapsed="0.023369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.108954" level="INFO"/>
<arg>${processes}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:41.108707" elapsed="0.000285"/>
</kw>
<kw name="Kill_Remote_Processes" owner="KillPythonTool">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.109748" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:48:41.109834" 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-10-11T00:48:41.109503" elapsed="0.000354"/>
</kw>
<if>
<branch type="IF" condition="${arg_length} == 0">
<return>
<status status="PASS" start="2026-10-11T00:48:41.110049" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:48:41.109961" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:41.109943" elapsed="0.000178"/>
</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-10-11T00:48:41.110303" elapsed="0.000020"/>
</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-10-11T00:48:41.110524" elapsed="0.000019"/>
</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-10-11T00:48:41.110722" elapsed="0.000018"/>
</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-10-11T00:48:41.109211" elapsed="0.001602"/>
</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-10-11T00:48:41.084899" elapsed="0.025962"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-10-11T00:48:41.111067" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects </doc>
<status status="PASS" start="2026-10-11T00:48:41.110999" elapsed="0.000143"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-10-11T00:48:41.111285" elapsed="0.000330"/>
</kw>
<doc>Make sure Python tool was killed, delete all sessions, tear down imported Resources.</doc>
<status status="PASS" start="2026-10-11T00:48:41.084641" elapsed="0.027028"/>
</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="PASS" start="2026-10-11T00:47:25.312819" elapsed="75.798877"/>
</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-10-11T00:48:41.138956" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:48:41.137314" elapsed="0.001685"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-10-11T00:48:41.137087" elapsed="0.001968"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.141336" 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-10-11T00:48:41.140017" elapsed="0.001345"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-10-11T00:48:41.141527" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:41.141447" elapsed="0.000119"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:41.141428" elapsed="0.000158"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.142101" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:48:41.141777" elapsed="0.000364"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.142594" 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-10-11T00:48:41.142301" elapsed="0.000317"/>
</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-10-11T00:48:41.143167" elapsed="0.000267"/>
</kw>
<msg time="2026-10-11T00:48:41.143524" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:41.143566" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:41.142828" elapsed="0.000758"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.144089" 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-10-11T00:48:41.143774" elapsed="0.000339"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.145050" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:48:41.144780" elapsed="0.000295"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.145473" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:48:41.145216" elapsed="0.000283"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.146081" 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-10-11T00:48:41.145709" elapsed="0.000398"/>
</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-10-11T00:48:41.147020" elapsed="0.000156"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.147629" level="INFO">${member_ip} = 10.30.170.173</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:48:41.147332" elapsed="0.000322"/>
</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-10-11T00:48:41.147829" elapsed="0.000168"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.148878" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:41.148458" elapsed="0.000445"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-11T00:48:41.148951" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:48:41.149079" 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-10-11T00:48:41.148170" elapsed="0.000932"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:48:41.149610" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x74344594a110&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-10-11T00:48:41.149274" elapsed="0.000458"/>
</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-10-11T00:48:41.149911" elapsed="0.000148"/>
</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-10-11T00:48:41.146528" elapsed="0.003585"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:48:41.146336" elapsed="0.003816"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-10-11T00:48:41.146153" elapsed="0.004028"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.150728" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:48:41.150358" elapsed="0.000421"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.151321" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.173'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:48:41.150974" elapsed="0.000386"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.152157" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:48:41.151802" elapsed="0.000395"/>
</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-10-11T00:48:41.144365" elapsed="0.007885"/>
</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-10-11T00:48:41.139696" elapsed="0.012603"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:41.152464" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:41.152356" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:41.152339" elapsed="0.000187"/>
</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-10-11T00:48:41.153704" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:41.153367" elapsed="0.000362"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.154163" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:48:41.153901" elapsed="0.000286"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:48:41.154227" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:48:41.154352" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:48:41.153071" elapsed="0.001303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:48:41.155225" level="INFO">${member_ip} = 10.30.170.173</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-10-11T00:48:41.155021" elapsed="0.000228"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:48:41.156017" 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-10-11T00:48:41.156108" 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-10-11T00:48:41.155869" elapsed="0.000263"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:41.158958" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:41.158427" elapsed="0.000612"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:41.158388" elapsed="0.000686"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:48:41.159746" 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-10-11T00:48:41.159998" 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-10-11T00:48:41.159313" elapsed="0.000733"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.160939" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.173" 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-10-11T00:48:41.160345" elapsed="0.000713"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:48:41.162351" 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-10-11T00:48:41.161346" elapsed="0.001054"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.164168" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:48:41.164334" 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-10-11T00:48:41.163843" elapsed="0.000532"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:41.164719" elapsed="0.000426"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:48:41.166232" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:48:41.772728" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 00:48:41 UTC 2026

  System load:  0.34               Processes:             128
  Usage of /:   14.1% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.173
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:47:25 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:48:41.165995" elapsed="0.606858"/>
</kw>
<msg time="2026-10-11T00:48:41.772945" 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-10-11T00:48:41.165531" elapsed="0.607591"/>
</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-10-11T00:48:41.162859" elapsed="0.610422"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:48:41.774049" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-10-11T00:48:41.786843" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-10-11T00:48:41.787112" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T00:48:41.787333" 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-10-11T00:48:41.773643" elapsed="0.013841"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:48:41.788175" elapsed="0.001078"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.791867" 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-10-11T00:48:41.790643" elapsed="0.001488"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T00:48:41.793001" elapsed="0.000147"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:41.792510" elapsed="0.000818"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:41.792460" elapsed="0.001101"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:48:41.794213" elapsed="0.000170"/>
</return>
<status status="PASS" start="2026-10-11T00:48:41.793775" elapsed="0.001005"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:41.793716" elapsed="0.001152"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T00:48:41.794991" 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">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:41.797702" elapsed="0.000795"/>
</kw>
<kw name="Open 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-10-11T00:48:41.798940" elapsed="0.000365"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:48:41.799693" elapsed="0.000309"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:48:41.796015" elapsed="0.004075"/>
</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-10-11T00:48:41.157748" elapsed="0.642491"/>
</kw>
<msg time="2026-10-11T00:48:41.800306" 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-10-11T00:48:41.157158" elapsed="0.643214"/>
</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-10-11T00:48:41.156770" elapsed="0.643753"/>
</kw>
<msg time="2026-10-11T00:48:41.800575" 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-10-11T00:48:41.156286" elapsed="0.644349"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:41.801523" elapsed="0.000403"/>
</kw>
<kw name="Open 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-10-11T00:48:41.802180" elapsed="0.000186"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:48:41.802635" elapsed="0.000138"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:48:41.801028" elapsed="0.001811"/>
</kw>
<msg time="2026-10-11T00:48:41.802950" 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-10-11T00:48:41.155499" elapsed="0.647484"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.803631" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:41.803271" elapsed="0.000413"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-11T00:48:41.803737" elapsed="0.000054"/>
</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-10-11T00:48:41.154702" elapsed="0.649191"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:48:41.154544" elapsed="0.649393"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:48:41.154442" elapsed="0.649535"/>
</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-10-11T00:48:41.152724" elapsed="0.651318"/>
</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-10-11T00:48:41.804250" elapsed="0.000301"/>
</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-10-11T00:48:41.812484" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:41.812343" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:41.812318" elapsed="0.000255"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:48:41.813030" 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-10-11T00:48:41.813160" 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-10-11T00:48:41.812865" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.813812" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:41.813473" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:41.814448" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:41.814129" elapsed="0.000376"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:48:41.815533" 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-10-11T00:48:41.815272" elapsed="0.000394">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-10-11T00:48:41.815816" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T00:48:41.815874" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:41.814719" elapsed="0.001184"/>
</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-10-11T00:48:41.816295" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:41.815998" elapsed="0.000390"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:41.815974" elapsed="0.000466"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:48:41.817346" level="INFO">${ip_address} = 10.30.170.173</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-10-11T00:48:41.817056" elapsed="0.000323"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-10-11T00:48:41.817460" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:48:41.817635" level="INFO">${odl_ip} = 10.30.170.173</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-10-11T00:48:41.816693" elapsed="0.000973"/>
</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-10-11T00:48:41.817928" elapsed="0.000439"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:48:41.818864" level="INFO">index=4
host=10.30.170.173
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-10-11T00:48:41.818989" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.173
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-10-11T00:48:41.818680" elapsed="0.000342"/>
</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-10-11T00:48:41.819245" elapsed="0.000340"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-10-11T00:48:41.820257" level="INFO">Logging into '10.30.170.173:8101' as 'karaf'.</msg>
<msg time="2026-10-11T00:48:42.037011" 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-10-11T00:48:41.819862" elapsed="0.217233"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:42.038445" elapsed="0.000281"/>
</kw>
<kw name="Open 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-10-11T00:48:42.038924" elapsed="0.000146"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:48:42.039213" elapsed="0.000090"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:48:42.038092" elapsed="0.001258"/>
</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-10-11T00:48:42.037375" elapsed="0.002018"/>
</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-10-11T00:48:41.812021" elapsed="0.227437"/>
</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-10-11T00:48:41.805503" elapsed="0.233999"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:41.804972" elapsed="0.234577"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:48:41.804782" elapsed="0.234803"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-10-11T00:48:41.804616" elapsed="0.234998"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-10-11T00:48:41.139305" elapsed="0.900396"/>
</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-10-11T00:48:42.040538" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:42.040449" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:42.040429" elapsed="0.000173"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:42.042550" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:42.042466" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:42.042449" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:42.043465" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:48:42.043125" elapsed="0.000366"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:48:42.043920" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:48:42.043642" elapsed="0.000301"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:48:42.043984" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:48:42.044112" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:48:42.042827" elapsed="0.001308"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:42.046591" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:42.046507" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:42.046489" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:48:42.047685" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:42.047602" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:42.047584" elapsed="0.000176"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:48:42.048166" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:48:42.047904" elapsed="0.000287"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:48:42.048558" 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-10-11T00:48:42.048354" elapsed="0.000228"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:48:42.091290" 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-10-11T00:48:42.049238" elapsed="0.042199"/>
</kw>
<msg time="2026-10-11T00:48:42.091571" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:48:42.091612" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:42.048734" elapsed="0.042911"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:48:42.187725" 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-10-11T00:48:42.092328" elapsed="0.095555"/>
</kw>
<msg time="2026-10-11T00:48:42.188012" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:48:42.188053" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:42.091824" elapsed="0.096264"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:42.188362" elapsed="0.000172"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:42.188156" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:42.188138" elapsed="0.000516"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:42.189210" 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-10-11T00:48:42.188856" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:42.189740" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:42.189385" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:42.189367" elapsed="0.000554"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:48:42.189953" 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">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:42.191894" 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-10-11T00:48:42.192700" elapsed="0.000286"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:48:42.193301" elapsed="0.000232"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:48:42.191171" elapsed="0.002444"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:48:42.190223" elapsed="0.003518"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:48:42.047376" elapsed="0.146455"/>
</kw>
<msg time="2026-10-11T00:48:42.193914" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:42.193954" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:42.046814" elapsed="0.147175"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:48:42.194142" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:48:42.194057" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:42.194040" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:42.194561" 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-10-11T00:48:42.194877" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:48:42.194940" 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-10-11T00:48:42.046257" elapsed="0.148767"/>
</kw>
<msg time="2026-10-11T00:48:42.195107" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:48:42.195147" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:42.044472" elapsed="0.150709"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:42.195598" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:48:42.195247" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:42.195231" elapsed="0.000441"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:48:42.044318" elapsed="0.151376"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:48:42.044180" elapsed="0.151539"/>
</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-10-11T00:48:42.042223" elapsed="0.153555"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-10-11T00:48:42.040261" elapsed="0.155568"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:42.039866" elapsed="0.155999"/>
</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-10-11T00:48:41.136824" elapsed="1.059086"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:48:42.196371" 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-10-11T00:48:42.196082" elapsed="0.000314"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:48:42.196897" level="INFO">${conn_id} = 7</msg>
<arg>${conn_id}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:48:42.196600" elapsed="0.000336"/>
</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-10-11T00:48:42.198399" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:48:42.198485" 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-10-11T00:48:42.198153" elapsed="0.000354"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:42.198656" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:48:42.199770" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:48:42.549666" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 00:48:41 UTC 2026

  System load:  0.34               Processes:             128
  Usage of /:   14.1% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.173
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:48:41 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:48:42.199531" elapsed="0.350323"/>
</kw>
<msg time="2026-10-11T00:48:42.549942" 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-10-11T00:48:42.199154" elapsed="0.350871"/>
</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-10-11T00:48:42.197785" elapsed="0.352347"/>
</kw>
<msg time="2026-10-11T00:48:42.550182" 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-10-11T00:48:42.197400" elapsed="0.352826"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-10-11T00:48:42.197117" elapsed="0.353179"/>
</kw>
<kw name="Configure_Ipv6_Network">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:48:42.551343" level="INFO">Executing command 'ip route | grep '^default' | awk '{print $5}''.</msg>
<msg time="2026-10-11T00:48:42.564306" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:48:42.564481" 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-10-11T00:48:42.551233" elapsed="0.013285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:42.565327" 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-10-11T00:48:42.564901" elapsed="0.000488"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:48:42.565905" level="INFO">Executing command 'sudo ip -6 addr add 2607:f0d0:1002:0011:0000:0000:0000:0002/64 dev ens3'.</msg>
<msg time="2026-10-11T00:48:42.631450" 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-10-11T00:48:42.565686" elapsed="0.065884"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:48:42.632268" level="INFO">Executing command 'sudo ip -6 route add default via 2607:f0d0:1002:0011:0000:0000:0000:0001'.</msg>
<msg time="2026-10-11T00:48:42.691524" 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-10-11T00:48:42.632022" elapsed="0.059627"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:48:42.692291" level="INFO">Executing command 'sudo ip -6 addr show'.</msg>
<msg time="2026-10-11T00:48:42.755646" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:48:42.755856" 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-10-11T00:48:42.692098" elapsed="0.063815"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:42.756941" 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:feab:8414/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-10-11T00:48:42.756373" elapsed="0.000670"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:48:42.757670" level="INFO">Executing command 'sudo ip -6 route show'.</msg>
<msg time="2026-10-11T00:48:42.819883" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:48:42.820074" 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-10-11T00:48:42.757483" elapsed="0.062646"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:42.821175" 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-10-11T00:48:42.820637" elapsed="0.000633"/>
</kw>
<doc>Reconfigures basic network settings on controller</doc>
<status status="PASS" start="2026-10-11T00:48:42.550554" elapsed="0.270827"/>
</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-10-11T00:48:42.828276" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:42.827627" elapsed="0.000836"/>
</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-10-11T00:48:42.831478" level="INFO">Executing command 'cd '.' &amp;&amp; virtualenv /tmp/defaultvenv'.</msg>
<msg time="2026-10-11T00:48:43.391013" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:48:43.391265" level="INFO">${stdout} = created virtual environment CPython3.10.12.final.0-64 in 282ms
  creator CPython3Posix(dest=/tmp/defaultvenv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=b...</msg>
<msg time="2026-10-11T00:48:43.391361" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T00:48:43.391491" 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-10-11T00:48:42.831101" elapsed="0.560441"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:48:43.393331" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T00:48:43.392776" elapsed="0.000683"/>
</kw>
<msg time="2026-10-11T00:48:43.393650" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T00:48:43.393756" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:48:43.391972" elapsed="0.001832"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:48:43.395060" 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-10-11T00:48:43.394191" elapsed="0.000924"/>
</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-10-11T00:48:43.397221" level="INFO">created virtual environment CPython3.10.12.final.0-64 in 282ms
  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-10-11T00:48:43.396707" elapsed="0.000615"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:43.398263" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:43.397791" elapsed="0.000555"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:48:43.399295" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:48:43.398822" elapsed="0.000560"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T00:48:43.395926" elapsed="0.003596"/>
</kw>
<status status="PASS" start="2026-10-11T00:48:43.395288" elapsed="0.004305"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:43.395239" elapsed="0.004411"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T00:48:43.399966" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:48:43.399788" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:43.399731" elapsed="0.000375"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:48:43.400359" elapsed="0.000086"/>
</return>
<status status="PASS" start="2026-10-11T00:48:43.400209" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-11T00:48:43.400178" elapsed="0.000384"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:48:43.400909" elapsed="0.000044"/>
</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-10-11T00:48:42.829975" elapsed="0.571144"/>
</kw>
<msg time="2026-10-11T00:48:43.401229" 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-10-11T00:48:42.828840" elapsed="0.572486"/>
</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-10-11T00:48:42.826500" elapsed="0.575085"/>
</kw>
<msg time="2026-10-11T00:48:43.401693" 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-10-11T00:48:42.823143" elapsed="0.578663"/>
</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-10-11T00:48:42.822397" elapsed="0.579955"/>
</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-10-11T00:48:43.411290" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:48:43.410642" elapsed="0.000706"/>
</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-10-11T00:48:43.414868" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate'.</msg>
<msg time="2026-10-11T00:49:10.320595" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:49:10.321072" level="INFO">${stdout} = Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Downloading pip-26.2.1-py3-none-any.whl (1.8 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━...</msg>
<msg time="2026-10-11T00:49:10.321234" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T00:49:10.321374" 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-10-11T00:48:43.414172" elapsed="26.907356"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:49:10.326710" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T00:49:10.325703" elapsed="0.001259"/>
</kw>
<msg time="2026-10-11T00:49:10.327271" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T00:49:10.327475" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:49:10.322286" elapsed="0.005293"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:49:10.330566" 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-10-11T00:49:10.328155" elapsed="0.002500"/>
</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-10-11T00:49:10.335400" level="INFO">Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Downloading pip-26.2.1-py3-none-any.whl (1.8 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.8/1.8 MB 11.9 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.2.1</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:49:10.334629" elapsed="0.001103"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:49:10.337565" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:49:10.336759" elapsed="0.001001"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:49:10.339642" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:49:10.338706" elapsed="0.001139"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T00:49:10.332608" elapsed="0.007427"/>
</kw>
<status status="PASS" start="2026-10-11T00:49:10.331024" elapsed="0.009225"/>
</branch>
<status status="PASS" start="2026-10-11T00:49:10.330968" elapsed="0.009344"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T00:49:10.340705" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:49:10.340462" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-10-11T00:49:10.340395" elapsed="0.000602"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:49:10.341299" elapsed="0.000069"/>
</return>
<status status="PASS" start="2026-10-11T00:49:10.341107" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-10-11T00:49:10.341075" elapsed="0.000621"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:49:10.342030" 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-10-11T00:48:43.413052" elapsed="26.929325"/>
</kw>
<msg time="2026-10-11T00:49:10.342573" 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-10-11T00:48:43.411722" elapsed="26.930963"/>
</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-10-11T00:48:43.409460" elapsed="26.933383"/>
</kw>
<msg time="2026-10-11T00:49:10.342948" 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-10-11T00:48:43.406240" elapsed="26.936801"/>
</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-10-11T00:48:43.405234" elapsed="26.937960"/>
</kw>
<msg time="2026-10-11T00:49:10.343396" 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-10-11T00:48:43.404435" elapsed="26.939229"/>
</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-10-11T00:48:43.403697" elapsed="26.940124"/>
</kw>
<msg time="2026-10-11T00:49:10.343906" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:43.402775" elapsed="26.941220"/>
</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-10-11T00:48:42.821842" elapsed="27.522295"/>
</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-10-11T00:49:10.354541" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:49:10.353853" elapsed="0.000749"/>
</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-10-11T00:49:10.358444" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate'.</msg>
<msg time="2026-10-11T00:49:48.716962" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:49:48.717506" 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-10-11T00:49:48.717615" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T00:49:48.717700" 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-10-11T00:49:10.357386" elapsed="38.360363"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:49:48.722734" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T00:49:48.721519" elapsed="0.001448"/>
</kw>
<msg time="2026-10-11T00:49:48.723290" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T00:49:48.723380" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:49:48.718518" elapsed="0.004956"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:49:48.725936" 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-10-11T00:49:48.723974" elapsed="0.002017"/>
</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-10-11T00:49:48.730487" 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 6.4 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-10-11T00:49:48.729742" elapsed="0.000905"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:49:48.732238" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:49:48.731570" elapsed="0.000795"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:49:48.733853" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:49:48.733185" elapsed="0.000801"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T00:49:48.727760" elapsed="0.006404"/>
</kw>
<status status="PASS" start="2026-10-11T00:49:48.726295" elapsed="0.008064"/>
</branch>
<status status="PASS" start="2026-10-11T00:49:48.726246" elapsed="0.008225"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T00:49:48.734788" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:49:48.734607" elapsed="0.000385"/>
</branch>
<status status="PASS" start="2026-10-11T00:49:48.734564" elapsed="0.000501"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:49:48.735328" elapsed="0.000066"/>
</return>
<status status="PASS" start="2026-10-11T00:49:48.735175" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-10-11T00:49:48.735142" elapsed="0.000641"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:49:48.736134" 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-10-11T00:49:10.356237" elapsed="38.380154"/>
</kw>
<msg time="2026-10-11T00:49:48.736639" 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-10-11T00:49:10.354948" elapsed="38.381804"/>
</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-10-11T00:49:10.352682" elapsed="38.384262"/>
</kw>
<msg time="2026-10-11T00:49:48.737076" 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-10-11T00:49:10.349323" elapsed="38.387850"/>
</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-10-11T00:49:10.348300" elapsed="38.389054"/>
</kw>
<msg time="2026-10-11T00:49:48.737485" 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-10-11T00:49:10.347229" elapsed="38.390345"/>
</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-10-11T00:49:10.345946" elapsed="38.391802"/>
</kw>
<msg time="2026-10-11T00:49:48.737836" 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-10-11T00:49:10.345119" elapsed="38.392801"/>
</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-10-11T00:49:10.344581" elapsed="38.393516"/>
</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-10-11T00:49:48.750163" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:49:48.749508" elapsed="0.000716"/>
</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-10-11T00:49:48.753802" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==4.2.4; deactivate'.</msg>
<msg time="2026-10-11T00:50:28.746312" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:50:28.746845" 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-10-11T00:50:28.746944" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T00:50:28.747033" 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-10-11T00:49:48.753081" elapsed="39.994002"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:50:28.752058" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T00:50:28.750843" elapsed="0.001449"/>
</kw>
<msg time="2026-10-11T00:50:28.752687" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T00:50:28.752778" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:28.747774" elapsed="0.005052"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:28.755311" 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-10-11T00:50:28.753328" elapsed="0.002040"/>
</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-10-11T00:50:28.759958" 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=f8ab2997145b09f6953420a4a86ef11f3fc2a40cf05cfbc1a9c5f7b7b9a7705b
  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-10-11T00:50:28.759228" elapsed="0.000889"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:28.761870" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:28.761059" elapsed="0.000944"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:28.763573" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:28.762873" elapsed="0.000836"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T00:50:28.757179" elapsed="0.006676"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:28.755767" elapsed="0.008287"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:28.755717" elapsed="0.008395"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T00:50:28.764522" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:28.764249" elapsed="0.000485"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:28.764202" elapsed="0.000584"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:50:28.765052" elapsed="0.000063"/>
</return>
<status status="PASS" start="2026-10-11T00:50:28.764892" elapsed="0.000397"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:28.764861" elapsed="0.000488"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:28.765742" elapsed="0.000046"/>
</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-10-11T00:49:48.751906" elapsed="40.014097"/>
</kw>
<msg time="2026-10-11T00:50:28.766125" 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-10-11T00:49:48.750599" elapsed="40.015630"/>
</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-10-11T00:49:48.748368" elapsed="40.018175"/>
</kw>
<msg time="2026-10-11T00:50:28.766665" 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-10-11T00:49:48.745180" elapsed="40.021577"/>
</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-10-11T00:49:48.744081" elapsed="40.022878"/>
</kw>
<msg time="2026-10-11T00:50:28.767066" 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-10-11T00:49:48.740788" elapsed="40.026365"/>
</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-10-11T00:49:48.740009" elapsed="40.027340"/>
</kw>
<msg time="2026-10-11T00:50:28.767505" 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-10-11T00:49:48.739118" elapsed="40.028478"/>
</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-10-11T00:49:48.738562" elapsed="40.029221"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:50:28.768717" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7434457988d0&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-10-11T00:50:28.768165" elapsed="0.000871"/>
</kw>
<kw name="Upload_Config_Files">
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T00:50:28.795844" level="INFO">[chan 10] Opened sftp connection (server version 3)</msg>
<msg time="2026-10-11T00:50:28.806758" 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-10-11T00:50:28.770009" elapsed="0.036886"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-10-11T00:50:28.816909" level="INFO">1 file:
exaipv6.cfg</msg>
<msg time="2026-10-11T00:50:28.817134" 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-10-11T00:50:28.807253" elapsed="0.009933"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:50:28.818821" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/2607:f0d0:1002:0011:0000:0000:0000:0002/g' exaipv6.cfg'.</msg>
<msg time="2026-10-11T00:50:28.831371" 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-10-11T00:50:28.818046" elapsed="0.013501"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:50:28.832328" level="INFO">Executing command 'sed -i -e 's/ODLIP/::1/g' exaipv6.cfg'.</msg>
<msg time="2026-10-11T00:50:28.882498" 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-10-11T00:50:28.832051" elapsed="0.050569"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:50:28.883324" level="INFO">Executing command 'sed -i -e 's/ROUTERID/1.2.3.4/g' exaipv6.cfg'.</msg>
<msg time="2026-10-11T00:50:28.930401" 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-10-11T00:50:28.883047" elapsed="0.047536"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:50:28.931261" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exaipv6.cfg'.</msg>
<msg time="2026-10-11T00:50:28.978561" 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-10-11T00:50:28.931010" elapsed="0.047674"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:50:28.979375" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exaipv6.cfg'.</msg>
<msg time="2026-10-11T00:50:29.026578" 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-10-11T00:50:28.979118" elapsed="0.047588"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:50:29.027401" level="INFO">Executing command 'cat exaipv6.cfg'.</msg>
<msg time="2026-10-11T00:50:29.074358" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:50:29.074635" 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-10-11T00:50:29.027148" elapsed="0.047543"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:29.075844" 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-10-11T00:50:29.075199" elapsed="0.000742"/>
</kw>
<var name="${cfgfile}">exaipv6.cfg</var>
<status status="PASS" start="2026-10-11T00:50:28.817668" elapsed="0.258344"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-10-11T00:50:28.817302" elapsed="0.258777"/>
</for>
<doc>Uploads exabgp config files</doc>
<status status="PASS" start="2026-10-11T00:50:28.769500" elapsed="0.306703"/>
</kw>
<kw name="Upload_Config_Files_exabgp_ipv4">
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T00:50:29.121944" 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-10-11T00:50:29.077230" elapsed="0.044835"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-10-11T00:50:29.134075" level="INFO">1 file:
exaipv4.cfg</msg>
<msg time="2026-10-11T00:50:29.134294" 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-10-11T00:50:29.122394" elapsed="0.011951"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:50:29.135501" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/127.0.0.1/g' exaipv4.cfg'.</msg>
<msg time="2026-10-11T00:50:29.148231" 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-10-11T00:50:29.135208" elapsed="0.013146"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:50:29.149116" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' exaipv4.cfg'.</msg>
<msg time="2026-10-11T00:50:29.198435" 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-10-11T00:50:29.148835" elapsed="0.049734"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:50:29.199236" level="INFO">Executing command 'sed -i -e 's/ROUTERID/127.0.0.1/g' exaipv4.cfg'.</msg>
<msg time="2026-10-11T00:50:29.246531" 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-10-11T00:50:29.198995" elapsed="0.047659"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:50:29.247334" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exaipv4.cfg'.</msg>
<msg time="2026-10-11T00:50:29.294637" 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-10-11T00:50:29.247085" elapsed="0.047670"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:50:29.295506" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exaipv4.cfg'.</msg>
<msg time="2026-10-11T00:50:29.342689" 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-10-11T00:50:29.295178" elapsed="0.047625"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:50:29.343528" level="INFO">Executing command 'cat exaipv4.cfg'.</msg>
<msg time="2026-10-11T00:50:29.390991" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:50:29.391218" level="INFO">${stdout} = neighbor 10.30.170.173 {
                  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-10-11T00:50:29.343220" elapsed="0.048053"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:29.392530" level="INFO">neighbor 10.30.170.173 {
                  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-10-11T00:50:29.391877" elapsed="0.000856"/>
</kw>
<var name="${cfgfile}">exaipv4.cfg</var>
<status status="PASS" start="2026-10-11T00:50:29.134827" elapsed="0.257980"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-10-11T00:50:29.134520" elapsed="0.258356"/>
</for>
<doc>Uploads exabgp config files</doc>
<status status="PASS" start="2026-10-11T00:50:29.076701" elapsed="0.316303"/>
</kw>
<kw name="Upload_Config_Files_exabgp_graceful_restart">
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T00:50:29.437806" 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-10-11T00:50:29.394009" elapsed="0.043932"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-10-11T00:50:29.449147" level="INFO">1 file:
exabgp_graceful_restart.cfg</msg>
<msg time="2026-10-11T00:50:29.449378" 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-10-11T00:50:29.438283" elapsed="0.011206"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:50:29.450647" 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-10-11T00:50:29.463480" 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-10-11T00:50:29.450312" elapsed="0.013291"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:50:29.464305" level="INFO">Executing command 'sed -i -e 's/ODLIP/::1/g' exabgp_graceful_restart.cfg'.</msg>
<msg time="2026-10-11T00:50:29.514506" 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-10-11T00:50:29.464026" elapsed="0.050598"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:50:29.515317" level="INFO">Executing command 'sed -i -e 's/ROUTERID/1.2.3.4/g' exabgp_graceful_restart.cfg'.</msg>
<msg time="2026-10-11T00:50:29.562774" 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-10-11T00:50:29.515042" elapsed="0.047862"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:50:29.563651" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exabgp_graceful_restart.cfg'.</msg>
<msg time="2026-10-11T00:50:29.610691" 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-10-11T00:50:29.563330" elapsed="0.047479"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:50:29.611536" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exabgp_graceful_restart.cfg'.</msg>
<msg time="2026-10-11T00:50:29.658840" 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-10-11T00:50:29.611225" elapsed="0.047752"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:50:29.659760" level="INFO">Executing command 'cat exabgp_graceful_restart.cfg'.</msg>
<msg time="2026-10-11T00:50:29.707448" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:50:29.707687" 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-10-11T00:50:29.659482" elapsed="0.048263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:29.708922" 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-10-11T00:50:29.708260" elapsed="0.000762"/>
</kw>
<var name="${cfgfile}">exabgp_graceful_restart.cfg</var>
<status status="PASS" start="2026-10-11T00:50:29.449928" elapsed="0.259166"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-10-11T00:50:29.449613" elapsed="0.259552"/>
</for>
<doc>Uploads exabgp config files</doc>
<status status="PASS" start="2026-10-11T00:50:29.393450" elapsed="0.315844"/>
</kw>
<kw name="Upload_Config_Files_Exabgp_AS_Value_Reconfigured">
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T00:50:29.752859" 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-10-11T00:50:29.710310" elapsed="0.042672"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-10-11T00:50:29.764876" level="INFO">1 file:
exa4.cfg</msg>
<msg time="2026-10-11T00:50:29.765103" 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-10-11T00:50:29.753313" elapsed="0.011842"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:50:29.766296" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/2607:f0d0:1002:0011:0000:0000:0000:0002/g' exa4.cfg'.</msg>
<msg time="2026-10-11T00:50:29.779351" 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-10-11T00:50:29.766019" elapsed="0.013524"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:50:29.780266" level="INFO">Executing command 'sed -i -e 's/ODLIP/::1/g' exa4.cfg'.</msg>
<msg time="2026-10-11T00:50:29.830552" 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-10-11T00:50:29.779980" elapsed="0.050688"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:50:29.831360" level="INFO">Executing command 'sed -i -e 's/ROUTERID/1.2.3.4/g' exa4.cfg'.</msg>
<msg time="2026-10-11T00:50:29.882698" 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-10-11T00:50:29.831088" elapsed="0.051737"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:50:29.883692" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exa4.cfg'.</msg>
<msg time="2026-10-11T00:50:29.930662" 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-10-11T00:50:29.883356" elapsed="0.047425"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:50:29.931515" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exa4.cfg'.</msg>
<msg time="2026-10-11T00:50:29.983159" 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-10-11T00:50:29.931204" elapsed="0.052089"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:50:29.984084" level="INFO">Executing command 'cat exa4.cfg'.</msg>
<msg time="2026-10-11T00:50:30.034984" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:50:30.035202" 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-10-11T00:50:29.983810" elapsed="0.051450"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.036457" 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-10-11T00:50:30.035845" elapsed="0.000732"/>
</kw>
<var name="${cfgfile}">exa4.cfg</var>
<status status="PASS" start="2026-10-11T00:50:29.765636" elapsed="0.271013"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-10-11T00:50:29.765270" elapsed="0.271448"/>
</for>
<doc>Uploads exabgp config files</doc>
<status status="PASS" start="2026-10-11T00:50:29.709773" elapsed="0.327072"/>
</kw>
<doc>Suite setup keyword.</doc>
<status status="PASS" start="2026-10-11T00:48:41.136560" elapsed="108.900386"/>
</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-10-11T00:50:30.039756" elapsed="0.000744"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:30.039142" elapsed="0.001477"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:30.042815" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:30.042585" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:30.042537" elapsed="0.000425"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:30.047952" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:30.047746" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:30.047704" elapsed="0.000394"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.050255" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:30.049499" elapsed="0.000814"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.051300" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:30.050706" elapsed="0.000648"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:30.051505" elapsed="0.000072"/>
</return>
<msg time="2026-10-11T00:50:30.051809" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:30.048633" elapsed="0.003228"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:30.059106" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:30.058913" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:30.058873" elapsed="0.000374"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:30.061728" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:30.061536" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:30.061495" elapsed="0.000370"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:30.062634" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:30.062187" elapsed="0.000503"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:30.063352" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:30.063048" elapsed="0.000356"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:30.105285" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:30.064613" elapsed="0.040829"/>
</kw>
<msg time="2026-10-11T00:50:30.105679" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:30.105804" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:30.063821" elapsed="0.042059"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:30.153799" 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-10-11T00:50:30.106630" elapsed="0.047277"/>
</kw>
<msg time="2026-10-11T00:50:30.154065" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:30.154108" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:30.106114" elapsed="0.048029"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:30.154449" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:30.154215" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:30.154196" elapsed="0.000352"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.154963" 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-10-11T00:50:30.154728" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:30.155289" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:30.155091" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:30.155074" elapsed="0.000286"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:30.155390" 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-10-11T00:50:30.157834" elapsed="0.000114"/>
</kw>
<msg time="2026-10-11T00:50:30.158005" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:30.156791" elapsed="0.001351"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:30.158473" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:30.158811" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:50:30.156180" 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-10-11T00:50:30.155716" elapsed="0.003338"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:50:30.060898" elapsed="0.098229"/>
</kw>
<msg time="2026-10-11T00:50:30.159209" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:30.159248" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:30.059635" elapsed="0.099649"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:30.159474" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:50:30.159353" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:30.159336" 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-10-11T00:50:30.159877" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:30.160172" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:30.160236" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:50:30.058212" elapsed="0.102108"/>
</kw>
<msg time="2026-10-11T00:50:30.160424" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:30.160479" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:30.052647" elapsed="0.107870"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:30.160838" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:30.160618" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:30.160600" elapsed="0.000308"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:30.052278" elapsed="0.108652"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:30.051964" elapsed="0.108994"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:30.046747" elapsed="0.114259"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:30.041924" elapsed="0.119130"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:30.040952" elapsed="0.120143"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:30.038308" elapsed="0.122832"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.162018" 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-10-11T00:50:30.161342" elapsed="0.000705"/>
</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-10-11T00:50:30.172784" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:30.172479" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:30.173541" 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-10-11T00:50:30.173285" elapsed="0.000329">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-10-11T00:50:30.173700" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:30.172969" elapsed="0.000753"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.174199" 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-10-11T00:50:30.173891" elapsed="0.000333"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:30.174528" 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-10-11T00:50:30.174674" 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-10-11T00:50:30.174388" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.175112" 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-10-11T00:50:30.174892" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.176078" 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-10-11T00:50:30.175843" elapsed="0.000278"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.176586" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:50:30.176293" elapsed="0.000317"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.177194" 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-10-11T00:50:30.176927" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:30.177913" 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-10-11T00:50:30.177724" elapsed="0.000214"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:30.178014" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T00:50:30.178144" 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-10-11T00:50:30.177383" 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-10-11T00:50:30.178331" elapsed="0.000211"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">2607:f0d0:1002:0011:0000:0000:0000:0002</var>
<status status="PASS" start="2026-10-11T00:50:30.176798" elapsed="0.001781"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.179076" 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-10-11T00:50:30.178807" elapsed="0.000294"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:30.179777" 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-10-11T00:50:30.179600" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:30.179845" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:30.179968" 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-10-11T00:50:30.179266" elapsed="0.000724"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:30.180149" elapsed="0.000163"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:50:30.178679" elapsed="0.001670"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.181035" 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-10-11T00:50:30.180617" elapsed="0.000442"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:30.181749" 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-10-11T00:50:30.181558" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:30.181820" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:30.181945" 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-10-11T00:50:30.181225" elapsed="0.000743"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:30.182140" elapsed="0.000166"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:50:30.180490" elapsed="0.001853"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.182883" 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-10-11T00:50:30.182614" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:30.183623" 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-10-11T00:50:30.183395" elapsed="0.000252"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:30.183692" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:30.183815" 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-10-11T00:50:30.183091" elapsed="0.000747"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:30.183997" elapsed="0.000165"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:50:30.182458" elapsed="0.001742"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.184728" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:30.184440" elapsed="0.000312"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:30.185424" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:30.185232" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:30.185507" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:30.185630" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:30.184915" elapsed="0.000737"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:30.185811" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:30.184298" elapsed="0.001714"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.186544" 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-10-11T00:50:30.186238" elapsed="0.000331"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:30.187230" 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-10-11T00:50:30.187050" elapsed="0.000204"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:30.187342" elapsed="0.000033"/>
</return>
<msg time="2026-10-11T00:50:30.187715" 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-10-11T00:50:30.186738" 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-10-11T00:50:30.187902" elapsed="0.000168"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:50:30.186111" elapsed="0.001996"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.188641" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:30.188335" elapsed="0.000331"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:30.189314" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:30.189138" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:30.189383" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T00:50:30.189540" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:30.188833" elapsed="0.000730"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:30.189723" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:30.188207" elapsed="0.001718"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.190435" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:30.190151" elapsed="0.000309"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:30.191304" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:30.191126" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:30.191373" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:50:30.191543" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:30.190657" elapsed="0.000910"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:30.191729" elapsed="0.000166"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:30.190025" elapsed="0.001907"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:50:30.176653" elapsed="0.015310"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:50:30.192002" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:50:30.192133" 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-10-11T00:50:30.175504" elapsed="0.016654"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:30.175215" elapsed="0.016973"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:30.192375" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:30.192212" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:30.175197" elapsed="0.017265"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.193333" 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-10-11T00:50:30.192654" elapsed="0.000705"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:30.193419" 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-10-11T00:50:30.171943" elapsed="0.021600"/>
</kw>
<msg time="2026-10-11T00:50:30.193594" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:30.167498" elapsed="0.026144"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:30.197887" 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/${file_name} 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-10-11T00:50:30.202148" 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/${file_name} 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-10-11T00:50:30.206397" elapsed="0.000042"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:30.206610" 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-10-11T00:50:30.206794" 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-10-11T00:50:30.207137" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:30.206993" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:30.206979" 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-10-11T00:50:30.207362" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:30.207566" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:30.207729" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:30.206952" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:30.206863" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:30.207948" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:30.208014" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:50:30.208130" 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-10-11T00:50:30.166883" elapsed="0.041272"/>
</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-10-11T00:50:30.217277" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:30.216976" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:30.218010" 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-10-11T00:50:30.217806" elapsed="0.000279">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-10-11T00:50:30.218169" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:30.217487" elapsed="0.000705"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.218700" 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-10-11T00:50:30.218361" elapsed="0.000364"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:30.219000" 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-10-11T00:50:30.219180" 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-10-11T00:50:30.218889" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.219654" 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-10-11T00:50:30.219400" 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-10-11T00:50:30.220019" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:30.219770" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.220709" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:30.220236" elapsed="0.000501"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:30.220094" elapsed="0.000677"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:30.219753" elapsed="0.001038"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.221665" 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-10-11T00:50:30.220951" elapsed="0.000742"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:30.221739" 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-10-11T00:50:30.216477" elapsed="0.005363"/>
</kw>
<msg time="2026-10-11T00:50:30.221891" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:30.212033" elapsed="0.009901"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:30.226094" 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/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-10-11T00:50:30.230284" 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/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-10-11T00:50:30.234528" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:30.234708" 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-10-11T00:50:30.234919" 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-10-11T00:50:30.235255" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:30.235113" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:30.235100" 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-10-11T00:50:30.235508" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:30.235689" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:30.235850" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:30.235074" elapsed="0.000823"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:30.234986" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:30.236067" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:30.236132" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:50:30.236251" 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-10-11T00:50:30.211299" elapsed="0.024978"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:30.237390" 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-10-11T00:50:30.237193" elapsed="0.000286">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-10-11T00:50:30.237564" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:30.236873" elapsed="0.000715"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:30.237866" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:30.237650" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.238371" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:30.238108" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:30.237938" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:30.237633" elapsed="0.000844"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.238973" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:30.238637" elapsed="0.000360"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:50:30.239042" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:50:30.239163" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:50:30.236574" elapsed="0.002612"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.240426" 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-10-11T00:50:30.240192" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.240883" 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-10-11T00:50:30.240672" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.241374" 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-10-11T00:50:30.241155" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.241848" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:30.241632" elapsed="0.000256"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:30.242629" 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-10-11T00:50:30.242433" elapsed="0.000220"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:50:30.242947" 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-10-11T00:50:30.242804" elapsed="0.000167"/>
</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-10-11T00:50:30.243127" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.243873" 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-10-11T00:50:30.243651" elapsed="0.000262"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:50:30.243951" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:30.244078" 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-10-11T00:50:30.242066" elapsed="0.002035"/>
</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-10-11T00:50:30.271303" level="INFO">PUT Request : url=http://10.30.170.173: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.34.2', '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-10-11T00:50:30.271382" level="INFO">PUT Response : url=http://10.30.170.173: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=node0253wmd38ivpec9ykl6a9d65h2.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Sat, 10-Oct-2026 00:50:30 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T00:50:30.271619" 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-10-11T00:50:30.244389" elapsed="0.027257"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:30.244162" elapsed="0.027532"/>
</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-10-11T00:50:30.271898" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:30.271721" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:30.244146" elapsed="0.027834"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.273273" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:30.272972" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:30.272674" elapsed="0.000672"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:30.272656" elapsed="0.000713"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.273963" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:30.273692" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:30.273438" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:30.273403" elapsed="0.000656"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.274628" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:30.274243" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:30.274974" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:30.274717" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.275515" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:30.275210" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:30.275050" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:30.274700" elapsed="0.000893"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.276103" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:30.275766" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:30.276395" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:30.276191" elapsed="0.000271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.276914" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:30.276654" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:30.276496" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:30.276174" elapsed="0.000816"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:30.277133" elapsed="0.000308"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:50:30.277843" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:30.277608" elapsed="0.000259"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:50:30.278015" elapsed="0.000213"/>
</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-10-11T00:50:30.272328" elapsed="0.005956"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:50:30.278442" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-10-11T00:50:30.278343" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:30.278327" 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-10-11T00:50:30.278681" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:50:30.278739" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:50:30.278899" 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-10-11T00:50:30.239517" elapsed="0.039406"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:30.278979" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:50:30.279103" 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-10-11T00:50:30.162893" elapsed="0.116232"/>
</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-10-11T00:50:30.279451" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:30.279215" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:30.279197" elapsed="0.000370"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:30.279597" elapsed="0.000023"/>
</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-10-11T00:50:30.162292" elapsed="0.117403"/>
</kw>
<doc>Configure BGP peer modules with initiate-connection set to false with short ipv6 address.</doc>
<status status="PASS" start="2026-10-11T00:50:30.037078" elapsed="0.242730"/>
</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-10-11T00:50:30.281026" elapsed="0.000199"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:30.280780" elapsed="0.000494"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:30.282229" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:30.282144" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:30.282127" 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-10-11T00:50:30.284590" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:30.284505" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:30.284487" elapsed="0.000167"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.285575" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:30.285218" elapsed="0.000383"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.286016" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:30.285751" elapsed="0.000291"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:30.286082" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:30.286210" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:30.284862" elapsed="0.001372"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:30.288968" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:30.288883" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:30.288866" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:30.290091" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:30.290009" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:30.289991" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:30.290498" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:30.290297" elapsed="0.000226"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:30.290827" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:30.290685" elapsed="0.000165"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:30.333381" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:30.291327" elapsed="0.042180"/>
</kw>
<msg time="2026-10-11T00:50:30.333664" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:30.333705" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:30.291001" elapsed="0.042739"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:30.361758" 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-10-11T00:50:30.334244" elapsed="0.027609"/>
</kw>
<msg time="2026-10-11T00:50:30.362003" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:30.362044" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:30.333907" elapsed="0.028174"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:30.362354" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:30.362150" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:30.362132" elapsed="0.000319"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.362870" 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-10-11T00:50:30.362643" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:30.363182" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:30.362986" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:30.362970" elapsed="0.000282"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:30.363282" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:30.365693" elapsed="0.000228"/>
</kw>
<msg time="2026-10-11T00:50:30.366008" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:30.364680" 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-10-11T00:50:30.366479" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:30.366848" 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-10-11T00:50:30.364064" elapsed="0.002980"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:50:30.363601" elapsed="0.003502"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:50:30.289753" elapsed="0.077426"/>
</kw>
<msg time="2026-10-11T00:50:30.367261" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:30.367300" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:30.289179" elapsed="0.078158"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:30.367536" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:50:30.367434" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:30.367388" elapsed="0.000225"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:30.367930" 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-10-11T00:50:30.368224" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:30.368288" 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-10-11T00:50:30.288595" elapsed="0.079777"/>
</kw>
<msg time="2026-10-11T00:50:30.368488" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:30.368529" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:30.286624" elapsed="0.081942"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:30.368850" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:30.368634" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:30.368618" elapsed="0.000303"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:30.286443" elapsed="0.082499"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:30.286283" elapsed="0.082686"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:30.284180" elapsed="0.084836"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:30.281891" elapsed="0.087174"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:30.281435" elapsed="0.087669"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:30.280428" elapsed="0.088722"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.369701" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:30.369305" elapsed="0.000420"/>
</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-10-11T00:50:30.371225" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:30.370949" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.371689" 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-10-11T00:50:30.371461" elapsed="0.000269"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:30.373955" 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-10-11T00:50:30.372277" elapsed="0.001729"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:50:30.378584" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<msg time="2026-10-11T00:50:30.378674" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T00:50:30.374172" elapsed="0.004561"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.379284" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:30.379054" elapsed="0.000274"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:30.378800" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:30.378782" elapsed="0.000600"/>
</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-10-11T00:50:30.371945" elapsed="0.007496"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:30.381394" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exaipv6.cfg &gt; exaipv6.log</msg>
<msg time="2026-10-11T00:50:30.381504" 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-10-11T00:50:30.379609" elapsed="0.001920"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.381944" 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-10-11T00:50:30.381725" elapsed="0.000262"/>
</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-10-11T00:50:30.370653" elapsed="0.011384"/>
</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-10-11T00:50:30.383802" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:30.383499" elapsed="0.000328"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.384278" 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-10-11T00:50:30.383996" elapsed="0.000306"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:50:30.392761" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:50:30.392907" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:50:30.392993" 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-10-11T00:50:30.384492" elapsed="0.008525"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.393531" 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-10-11T00:50:30.393217" elapsed="0.000358"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T00:50:30.394305" 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-10-11T00:50:30.393741" elapsed="0.000634">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-10-11T00:50:30.383071" elapsed="0.011439">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.397245" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:33.396446" elapsed="0.000866"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.398478" 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-10-11T00:50:33.397776" elapsed="0.000783"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:50:33.410450" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:50:33.410806" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:50:33.411114" 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-10-11T00:50:33.398918" elapsed="0.012251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.412468" 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-10-11T00:50:33.411739" elapsed="0.000978"/>
</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-10-11T00:50:33.413099" elapsed="0.000765"/>
</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-10-11T00:50:33.395263" elapsed="0.018728"/>
</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-10-11T00:50:30.382610" elapsed="3.031488"/>
</kw>
<msg time="2026-10-11T00:50:33.414300" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:33.414393" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:30.382191" elapsed="3.032283"/>
</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-10-11T00:50:33.415220" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.414697" elapsed="0.000632"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.414650" elapsed="0.000731"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="PASS" start="2026-10-11T00:50:33.415739" elapsed="0.000069"/>
</return>
<status status="PASS" start="2026-10-11T00:50:33.415549" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.415494" elapsed="0.000425"/>
</if>
<var name="${idx}">0</var>
<status status="PASS" start="2026-10-11T00:50:30.370493" elapsed="3.045479"/>
</iter>
<var>${idx}</var>
<value>${connection_retries}</value>
<status status="PASS" start="2026-10-11T00:50:30.370281" elapsed="3.045758"/>
</for>
<kw name="Fail" owner="BuiltIn">
<arg>Unable to connect ExaBgp to ODL</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.416381" elapsed="0.000076"/>
</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-10-11T00:50:30.370001" elapsed="3.046604"/>
</kw>
<doc>Start exabgp with</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:50:30.280006" elapsed="3.136820"/>
</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-10-11T00:50:33.419851" elapsed="0.000448"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:33.419149" elapsed="0.001290"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.422553" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:33.422305" elapsed="0.000373"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.422266" elapsed="0.000472"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.430473" elapsed="0.000057"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:33.430249" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.430211" elapsed="0.000436"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.432777" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:33.431967" elapsed="0.000866"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.433822" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:33.433171" elapsed="0.000704"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:33.433966" elapsed="0.000061"/>
</return>
<msg time="2026-10-11T00:50:33.434252" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:33.431110" elapsed="0.003192"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.440174" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:33.439985" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.439944" elapsed="0.000371"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.442752" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:33.442562" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.442522" elapsed="0.000368"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:33.443680" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:33.443212" elapsed="0.000523"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:33.444404" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:33.444098" elapsed="0.000398"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:33.482657" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:33.445692" elapsed="0.037098"/>
</kw>
<msg time="2026-10-11T00:50:33.482998" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:33.483055" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:33.444863" elapsed="0.038240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:33.515765" 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-10-11T00:50:33.483852" elapsed="0.032029"/>
</kw>
<msg time="2026-10-11T00:50:33.516041" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:33.516084" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:33.483332" elapsed="0.032787"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.516458" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.516200" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.516177" elapsed="0.000368"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.516979" 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-10-11T00:50:33.516725" elapsed="0.000321"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.517303" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.517106" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.517089" elapsed="0.000286"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:33.517426" 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-10-11T00:50:33.519953" elapsed="0.000266"/>
</kw>
<msg time="2026-10-11T00:50:33.520277" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:33.518858" elapsed="0.001578"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.520759" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.521089" 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-10-11T00:50:33.518228" elapsed="0.003046"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:50:33.517752" elapsed="0.003580"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:50:33.441926" elapsed="0.079497"/>
</kw>
<msg time="2026-10-11T00:50:33.521521" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:33.521569" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:33.440700" elapsed="0.080904"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:33.521802" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:50:33.521716" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.521698" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.522203" elapsed="0.000022"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.522562" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.522627" 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-10-11T00:50:33.439300" elapsed="0.083411"/>
</kw>
<msg time="2026-10-11T00:50:33.522795" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:33.522836" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:33.435123" elapsed="0.087748"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.523158" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.522937" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.522921" elapsed="0.000307"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:33.434809" elapsed="0.088441"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:33.434405" elapsed="0.088875"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:33.429578" elapsed="0.093750"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:33.421747" elapsed="0.101632"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:33.420801" elapsed="0.102734"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:33.418327" elapsed="0.105264"/>
</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-10-11T00:50:33.539622" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:33.539283" elapsed="0.000366"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:33.540347" 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-10-11T00:50:33.540122" elapsed="0.000318">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-10-11T00:50:33.540543" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:33.539805" elapsed="0.000762"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.541046" 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-10-11T00:50:33.540738" elapsed="0.000334"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:33.541350" 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-10-11T00:50:33.541533" 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-10-11T00:50:33.541237" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.541967" 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-10-11T00:50:33.541751" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.543109" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:33.542876" elapsed="0.000274"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.543647" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:50:33.543358" 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-10-11T00:50:33.543963" elapsed="0.000020"/>
</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-10-11T00:50:33.544147" elapsed="0.000022"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:50:33.544328" elapsed="0.000018"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:50:33.543833" elapsed="0.000546"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.543716" elapsed="0.000689"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:50:33.544461" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:33.544626" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:50:33.542323" elapsed="0.002326"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:33.542070" elapsed="0.002608"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.544844" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.544700" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.542053" elapsed="0.002860"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.545465" 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-10-11T00:50:33.545066" elapsed="0.000425"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:33.545547" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:33.538786" elapsed="0.006866"/>
</kw>
<msg time="2026-10-11T00:50:33.545700" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:33.534302" elapsed="0.011441"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:33.549939" 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/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-10-11T00:50:33.554140" 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/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-10-11T00:50:33.559741" elapsed="0.000071"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.560073" 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-10-11T00:50:33.560272" 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-10-11T00:50:33.560750" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.560590" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:33.560568" elapsed="0.000342"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.561072" 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-10-11T00:50:33.561249" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.561426" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:33.560524" elapsed="0.000952"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.560354" elapsed="0.001158"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.561667" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.561742" elapsed="0.000018"/>
</return>
<msg time="2026-10-11T00:50:33.561907" 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-10-11T00:50:33.533717" elapsed="0.028218"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:33.563317" 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-10-11T00:50:33.563040" elapsed="0.000355">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-10-11T00:50:33.563509" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:33.562636" elapsed="0.000898"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.563848" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.563602" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.564371" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:33.564104" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:33.563922" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.563585" elapsed="0.000878"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.564977" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:33.564633" elapsed="0.000367"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:50:33.565045" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T00:50:33.565172" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:50:33.562261" elapsed="0.002934"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:33.566290" 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-10-11T00:50:33.566101" elapsed="0.000247">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-10-11T00:50:33.566449" 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-10-11T00:50:33.565785" elapsed="0.000687"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:50:33.566656" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:50:33.566557" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.566540" elapsed="0.000195"/>
</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-10-11T00:50:33.566886" elapsed="0.000020"/>
</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-10-11T00:50:33.567060" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.567118" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:50:33.567242" 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-10-11T00:50:33.565464" elapsed="0.001801"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.568805" 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-10-11T00:50:33.568573" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.569253" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:33.569037" elapsed="0.000256"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:50:33.583591" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:50:33.583744" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:50:33.583849" 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-10-11T00:50:33.569615" elapsed="0.014258"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:33.569352" elapsed="0.014559"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.584083" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.583935" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.569336" elapsed="0.014824"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.585445" 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-10-11T00:50:33.585096" elapsed="0.000395"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:33.584858" elapsed="0.000683"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.584841" elapsed="0.000725"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.586118" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:33.585850" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:33.585616" elapsed="0.000575"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.585600" elapsed="0.000613"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.586773" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:33.586384" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.587068" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.586861" elapsed="0.000259"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.587596" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:33.587298" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:33.587142" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.586844" elapsed="0.000829"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.588175" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:33.587842" elapsed="0.000358"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.588486" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.588261" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.588996" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:33.588735" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:33.588573" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.588245" elapsed="0.000826"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:33.589211" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:50:33.589970" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:33.589718" elapsed="0.000276"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:50:33.590145" elapsed="0.000259"/>
</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-10-11T00:50:33.584519" elapsed="0.005959"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.590635" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:33.590553" elapsed="0.000122"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.590536" elapsed="0.000159"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:50:33.591434" 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-10-11T00:50:33.590833" elapsed="0.000629"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:50:33.591519" elapsed="0.000032"/>
</return>
<msg time="2026-10-11T00:50:33.591655" 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-10-11T00:50:33.567847" elapsed="0.023833"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:33.591734" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:50:33.591857" 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-10-11T00:50:33.526346" elapsed="0.065536"/>
</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-10-11T00:50:33.602901" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:33.602597" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:33.603650" 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-10-11T00:50:33.603398" elapsed="0.000375">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-10-11T00:50:33.603938" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:33.603083" elapsed="0.000879"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.604467" 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-10-11T00:50:33.604134" elapsed="0.000359"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:33.604789" 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-10-11T00:50:33.604938" 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-10-11T00:50:33.604676" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.605372" 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-10-11T00:50:33.605155" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:50:33.605812" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.605497" elapsed="0.000370"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.606555" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:33.606032" elapsed="0.000548"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:33.605889" elapsed="0.000723"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.605479" elapsed="0.001153"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.607169" 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-10-11T00:50:33.606790" elapsed="0.000405"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:33.607239" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:33.602069" elapsed="0.005269"/>
</kw>
<msg time="2026-10-11T00:50:33.607390" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:33.597482" 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/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-10-11T00:50:33.611736" 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/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-10-11T00:50:33.615917" 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/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-10-11T00:50:33.620302" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.620510" 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-10-11T00:50:33.620695" 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-10-11T00:50:33.621034" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.620894" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:33.620881" 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-10-11T00:50:33.621255" 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-10-11T00:50:33.621448" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.621622" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:33.620855" elapsed="0.000815"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.620764" elapsed="0.000929"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.621838" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.621903" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:50:33.622045" 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-10-11T00:50:33.596764" elapsed="0.025306"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:33.622233" elapsed="0.000362"/>
</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-10-11T00:50:33.623632" 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-10-11T00:50:33.623222" elapsed="0.000437"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:50:33.624169" 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-10-11T00:50:33.623805" 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-10-11T00:50:33.624378" elapsed="0.000318"/>
</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-10-11T00:50:33.622867" elapsed="0.001883"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:33.622667" 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-10-11T00:50:33.624974" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.624803" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.622650" elapsed="0.002392"/>
</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-10-11T00:50:33.592841" elapsed="0.032244"/>
</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-10-11T00:50:33.592162" elapsed="0.032987"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:33.591957" elapsed="0.033231"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.591940" elapsed="0.033269"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:33.625238" elapsed="0.000025"/>
</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-10-11T00:50:33.525747" elapsed="0.099591"/>
</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-10-11T00:50:33.524015" elapsed="0.101376"/>
</kw>
<doc>Verifies that example-ipv6-topology is filled with ipv6 route</doc>
<status status="PASS" start="2026-10-11T00:50:33.523724" elapsed="0.101753"/>
</kw>
<doc>Verifies that example-ipv6-topology is filled after starting exabgp.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:50:33.417230" elapsed="0.208369"/>
</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-10-11T00:50:33.627085" elapsed="0.000196"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:33.626839" elapsed="0.000492"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.628244" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:33.628156" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.628139" elapsed="0.000167"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.630519" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:33.630401" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.630384" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.631479" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:33.631141" elapsed="0.000375"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.631967" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:33.631702" elapsed="0.000289"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:33.632032" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:33.632157" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:33.630789" elapsed="0.001391"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.634765" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:33.634680" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.634661" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.635882" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:33.635799" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.635782" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:33.636255" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:33.636088" elapsed="0.000190"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:33.636639" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:33.636455" elapsed="0.000207"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:33.674780" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:33.637141" elapsed="0.037739"/>
</kw>
<msg time="2026-10-11T00:50:33.675038" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:33.675078" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:33.636816" elapsed="0.038297"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:33.714862" 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-10-11T00:50:33.675657" elapsed="0.039306"/>
</kw>
<msg time="2026-10-11T00:50:33.715111" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:33.715152" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:33.675280" elapsed="0.039907"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.715482" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.715255" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.715237" elapsed="0.000333"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.715992" 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-10-11T00:50:33.715754" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.716313" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.716116" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.716099" elapsed="0.000284"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:33.716428" 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-10-11T00:50:33.718878" elapsed="0.000238"/>
</kw>
<msg time="2026-10-11T00:50:33.719176" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:33.717803" 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-10-11T00:50:33.719653" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.719988" 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-10-11T00:50:33.717188" 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-10-11T00:50:33.716720" elapsed="0.003547"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:50:33.635541" elapsed="0.084803"/>
</kw>
<msg time="2026-10-11T00:50:33.720449" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:33.720491" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:33.634973" elapsed="0.085566"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:33.720696" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:50:33.720609" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.720591" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.721101" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.721400" elapsed="0.000044"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.721486" 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-10-11T00:50:33.634357" elapsed="0.087247"/>
</kw>
<msg time="2026-10-11T00:50:33.721688" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:33.721728" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:33.632536" elapsed="0.089226"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.722045" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.721828" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.721812" elapsed="0.000303"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:33.632367" elapsed="0.089769"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:33.632225" elapsed="0.089937"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:33.630106" elapsed="0.092105"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:33.627906" elapsed="0.094354"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:33.627499" elapsed="0.094801"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:33.626479" elapsed="0.095868"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.723225" 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-10-11T00:50:33.722656" elapsed="0.000596"/>
</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-10-11T00:50:33.736801" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:33.736488" elapsed="0.000340"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:33.737480" 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-10-11T00:50:33.737295" elapsed="0.000256">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-10-11T00:50:33.737636" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:33.736982" elapsed="0.000677"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.738135" 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-10-11T00:50:33.737830" elapsed="0.000330"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:33.738487" 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-10-11T00:50:33.738622" 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-10-11T00:50:33.738361" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.739059" 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-10-11T00:50:33.738840" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.740010" 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-10-11T00:50:33.739777" elapsed="0.000276"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.740487" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:50:33.740225" elapsed="0.000299"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.741109" 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-10-11T00:50:33.740843" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:33.741997" 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-10-11T00:50:33.741807" elapsed="0.000215"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:33.742067" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:33.742194" 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-10-11T00:50:33.741299" 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-10-11T00:50:33.742379" elapsed="0.000203"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">2607:f0d0:1002:0011:0000:0000:0000:0002</var>
<status status="PASS" start="2026-10-11T00:50:33.740713" elapsed="0.001906"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.743113" 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-10-11T00:50:33.742845" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:33.743837" 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-10-11T00:50:33.743657" elapsed="0.000204"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:33.743906" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:33.744030" 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-10-11T00:50:33.743304" elapsed="0.000748"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:33.744213" elapsed="0.000164"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:50:33.742718" elapsed="0.001710"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.745008" 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-10-11T00:50:33.744673" elapsed="0.000360"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:33.745705" 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-10-11T00:50:33.745527" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:33.745772" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:50:33.745893" 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-10-11T00:50:33.745198" elapsed="0.000717"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:33.746075" elapsed="0.000163"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:50:33.744545" elapsed="0.001728"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.746793" 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-10-11T00:50:33.746526" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:33.747475" 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-10-11T00:50:33.747285" elapsed="0.000214"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:33.747591" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T00:50:33.747720" 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-10-11T00:50:33.746979" elapsed="0.000763"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:33.747904" elapsed="0.000166"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:50:33.746371" elapsed="0.001737"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.748633" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:33.748334" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:33.749306" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:33.749130" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:33.749374" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:33.749526" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:33.748825" elapsed="0.000725"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:33.749710" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:33.748208" elapsed="0.001704"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.750403" 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-10-11T00:50:33.750136" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:33.751116" 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-10-11T00:50:33.750940" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:33.751185" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:33.751478" 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-10-11T00:50:33.750630" elapsed="0.000883"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:33.751676" elapsed="0.000166"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:50:33.750011" elapsed="0.001868"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.752369" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:33.752104" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:33.753065" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:33.752888" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:33.753133" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:33.753256" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:33.752586" elapsed="0.000693"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:33.753453" elapsed="0.000178"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:33.751978" elapsed="0.001690"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.754157" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:33.753893" elapsed="0.000287"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:33.754880" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:33.754704" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:33.754948" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:33.755070" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:33.754345" elapsed="0.000747"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:33.755252" elapsed="0.000181"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:33.753767" elapsed="0.001704"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:50:33.740567" elapsed="0.014948"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:50:33.755554" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:50:33.755690" 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-10-11T00:50:33.739426" elapsed="0.016288"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:33.739162" elapsed="0.016581"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.755948" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.755796" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.739145" elapsed="0.016873"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.756822" 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-10-11T00:50:33.756173" elapsed="0.000676"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:33.756892" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:33.735974" elapsed="0.021018"/>
</kw>
<msg time="2026-10-11T00:50:33.757039" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:33.731510" elapsed="0.025572"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:33.761314" 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/${file_name} 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-10-11T00:50:33.765615" 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/${file_name} 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-10-11T00:50:33.769844" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.770025" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.770202" 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-10-11T00:50:33.770566" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.770393" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:33.770379" 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-10-11T00:50:33.770793" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.770970" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.771131" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:33.770355" elapsed="0.000823"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.770267" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.771349" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.771429" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:50:33.771555" 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-10-11T00:50:33.730874" elapsed="0.040736"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.772630" 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-10-11T00:50:33.772376" 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-10-11T00:50:33.789210" level="INFO">DELETE Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:50:33.789255" level="INFO">DELETE Response : url=http://10.30.170.173: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-10-11T00:50:33.789345" 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-10-11T00:50:33.772959" elapsed="0.016410"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:33.772735" elapsed="0.016692"/>
</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-10-11T00:50:33.789614" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.789453" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.772718" elapsed="0.016972"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.791046" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:33.790772" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:33.790528" elapsed="0.000591"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.790496" elapsed="0.000645"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.791722" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:33.791437" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:33.791191" elapsed="0.000604"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.791176" elapsed="0.000641"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.792326" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:33.791988" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.792651" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.792431" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.793144" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:33.792883" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:33.792726" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.792398" elapsed="0.000820"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.793759" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:33.793388" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.794047" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.793844" elapsed="0.000253"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.794560" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:33.794274" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:33.794119" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.793828" elapsed="0.000808"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:33.794775" elapsed="0.000290"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:50:33.795491" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:33.795253" elapsed="0.000274"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:50:33.795678" elapsed="0.000210"/>
</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-10-11T00:50:33.790007" elapsed="0.005937"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:50:33.795985" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:33.796157" 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-10-11T00:50:33.771854" elapsed="0.024327"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:33.796227" elapsed="0.000025"/>
</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-10-11T00:50:33.723486" elapsed="0.072837"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-10-11T00:50:33.625926" elapsed="0.170503"/>
</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-10-11T00:50:33.797877" elapsed="0.000197"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:33.797629" elapsed="0.000495"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.799042" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:33.798955" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.798938" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.801231" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:33.801149" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.801132" elapsed="0.000160"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.802214" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:33.801890" elapsed="0.000349"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.802707" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:33.802387" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:33.802772" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:33.802896" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:33.801531" elapsed="0.001387"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.805434" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:33.805334" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.805316" elapsed="0.000181"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.806554" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:33.806450" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.806431" elapsed="0.000185"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:33.806922" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:33.806757" elapsed="0.000188"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:33.807234" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:33.807103" elapsed="0.000153"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:33.848695" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:33.807765" elapsed="0.041026"/>
</kw>
<msg time="2026-10-11T00:50:33.848941" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:33.848983" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:33.807424" elapsed="0.041594"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:33.885619" 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-10-11T00:50:33.849596" elapsed="0.036124"/>
</kw>
<msg time="2026-10-11T00:50:33.885871" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:33.885912" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:33.849226" elapsed="0.036721"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.886218" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.886016" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.885998" elapsed="0.000291"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.886747" 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-10-11T00:50:33.886490" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.887065" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.886870" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.886854" elapsed="0.000281"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:33.887165" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:33.890820" elapsed="0.000119"/>
</kw>
<msg time="2026-10-11T00:50:33.890998" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:33.888546" elapsed="0.002580"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.891456" elapsed="0.000091"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.891810" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:50:33.887924" elapsed="0.004071"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:50:33.887449" 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-10-11T00:50:33.806172" elapsed="0.085955"/>
</kw>
<msg time="2026-10-11T00:50:33.892207" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:33.892245" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:33.805657" elapsed="0.086623"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:33.892459" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:50:33.892348" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.892330" 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-10-11T00:50:33.892867" 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-10-11T00:50:33.893164" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.893227" 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-10-11T00:50:33.805049" elapsed="0.088263"/>
</kw>
<msg time="2026-10-11T00:50:33.893393" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:33.893519" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:33.803237" elapsed="0.090320"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.893842" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.893627" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.893610" elapsed="0.000302"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:33.803098" elapsed="0.090865"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:33.802963" elapsed="0.091029"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:33.800858" elapsed="0.093182"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:33.798703" elapsed="0.095385"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:33.798269" elapsed="0.095857"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:33.797260" elapsed="0.096911"/>
</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-10-11T00:50:33.910273" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:33.909968" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:33.910979" 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-10-11T00:50:33.910797" elapsed="0.000243">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-10-11T00:50:33.911124" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:33.910470" elapsed="0.000676"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.911656" 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-10-11T00:50:33.911313" elapsed="0.000368"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:33.911951" 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-10-11T00:50:33.912072" 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-10-11T00:50:33.911843" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.912528" 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-10-11T00:50:33.912283" 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-10-11T00:50:33.913639" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:33.913380" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.914100" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:50:33.913853" elapsed="0.000271"/>
</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-10-11T00:50:33.914400" elapsed="0.000035"/>
</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-10-11T00:50:33.914610" 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-10-11T00:50:33.914789" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:50:33.914275" elapsed="0.000564"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.914167" elapsed="0.000698"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:50:33.914903" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:33.915033" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:50:33.912879" elapsed="0.002177"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:33.912632" elapsed="0.002453"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.915250" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.915107" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.912614" elapsed="0.002706"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.915872" 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-10-11T00:50:33.915489" elapsed="0.000409"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:33.916027" 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/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-10-11T00:50:33.909458" elapsed="0.006683"/>
</kw>
<msg time="2026-10-11T00:50:33.916189" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:33.905011" elapsed="0.011222"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:33.920454" 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/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-10-11T00:50:33.924687" 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/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-10-11T00:50:33.928872" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.929050" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.929227" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.929588" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.929432" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:33.929417" 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-10-11T00:50:33.929813" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.929989" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.930149" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:33.929378" elapsed="0.000818"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.929291" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.930364" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.930446" elapsed="0.000017"/>
</return>
<msg time="2026-10-11T00:50:33.930583" 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-10-11T00:50:33.904414" elapsed="0.026194"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:33.931764" 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-10-11T00:50:33.931567" elapsed="0.000257">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-10-11T00:50:33.931908" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:33.931204" elapsed="0.000727"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.932211" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.931994" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.932741" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:33.932460" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:33.932284" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.931977" elapsed="0.000840"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.933308" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:33.932974" elapsed="0.000358"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:50:33.933376" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T00:50:33.933530" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:50:33.930872" elapsed="0.002682"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:33.934625" 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-10-11T00:50:33.934422" elapsed="0.000263">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-10-11T00:50:33.934768" 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-10-11T00:50:33.934095" elapsed="0.000696"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:50:33.934950" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:50:33.934853" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.934836" elapsed="0.000189"/>
</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-10-11T00:50:33.935173" elapsed="0.000019"/>
</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-10-11T00:50:33.935340" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.935398" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:33.935550" 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-10-11T00:50:33.933799" elapsed="0.001774"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.936969" 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-10-11T00:50:33.936742" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.937430" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:33.937199" elapsed="0.000272"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:50:33.945278" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:50:33.945392" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:50:33.945523" 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-10-11T00:50:33.937767" elapsed="0.007781"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:33.937544" elapsed="0.008043"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.945760" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.945611" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.937526" elapsed="0.008344"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.947126" 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-10-11T00:50:33.946801" elapsed="0.000369"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:33.946560" elapsed="0.000642"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.946543" elapsed="0.000681"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.947801" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:33.947532" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:33.947273" elapsed="0.000600"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.947259" elapsed="0.000636"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.948404" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:33.948065" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.948736" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.948521" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.949229" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:33.948967" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:33.948810" elapsed="0.000477"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.948492" elapsed="0.000814"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.949849" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:33.949491" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.950139" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.949936" elapsed="0.000253"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.950658" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:33.950366" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:33.950211" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.949919" elapsed="0.000814"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:33.950874" elapsed="0.000285"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:50:33.951564" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:33.951313" elapsed="0.000275"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:50:33.951742" elapsed="0.000207"/>
</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-10-11T00:50:33.946195" elapsed="0.005810"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.952148" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:33.952067" elapsed="0.000120"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.952050" elapsed="0.000157"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:50:33.952868" 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-10-11T00:50:33.952343" elapsed="0.000552"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:50:33.952942" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:50:33.953068" 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-10-11T00:50:33.936024" elapsed="0.017068"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:33.953146" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:50:33.953265" 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-10-11T00:50:33.896959" elapsed="0.056361"/>
</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-10-11T00:50:33.964099" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:33.963799" elapsed="0.000326"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:33.964837" 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-10-11T00:50:33.964617" elapsed="0.000337">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-10-11T00:50:33.965116" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:33.964279" elapsed="0.000860"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.965661" 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-10-11T00:50:33.965311" elapsed="0.000375"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:33.965958" 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-10-11T00:50:33.966078" 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-10-11T00:50:33.965850" elapsed="0.000252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.966543" 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-10-11T00:50:33.966292" 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-10-11T00:50:33.966940" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.966648" elapsed="0.000346"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.967640" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:33.967160" elapsed="0.000504"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:33.967017" elapsed="0.000680"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.966630" elapsed="0.001086"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.968245" 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-10-11T00:50:33.967875" elapsed="0.000396"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:33.968314" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:33.963257" elapsed="0.005184"/>
</kw>
<msg time="2026-10-11T00:50:33.968492" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:33.958789" elapsed="0.009761"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:33.972765" 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/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-10-11T00:50:33.977013" 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/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-10-11T00:50:33.981324" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.981542" 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-10-11T00:50:33.981724" 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-10-11T00:50:33.982061" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.981919" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:33.981905" 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-10-11T00:50:33.982285" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.982475" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.982652" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:33.981880" elapsed="0.000820"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.981791" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:33.982871" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.982938" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:50:33.983043" 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-10-11T00:50:33.958062" elapsed="0.025006"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:33.983232" elapsed="0.000341"/>
</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-10-11T00:50:33.984466" 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-10-11T00:50:33.984200" elapsed="0.000293"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:50:33.984891" 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-10-11T00:50:33.984650" elapsed="0.000267"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:50:33.985093" elapsed="0.000274"/>
</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-10-11T00:50:33.983840" elapsed="0.001598"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:33.983643" elapsed="0.001826"/>
</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-10-11T00:50:33.985693" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:33.985492" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.983626" elapsed="0.002178"/>
</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-10-11T00:50:33.954280" elapsed="0.031568"/>
</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-10-11T00:50:33.953630" elapsed="0.032282"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:33.953396" elapsed="0.032556"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.953380" elapsed="0.032593"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:33.986003" elapsed="0.000026"/>
</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-10-11T00:50:33.896337" elapsed="0.089766"/>
</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-10-11T00:50:33.894680" elapsed="0.091473"/>
</kw>
<doc>Verifies that example-ipv6-topology is empty</doc>
<status status="PASS" start="2026-10-11T00:50:33.894289" elapsed="0.091919"/>
</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-10-11T00:50:33.796744" elapsed="0.189548"/>
</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-10-11T00:50:33.987740" elapsed="0.000198"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:33.987480" elapsed="0.000508"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.988886" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:33.988800" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.988782" elapsed="0.000166"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.991061" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:33.990979" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.990962" elapsed="0.000160"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.992027" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:33.991707" elapsed="0.000346"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:33.992483" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:33.992201" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:33.992561" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:33.992687" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:33.991322" elapsed="0.001387"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.995200" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:33.995118" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.995100" elapsed="0.000162"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:33.996294" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:33.996213" elapsed="0.000122"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:33.996196" elapsed="0.000159"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:33.996720" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:33.996550" elapsed="0.000194"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:33.997036" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:33.996904" elapsed="0.000155"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:34.035784" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:33.997569" elapsed="0.038312"/>
</kw>
<msg time="2026-10-11T00:50:34.036031" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:34.036071" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:33.997212" elapsed="0.038935"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:34.075369" 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-10-11T00:50:34.036694" elapsed="0.038800"/>
</kw>
<msg time="2026-10-11T00:50:34.075656" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:34.075697" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:34.036315" elapsed="0.039417"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.076006" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:34.075801" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:34.075783" elapsed="0.000294"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.076498" 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-10-11T00:50:34.076256" elapsed="0.000326"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.076841" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:34.076642" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:34.076626" elapsed="0.000285"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:34.076941" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:34.079314" elapsed="0.000268"/>
</kw>
<msg time="2026-10-11T00:50:34.079642" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:34.078270" 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-10-11T00:50:34.080071" elapsed="0.000072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.080400" 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-10-11T00:50:34.077701" 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-10-11T00:50:34.077204" elapsed="0.003472"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:50:33.995961" elapsed="0.084789"/>
</kw>
<msg time="2026-10-11T00:50:34.080830" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:34.080869" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:33.995425" elapsed="0.085479"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:34.081055" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-11T00:50:34.080971" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:34.080954" elapsed="0.000175"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.081463" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.081777" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:34.081842" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:50:33.994835" elapsed="0.087091"/>
</kw>
<msg time="2026-10-11T00:50:34.082007" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:34.082046" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:33.993025" elapsed="0.089056"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.082398" elapsed="0.000098"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:34.082179" elapsed="0.000362"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:34.082162" elapsed="0.000401"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:33.992887" elapsed="0.089698"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:33.992754" elapsed="0.089857"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:33.990688" elapsed="0.091970"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:33.988549" elapsed="0.094158"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:33.988134" elapsed="0.094613"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:33.987124" elapsed="0.095669"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.083612" 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-10-11T00:50:34.082987" 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-10-11T00:50:34.094150" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:34.093851" elapsed="0.000325"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:34.094845" 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-10-11T00:50:34.094674" elapsed="0.000230">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-10-11T00:50:34.094987" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:34.094331" elapsed="0.000679"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.095523" 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-10-11T00:50:34.095185" elapsed="0.000365"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:34.095821" 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-10-11T00:50:34.095936" 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-10-11T00:50:34.095713" elapsed="0.000248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.096366" 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-10-11T00:50:34.096151" elapsed="0.000272"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.097327" 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-10-11T00:50:34.097096" elapsed="0.000273"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.097983" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:50:34.097568" elapsed="0.000439"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.098619" 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-10-11T00:50:34.098324" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:34.099299" 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-10-11T00:50:34.099118" elapsed="0.000205"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:34.099368" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:34.099555" 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-10-11T00:50:34.098811" 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-10-11T00:50:34.099744" elapsed="0.000169"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">2607:f0d0:1002:11:0:0:0:2</var>
<status status="PASS" start="2026-10-11T00:50:34.098196" elapsed="0.001755"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.100460" 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-10-11T00:50:34.100177" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:34.101148" 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-10-11T00:50:34.100973" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:34.101216" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:34.101337" 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-10-11T00:50:34.100668" elapsed="0.000691"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:34.101552" elapsed="0.000166"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:50:34.100050" elapsed="0.001706"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.102245" 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-10-11T00:50:34.101980" elapsed="0.000288"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:34.102938" 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-10-11T00:50:34.102763" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:34.103006" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:34.103127" 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-10-11T00:50:34.102448" elapsed="0.000701"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:34.103309" elapsed="0.000179"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:50:34.101853" elapsed="0.001685"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.104024" 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-10-11T00:50:34.103761" elapsed="0.000288"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:34.104720" 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-10-11T00:50:34.104543" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:34.104788" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:34.104909" 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-10-11T00:50:34.104214" elapsed="0.000717"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:34.105088" elapsed="0.000163"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:50:34.103635" elapsed="0.001652"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.105799" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:34.105533" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:34.106477" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:34.106286" elapsed="0.000215"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:34.106559" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:34.106681" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:34.105987" elapsed="0.000716"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:34.106861" elapsed="0.000161"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:34.105384" elapsed="0.001675"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.107802" 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-10-11T00:50:34.107330" elapsed="0.000497"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:34.108484" 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-10-11T00:50:34.108292" elapsed="0.000229"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:34.108566" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:34.108725" 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-10-11T00:50:34.107992" elapsed="0.000756"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:34.108907" elapsed="0.000162"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:50:34.107156" elapsed="0.001949"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.109623" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:34.109326" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:34.110288" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:34.110112" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:34.110355" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:34.110494" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:34.109812" elapsed="0.000718"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:34.110691" elapsed="0.000163"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:34.109201" elapsed="0.001691"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.111379" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:34.111115" elapsed="0.000288"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:34.112072" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:34.111898" elapsed="0.000198"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:34.112140" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:34.112261" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:34.111597" elapsed="0.000687"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:34.112459" elapsed="0.000178"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:34.110990" elapsed="0.001684"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:50:34.098051" elapsed="0.014654"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:50:34.112742" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:50:34.112871" 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-10-11T00:50:34.096756" elapsed="0.016140"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:34.096485" elapsed="0.016440"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.113092" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:34.112946" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:34.096468" elapsed="0.016693"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.113934" 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-10-11T00:50:34.113314" elapsed="0.000646"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:34.114004" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:34.093328" elapsed="0.020773"/>
</kw>
<msg time="2026-10-11T00:50:34.114149" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:34.088909" elapsed="0.025282"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:34.118395" 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/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-10-11T00:50:34.122774" 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/${file_name} 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-10-11T00:50:34.126950" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.127127" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.127304" 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-10-11T00:50:34.127665" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:34.127521" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:34.127496" 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-10-11T00:50:34.127890" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.128066" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.128227" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:34.127471" elapsed="0.000803"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:34.127369" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.128459" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:34.128536" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:50:34.128647" 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-10-11T00:50:34.088287" elapsed="0.040385"/>
</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-10-11T00:50:34.137831" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:34.137528" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:34.138525" 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-10-11T00:50:34.138326" elapsed="0.000259">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-10-11T00:50:34.138668" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:34.138014" elapsed="0.000676"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.139165" 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-10-11T00:50:34.138859" elapsed="0.000331"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:34.139480" 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-10-11T00:50:34.139640" 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-10-11T00:50:34.139353" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.140076" 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-10-11T00:50:34.139859" elapsed="0.000271"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:50:34.140457" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:34.140191" elapsed="0.000347"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.140975" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:34.140708" elapsed="0.000293"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:34.140563" elapsed="0.000471"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:34.140174" elapsed="0.000879"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.141898" 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-10-11T00:50:34.141210" elapsed="0.000716"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:34.141970" 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-10-11T00:50:34.137001" elapsed="0.005070"/>
</kw>
<msg time="2026-10-11T00:50:34.142124" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:34.132482" elapsed="0.009686"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:34.146530" 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/${file_name} 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-10-11T00:50:34.150852" 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/${file_name} 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-10-11T00:50:34.155048" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.155227" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.155451" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.155802" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:34.155661" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:34.155648" 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-10-11T00:50:34.156030" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.156204" 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-10-11T00:50:34.156365" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:34.155623" elapsed="0.000804"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:34.155533" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.156615" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:34.156683" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:50:34.156802" 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-10-11T00:50:34.131773" elapsed="0.025056"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:34.157930" 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-10-11T00:50:34.157745" elapsed="0.000243">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-10-11T00:50:34.158071" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:34.157393" elapsed="0.000701"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.158371" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:34.158156" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.158894" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:34.158634" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:34.158460" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:34.158139" elapsed="0.000830"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.159473" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:34.159124" elapsed="0.000374"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:50:34.159555" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:34.159680" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:50:34.157096" elapsed="0.002607"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.160946" 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-10-11T00:50:34.160727" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.161384" 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-10-11T00:50:34.161174" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.161908" 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-10-11T00:50:34.161689" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.162347" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:34.162133" elapsed="0.000255"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:34.163126" 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-10-11T00:50:34.162970" elapsed="0.000180"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:50:34.163459" 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-10-11T00:50:34.163300" elapsed="0.000183"/>
</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-10-11T00:50:34.163658" elapsed="0.000154"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.164218" 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-10-11T00:50:34.164001" elapsed="0.000257"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:50:34.164297" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:34.164439" 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-10-11T00:50:34.162615" elapsed="0.001849"/>
</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-10-11T00:50:34.177983" level="INFO">PUT Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.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-10-11T00:50:34.178047" level="INFO">PUT Response : url=http://10.30.170.173: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-10-11T00:50:34.178138" 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-10-11T00:50:34.164765" elapsed="0.013397"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:34.164538" elapsed="0.013665"/>
</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-10-11T00:50:34.178376" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:34.178227" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:34.164522" elapsed="0.013956"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.179631" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:34.179330" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:34.179095" elapsed="0.000607"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:34.179078" elapsed="0.000646"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.180263" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:34.180002" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:34.179772" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:34.179757" elapsed="0.000599"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.180893" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:34.180552" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.181182" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:34.180980" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.181735" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:34.181460" elapsed="0.000299"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:34.181286" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:34.180963" elapsed="0.000848"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.182316" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:34.181982" elapsed="0.000359"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.182635" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:34.182403" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.183122" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:34.182865" elapsed="0.000281"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:34.182709" elapsed="0.000469"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:34.182386" elapsed="0.000811"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:34.183341" elapsed="0.000319"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:50:34.184034" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:34.183815" elapsed="0.000244"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:50:34.184206" elapsed="0.000222"/>
</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-10-11T00:50:34.178807" elapsed="0.005676"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:50:34.184659" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:50:34.184576" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:34.184558" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.184875" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:50:34.184935" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:50:34.185092" 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-10-11T00:50:34.159997" elapsed="0.025118"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:34.185170" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:50:34.185291" 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-10-11T00:50:34.084476" elapsed="0.100838"/>
</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-10-11T00:50:34.185630" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:34.185399" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:34.185383" elapsed="0.000330"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:34.185743" elapsed="0.000024"/>
</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-10-11T00:50:34.083889" elapsed="0.101949"/>
</kw>
<doc>Configure BGP peer modules with initiate-connection set to false with ipv6 address without "::" shortened version.</doc>
<status status="PASS" start="2026-10-11T00:50:33.986568" elapsed="0.199362"/>
</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-10-11T00:50:34.187304" elapsed="0.000230"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:34.187058" 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-10-11T00:50:34.188474" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:34.188369" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:34.188351" elapsed="0.000230"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:34.191715" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:34.191630" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:34.191610" elapsed="0.000166"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.192683" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:34.192329" elapsed="0.000379"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.193117" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:34.192857" elapsed="0.000283"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:34.193180" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:34.193304" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:34.191978" elapsed="0.001349"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:34.195872" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:34.195788" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:34.195771" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:34.196964" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:34.196881" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:34.196863" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:34.197334" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:34.197168" elapsed="0.000190"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:34.197690" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:34.197553" elapsed="0.000160"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:34.235990" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:34.198192" elapsed="0.037896"/>
</kw>
<msg time="2026-10-11T00:50:34.236239" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:34.236281" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:34.197867" elapsed="0.038449"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:34.271245" 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-10-11T00:50:34.236848" elapsed="0.034501"/>
</kw>
<msg time="2026-10-11T00:50:34.271535" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:34.271577" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:34.236501" elapsed="0.035111"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.271882" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:34.271680" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:34.271663" elapsed="0.000290"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.272350" 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-10-11T00:50:34.272128" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.272732" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:34.272533" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:34.272489" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:34.272832" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:34.275194" elapsed="0.000251"/>
</kw>
<msg time="2026-10-11T00:50:34.275550" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:34.274150" 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-10-11T00:50:34.275978" elapsed="0.000072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.276304" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:50:34.273586" 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-10-11T00:50:34.273096" 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-10-11T00:50:34.196625" elapsed="0.080030"/>
</kw>
<msg time="2026-10-11T00:50:34.276736" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:34.276775" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:34.196082" elapsed="0.080728"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:34.276963" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:50:34.276877" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:34.276860" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.277352" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.277686" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:34.277750" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:50:34.195473" elapsed="0.082361"/>
</kw>
<msg time="2026-10-11T00:50:34.277916" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:34.277955" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:34.193679" elapsed="0.084311"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.278269" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:34.278056" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:34.278040" elapsed="0.000299"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:34.193539" elapsed="0.084821"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:34.193372" elapsed="0.085014"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:34.191301" elapsed="0.087228"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:34.188116" elapsed="0.090465"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:34.187729" elapsed="0.090891"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:34.186724" elapsed="0.091941"/>
</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-10-11T00:50:34.294637" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:34.294284" elapsed="0.000380"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:34.295302" 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-10-11T00:50:34.295130" elapsed="0.000231">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-10-11T00:50:34.295461" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:34.294818" elapsed="0.000666"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.296007" 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-10-11T00:50:34.295697" elapsed="0.000335"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:34.296303" 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-10-11T00:50:34.296437" 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-10-11T00:50:34.296195" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.296880" 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-10-11T00:50:34.296662" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.297985" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:34.297752" elapsed="0.000275"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.298484" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:50:34.298216" 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-10-11T00:50:34.298796" 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-10-11T00:50:34.298981" elapsed="0.000022"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:50:34.299159" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:50:34.298670" elapsed="0.000540"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:50:34.298562" elapsed="0.000675"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:50:34.299274" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:50:34.299417" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:50:34.297225" elapsed="0.002218"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:34.296982" elapsed="0.002491"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.299648" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:34.299495" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:34.296964" elapsed="0.002752"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.300238" 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-10-11T00:50:34.299869" elapsed="0.000395"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:34.300306" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:34.293789" elapsed="0.006630"/>
</kw>
<msg time="2026-10-11T00:50:34.300468" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:34.289348" elapsed="0.011176"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:34.304708" 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/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-10-11T00:50:34.308884" 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/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-10-11T00:50:34.313100" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.313278" 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-10-11T00:50:34.313486" 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-10-11T00:50:34.313833" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:34.313691" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:34.313678" 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-10-11T00:50:34.314058" elapsed="0.000067"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.314291" 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-10-11T00:50:34.314469" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:34.313653" elapsed="0.000878"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:34.313566" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.314705" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:34.314771" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:50:34.314876" 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-10-11T00:50:34.288762" elapsed="0.026137"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:34.315986" 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-10-11T00:50:34.315801" elapsed="0.000243">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-10-11T00:50:34.316126" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:34.315468" elapsed="0.000680"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.316441" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:34.316210" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.316971" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:34.316711" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:34.316549" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:34.316194" elapsed="0.000853"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.317567" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:34.317204" elapsed="0.000387"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:50:34.317636" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:34.317760" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:50:34.315158" elapsed="0.002624"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:34.318848" 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-10-11T00:50:34.318668" elapsed="0.000238">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-10-11T00:50:34.319023" 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-10-11T00:50:34.318318" elapsed="0.000728"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:50:34.319206" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:50:34.319109" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:34.319092" elapsed="0.000190"/>
</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-10-11T00:50:34.319446" elapsed="0.000020"/>
</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-10-11T00:50:34.319631" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:50:34.319691" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:50:34.319814" 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-10-11T00:50:34.318024" elapsed="0.001813"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.321223" 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-10-11T00:50:34.320999" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.321701" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:34.321468" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:50:34.328811" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:50:34.328920" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:50:34.329016" 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-10-11T00:50:34.322025" elapsed="0.007015"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:34.321802" elapsed="0.007276"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.329251" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:34.329102" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:34.321785" elapsed="0.007542"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.330610" 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-10-11T00:50:34.330253" elapsed="0.000400"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:34.330019" elapsed="0.000666"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:34.330002" elapsed="0.000705"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.331255" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:34.330991" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:34.330757" elapsed="0.000568"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:34.330742" elapsed="0.000605"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.331887" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:34.331544" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.332177" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:34.331973" elapsed="0.000255"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.332697" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:34.332420" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:34.332250" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:34.331956" elapsed="0.000816"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.333270" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:34.332941" elapsed="0.000354"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.333589" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:34.333357" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.334119" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:34.333858" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:34.333694" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:34.333340" elapsed="0.000853"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:34.334333" elapsed="0.000322"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:50:34.335030" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:34.334812" elapsed="0.000242"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:50:34.335202" elapsed="0.000221"/>
</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-10-11T00:50:34.329686" elapsed="0.005794"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:34.335635" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:34.335554" elapsed="0.000122"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:34.335537" elapsed="0.000158"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:50:34.336293" 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-10-11T00:50:34.335831" elapsed="0.000488"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:50:34.336364" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:50:34.336522" 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-10-11T00:50:34.320279" elapsed="0.016268"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:34.336602" elapsed="0.000023"/>
</return>
<msg time="2026-10-11T00:50:34.336720" 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-10-11T00:50:34.281355" elapsed="0.055388"/>
</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-10-11T00:50:34.347618" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:34.347279" elapsed="0.000365"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:34.348331" 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-10-11T00:50:34.348113" elapsed="0.000359">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-10-11T00:50:34.348648" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:34.347799" elapsed="0.000873"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.349150" 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-10-11T00:50:34.348842" elapsed="0.000333"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:34.349462" 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-10-11T00:50:34.349594" 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-10-11T00:50:34.349336" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.350061" 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-10-11T00:50:34.349841" elapsed="0.000266"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:50:34.350479" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:34.350168" elapsed="0.000397"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.351177" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:34.350735" elapsed="0.000466"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:34.350588" elapsed="0.000646"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:34.350150" elapsed="0.001104"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.351823" 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-10-11T00:50:34.351435" elapsed="0.000414"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:34.351893" 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_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-10-11T00:50:34.346779" elapsed="0.005214"/>
</kw>
<msg time="2026-10-11T00:50:34.352042" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:34.342265" elapsed="0.009821"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:34.356361" 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/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-10-11T00:50:34.360574" 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/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-10-11T00:50:34.364920" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.365103" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.365283" 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-10-11T00:50:34.365655" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:34.365492" elapsed="0.000241"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:34.365478" 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-10-11T00:50:34.365914" 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-10-11T00:50:34.366091" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.366252" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:34.365452" elapsed="0.000848"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:34.365349" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:34.366489" elapsed="0.000030"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:34.366569" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:50:34.366678" 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-10-11T00:50:34.341568" elapsed="0.025135"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:34.366889" elapsed="0.000335"/>
</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-10-11T00:50:34.368281" 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-10-11T00:50:34.367911" elapsed="0.000397"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:50:34.368740" 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-10-11T00:50:34.368480" elapsed="0.000286"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T00:50:34.369211" 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-10-11T00:50:34.369378" 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-10-11T00:50:34.368944" elapsed="0.000512">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-10-11T00:50:34.367551" elapsed="0.002049">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-10-11T00:50:34.367294" elapsed="0.002371">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-10-11T00:50:34.369869" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:34.369695" elapsed="0.000252"/>
</branch>
<status status="FAIL" start="2026-10-11T00:50:34.367278" elapsed="0.002693">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-10-11T00:50:34.337697" elapsed="0.032375">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-10-11T00:50:34.337015" elapsed="0.033172">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-10-11T00:50:34.336815" elapsed="0.033445">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-10-11T00:50:34.336799" elapsed="0.033490">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-10-11T00:50:34.370332" elapsed="0.000015"/>
</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-10-11T00:50:34.280773" elapsed="0.089679">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-10-11T00:50:36.406394" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:36.405701" elapsed="0.000788"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:36.408043" 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-10-11T00:50:36.407634" elapsed="0.000550">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-10-11T00:50:36.408376" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:36.406869" elapsed="0.001590"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.409630" 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-10-11T00:50:36.408878" elapsed="0.000809"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:36.410305" 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-10-11T00:50:36.410637" 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-10-11T00:50:36.410056" elapsed="0.000636"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.411702" 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-10-11T00:50:36.411122" elapsed="0.000674"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.413978" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:36.413402" elapsed="0.000667"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.415109" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:50:36.414487" elapsed="0.000675"/>
</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-10-11T00:50:36.415854" 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-10-11T00:50:36.416265" 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-10-11T00:50:36.416722" elapsed="0.000045"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:50:36.415558" elapsed="0.001283"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.415260" elapsed="0.001642"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:50:36.416995" elapsed="0.000064"/>
</return>
<msg time="2026-10-11T00:50:36.417292" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:50:36.412643" elapsed="0.004700"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:36.412021" elapsed="0.005416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.417851" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.417493" elapsed="0.000430"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.411976" elapsed="0.005974"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.418729" 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-10-11T00:50:36.418165" elapsed="0.000600"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:36.418824" 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-10-11T00:50:36.404486" elapsed="0.014475"/>
</kw>
<msg time="2026-10-11T00:50:36.419029" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:36.394173" 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/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-10-11T00:50:36.425250" 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-10-11T00:50:36.431168" 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/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-10-11T00:50:36.437091" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.437339" 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-10-11T00:50:36.437620" 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-10-11T00:50:36.438141" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.437940" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:36.437921" elapsed="0.000320"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.438473" 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-10-11T00:50:36.438742" 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-10-11T00:50:36.438966" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:36.437884" elapsed="0.001149"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.437757" elapsed="0.001308"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.439271" elapsed="0.000025"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.439362" elapsed="0.000021"/>
</return>
<msg time="2026-10-11T00:50:36.439544" 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-10-11T00:50:36.392768" elapsed="0.046811"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:36.441106" 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-10-11T00:50:36.440849" elapsed="0.000340">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-10-11T00:50:36.441305" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:36.440362" 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-10-11T00:50:36.441773" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.441446" elapsed="0.000400"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.442500" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:36.442111" elapsed="0.000438"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:36.441877" elapsed="0.000717"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.441401" elapsed="0.001221"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.443280" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:36.442890" elapsed="0.000414"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:50:36.443348" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:50:36.443489" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:50:36.439949" elapsed="0.003563"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:36.444620" 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-10-11T00:50:36.444391" elapsed="0.000289">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-10-11T00:50:36.444764" 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-10-11T00:50:36.444076" elapsed="0.000710"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:50:36.444947" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:50:36.444850" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.444833" elapsed="0.000191"/>
</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-10-11T00:50:36.445173" elapsed="0.000019"/>
</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-10-11T00:50:36.445344" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.445449" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:50:36.445591" 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-10-11T00:50:36.443779" elapsed="0.001836"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.446844" 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-10-11T00:50:36.446616" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.447288" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:36.447072" elapsed="0.000256"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:50:36.456160" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:50:36.456453" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:50:36.456669" 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-10-11T00:50:36.447658" elapsed="0.009067"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:36.447387" elapsed="0.009425"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.457206" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.456866" elapsed="0.000469"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.447370" elapsed="0.010009"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.459844" 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-10-11T00:50:36.459289" elapsed="0.000618"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:36.458959" elapsed="0.000993"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.458935" elapsed="0.001048"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.460795" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:36.460380" elapsed="0.000473"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:36.460053" elapsed="0.000843"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.460032" elapsed="0.000894"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.461687" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:36.461163" elapsed="0.000560"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.462100" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.461811" elapsed="0.000361"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.462830" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:36.462442" elapsed="0.000423"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:36.462203" elapsed="0.000707"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.461788" elapsed="0.001148"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.463676" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:36.463174" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.464082" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.463799" elapsed="0.000354"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.464803" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:36.464400" elapsed="0.000437"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:36.464182" elapsed="0.000700"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.463776" elapsed="0.001132"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:36.465103" elapsed="0.000439"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:50:36.466135" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:36.465809" 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-10-11T00:50:36.466379" elapsed="0.000356"/>
</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-10-11T00:50:36.458160" elapsed="0.008655"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.467014" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:36.466901" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.466878" elapsed="0.000218"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:50:36.468100" 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-10-11T00:50:36.467290" elapsed="0.000847"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:50:36.468202" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T00:50:36.468376" 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-10-11T00:50:36.445896" elapsed="0.022535"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:36.468510" elapsed="0.000050"/>
</return>
<msg time="2026-10-11T00:50:36.468695" 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-10-11T00:50:36.375462" 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-10-11T00:50:36.484001" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:36.483496" elapsed="0.000538"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:36.484761" 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-10-11T00:50:36.484519" elapsed="0.000361">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-10-11T00:50:36.485043" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:36.484192" elapsed="0.000874"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.485580" 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-10-11T00:50:36.485237" elapsed="0.000369"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:36.485876" 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-10-11T00:50:36.486005" 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-10-11T00:50:36.485767" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.486453" 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-10-11T00:50:36.486220" 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-10-11T00:50:36.486908" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.486614" elapsed="0.000349"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.487616" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:36.487129" elapsed="0.000511"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:36.486985" elapsed="0.000688"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.486595" elapsed="0.001098"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.488226" 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-10-11T00:50:36.487858" elapsed="0.000393"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:36.488295" 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_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-10-11T00:50:36.482785" elapsed="0.005610"/>
</kw>
<msg time="2026-10-11T00:50:36.488473" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:36.476384" elapsed="0.012135"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:36.492899" 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/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-10-11T00:50:36.497095" 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/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-10-11T00:50:36.501422" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.501612" 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-10-11T00:50:36.501791" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.502126" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.501984" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:36.501971" 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-10-11T00:50:36.502350" 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-10-11T00:50:36.502552" 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-10-11T00:50:36.502719" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:36.501945" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.501856" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.502969" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.503037" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:50:36.503144" 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-10-11T00:50:36.475381" elapsed="0.027788"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:36.503333" elapsed="0.000359"/>
</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-10-11T00:50:36.504711" 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-10-11T00:50:36.504316" elapsed="0.000423"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:50:36.505246" 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-10-11T00:50:36.504885" elapsed="0.000388"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:50:36.505476" elapsed="0.000297"/>
</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-10-11T00:50:36.503959" elapsed="0.001869"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:36.503763" elapsed="0.002094"/>
</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-10-11T00:50:36.506052" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.505879" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.503746" elapsed="0.002373"/>
</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-10-11T00:50:36.470113" elapsed="0.036048"/>
</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-10-11T00:50:36.469111" elapsed="0.037114"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:36.468830" elapsed="0.037435"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.468808" elapsed="0.037478"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:36.506316" elapsed="0.000026"/>
</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-10-11T00:50:36.373970" elapsed="0.132462"/>
</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-10-11T00:50:34.279060" elapsed="2.227425"/>
</kw>
<doc>Verifies that example-ipv6-topology is filled with ipv6 route</doc>
<status status="PASS" start="2026-10-11T00:50:34.278778" elapsed="2.227778"/>
</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-10-11T00:50:34.186171" elapsed="2.320484"/>
</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-10-11T00:50:36.508086" elapsed="0.000199"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:36.507841" elapsed="0.000493"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.509246" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:36.509159" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.509142" elapsed="0.000167"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.511476" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:36.511378" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.511361" elapsed="0.000222"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.512485" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:36.512144" elapsed="0.000366"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.512946" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:36.512681" elapsed="0.000289"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:36.513010" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:36.513136" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:36.511791" elapsed="0.001369"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.515712" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:36.515628" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.515610" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.516825" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:36.516742" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.516725" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:36.517199" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:36.517031" elapsed="0.000193"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:36.517578" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:36.517386" elapsed="0.000216"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:36.554863" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:36.518083" elapsed="0.036885"/>
</kw>
<msg time="2026-10-11T00:50:36.555129" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:36.555172" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:36.517756" elapsed="0.037452"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:36.588969" 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-10-11T00:50:36.555881" elapsed="0.033194"/>
</kw>
<msg time="2026-10-11T00:50:36.589226" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:36.589266" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:36.555376" elapsed="0.033925"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.589611" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.589369" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.589351" elapsed="0.000335"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.590092" 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-10-11T00:50:36.589870" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.590425" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.590216" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.590199" elapsed="0.000299"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:36.590528" 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-10-11T00:50:36.594240" elapsed="0.000118"/>
</kw>
<msg time="2026-10-11T00:50:36.594437" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:36.591905" elapsed="0.002678"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.594927" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.595257" 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-10-11T00:50:36.591272" elapsed="0.004197"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:50:36.590817" elapsed="0.004726"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:50:36.516471" elapsed="0.079148"/>
</kw>
<msg time="2026-10-11T00:50:36.595701" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:36.595740" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:36.515923" elapsed="0.079852"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:36.595928" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:50:36.595843" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.595825" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.596323" elapsed="0.000022"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.596715" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.596780" 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-10-11T00:50:36.515315" elapsed="0.081551"/>
</kw>
<msg time="2026-10-11T00:50:36.596948" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:36.596988" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:36.513498" elapsed="0.083524"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.597306" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.597089" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.597073" elapsed="0.000303"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:36.513341" elapsed="0.084056"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:36.513205" elapsed="0.084278"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:36.511086" elapsed="0.086458"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:36.508908" elapsed="0.088685"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:36.508503" elapsed="0.089129"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:36.507487" elapsed="0.090192"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.598442" 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-10-11T00:50:36.597875" elapsed="0.000596"/>
</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-10-11T00:50:36.611941" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:36.611640" elapsed="0.000327"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:36.612644" 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-10-11T00:50:36.612450" elapsed="0.000254">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-10-11T00:50:36.612823" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:36.612122" elapsed="0.000725"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.613323" 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-10-11T00:50:36.613017" elapsed="0.000331"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:36.613665" 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-10-11T00:50:36.613783" 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-10-11T00:50:36.613527" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.614215" 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-10-11T00:50:36.613997" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.615163" 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-10-11T00:50:36.614931" elapsed="0.000275"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.615654" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:50:36.615376" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.616257" 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-10-11T00:50:36.615991" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:36.617139" 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-10-11T00:50:36.616951" elapsed="0.000212"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:36.617208" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:36.617333" 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-10-11T00:50:36.616462" elapsed="0.000894"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:36.617543" elapsed="0.000174"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">2607:f0d0:1002:11:0:0:0:2</var>
<status status="PASS" start="2026-10-11T00:50:36.615865" elapsed="0.001889"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.618247" 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-10-11T00:50:36.617980" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:36.618954" 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-10-11T00:50:36.618778" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:36.619022" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:36.619144" 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-10-11T00:50:36.618458" elapsed="0.000708"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:36.619325" elapsed="0.000183"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:50:36.617852" elapsed="0.001705"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.620047" 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-10-11T00:50:36.619782" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:36.620770" 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-10-11T00:50:36.620589" elapsed="0.000205"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:36.620838" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:36.620959" 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-10-11T00:50:36.620239" elapsed="0.000742"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:36.621142" elapsed="0.000164"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:50:36.619655" elapsed="0.001688"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.621862" 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-10-11T00:50:36.621595" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:36.622595" 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-10-11T00:50:36.622390" elapsed="0.000229"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:36.622664" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:36.622786" 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-10-11T00:50:36.622088" elapsed="0.000720"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:36.622968" elapsed="0.000164"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:50:36.621456" elapsed="0.001714"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.623686" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:36.623394" elapsed="0.000316"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:36.624356" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:36.624180" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:36.624455" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:50:36.624608" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:36.623877" elapsed="0.000755"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:36.624794" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:36.623268" elapsed="0.001728"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.625509" 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-10-11T00:50:36.625221" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:36.626192" 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-10-11T00:50:36.626017" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:36.626260" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:36.626383" 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-10-11T00:50:36.625714" elapsed="0.000691"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:36.626597" elapsed="0.000321"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:50:36.625095" elapsed="0.001861"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.627470" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:36.627185" elapsed="0.000309"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:36.628154" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:36.627978" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:36.628223" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:36.628346" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:36.627674" elapsed="0.000694"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:36.628554" elapsed="0.000168"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:36.627058" elapsed="0.001702"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.629306" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:36.628986" elapsed="0.000346"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:36.630009" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:36.629834" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:36.630078" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:36.630199" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:36.629517" elapsed="0.000705"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:36.630382" elapsed="0.000190"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:36.628859" elapsed="0.001750"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:50:36.615721" elapsed="0.014919"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:50:36.630710" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:36.630845" 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-10-11T00:50:36.614595" elapsed="0.016275"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:36.614318" elapsed="0.016582"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.631068" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.630922" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.614300" elapsed="0.016837"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.631945" 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-10-11T00:50:36.631291" elapsed="0.000681"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:36.632016" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:36.611118" elapsed="0.020997"/>
</kw>
<msg time="2026-10-11T00:50:36.632163" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:36.606672" elapsed="0.025534"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:36.636426" 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/${file_name} 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-10-11T00:50:36.640639" 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/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-10-11T00:50:36.644854" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.645034" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.645213" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.645685" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.645416" elapsed="0.000325"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:36.645389" elapsed="0.000375"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.645917" 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-10-11T00:50:36.646093" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.646253" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:36.645365" elapsed="0.000934"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.645278" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.646517" elapsed="0.000041"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.646610" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:50:36.646722" 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-10-11T00:50:36.606037" elapsed="0.040710"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.647751" 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-10-11T00:50:36.647516" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:50:36.658474" level="INFO">DELETE Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:50:36.658519" level="INFO">DELETE Response : url=http://10.30.170.173: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-10-11T00:50:36.658628" 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-10-11T00:50:36.648079" elapsed="0.010573"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:36.647856" 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-10-11T00:50:36.658864" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.658718" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.647839" elapsed="0.011100"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.660296" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:36.659841" elapsed="0.000495"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:36.659608" elapsed="0.000760"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.659591" elapsed="0.000800"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.660976" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:36.660707" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:36.660456" elapsed="0.000595"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.660441" elapsed="0.000632"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.661629" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:36.661245" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.661929" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.661719" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.662440" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:36.662161" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:36.662003" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.661701" elapsed="0.000818"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.663044" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:36.662706" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.663335" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.663131" elapsed="0.000256"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.663857" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:36.663596" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:36.663423" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.663115" elapsed="0.000851"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:36.664107" elapsed="0.000294"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:50:36.664826" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:36.664601" elapsed="0.000249"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:50:36.664998" elapsed="0.000209"/>
</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-10-11T00:50:36.659248" elapsed="0.006013"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:50:36.665302" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:36.665489" 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-10-11T00:50:36.646979" elapsed="0.018534"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:36.665574" elapsed="0.000025"/>
</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-10-11T00:50:36.598712" elapsed="0.066958"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-10-11T00:50:36.506943" elapsed="0.158818"/>
</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-10-11T00:50:36.667124" elapsed="0.000197"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:36.666882" elapsed="0.000489"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.668268" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:36.668182" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.668165" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.670310" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:36.670228" elapsed="0.000122"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.670212" elapsed="0.000158"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.671270" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:36.670951" elapsed="0.000345"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.671739" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:36.671460" elapsed="0.000303"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:36.671803" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:36.671927" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:36.670595" elapsed="0.001354"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.674642" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:36.674556" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.674524" elapsed="0.000181"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.675764" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:36.675680" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.675663" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:36.676134" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:36.675968" elapsed="0.000190"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:36.676467" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:36.676316" elapsed="0.000174"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:36.712269" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:36.676980" elapsed="0.035389"/>
</kw>
<msg time="2026-10-11T00:50:36.712608" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:36.712650" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:36.676656" elapsed="0.036030"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:36.743862" 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-10-11T00:50:36.713187" elapsed="0.030775"/>
</kw>
<msg time="2026-10-11T00:50:36.744110" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:36.744151" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:36.712851" elapsed="0.031335"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.744484" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.744254" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.744236" elapsed="0.000336"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.744974" 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-10-11T00:50:36.744750" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.745292" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.745096" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.745080" elapsed="0.000282"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:36.745393" 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-10-11T00:50:36.747806" elapsed="0.000113"/>
</kw>
<msg time="2026-10-11T00:50:36.747974" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:36.746754" elapsed="0.001348"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.748398" elapsed="0.000094"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.748763" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:50:36.746149" elapsed="0.002798"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:50:36.745695" elapsed="0.003309"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:50:36.675369" elapsed="0.073708"/>
</kw>
<msg time="2026-10-11T00:50:36.749157" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:36.749196" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:36.674852" elapsed="0.074379"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:36.749385" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-10-11T00:50:36.749299" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.749282" elapsed="0.000202"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.749838" 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-10-11T00:50:36.750140" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.750203" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:50:36.674239" elapsed="0.076048"/>
</kw>
<msg time="2026-10-11T00:50:36.750370" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:36.750481" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:36.672265" elapsed="0.078255"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.750858" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.750638" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.750620" elapsed="0.000309"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:36.672128" elapsed="0.078823"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:36.671995" elapsed="0.078983"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:36.669940" elapsed="0.081086"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:36.667935" elapsed="0.083139"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:36.667548" elapsed="0.083565"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:36.666543" elapsed="0.084617"/>
</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-10-11T00:50:36.767385" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:36.767083" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:36.768085" 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-10-11T00:50:36.767908" elapsed="0.000238">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-10-11T00:50:36.768229" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:36.767593" elapsed="0.000658"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.768757" 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-10-11T00:50:36.768434" elapsed="0.000348"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:36.769051" 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-10-11T00:50:36.769170" 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-10-11T00:50:36.768944" elapsed="0.000250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.769628" 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-10-11T00:50:36.769382" 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-10-11T00:50:36.770566" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:36.770310" elapsed="0.000298"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.771025" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:50:36.770779" elapsed="0.000270"/>
</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-10-11T00:50:36.771326" elapsed="0.000020"/>
</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-10-11T00:50:36.771523" elapsed="0.000045"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:50:36.771730" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:50:36.771199" elapsed="0.000582"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.771092" elapsed="0.000715"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:50:36.771845" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:36.771975" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:50:36.769976" elapsed="0.002022"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:36.769731" elapsed="0.002296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.772192" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.772048" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.769713" elapsed="0.002581"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.772852" 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-10-11T00:50:36.772465" elapsed="0.000413"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:36.772922" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:36.766585" elapsed="0.006436"/>
</kw>
<msg time="2026-10-11T00:50:36.773067" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:36.762132" elapsed="0.010978"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:36.777504" 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/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-10-11T00:50:36.781743" 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/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-10-11T00:50:36.785971" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.786150" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.786328" 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-10-11T00:50:36.786692" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.786548" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:36.786523" 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-10-11T00:50:36.786916" 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-10-11T00:50:36.787093" elapsed="0.000017"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.787251" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:36.786498" elapsed="0.000801"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.786393" elapsed="0.000929"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.787485" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.787564" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:50:36.787670" 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-10-11T00:50:36.761542" elapsed="0.026152"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:36.788822" 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-10-11T00:50:36.788635" elapsed="0.000247">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-10-11T00:50:36.788965" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:36.788285" elapsed="0.000703"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.789267" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.789051" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.789807" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:36.789520" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:36.789340" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.789034" elapsed="0.000849"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.790373" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:36.790040" elapsed="0.000356"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:50:36.790458" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:36.790594" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:50:36.787988" elapsed="0.002629"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:36.791681" 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-10-11T00:50:36.791483" elapsed="0.000256">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-10-11T00:50:36.791821" 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-10-11T00:50:36.791155" elapsed="0.000688"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:50:36.792003" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:50:36.791905" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.791888" elapsed="0.000190"/>
</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-10-11T00:50:36.792228" elapsed="0.000019"/>
</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-10-11T00:50:36.792399" elapsed="0.000034"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.792474" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:50:36.792609" 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-10-11T00:50:36.790861" elapsed="0.001771"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.793857" 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-10-11T00:50:36.793633" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.794301" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:36.794085" elapsed="0.000256"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:50:36.802722" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:50:36.802840" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:50:36.802928" 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-10-11T00:50:36.794656" elapsed="0.008296"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:36.794400" elapsed="0.008591"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.803164" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.803014" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.794384" elapsed="0.008889"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.804551" 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-10-11T00:50:36.804199" elapsed="0.000397"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:36.803965" elapsed="0.000663"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.803948" elapsed="0.000702"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.805202" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:36.804936" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:36.804700" elapsed="0.000573"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.804685" elapsed="0.000610"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.805853" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:36.805479" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.806145" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.805941" elapsed="0.000256"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.806665" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:36.806374" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:36.806218" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.805924" elapsed="0.000819"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.807247" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:36.806915" elapsed="0.000356"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.807562" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.807333" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.808051" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:36.807792" elapsed="0.000283"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:36.807636" elapsed="0.000471"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.807316" elapsed="0.000810"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:36.808265" elapsed="0.000334"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:50:36.808978" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:36.808757" elapsed="0.000245"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:50:36.809150" elapsed="0.000207"/>
</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-10-11T00:50:36.803625" elapsed="0.005806"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.809591" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:36.809495" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.809478" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:50:36.810261" 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-10-11T00:50:36.809788" elapsed="0.000499"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:50:36.810332" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:50:36.810495" 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-10-11T00:50:36.792901" elapsed="0.017619"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:36.810588" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:50:36.810709" 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-10-11T00:50:36.754131" elapsed="0.056633"/>
</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-10-11T00:50:36.821550" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:36.821221" elapsed="0.000357"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:36.822261" 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-10-11T00:50:36.822044" elapsed="0.000333">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-10-11T00:50:36.822577" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:36.821732" elapsed="0.000868"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.823076" 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-10-11T00:50:36.822770" elapsed="0.000331"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:36.823369" 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-10-11T00:50:36.823502" 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-10-11T00:50:36.823262" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.823949" 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-10-11T00:50:36.823733" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:50:36.824340" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.824051" elapsed="0.000342"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.825038" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:36.824599" elapsed="0.000464"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:36.824439" elapsed="0.000656"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.824033" elapsed="0.001082"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.825676" 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-10-11T00:50:36.825271" elapsed="0.000431"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:36.825745" 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_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-10-11T00:50:36.820719" elapsed="0.005125"/>
</kw>
<msg time="2026-10-11T00:50:36.825891" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:36.816174" elapsed="0.009761"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:36.830169" 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/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-10-11T00:50:36.834385" 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/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-10-11T00:50:36.838789" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.838967" 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-10-11T00:50:36.839143" 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-10-11T00:50:36.839490" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.839335" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:36.839321" 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-10-11T00:50:36.839727" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.839902" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.840060" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:36.839296" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.839209" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.840274" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.840340" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:50:36.840459" 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-10-11T00:50:36.815459" elapsed="0.025025"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:36.840659" elapsed="0.000312"/>
</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-10-11T00:50:36.841894" 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-10-11T00:50:36.841641" elapsed="0.000279"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:50:36.842308" 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-10-11T00:50:36.842067" elapsed="0.000267"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:50:36.842531" elapsed="0.000291"/>
</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-10-11T00:50:36.841239" elapsed="0.001640"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:36.841041" elapsed="0.001867"/>
</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-10-11T00:50:36.843102" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.842931" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.841024" elapsed="0.002188"/>
</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-10-11T00:50:36.811722" elapsed="0.031535"/>
</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-10-11T00:50:36.811044" elapsed="0.032278"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:36.810841" elapsed="0.032521"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.810825" elapsed="0.032558"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:36.843429" 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-10-11T00:50:36.753522" elapsed="0.090024"/>
</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-10-11T00:50:36.751647" elapsed="0.091950"/>
</kw>
<doc>Verifies that example-ipv6-topology is empty</doc>
<status status="PASS" start="2026-10-11T00:50:36.751280" elapsed="0.092374"/>
</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-10-11T00:50:36.665997" elapsed="0.177741"/>
</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-10-11T00:50:36.845161" elapsed="0.000199"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:36.844916" elapsed="0.000509"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.846316" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:36.846225" elapsed="0.000133"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.846208" elapsed="0.000170"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.848525" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:36.848441" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.848403" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.849487" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:36.849148" elapsed="0.000364"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.849954" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:36.849694" elapsed="0.000283"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:36.850017" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:36.850141" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:36.848799" elapsed="0.001364"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.852715" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:36.852630" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.852612" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.853820" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:36.853737" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.853720" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:36.854189" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:36.854023" elapsed="0.000189"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:36.854522" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:36.854371" elapsed="0.000189"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:36.891168" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:36.855040" elapsed="0.036230"/>
</kw>
<msg time="2026-10-11T00:50:36.891461" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:36.891505" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:36.854715" elapsed="0.036878"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:36.928246" 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-10-11T00:50:36.892123" elapsed="0.036233"/>
</kw>
<msg time="2026-10-11T00:50:36.928547" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:36.928590" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:36.891774" elapsed="0.036853"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.928909" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.928698" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.928680" elapsed="0.000302"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.929389" 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-10-11T00:50:36.929159" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.929768" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.929566" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.929520" elapsed="0.000320"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:36.929870" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:36.932377" elapsed="0.000139"/>
</kw>
<msg time="2026-10-11T00:50:36.932590" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:36.931213" 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-10-11T00:50:36.933020" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.933350" 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-10-11T00:50:36.930639" 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-10-11T00:50:36.930139" elapsed="0.003489"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:50:36.853460" elapsed="0.080240"/>
</kw>
<msg time="2026-10-11T00:50:36.933781" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:36.933820" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:36.852924" elapsed="0.080932"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:36.934009" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:50:36.933924" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.933906" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.934397" elapsed="0.000045"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.934775" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.934839" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:50:36.852303" elapsed="0.082619"/>
</kw>
<msg time="2026-10-11T00:50:36.935004" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:36.935043" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:36.850495" elapsed="0.084583"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.935519" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.935176" elapsed="0.000408"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.935159" elapsed="0.000446"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:36.850341" elapsed="0.085286"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:36.850208" elapsed="0.085445"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:36.848131" elapsed="0.087570"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:36.845974" elapsed="0.089776"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:36.845586" elapsed="0.090204"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:36.844574" elapsed="0.091270"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.936635" 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-10-11T00:50:36.936038" elapsed="0.000625"/>
</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-10-11T00:50:36.947194" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:36.946895" elapsed="0.000325"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:36.947891" 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-10-11T00:50:36.947718" elapsed="0.000233">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-10-11T00:50:36.948035" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:36.947374" elapsed="0.000683"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.948574" 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-10-11T00:50:36.948227" elapsed="0.000374"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:36.948874" 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-10-11T00:50:36.948992" 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-10-11T00:50:36.948766" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.949439" 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-10-11T00:50:36.949207" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.951659" 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-10-11T00:50:36.950142" elapsed="0.001561"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.952133" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:50:36.951881" elapsed="0.000276"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.952771" 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-10-11T00:50:36.952488" elapsed="0.000308"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:36.953466" 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-10-11T00:50:36.953268" elapsed="0.000223"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:36.953550" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:50:36.953709" 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-10-11T00:50:36.952964" 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-10-11T00:50:36.953893" elapsed="0.000168"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">2607:f0d0:1002:11::2</var>
<status status="PASS" start="2026-10-11T00:50:36.952344" elapsed="0.001754"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.954620" 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-10-11T00:50:36.954322" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:36.955289" 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-10-11T00:50:36.955114" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:36.955356" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:36.955497" 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-10-11T00:50:36.954812" elapsed="0.000707"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:36.955695" elapsed="0.000164"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:50:36.954196" elapsed="0.001700"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.956384" 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-10-11T00:50:36.956118" elapsed="0.000304"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:36.957081" 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-10-11T00:50:36.956907" elapsed="0.000198"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:36.957149" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:36.957272" 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-10-11T00:50:36.956605" elapsed="0.000689"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:36.957470" elapsed="0.000180"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:50:36.955993" elapsed="0.001695"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.958178" 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-10-11T00:50:36.957912" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:36.958878" 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-10-11T00:50:36.958702" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:36.958946" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:36.959069" 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-10-11T00:50:36.958368" elapsed="0.000723"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:36.959250" elapsed="0.000178"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:50:36.957786" elapsed="0.001680"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.959983" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:36.959719" elapsed="0.000288"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:36.960680" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:36.960491" elapsed="0.000214"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:36.960749" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:36.960871" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:36.960173" elapsed="0.000721"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:36.961053" elapsed="0.000163"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:36.959593" elapsed="0.001660"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.961936" 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-10-11T00:50:36.961493" elapsed="0.000467"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:36.962653" 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-10-11T00:50:36.962446" elapsed="0.000231"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:36.962721" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:36.962845" 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-10-11T00:50:36.962128" 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-10-11T00:50:36.963065" elapsed="0.000166"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:50:36.961352" elapsed="0.001915"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.963786" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:36.963509" elapsed="0.000301"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:36.964468" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:36.964278" elapsed="0.000214"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:36.964546" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:36.964671" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:36.963976" elapsed="0.000718"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:36.964853" elapsed="0.000162"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:36.963366" elapsed="0.001686"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.965813" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:36.965275" elapsed="0.000564"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:36.966498" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:36.966306" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:36.966579" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:36.966702" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:36.966006" elapsed="0.000719"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:36.966884" elapsed="0.000163"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:36.965150" elapsed="0.001935"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:50:36.952200" elapsed="0.014915"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:50:36.967152" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:50:36.967281" 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-10-11T00:50:36.949803" elapsed="0.017502"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:36.949554" elapsed="0.017779"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.967514" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.967354" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.949525" elapsed="0.018073"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.968344" 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-10-11T00:50:36.967751" elapsed="0.000619"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:36.968428" 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-10-11T00:50:36.946375" elapsed="0.022155"/>
</kw>
<msg time="2026-10-11T00:50:36.968591" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:36.941961" 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/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-10-11T00:50:36.972822" 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/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-10-11T00:50:36.977201" 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/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-10-11T00:50:36.981369" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.981570" 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-10-11T00:50:36.981749" 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-10-11T00:50:36.982077" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.981937" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:36.981924" 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-10-11T00:50:36.982300" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.982489" 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-10-11T00:50:36.982677" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:36.981900" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.981814" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:36.982895" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:36.982961" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:50:36.983070" 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-10-11T00:50:36.941345" elapsed="0.041750"/>
</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-10-11T00:50:36.992204" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:36.991903" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:36.992903" 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-10-11T00:50:36.992729" elapsed="0.000232">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-10-11T00:50:36.993043" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:36.992384" elapsed="0.000682"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.993581" 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-10-11T00:50:36.993233" elapsed="0.000374"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:36.993893" 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-10-11T00:50:36.994042" 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-10-11T00:50:36.993784" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.994492" 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-10-11T00:50:36.994258" 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-10-11T00:50:36.994865" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:36.994620" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.995345" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:36.995082" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:36.994939" elapsed="0.000477"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:36.994603" elapsed="0.000834"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:36.996282" 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-10-11T00:50:36.995624" elapsed="0.000686"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:36.996354" 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-10-11T00:50:36.991383" elapsed="0.005089"/>
</kw>
<msg time="2026-10-11T00:50:36.996524" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:36.986934" elapsed="0.009649"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:37.000929" 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/${file_name} 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-10-11T00:50:37.005146" 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/${file_name} 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-10-11T00:50:37.009329" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:37.009529" 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-10-11T00:50:37.009756" 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-10-11T00:50:37.010088" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:37.009947" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:37.009934" 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-10-11T00:50:37.010313" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:37.010506" 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-10-11T00:50:37.010682" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:37.009910" elapsed="0.000820"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:37.009823" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:37.010900" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:37.010966" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:50:37.011084" 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-10-11T00:50:36.986206" elapsed="0.024904"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:37.012208" 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-10-11T00:50:37.012025" elapsed="0.000242">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-10-11T00:50:37.012348" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:37.011704" elapsed="0.000667"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:37.012680" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:37.012450" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.013173" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:37.012913" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:37.012753" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:37.012432" elapsed="0.000816"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.013770" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:37.013420" elapsed="0.000374"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:50:37.013838" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:37.013960" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:50:37.011377" elapsed="0.002606"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.015192" 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-10-11T00:50:37.014974" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.015677" 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-10-11T00:50:37.015436" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.016171" 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-10-11T00:50:37.015954" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.016636" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:37.016394" elapsed="0.000282"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:37.017365" 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-10-11T00:50:37.017207" elapsed="0.000182"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:50:37.017729" 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-10-11T00:50:37.017582" elapsed="0.000171"/>
</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-10-11T00:50:37.017911" elapsed="0.000154"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.018488" 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-10-11T00:50:37.018252" elapsed="0.000277"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:50:37.018580" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:37.018710" 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-10-11T00:50:37.016855" elapsed="0.001877"/>
</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-10-11T00:50:37.033328" level="INFO">PUT Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.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-10-11T00:50:37.033393" level="INFO">PUT Response : url=http://10.30.170.173: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-10-11T00:50:37.033508" 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-10-11T00:50:37.019019" elapsed="0.014513"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:37.018793" elapsed="0.014797"/>
</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-10-11T00:50:37.033766" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:37.033614" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:37.018777" elapsed="0.015070"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.034992" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:37.034721" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:37.034468" elapsed="0.000595"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:37.034451" elapsed="0.000634"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.035663" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:37.035367" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:37.035134" elapsed="0.000601"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:37.035119" elapsed="0.000638"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.036266" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:37.035926" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:37.036585" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:37.036353" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.037130" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:37.036865" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:37.036701" elapsed="0.000485"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:37.036337" elapsed="0.000868"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.037760" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:37.037374" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:37.038051" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:37.037847" elapsed="0.000256"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.038571" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:37.038280" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:37.038124" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:37.037831" elapsed="0.000818"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:37.038790" elapsed="0.000288"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:50:37.039473" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:37.039234" elapsed="0.000264"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:50:37.039681" elapsed="0.000213"/>
</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-10-11T00:50:37.034165" elapsed="0.005785"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:50:37.040090" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:50:37.040009" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:37.039992" elapsed="0.000174"/>
</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-10-11T00:50:37.040304" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:50:37.040363" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:50:37.040548" 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-10-11T00:50:37.014272" elapsed="0.026301"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:37.040629" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:50:37.040751" 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-10-11T00:50:36.937504" elapsed="0.103270"/>
</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-10-11T00:50:37.041056" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:37.040858" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:37.040843" elapsed="0.000296"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:37.041168" elapsed="0.000024"/>
</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-10-11T00:50:36.936910" elapsed="0.104354"/>
</kw>
<doc>Configure BGP peer modules with initiate-connection set to false with full text ipv6 address.</doc>
<status status="PASS" start="2026-10-11T00:50:36.844012" elapsed="0.197345"/>
</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-10-11T00:50:37.042774" elapsed="0.000200"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:37.042515" elapsed="0.000509"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:37.043932" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:37.043846" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:37.043828" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:37.046220" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:37.046134" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:37.046117" elapsed="0.000165"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.047205" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:37.046879" elapsed="0.000351"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.047674" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:37.047379" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:37.047739" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:37.047864" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:37.046500" elapsed="0.001387"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:37.050402" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:37.050318" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:37.050300" elapsed="0.000182"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:37.051564" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:37.051466" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:37.051448" elapsed="0.000179"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:37.051935" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:37.051769" elapsed="0.000190"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:37.052249" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:37.052116" elapsed="0.000155"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:37.087698" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:37.052780" elapsed="0.035017"/>
</kw>
<msg time="2026-10-11T00:50:37.087949" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:37.087990" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:37.052441" elapsed="0.035584"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:37.119712" 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-10-11T00:50:37.088555" elapsed="0.031256"/>
</kw>
<msg time="2026-10-11T00:50:37.119959" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:37.120000" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:37.088187" elapsed="0.031848"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:37.120304" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:37.120103" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:37.120085" elapsed="0.000290"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.120813" 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-10-11T00:50:37.120588" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:37.121132" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:37.120937" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:37.120920" elapsed="0.000282"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:37.121231" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:37.123646" elapsed="0.000233"/>
</kw>
<msg time="2026-10-11T00:50:37.123938" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:37.122602" 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-10-11T00:50:37.124402" elapsed="0.000096"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:37.124770" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:50:37.121985" elapsed="0.002967"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:50:37.121516" elapsed="0.003494"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:50:37.051187" elapsed="0.073897"/>
</kw>
<msg time="2026-10-11T00:50:37.125165" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:37.125205" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:37.050665" elapsed="0.074575"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:37.125394" elapsed="0.000053"/>
</return>
<status status="PASS" start="2026-10-11T00:50:37.125308" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:37.125291" 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-10-11T00:50:37.125846" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:37.126144" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:37.126208" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:50:37.050031" elapsed="0.076260"/>
</kw>
<msg time="2026-10-11T00:50:37.126373" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:37.126437" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:37.048208" elapsed="0.078266"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:37.126773" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:37.126555" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:37.126526" elapsed="0.000318"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:37.048068" elapsed="0.078796"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:37.047933" elapsed="0.078958"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:37.045834" elapsed="0.081104"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:37.043591" elapsed="0.083396"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:37.043169" elapsed="0.083857"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:37.042163" elapsed="0.084908"/>
</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-10-11T00:50:37.143172" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:37.142872" elapsed="0.000327"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:37.143881" 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-10-11T00:50:37.143697" elapsed="0.000244">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-10-11T00:50:37.144025" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:37.143352" elapsed="0.000696"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.144598" 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-10-11T00:50:37.144257" elapsed="0.000367"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:37.144897" 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-10-11T00:50:37.145023" 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-10-11T00:50:37.144788" elapsed="0.000259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.145499" 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-10-11T00:50:37.145261" 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-10-11T00:50:37.146627" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:37.146366" elapsed="0.000304"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.147097" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:50:37.146845" elapsed="0.000277"/>
</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-10-11T00:50:37.147400" elapsed="0.000035"/>
</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-10-11T00:50:37.147626" 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-10-11T00:50:37.147808" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:50:37.147272" elapsed="0.000588"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:50:37.147165" elapsed="0.000721"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:50:37.147925" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:37.148054" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:50:37.145862" elapsed="0.002216"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:37.145616" elapsed="0.002491"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:37.148274" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:37.148129" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:37.145599" elapsed="0.002744"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.148924" 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-10-11T00:50:37.148518" elapsed="0.000434"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:37.148995" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:37.142343" elapsed="0.006751"/>
</kw>
<msg time="2026-10-11T00:50:37.149141" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:37.137903" elapsed="0.011282"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:37.153485" 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/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-10-11T00:50:37.158319" 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/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-10-11T00:50:37.163134" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:37.163367" 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-10-11T00:50:37.163588" 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-10-11T00:50:37.164007" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:37.163851" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:37.163831" 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-10-11T00:50:37.164242" 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-10-11T00:50:37.164435" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:37.164610" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:37.163790" elapsed="0.000870"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:37.163670" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:37.164838" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:37.164911" elapsed="0.000019"/>
</return>
<msg time="2026-10-11T00:50:37.165079" 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-10-11T00:50:37.137288" elapsed="0.027818"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:37.166473" 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-10-11T00:50:37.166195" elapsed="0.000372">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-10-11T00:50:37.166655" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:37.165788" elapsed="0.000890"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:37.166997" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:37.166748" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.167553" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:37.167255" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:37.167071" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:37.166730" elapsed="0.000901"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.168132" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:37.167792" elapsed="0.000365"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:50:37.168202" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T00:50:37.168330" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:50:37.165394" elapsed="0.002959"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:37.169460" 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-10-11T00:50:37.169258" elapsed="0.000262">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-10-11T00:50:37.169665" 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-10-11T00:50:37.168940" elapsed="0.000748"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:50:37.169852" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:50:37.169752" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:37.169735" elapsed="0.000196"/>
</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-10-11T00:50:37.170083" elapsed="0.000019"/>
</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-10-11T00:50:37.170255" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:50:37.170313" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:50:37.170453" 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-10-11T00:50:37.168638" elapsed="0.001839"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.171998" 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-10-11T00:50:37.171764" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.172474" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:37.172239" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:50:37.181244" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:50:37.181405" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:50:37.181523" 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-10-11T00:50:37.172829" elapsed="0.008731"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:37.172598" elapsed="0.009002"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:37.181775" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:37.181624" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:37.172581" elapsed="0.009270"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.183356" 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-10-11T00:50:37.182963" elapsed="0.000437"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:37.182635" elapsed="0.000815"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:37.182611" elapsed="0.000866"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.184077" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:37.183802" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:37.183556" elapsed="0.000595"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:37.183524" elapsed="0.000650"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.184757" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:37.184351" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:37.185052" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:37.184845" elapsed="0.000260"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.185606" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:37.185285" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:37.185128" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:37.184828" elapsed="0.000856"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.186191" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:37.185856" elapsed="0.000359"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:37.186496" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:37.186278" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.187043" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:37.186781" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:37.186619" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:37.186261" elapsed="0.000859"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:37.187263" elapsed="0.000323"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:50:37.188018" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:37.187747" elapsed="0.000295"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:50:37.188197" elapsed="0.000231"/>
</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-10-11T00:50:37.182188" elapsed="0.006299"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:37.188647" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:37.188563" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:37.188533" elapsed="0.000176"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:50:37.189395" 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-10-11T00:50:37.188853" elapsed="0.000584"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:50:37.189485" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:37.189627" 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-10-11T00:50:37.171026" elapsed="0.018626"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:37.189707" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:50:37.189834" 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-10-11T00:50:37.129879" elapsed="0.059980"/>
</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-10-11T00:50:37.200885" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:37.200584" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:37.201627" 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-10-11T00:50:37.201378" elapsed="0.000369">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-10-11T00:50:37.201913" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:37.201065" elapsed="0.000871"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.202447" 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-10-11T00:50:37.202110" elapsed="0.000363"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:37.202763" 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-10-11T00:50:37.202909" 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-10-11T00:50:37.202651" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.203386" 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-10-11T00:50:37.203159" 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-10-11T00:50:37.203832" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:37.203511" elapsed="0.000376"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.204564" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:37.204053" elapsed="0.000538"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:37.203909" elapsed="0.000720"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:37.203494" elapsed="0.001155"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.205194" 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-10-11T00:50:37.204810" elapsed="0.000411"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:37.205267" 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_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-10-11T00:50:37.200057" elapsed="0.005310"/>
</kw>
<msg time="2026-10-11T00:50:37.205446" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:37.195453" elapsed="0.010041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:37.209769" 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/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-10-11T00:50:37.213977" 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/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-10-11T00:50:37.218430" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:37.218625" 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-10-11T00:50:37.218803" 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-10-11T00:50:37.219147" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:37.219004" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:37.218991" 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-10-11T00:50:37.219433" 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-10-11T00:50:37.219627" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:37.219792" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:37.218965" elapsed="0.000875"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:37.218872" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:37.220016" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:37.220083" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:50:37.220190" 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-10-11T00:50:37.194738" elapsed="0.025477"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:37.220378" elapsed="0.000350"/>
</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-10-11T00:50:37.222462" 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-10-11T00:50:37.221365" elapsed="0.001126"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:50:37.222901" 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-10-11T00:50:37.222654" elapsed="0.000272"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T00:50:37.223382" 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-10-11T00:50:37.223586" 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-10-11T00:50:37.223109" elapsed="0.000540">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-10-11T00:50:37.221000" elapsed="0.002779">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-10-11T00:50:37.220798" elapsed="0.003045">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-10-11T00:50:37.224047" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:37.223873" elapsed="0.000260"/>
</branch>
<status status="FAIL" start="2026-10-11T00:50:37.220781" elapsed="0.003376">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-10-11T00:50:37.190851" elapsed="0.033408">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-10-11T00:50:37.190146" elapsed="0.034228">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-10-11T00:50:37.189939" elapsed="0.034531">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-10-11T00:50:37.189921" elapsed="0.034580">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-10-11T00:50:37.224569" 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-10-11T00:50:37.129260" elapsed="0.095416">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-10-11T00:50:39.261853" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:39.261076" elapsed="0.000847"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:39.263601" 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-10-11T00:50:39.263093" elapsed="0.000665">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-10-11T00:50:39.263952" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:39.262289" elapsed="0.001714"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.265128" 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-10-11T00:50:39.264381" elapsed="0.000802"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:39.265864" 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-10-11T00:50:39.266170" 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-10-11T00:50:39.265607" elapsed="0.000617"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.267233" 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-10-11T00:50:39.266737" elapsed="0.000590"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.269740" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:39.269043" elapsed="0.000806"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.270517" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:50:39.270136" elapsed="0.000415"/>
</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-10-11T00:50:39.270991" 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-10-11T00:50:39.271254" elapsed="0.000030"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:50:39.271530" elapsed="0.000040"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:50:39.270808" elapsed="0.000810"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:50:39.270637" elapsed="0.001023"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:50:39.271726" elapsed="0.000048"/>
</return>
<msg time="2026-10-11T00:50:39.271925" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:50:39.268232" elapsed="0.003725"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:39.267640" elapsed="0.004358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.272231" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:39.272031" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.267586" elapsed="0.004742"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.273134" 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-10-11T00:50:39.272590" elapsed="0.000579"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:39.273229" 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/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-10-11T00:50:39.259818" elapsed="0.013547"/>
</kw>
<msg time="2026-10-11T00:50:39.273455" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:39.249531" elapsed="0.023989"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:39.281602" 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/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-10-11T00:50:39.288318" elapsed="0.000085"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-10-11T00:50:39.294569" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.294874" 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-10-11T00:50:39.295142" 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-10-11T00:50:39.295843" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:39.295621" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:39.295595" elapsed="0.000358"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.296175" 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-10-11T00:50:39.296440" 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-10-11T00:50:39.296684" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:39.295525" elapsed="0.001227"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:39.295347" elapsed="0.001442"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.297000" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:39.297100" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:50:39.297319" 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-10-11T00:50:39.248054" elapsed="0.049303"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:39.299039" 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-10-11T00:50:39.298761" elapsed="0.000358">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-10-11T00:50:39.299207" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:39.298290" elapsed="0.000940"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.299588" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:39.299296" elapsed="0.000348"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.300124" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:39.299854" elapsed="0.000295"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:39.299667" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.299278" elapsed="0.000922"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.300732" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:39.300359" elapsed="0.000397"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:50:39.300800" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T00:50:39.300928" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:50:39.297804" elapsed="0.003147"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:39.302043" 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-10-11T00:50:39.301855" elapsed="0.000247">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-10-11T00:50:39.302187" 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-10-11T00:50:39.301524" elapsed="0.000685"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:50:39.302371" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:50:39.302273" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.302256" elapsed="0.000209"/>
</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-10-11T00:50:39.302648" 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-10-11T00:50:39.302826" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:50:39.302923" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:50:39.303052" 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-10-11T00:50:39.301208" elapsed="0.001867"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.304341" 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-10-11T00:50:39.304106" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.304821" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:39.304600" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:50:39.313352" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:50:39.313553" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:50:39.313687" 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-10-11T00:50:39.305153" elapsed="0.008559"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:39.304922" elapsed="0.008829"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.313931" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:39.313776" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.304905" elapsed="0.009102"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.315291" 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-10-11T00:50:39.314955" elapsed="0.000381"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:39.314713" elapsed="0.000655"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.314697" elapsed="0.000694"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.315982" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:39.315713" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:39.315457" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.315441" elapsed="0.000636"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.316675" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:39.316251" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.316975" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:39.316764" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.317488" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:39.317207" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:39.317048" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.316747" elapsed="0.000886"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.318151" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:39.317807" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.318461" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:39.318240" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.318971" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:39.318707" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:39.318536" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.318222" elapsed="0.000825"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:39.319190" elapsed="0.000310"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:50:39.319971" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:39.319709" elapsed="0.000286"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:50:39.320148" elapsed="0.000219"/>
</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-10-11T00:50:39.314342" elapsed="0.006105"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:39.320608" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:39.320511" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.320495" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:50:39.321431" 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-10-11T00:50:39.320811" elapsed="0.000648"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:50:39.321505" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:39.321661" 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-10-11T00:50:39.303362" elapsed="0.018324"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:39.321741" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:50:39.321866" 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-10-11T00:50:39.230248" elapsed="0.091642"/>
</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-10-11T00:50:39.332998" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:39.332694" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:39.333888" 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-10-11T00:50:39.333514" elapsed="0.000494">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-10-11T00:50:39.334172" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:39.333181" elapsed="0.001016"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.334742" 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-10-11T00:50:39.334370" elapsed="0.000398"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:39.335048" 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-10-11T00:50:39.335238" 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-10-11T00:50:39.334934" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.335732" 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-10-11T00:50:39.335491" 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-10-11T00:50:39.336181" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:39.335877" elapsed="0.000360"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.336923" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:39.336425" elapsed="0.000524"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:39.336259" elapsed="0.000723"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.335859" elapsed="0.001143"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.337661" 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-10-11T00:50:39.337163" elapsed="0.000528"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:39.337737" 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-10-11T00:50:39.332145" elapsed="0.005696"/>
</kw>
<msg time="2026-10-11T00:50:39.337892" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:39.327496" elapsed="0.010443"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:39.342323" 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_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-10-11T00:50:39.346513" 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/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-10-11T00:50:39.350875" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.351063" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.351244" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.351631" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:39.351472" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:39.351457" 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-10-11T00:50:39.351857" 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-10-11T00:50:39.352032" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.352192" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:39.351427" elapsed="0.000812"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:39.351316" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.352468" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:39.352541" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:39.352668" 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-10-11T00:50:39.326778" elapsed="0.025916"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:39.352860" elapsed="0.000349"/>
</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-10-11T00:50:39.354277" 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-10-11T00:50:39.353876" elapsed="0.000429"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:50:39.354895" 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-10-11T00:50:39.354487" 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-10-11T00:50:39.355107" elapsed="0.000292"/>
</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-10-11T00:50:39.353495" elapsed="0.001990"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:39.353279" elapsed="0.002236"/>
</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-10-11T00:50:39.355725" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:39.355538" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.353262" elapsed="0.002534"/>
</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-10-11T00:50:39.322871" elapsed="0.032969"/>
</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-10-11T00:50:39.322171" elapsed="0.033738"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:39.321966" elapsed="0.033983"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.321950" elapsed="0.034020"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:39.356001" elapsed="0.000027"/>
</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-10-11T00:50:39.228640" elapsed="0.127464"/>
</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-10-11T00:50:37.127513" elapsed="2.228646"/>
</kw>
<doc>Verifies that example-ipv6-topology is filled with ipv6 route</doc>
<status status="PASS" start="2026-10-11T00:50:37.127186" elapsed="2.229034"/>
</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-10-11T00:50:37.041643" elapsed="2.314686"/>
</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-10-11T00:50:39.358013" elapsed="0.000204"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:39.357741" 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-10-11T00:50:39.359347" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:39.359232" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.359209" elapsed="0.000255"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:39.361711" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:39.361626" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.361606" elapsed="0.000226"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.362808" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:39.362435" elapsed="0.000400"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.363280" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:39.363012" elapsed="0.000293"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:39.363346" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:50:39.363493" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:39.362054" elapsed="0.001463"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:39.366109" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:39.366024" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.366006" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:39.367298" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:39.367212" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.367194" elapsed="0.000168"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:39.367746" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:39.367541" elapsed="0.000231"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:39.368087" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:39.367941" elapsed="0.000170"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:39.404622" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:39.368648" elapsed="0.036088"/>
</kw>
<msg time="2026-10-11T00:50:39.404898" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:39.404955" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:39.368271" elapsed="0.036722"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:39.458836" 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-10-11T00:50:39.405535" elapsed="0.053437"/>
</kw>
<msg time="2026-10-11T00:50:39.459148" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:39.459190" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:39.405161" elapsed="0.054065"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.459626" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:39.459317" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.459287" elapsed="0.000421"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.460173" 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-10-11T00:50:39.459895" elapsed="0.000346"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.460530" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:39.460301" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.460284" elapsed="0.000334"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:39.460652" 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-10-11T00:50:39.463529" elapsed="0.000158"/>
</kw>
<msg time="2026-10-11T00:50:39.463751" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:39.462143" elapsed="0.001750"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.464254" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.464690" 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-10-11T00:50:39.461515" elapsed="0.003373"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:50:39.460986" elapsed="0.003963"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:50:39.366943" elapsed="0.098081"/>
</kw>
<msg time="2026-10-11T00:50:39.465109" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:39.465150" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:39.366321" elapsed="0.098865"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:39.465343" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:50:39.465256" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.465239" 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-10-11T00:50:39.465861" 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-10-11T00:50:39.466173" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:39.466236" 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-10-11T00:50:39.365733" elapsed="0.100590"/>
</kw>
<msg time="2026-10-11T00:50:39.466504" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:39.466572" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:39.363871" elapsed="0.102741"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.466907" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:39.466683" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.466666" elapsed="0.000312"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:39.363730" elapsed="0.103271"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:39.363582" elapsed="0.103461"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:39.361299" elapsed="0.105802"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:39.358931" elapsed="0.108223"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:39.358444" elapsed="0.108754"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:39.357339" elapsed="0.109911"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.468105" 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-10-11T00:50:39.467485" elapsed="0.000648"/>
</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-10-11T00:50:39.481712" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:39.481354" elapsed="0.000385"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:39.482463" 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-10-11T00:50:39.482218" elapsed="0.000329">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-10-11T00:50:39.482681" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:39.481898" elapsed="0.000808"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.483188" 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-10-11T00:50:39.482879" elapsed="0.000334"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:39.483508" 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-10-11T00:50:39.483675" 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-10-11T00:50:39.483379" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.484112" 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-10-11T00:50:39.483893" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.485078" 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-10-11T00:50:39.484842" elapsed="0.000279"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.485591" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:50:39.485300" elapsed="0.000318"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.486221" 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-10-11T00:50:39.485953" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:39.487133" 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-10-11T00:50:39.486933" elapsed="0.000225"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:39.487202" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:50:39.487329" 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-10-11T00:50:39.486615" elapsed="0.000737"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:39.487532" elapsed="0.000213"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">2607:f0d0:1002:11::2</var>
<status status="PASS" start="2026-10-11T00:50:39.485820" elapsed="0.001962"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.488281" 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-10-11T00:50:39.488013" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:39.488987" 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-10-11T00:50:39.488811" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:39.489055" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:50:39.489176" 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-10-11T00:50:39.488490" elapsed="0.000708"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:39.489356" elapsed="0.000180"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:50:39.487886" elapsed="0.001715"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.490093" 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-10-11T00:50:39.489828" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:39.490810" 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-10-11T00:50:39.490633" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:39.490876" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:39.490997" 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-10-11T00:50:39.490282" elapsed="0.000738"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:39.491181" elapsed="0.000164"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:50:39.489701" elapsed="0.001680"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.491902" 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-10-11T00:50:39.491634" elapsed="0.000328"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:39.492648" 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-10-11T00:50:39.492456" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:39.492718" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:39.492841" 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-10-11T00:50:39.492134" elapsed="0.000730"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:39.493024" elapsed="0.000164"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:50:39.491495" elapsed="0.001729"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.493756" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:39.493462" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:39.494437" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:39.494247" elapsed="0.000215"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:39.494506" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:39.494641" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:39.493946" elapsed="0.000718"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:39.494824" elapsed="0.000162"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:39.493321" elapsed="0.001701"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.495538" 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-10-11T00:50:39.495244" elapsed="0.000332"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:39.496378" 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-10-11T00:50:39.496050" elapsed="0.000352"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:39.496465" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:39.496616" 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-10-11T00:50:39.495743" elapsed="0.000897"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:39.496801" elapsed="0.000164"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:50:39.495119" elapsed="0.001882"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.497508" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:39.497224" elapsed="0.000308"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:39.498197" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:39.498020" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:39.498264" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:39.498388" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:39.497716" elapsed="0.000708"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:39.498595" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:39.497099" elapsed="0.001697"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.499284" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:39.499020" elapsed="0.000288"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:39.499980" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:39.499805" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:39.500049" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:39.500172" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:39.499490" elapsed="0.000705"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:39.500354" elapsed="0.000180"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:39.498895" elapsed="0.001700"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:50:39.485665" elapsed="0.014964"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:50:39.500700" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:39.500836" 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-10-11T00:50:39.484489" elapsed="0.016372"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:39.484216" elapsed="0.016677"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.501064" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:39.500917" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.484198" elapsed="0.016935"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.501965" 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-10-11T00:50:39.501288" elapsed="0.000704"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:39.502036" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:39.480854" elapsed="0.021280"/>
</kw>
<msg time="2026-10-11T00:50:39.502183" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:39.476418" elapsed="0.025808"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:39.506451" 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/${file_name} 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-10-11T00:50:39.510663" 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/${file_name} 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-10-11T00:50:39.514862" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.515042" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.515219" 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-10-11T00:50:39.515579" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:39.515424" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:39.515397" 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-10-11T00:50:39.515804" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.515979" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.516139" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:39.515372" elapsed="0.000813"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:39.515286" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.516390" elapsed="0.000034"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:39.516474" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:50:39.516596" 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-10-11T00:50:39.475789" elapsed="0.040833"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.517632" 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-10-11T00:50:39.517381" 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-10-11T00:50:39.526678" level="INFO">DELETE Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:50:39.526726" level="INFO">DELETE Response : url=http://10.30.170.173: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-10-11T00:50:39.526810" 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-10-11T00:50:39.517960" elapsed="0.008873"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:39.517735" elapsed="0.009139"/>
</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-10-11T00:50:39.527045" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:39.526899" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.517718" elapsed="0.009401"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.528514" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:39.528222" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:39.527987" elapsed="0.000615"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.527969" elapsed="0.000656"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.529179" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:39.528914" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:39.528674" elapsed="0.000577"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.528659" elapsed="0.000613"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.529842" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:39.529461" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.530138" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:39.529930" elapsed="0.000259"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.530665" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:39.530369" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:39.530211" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.529912" elapsed="0.000829"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.531247" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:39.530912" elapsed="0.000360"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.531554" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:39.531335" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.532085" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:39.531821" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:39.531662" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.531318" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:39.532337" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:50:39.533078" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:39.532847" elapsed="0.000255"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:50:39.533254" elapsed="0.000233"/>
</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-10-11T00:50:39.527651" elapsed="0.005892"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:50:39.533603" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:39.533778" 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-10-11T00:50:39.516858" elapsed="0.016943"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:39.533848" elapsed="0.000024"/>
</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-10-11T00:50:39.468357" elapsed="0.065586"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-10-11T00:50:39.356736" elapsed="0.177309"/>
</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-10-11T00:50:39.535693" elapsed="0.000289"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:39.535356" elapsed="0.000697"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:39.536996" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:39.536907" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.536890" elapsed="0.000167"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:39.539226" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:39.539142" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.539125" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.540224" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:39.539891" elapsed="0.000359"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.540714" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:39.540400" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:39.540779" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:39.540902" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:39.539520" elapsed="0.001405"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:39.543451" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:39.543350" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.543333" elapsed="0.000180"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:39.544584" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:39.544480" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.544458" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:39.544973" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:39.544796" elapsed="0.000202"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:39.545297" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:39.545160" elapsed="0.000161"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:39.580596" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:39.545911" elapsed="0.034801"/>
</kw>
<msg time="2026-10-11T00:50:39.580966" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:39.581009" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:39.545517" elapsed="0.035529"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:39.611474" 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-10-11T00:50:39.581679" elapsed="0.029922"/>
</kw>
<msg time="2026-10-11T00:50:39.611755" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:39.611796" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:39.581235" elapsed="0.030597"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.612131" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:39.611910" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.611887" elapsed="0.000320"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.612668" 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-10-11T00:50:39.612385" elapsed="0.000349"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.612996" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:39.612795" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.612777" elapsed="0.000289"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:39.613099" 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-10-11T00:50:39.616026" elapsed="0.000137"/>
</kw>
<msg time="2026-10-11T00:50:39.616225" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:39.614612" elapsed="0.001759"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.616731" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.617064" 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-10-11T00:50:39.613942" elapsed="0.003353"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:50:39.613435" 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-10-11T00:50:39.544191" elapsed="0.073306"/>
</kw>
<msg time="2026-10-11T00:50:39.617624" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:39.617666" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:39.543673" elapsed="0.074030"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:39.617867" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-10-11T00:50:39.617776" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.617756" elapsed="0.000196"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.618302" 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-10-11T00:50:39.618666" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:39.618734" 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-10-11T00:50:39.543065" elapsed="0.075757"/>
</kw>
<msg time="2026-10-11T00:50:39.618910" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:39.618950" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:39.541246" elapsed="0.077742"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.619325" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:39.619100" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.619083" elapsed="0.000313"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:39.541108" elapsed="0.078438"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:39.540971" elapsed="0.078626"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:39.538842" elapsed="0.080815"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:39.536651" elapsed="0.083062"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:39.536208" elapsed="0.083549"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:39.534989" elapsed="0.084818"/>
</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-10-11T00:50:39.636172" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:39.635862" elapsed="0.000336"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:39.636934" 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-10-11T00:50:39.636707" elapsed="0.000308">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-10-11T00:50:39.637100" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:39.636354" elapsed="0.000768"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.637633" 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-10-11T00:50:39.637292" elapsed="0.000366"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:39.637936" 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-10-11T00:50:39.638085" 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-10-11T00:50:39.637823" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.638537" 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-10-11T00:50:39.638298" 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-10-11T00:50:39.639489" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:39.639244" elapsed="0.000286"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.639999" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:50:39.639732" elapsed="0.000291"/>
</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-10-11T00:50:39.640327" elapsed="0.000020"/>
</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-10-11T00:50:39.640531" 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-10-11T00:50:39.640727" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:50:39.640196" elapsed="0.000584"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:50:39.640071" elapsed="0.000735"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:50:39.640844" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:39.640973" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:50:39.638910" elapsed="0.002087"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:39.638654" elapsed="0.002371"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.641190" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:39.641047" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.638636" elapsed="0.002658"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.641871" 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-10-11T00:50:39.641466" elapsed="0.000430"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:39.641939" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:39.635330" elapsed="0.006709"/>
</kw>
<msg time="2026-10-11T00:50:39.642087" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:39.630725" elapsed="0.011407"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:39.646339" 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/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-10-11T00:50:39.650548" 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/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-10-11T00:50:39.656322" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.656578" 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-10-11T00:50:39.656812" 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-10-11T00:50:39.657216" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:39.657040" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:39.657024" 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-10-11T00:50:39.657475" 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-10-11T00:50:39.657677" 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-10-11T00:50:39.657840" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:39.656996" elapsed="0.000891"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:39.656891" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.658058" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:39.658123" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:50:39.658228" 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-10-11T00:50:39.630113" elapsed="0.028138"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:39.659424" 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-10-11T00:50:39.659218" elapsed="0.000277">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-10-11T00:50:39.659594" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:39.658898" elapsed="0.000720"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.659898" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:39.659681" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.660422" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:39.660145" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:39.659971" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.659664" elapsed="0.000835"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.661006" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:39.660672" elapsed="0.000358"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:50:39.661074" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:39.661197" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:50:39.658596" elapsed="0.002623"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:39.662311" 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-10-11T00:50:39.662129" elapsed="0.000240">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-10-11T00:50:39.662468" 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-10-11T00:50:39.661810" elapsed="0.000680"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:50:39.662665" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:50:39.662554" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.662537" elapsed="0.000204"/>
</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-10-11T00:50:39.662889" elapsed="0.000019"/>
</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-10-11T00:50:39.663059" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:50:39.663116" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:50:39.663238" 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-10-11T00:50:39.661485" elapsed="0.001775"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.664485" 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-10-11T00:50:39.664248" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.664941" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:39.664726" elapsed="0.000255"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:50:39.673640" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:50:39.673807" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:50:39.673908" 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-10-11T00:50:39.665264" elapsed="0.008668"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:39.665040" elapsed="0.008929"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.674142" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:39.673994" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.665023" elapsed="0.009231"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.724431" 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-10-11T00:50:39.723852" elapsed="0.000644"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:39.723385" elapsed="0.001159"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.674925" elapsed="0.049665"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.725167" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:39.724895" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:39.724654" elapsed="0.000586"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.724638" elapsed="0.000624"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.725893" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:39.725487" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.726197" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:39.725983" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.726727" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:39.726448" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:39.726271" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.725966" elapsed="0.000839"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.727311" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:39.726975" elapsed="0.000361"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.727648" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:39.727398" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.728150" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:39.727884" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:39.727724" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.727381" elapsed="0.000845"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:39.728376" elapsed="0.000329"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:50:39.729114" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:39.728863" elapsed="0.000275"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:50:39.729287" elapsed="0.000232"/>
</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-10-11T00:50:39.674606" elapsed="0.054992"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:39.729755" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:39.729665" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.729648" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:50:39.730513" 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-10-11T00:50:39.729961" elapsed="0.000579"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:50:39.730599" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:50:39.730746" 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-10-11T00:50:39.663551" elapsed="0.067220"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:39.730827" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:50:39.730947" 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-10-11T00:50:39.622716" elapsed="0.108319"/>
</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-10-11T00:50:39.742069" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:39.741767" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:39.742869" 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-10-11T00:50:39.742596" elapsed="0.000410">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-10-11T00:50:39.743172" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:39.742252" elapsed="0.000944"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.743751" 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-10-11T00:50:39.743368" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:39.744062" 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-10-11T00:50:39.744214" 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-10-11T00:50:39.743949" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.744697" 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-10-11T00:50:39.744458" 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-10-11T00:50:39.745093" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:39.744801" elapsed="0.000345"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.745824" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:39.745311" elapsed="0.000539"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:39.745168" elapsed="0.000714"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.744783" elapsed="0.001120"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.746480" 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-10-11T00:50:39.746063" elapsed="0.000445"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:39.746552" 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/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-10-11T00:50:39.741237" elapsed="0.005432"/>
</kw>
<msg time="2026-10-11T00:50:39.746719" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:39.736627" elapsed="0.010137"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:39.751073" 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/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-10-11T00:50:39.755578" 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_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-10-11T00:50:39.759825" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.760021" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.760201" 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-10-11T00:50:39.760609" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:39.760438" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:39.760422" 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-10-11T00:50:39.760837" 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-10-11T00:50:39.761013" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.761173" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:39.760380" elapsed="0.000839"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:39.760279" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.761395" elapsed="0.000033"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:39.761477" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:50:39.761602" 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-10-11T00:50:39.735895" elapsed="0.025734"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:39.761794" elapsed="0.000344"/>
</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-10-11T00:50:39.763090" 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-10-11T00:50:39.762809" elapsed="0.000308"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:50:39.763527" 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-10-11T00:50:39.763262" 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-10-11T00:50:39.763748" elapsed="0.000285"/>
</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-10-11T00:50:39.762423" elapsed="0.001666"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:39.762207" elapsed="0.001912"/>
</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-10-11T00:50:39.764313" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:39.764142" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.762191" elapsed="0.002248"/>
</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-10-11T00:50:39.732081" elapsed="0.032404"/>
</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-10-11T00:50:39.731344" elapsed="0.033210"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:39.731113" elapsed="0.033496"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.731096" elapsed="0.033536"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:39.764663" 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-10-11T00:50:39.622061" elapsed="0.142708"/>
</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-10-11T00:50:39.620256" elapsed="0.144566"/>
</kw>
<doc>Verifies that example-ipv6-topology is empty</doc>
<status status="PASS" start="2026-10-11T00:50:39.619949" elapsed="0.144934"/>
</kw>
<doc>Verifies that example-ipv6-topology is empty after final deconfiguration.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:50:39.534344" elapsed="0.230646"/>
</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-10-11T00:50:39.766401" elapsed="0.000244"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:39.766148" 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-10-11T00:50:39.767662" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:39.767521" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.767498" elapsed="0.000250"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:39.769921" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:39.769837" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.769820" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.770894" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:39.770554" elapsed="0.000365"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.771328" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:39.771067" elapsed="0.000285"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:39.771393" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T00:50:39.771535" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:39.770188" elapsed="0.001370"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:39.774141" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:39.774056" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.774039" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:39.775257" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:39.775174" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.775157" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:39.775698" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:39.775499" elapsed="0.000224"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:39.776033" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:39.775888" elapsed="0.000169"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:39.810995" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:39.776595" elapsed="0.034498"/>
</kw>
<msg time="2026-10-11T00:50:39.811261" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:39.811307" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:39.776212" elapsed="0.035223"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:39.836627" 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-10-11T00:50:39.812010" elapsed="0.024737"/>
</kw>
<msg time="2026-10-11T00:50:39.836918" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:39.836960" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:39.811648" elapsed="0.025350"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.837314" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:39.837077" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.837055" elapsed="0.000333"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.837896" 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-10-11T00:50:39.837632" elapsed="0.000326"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.838219" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:39.838019" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.838002" elapsed="0.000289"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:39.838325" 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-10-11T00:50:39.841084" elapsed="0.000123"/>
</kw>
<msg time="2026-10-11T00:50:39.841268" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:39.839830" elapsed="0.001599"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.841769" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.842109" 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-10-11T00:50:39.839167" elapsed="0.003133"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:50:39.838687" 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-10-11T00:50:39.774919" elapsed="0.067566"/>
</kw>
<msg time="2026-10-11T00:50:39.842636" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:39.842681" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:39.774350" elapsed="0.068369"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:39.842878" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:50:39.842790" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.842773" elapsed="0.000183"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.843289" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.843647" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:39.843715" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:50:39.773768" elapsed="0.070032"/>
</kw>
<msg time="2026-10-11T00:50:39.843886" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:39.843927" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:39.771921" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:39.844251" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:39.844032" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:39.844016" elapsed="0.000352"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:39.771777" elapsed="0.072614"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:39.771634" elapsed="0.072911"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:39.769527" elapsed="0.075093"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:39.767233" elapsed="0.077442"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:39.766844" elapsed="0.077873"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:39.765783" elapsed="0.078983"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:50:39.848160" level="INFO">Executing command 'cat exaipv6.log'.</msg>
<msg time="2026-10-11T00:50:39.861131" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:50:39.861221" level="INFO">${output_log} = 00:50:30 | 3612   | welcome         | Thank you for using ExaBGP
00:50:30 | 3612   | version         | 4.2.4
00:50:30 | 3612   | interpreter     | 3.10.12 (main, Aug 31 2026, 10:18:17) [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-10-11T00:50:39.848043" elapsed="0.013203"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.861735" level="INFO">00:50:30 | 3612   | welcome         | Thank you for using ExaBGP
00:50:30 | 3612   | version         | 4.2.4
00:50:30 | 3612   | interpreter     | 3.10.12 (main, Aug 31 2026, 10:18:17) [GCC 11.4.0]
00:50:30 | 3612   | os              | Linux releng-26932-423-0-builder-0 5.15.0-194-generic #204-Ubuntu SMP Wed Sep 2 13:09:23 UTC 2026 x86_64
00:50:30 | 3612   | installation    | /tmp/defaultvenv
00:50:30 | 3612   | advice          | environment file missing
00:50:30 | 3612   | advice          | generate it using "exabgp --fi &gt; /tmp/defaultvenv/etc/exabgp/exabgp.env"
00:50:30 | 3612   | cli             | could not find the named pipes (exabgp.in and exabgp.out) required for the cli
00:50:30 | 3612   | cli             | we scanned the following folders (the number is your PID):
00:50:30 | 3612   | cli control     |  - /run/exabgp/
00:50:30 | 3612   | cli control     |  - /run/1001/
00:50:30 | 3612   | cli control     |  - /run/
00:50:30 | 3612   | cli control     |  - /var/run/exabgp/
00:50:30 | 3612   | cli control     |  - /var/run/1001/
00:50:30 | 3612   | cli control     |  - /var/run/
00:50:30 | 3612   | cli control     |  - /tmp/defaultvenv/run/exabgp/
00:50:30 | 3612   | cli control     |  - /tmp/defaultvenv/run/1001/
00:50:30 | 3612   | cli control     |  - /tmp/defaultvenv/run/
00:50:30 | 3612   | cli control     |  - /tmp/defaultvenv/var/run/exabgp/
00:50:30 | 3612   | cli control     |  - /tmp/defaultvenv/var/run/1001/
00:50:30 | 3612   | cli control     |  - /tmp/defaultvenv/var/run/
00:50:30 | 3612   | cli control     | please make them in one of the folder with the following commands:
00:50:30 | 3612   | cli control     | &gt; mkfifo /home/jenkins/run/exabgp.{in,out}
00:50:30 | 3612   | cli control     | &gt; chmod 600 /home/jenkins/run/exabgp.{in,out}
00:50:30 | 3612   | cli control     | &gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}
00:50:30 | 3612   | configuration   | performing reload of exabgp 4.2.4
00:50:30 | 3612   | configuration   | &gt; neighbor         | '::1'
00:50:30 | 3612   | configuration   | . router-id        | '1.2.3.4'
00:50:30 | 3612   | configuration   | . local-address    | '2607:f0d0:1002:0011:0000:0000:0000:0002'
00:50:30 | 3612   | configuration   | . local-as         | '64496'
00:50:30 | 3612   | configuration   | . peer-as          | '64496'
00:50:30 | 3612   | configuration   | &gt; capability       | 
00:50:30 | 3612   | configuration   | . route-refresh    | 'disable'
00:50:30 | 3612   | configuration   | . add-path         | 'disable'
00:50:30 | 3612   | configuration   | &lt; capability       | 
00:50:30 | 3612   | configuration   | &gt; family           | 
00:50:30 | 3612   | configuration   | . ipv6             | 'unicast'
00:50:30 | 3612   | configuration   | &lt; family           | 
00:50:30 | 3612   | configuration   | &gt; static           | 
00:50:30 | 3612   | configuration   | . route            | '2a04:6d80::1/128' 'next-hop' 'self'
00:50:30 | 3612   | configuration   | &lt; static           | 
00:50:30 | 3612   | configuration   | &lt; neighbor         | 
00:50:30 | 3612   | 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:50:30 | 3612   | reactor         | loaded new configuration successfully
00:50:30 | 3612   | reactor         | initialising connection to peer-1
00:50:30 | 3612   | outgoing-1      | attempting connection to ::1:1790
00:50:30 | 3612   | 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:50:30 | 3612   | 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:50:30 | 3612   | ka-outgoing-1   | receive-timer 60 second(s) left
00:50:30 | 3612   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 003B 01
00:50:30 | 3612   | 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:50:30 | 3612   | outgoing-1      | &lt;&lt; message of type OPEN
00:50:30 | 3612   | 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:50:30 | 3612   | outgoing-1      | --------------------------------------------------------------------
00:50:30 | 3612   | outgoing-1      | the connection can not carry the following family/families
00:50:30 | 3612   | outgoing-1      |  - exabgp is not configured for ipv4/unicast
00:50:30 | 3612   | outgoing-1      | therefore no routes of this kind can be announced on the connection
00:50:30 | 3612   | outgoing-1      | --------------------------------------------------------------------
00:50:30 | 3612   | outgoing-1      | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:50:30 | 3612   | outgoing-1      | &gt;&gt; KEEPALIVE (OPENCONFIRM)
00:50:30 | 3612   | ka-outgoing-1   | receive-timer 180 second(s) left
00:50:30 | 3612   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:50:30 | 3612   | outgoing-1      | &lt;&lt; message of type KEEPALIVE
00:50:30 | 3612   | reactor         | connected to peer-1 with outgoing-1 2607:f0d0:1002:0011:0000:0000:0000:0002-::1
00:50:30 | 3612   | 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:50:30 | 3612   | outgoing-1      | &gt;&gt; 1 UPDATE(s)
00:50:30 | 3612   | outgoing-1      | sending TCP payload (  30) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001E 0200 0000 0790 0F00 0300 0201
00:50:30 | 3612   | outgoing-1      | &gt;&gt; EOR ipv6 unicast
00:50:30 | 3612   | peer-1          | &gt;&gt; EOR(s)
00:50:30 | 3612   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02
00:50:30 | 3612   | outgoing-1      | received TCP payload (   4) 0000 0000
00:50:30 | 3612   | outgoing-1      | &lt;&lt; message of type UPDATE
00:50:30 | 3612   | parser          | parsing UPDATE (   4) 0000 0000
00:50:30 | 3612   | peer-1          | &lt;&lt; UPDATE #1
00:50:30 | 3612   | peer-1          |    UPDATE #1 nlri  (   4) eor 1/1 (ipv4 unicast)
00:50:30 | 3612   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02
00:50:30 | 3612   | outgoing-1      | received TCP payload (   4) 0000 0000
00:50:30 | 3612   | outgoing-1      | &lt;&lt; message of type UPDATE
00:50:30 | 3612   | parser          | parsing UPDATE (   4) 0000 0000
00:50:30 | 3612   | peer-1          | &lt;&lt; UPDATE #2
00:50:30 | 3612   | peer-1          |    UPDATE #2 nlri  (   4) eor 1/1 (ipv4 unicast)
00:50:30 | 3612   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001D 02
00:50:30 | 3612   | outgoing-1      | received TCP payload (  10) 0000 0006 800F 0300 0201
00:50:30 | 3612   | outgoing-1      | &lt;&lt; message of type UPDATE
00:50:30 | 3612   | parser          | parsing UPDATE (  10) 0000 0006 800F 0300 0201
00:50:30 | 3612   | routes          | withdrawn NLRI none
00:50:30 | 3612   | parser          | attribute mp-unreach-nlri    flag 0x80 type 0x0f len 0x03 payload 0002 01
00:50:30 | 3612   | routes          | announced NLRI none
00:50:30 | 3612   | peer-1          | &lt;&lt; UPDATE #3
00:50:30 | 3612   | peer-1          |    UPDATE #3 nlri  (  11) eor 2/1 (ipv6 unicast)
00:50:30 | 3612   | ka-outgoing-1   | receive-timer 179 second(s) left
00:50:30 | 3612   | ka-outgoing-1   | send-timer 59 second(s) left
00:50:31 | 3612   | ka-outgoing-1   | receive-timer 178 second(s) left
00:50:31 | 3612   | ka-outgoing-1   | send-timer 58 second(s) left
00:50:32 | 3612   | ka-outgoing-1   | receive-timer 177 second(s) left
00:50:32 | 3612   | ka-outgoing-1   | send-timer 57 second(s) left
00:50:33 | 3612   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0015 03
00:50:33 | 3612   | outgoing-1      | received TCP payload (   2) 0600
00:50:33 | 3612   | outgoing-1      | &lt;&lt; message of type NOTIFICATION
00:50:33 | 3612   | outgoing-1      | peer reset, message [notification received (6,0)] error[Cease / Unspecific]
00:50:33 | 3612   | outgoing-1      | outgoing-1 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
00:50:33 | 3612   | reactor         | initialising connection to peer-1
00:50:33 | 3612   | outgoing-2      | attempting connection to ::1:1790
00:50:33 | 3612   | 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:50:33 | 3612   | 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:50:33 | 3612   | ka-outgoing-2   | receive-timer 60 second(s) left
00:50:33 | 3612   | outgoing-2      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0015 03
00:50:33 | 3612   | outgoing-2      | received TCP payload (   2) 0605
00:50:33 | 3612   | outgoing-2      | &lt;&lt; message of type NOTIFICATION
00:50:33 | 3612   | outgoing-2      | peer reset, message [notification received (6,5)] error[Cease / Connection Rejected]
00:50:33 | 3612   | outgoing-2      | outgoing-2 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
00:50:34 | 3612   | reactor         | initialising connection to peer-1
00:50:34 | 3612   | outgoing-3      | attempting connection to ::1:1790
00:50:34 | 3612   | 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:50:34 | 3612   | 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:50:34 | 3612   | outgoing-3      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 003B 01
00:50:34 | 3612   | 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:50:34 | 3612   | outgoing-3      | &lt;&lt; message of type OPEN
00:50:34 | 3612   | 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:50:34 | 3612   | ka-outgoing-3   | receive-timer 60 second(s) left
00:50:34 | 3612   | outgoing-3      | --------------------------------------------------------------------
00:50:34 | 3612   | outgoing-3      | the connection can not carry the following family/families
00:50:34 | 3612   | outgoing-3      |  - exabgp is not configured for ipv4/unicast
00:50:34 | 3612   | outgoing-3      | therefore no routes of this kind can be announced on the connection
00:50:34 | 3612   | outgoing-3      | --------------------------------------------------------------------
00:50:34 | 3612   | outgoing-3      | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:50:34 | 3612   | outgoing-3      | &gt;&gt; KEEPALIVE (OPENCONFIRM)
00:50:34 | 3612   | outgoing-3      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:50:34 | 3612   | outgoing-3      | &lt;&lt; message of type KEEPALIVE
00:50:34 | 3612   | ka-outgoing-3   | receive-timer 180 second(s) left
00:50:34 | 3612   | reactor         | connected to peer-1 with outgoing-3 2607:f0d0:1002:0011:0000:0000:0000:0002-::1
00:50:34 | 3612   | 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:50:34 | 3612   | outgoing-3      | &gt;&gt; 1 UPDATE(s)
00:50:34 | 3612   | outgoing-3      | sending TCP payload (  30) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001E 0200 0000 0790 0F00 0300 0201
00:50:34 | 3612   | outgoing-3      | &gt;&gt; EOR ipv6 unicast
00:50:34 | 3612   | peer-1          | &gt;&gt; EOR(s)
00:50:34 | 3612   | outgoing-3      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001D 02
00:50:34 | 3612   | outgoing-3      | received TCP payload (  10) 0000 0006 800F 0300 0201
00:50:34 | 3612   | outgoing-3      | &lt;&lt; message of type UPDATE
00:50:34 | 3612   | parser          | parsing UPDATE (  10) 0000 0006 800F 0300 0201
00:50:34 | 3612   | routes          | withdrawn NLRI none
00:50:34 | 3612   | parser          | attribute mp-unreach-nlri    flag 0x80 type 0x0f len 0x03 payload 0002 01
00:50:34 | 3612   | routes          | announced NLRI none
00:50:34 | 3612   | peer-1          | &lt;&lt; UPDATE #1
00:50:34 | 3612   | peer-1          |    UPDATE #1 nlri  (  11) eor 2/1 (ipv6 unicast)
00:50:34 | 3612   | outgoing-3      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02
00:50:34 | 3612   | outgoing-3      | received TCP payload (   4) 0000 0000
00:50:34 | 3612   | outgoing-3      | &lt;&lt; message of type UPDATE
00:50:34 | 3612   | parser          | parsing UPDATE (   4) 0000 0000
00:50:34 | 3612   | peer-1          | &lt;&lt; UPDATE #2
00:50:34 | 3612   | peer-1          |    UPDATE #2 nlri  (   4) eor 1/1 (ipv4 unicast)
00:50:34 | 3612   | outgoing-3      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02
00:50:34 | 3612   | outgoing-3      | received TCP payload (   4) 0000 0000
00:50:34 | 3612   | outgoing-3      | &lt;&lt; message of type UPDATE
00:50:34 | 3612   | parser          | parsing UPDATE (   4) 0000 0000
00:50:34 | 3612   | peer-1          | &lt;&lt; UPDATE #3
00:50:34 | 3612   | peer-1          |    UPDATE #3 nlri  (   4) eor 1/1 (ipv4 unicast)
00:50:34 | 3612   | ka-outgoing-3   | receive-timer 179 second(s) left
00:50:34 | 3612   | ka-outgoing-3   | send-timer 59 second(s) left
00:50:35 | 3612   | ka-outgoing-3   | receive-timer 178 second(s) left
00:50:35 | 3612   | ka-outgoing-3   | send-timer 58 second(s) left
00:50:36 | 3612   | outgoing-3      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0015 03
00:50:36 | 3612   | outgoing-3      | received TCP payload (   2) 0600
00:50:36 | 3612   | outgoing-3      | &lt;&lt; message of type NOTIFICATION
00:50:36 | 3612   | outgoing-3      | peer reset, message [notification received (6,0)] error[Cease / Unspecific]
00:50:36 | 3612   | outgoing-3      | outgoing-3 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
00:50:38 | 3612   | reactor         | initialising connection to peer-1
00:50:38 | 3612   | outgoing-4      | attempting connection to ::1:1790
00:50:38 | 3612   | 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:50:38 | 3612   | 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:50:38 | 3612   | ka-outgoing-4   | receive-timer 60 second(s) left
00:50:38 | 3612   | outgoing-4      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 003B 01
00:50:38 | 3612   | 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:50:38 | 3612   | outgoing-4      | &lt;&lt; message of type OPEN
00:50:38 | 3612   | 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:50:38 | 3612   | outgoing-4      | --------------------------------------------------------------------
00:50:38 | 3612   | outgoing-4      | the connection can not carry the following family/families
00:50:38 | 3612   | outgoing-4      |  - exabgp is not configured for ipv4/unicast
00:50:38 | 3612   | outgoing-4      | therefore no routes of this kind can be announced on the connection
00:50:38 | 3612   | outgoing-4      | --------------------------------------------------------------------
00:50:38 | 3612   | outgoing-4      | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:50:38 | 3612   | outgoing-4      | &gt;&gt; KEEPALIVE (OPENCONFIRM)
00:50:38 | 3612   | outgoing-4      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:50:38 | 3612   | outgoing-4      | &lt;&lt; message of type KEEPALIVE
00:50:38 | 3612   | ka-outgoing-4   | receive-timer 180 second(s) left
00:50:38 | 3612   | reactor         | connected to peer-1 with outgoing-4 2607:f0d0:1002:0011:0000:0000:0000:0002-::1
00:50:38 | 3612   | 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:50:38 | 3612   | outgoing-4      | &gt;&gt; 1 UPDATE(s)
00:50:38 | 3612   | outgoing-4      | sending TCP payload (  30) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001E 0200 0000 0790 0F00 0300 0201
00:50:38 | 3612   | outgoing-4      | &gt;&gt; EOR ipv6 unicast
00:50:38 | 3612   | peer-1          | &gt;&gt; EOR(s)
00:50:38 | 3612   | outgoing-4      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02
00:50:38 | 3612   | outgoing-4      | received TCP payload (   4) 0000 0000
00:50:38 | 3612   | outgoing-4      | &lt;&lt; message of type UPDATE
00:50:38 | 3612   | parser          | parsing UPDATE (   4) 0000 0000
00:50:38 | 3612   | peer-1          | &lt;&lt; UPDATE #1
00:50:38 | 3612   | peer-1          |    UPDATE #1 nlri  (   4) eor 1/1 (ipv4 unicast)
00:50:38 | 3612   | outgoing-4      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02
00:50:38 | 3612   | outgoing-4      | received TCP payload (   4) 0000 0000
00:50:38 | 3612   | outgoing-4      | &lt;&lt; message of type UPDATE
00:50:38 | 3612   | parser          | parsing UPDATE (   4) 0000 0000
00:50:38 | 3612   | peer-1          | &lt;&lt; UPDATE #2
00:50:38 | 3612   | peer-1          |    UPDATE #2 nlri  (   4) eor 1/1 (ipv4 unicast)
00:50:38 | 3612   | outgoing-4      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001D 02
00:50:38 | 3612   | outgoing-4      | received TCP payload (  10) 0000 0006 800F 0300 0201
00:50:38 | 3612   | outgoing-4      | &lt;&lt; message of type UPDATE
00:50:38 | 3612   | parser          | parsing UPDATE (  10) 0000 0006 800F 0300 0201
00:50:38 | 3612   | routes          | withdrawn NLRI none
00:50:38 | 3612   | parser          | attribute mp-unreach-nlri    flag 0x80 type 0x0f len 0x03 payload 0002 01
00:50:38 | 3612   | routes          | announced NLRI none
00:50:38 | 3612   | peer-1          | &lt;&lt; UPDATE #3
00:50:38 | 3612   | peer-1          |    UPDATE #3 nlri  (  11) eor 2/1 (ipv6 unicast)
00:50:38 | 3612   | ka-outgoing-4   | receive-timer 179 second(s) left
00:50:38 | 3612   | ka-outgoing-4   | send-timer 59 second(s) left
00:50:39 | 3612   | outgoing-4      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0015 03
00:50:39 | 3612   | outgoing-4      | received TCP payload (   2) 0600
00:50:39 | 3612   | outgoing-4      | &lt;&lt; message of type NOTIFICATION
00:50:39 | 3612   | outgoing-4      | peer reset, message [notification received (6,0)] error[Cease / Unspecific]
00:50:39 | 3612   | 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-10-11T00:50:39.861480" elapsed="0.000499"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:39.862537" 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-10-11T00:50:39.862159" elapsed="0.000444"/>
</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-10-11T00:50:39.847666" elapsed="0.014992"/>
</kw>
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-10-11T00:50:39.863237" level="INFO">[?2004l</msg>
<msg time="2026-10-11T00:50:39.863307" level="INFO">${output} = [?2004l</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-10-11T00:50:39.863137" elapsed="0.000192"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.863766" level="INFO">[?2004l</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:39.863530" elapsed="0.000278"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:39.864644" 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-10-11T00:50:39.864275" elapsed="0.000396"/>
</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-10-11T00:50:39.864820" elapsed="0.000156"/>
</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-10-11T00:50:39.863997" elapsed="0.001031"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:50:40.027918" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<msg time="2026-10-11T00:50:40.028049" level="INFO">${output} = ^C[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T00:50:39.865186" elapsed="0.162889"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.028620" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:40.028314" elapsed="0.000350"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:40.030941" 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-10-11T00:50:40.029278" elapsed="0.001734"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:50:40.031910" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<msg time="2026-10-11T00:50:40.032001" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-423-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-10-11T00:50:40.031190" elapsed="0.000836"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.032671" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:40.032394" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:40.032106" elapsed="0.000642"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.032080" elapsed="0.000695"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-10-11T00:50:40.028910" elapsed="0.003912"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-10-11T00:50:39.862865" elapsed="0.170006"/>
</kw>
<doc>Save exabgp logs as exaipv6.log, and stop exabgp with ctrl-c bash signal</doc>
<status status="PASS" start="2026-10-11T00:50:39.765201" elapsed="0.267779"/>
</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-10-11T00:50:40.034277" elapsed="0.000582"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:40.034026" elapsed="0.000886"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:40.035895" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:40.035801" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.035782" elapsed="0.000181"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:40.038099" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:40.038016" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.037999" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.039091" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:40.038762" elapsed="0.000354"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.039547" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:40.039268" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:40.039633" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:50:40.039773" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:40.038372" elapsed="0.001423"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:40.042552" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:40.042395" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.042377" elapsed="0.000266"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:40.043741" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:40.043656" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.043639" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:40.044125" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:40.043950" elapsed="0.000199"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:40.044470" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:40.044310" elapsed="0.000184"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:40.079601" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:40.044993" elapsed="0.034701"/>
</kw>
<msg time="2026-10-11T00:50:40.079845" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:40.079887" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:40.044665" elapsed="0.035275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:40.105696" 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-10-11T00:50:40.080462" elapsed="0.025330"/>
</kw>
<msg time="2026-10-11T00:50:40.105944" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:40.105985" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:40.080107" elapsed="0.025914"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.106295" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:40.106089" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.106071" elapsed="0.000295"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.106831" 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-10-11T00:50:40.106600" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.107273" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:40.107065" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.106936" elapsed="0.000410"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:40.107376" 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-10-11T00:50:40.109916" elapsed="0.000117"/>
</kw>
<msg time="2026-10-11T00:50:40.110092" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:40.108834" elapsed="0.001396"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.110589" elapsed="0.000080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.110931" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:50:40.108197" 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-10-11T00:50:40.107731" 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-10-11T00:50:40.043361" elapsed="0.067947"/>
</kw>
<msg time="2026-10-11T00:50:40.111390" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:40.111466" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:40.042796" elapsed="0.068708"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:40.111681" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:50:40.111585" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.111557" 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-10-11T00:50:40.112118" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.112437" elapsed="0.000031"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:40.112512" 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-10-11T00:50:40.042106" elapsed="0.070525"/>
</kw>
<msg time="2026-10-11T00:50:40.112717" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:40.112757" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:40.040145" elapsed="0.072647"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.113080" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:40.112859" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.112842" elapsed="0.000310"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:40.040003" elapsed="0.073171"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:40.039851" elapsed="0.073354"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:40.037725" elapsed="0.075530"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:40.035507" elapsed="0.077796"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:40.035068" elapsed="0.078276"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:40.033664" elapsed="0.079726"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.114277" 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-10-11T00:50:40.113729" elapsed="0.000577"/>
</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-10-11T00:50:40.125106" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:40.124800" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:40.125870" 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-10-11T00:50:40.125639" elapsed="0.000312">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-10-11T00:50:40.126037" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:40.125289" elapsed="0.000771"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.126553" 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-10-11T00:50:40.126229" elapsed="0.000365"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:40.126873" 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-10-11T00:50:40.127022" 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-10-11T00:50:40.126761" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.127470" 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-10-11T00:50:40.127238" 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-10-11T00:50:40.128467" 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-10-11T00:50:40.128217" elapsed="0.000293"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.128943" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:50:40.128695" elapsed="0.000272"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.129598" 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-10-11T00:50:40.129285" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:40.130303" 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-10-11T00:50:40.130106" elapsed="0.000221"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:40.130371" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:50:40.130514" 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-10-11T00:50:40.129796" elapsed="0.000740"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:40.130713" elapsed="0.000190"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.12</var>
<status status="PASS" start="2026-10-11T00:50:40.129155" elapsed="0.001784"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.131444" 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-10-11T00:50:40.131163" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:40.132157" 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-10-11T00:50:40.131978" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:40.132224" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:40.132347" 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-10-11T00:50:40.131669" elapsed="0.000700"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:40.132547" elapsed="0.000179"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:50:40.131037" elapsed="0.001739"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.133293" 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-10-11T00:50:40.133020" elapsed="0.000298"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:40.134076" 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-10-11T00:50:40.133895" elapsed="0.000205"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:40.134145" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:50:40.134270" 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-10-11T00:50:40.133516" 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-10-11T00:50:40.134469" elapsed="0.000343"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:50:40.132886" elapsed="0.001965"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.135352" 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-10-11T00:50:40.135081" elapsed="0.000295"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:40.136052" 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-10-11T00:50:40.135875" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:40.136120" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:40.136243" 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-10-11T00:50:40.135559" elapsed="0.000706"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:40.136440" elapsed="0.000178"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:50:40.134954" elapsed="0.001742"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.137194" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:40.136925" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:40.137892" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:40.137714" elapsed="0.000203"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:40.138001" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:50:40.138128" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:40.137384" 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-10-11T00:50:40.138310" elapsed="0.000181"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:40.136798" elapsed="0.001729"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.139030" 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-10-11T00:50:40.138762" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:40.139727" 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-10-11T00:50:40.139540" elapsed="0.000211"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:40.139795" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:40.139918" 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-10-11T00:50:40.139221" elapsed="0.000719"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:40.140100" elapsed="0.000163"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:50:40.138635" elapsed="0.001665"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.140833" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:40.140540" elapsed="0.000318"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:40.141524" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:40.141330" elapsed="0.000218"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:40.141620" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T00:50:40.141746" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:40.141024" elapsed="0.000744"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:40.141928" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:40.140398" elapsed="0.001731"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.142649" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:40.142353" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:40.143320" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:40.143143" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:40.143388" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T00:50:40.143530" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:40.142839" elapsed="0.000713"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:40.143724" elapsed="0.000164"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:40.142227" elapsed="0.001699"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:50:40.129010" elapsed="0.014946"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:50:40.143995" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:50:40.144126" 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-10-11T00:50:40.127878" elapsed="0.016274"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:40.127621" elapsed="0.016560"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.144351" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:40.144204" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.127603" elapsed="0.016832"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.145433" 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-10-11T00:50:40.144608" elapsed="0.000854"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:40.145508" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:40.124262" elapsed="0.021372"/>
</kw>
<msg time="2026-10-11T00:50:40.145722" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:40.119632" elapsed="0.026135"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:40.149983" 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/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-10-11T00:50:40.154186" 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/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-10-11T00:50:40.158420" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.158615" 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-10-11T00:50:40.158797" 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-10-11T00:50:40.159134" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:40.158991" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:40.158977" 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-10-11T00:50:40.159358" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.159550" 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-10-11T00:50:40.159727" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:40.158953" elapsed="0.000821"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:40.158866" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.159950" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:40.160016" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:50:40.160125" 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-10-11T00:50:40.119020" elapsed="0.041129"/>
</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-10-11T00:50:40.169288" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:40.168988" elapsed="0.000326"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:40.170066" 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-10-11T00:50:40.169889" elapsed="0.000273">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-10-11T00:50:40.170252" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:40.169511" elapsed="0.000765"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.170843" 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-10-11T00:50:40.170478" elapsed="0.000392"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:40.171155" 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-10-11T00:50:40.171305" 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-10-11T00:50:40.171037" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.171789" 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-10-11T00:50:40.171553" 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-10-11T00:50:40.172175" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:40.171904" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.172693" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:40.172396" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:40.172253" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.171883" elapsed="0.000888"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.173608" 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-10-11T00:50:40.172933" elapsed="0.000706"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:40.173684" 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/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-10-11T00:50:40.168473" elapsed="0.005320"/>
</kw>
<msg time="2026-10-11T00:50:40.173843" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:40.163998" elapsed="0.009890"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:40.178347" 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/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-10-11T00:50:40.182592" 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/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-10-11T00:50:40.186888" elapsed="0.000052"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.187100" 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-10-11T00:50:40.187278" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.187645" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:40.187490" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:40.187477" 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-10-11T00:50:40.187873" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.188047" elapsed="0.000017"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.188205" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:40.187450" elapsed="0.000803"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:40.187345" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.188438" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:40.188505" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:50:40.188632" 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-10-11T00:50:40.163276" elapsed="0.025383"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:40.189821" 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-10-11T00:50:40.189620" elapsed="0.000261">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-10-11T00:50:40.189964" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:40.189241" elapsed="0.000746"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.190266" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:40.190049" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.190806" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:40.190527" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:40.190339" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.190033" elapsed="0.000849"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.191376" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:40.191042" elapsed="0.000358"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:50:40.191462" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:40.191603" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:50:40.188933" elapsed="0.002694"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.192856" 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-10-11T00:50:40.192633" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.193339" 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-10-11T00:50:40.193124" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.193823" 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-10-11T00:50:40.193603" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.194262" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:40.194048" elapsed="0.000254"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:40.195040" 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-10-11T00:50:40.194871" elapsed="0.000193"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:50:40.195357" 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-10-11T00:50:40.195214" elapsed="0.000167"/>
</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-10-11T00:50:40.195557" elapsed="0.000195"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.196165" 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-10-11T00:50:40.195944" elapsed="0.000261"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:50:40.196243" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:40.196371" 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-10-11T00:50:40.194500" elapsed="0.001894"/>
</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-10-11T00:50:40.210049" level="INFO">PUT Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.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-10-11T00:50:40.210104" level="INFO">PUT Response : url=http://10.30.170.173: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-10-11T00:50:40.210186" 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-10-11T00:50:40.196716" elapsed="0.013494"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:40.196473" elapsed="0.013778"/>
</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-10-11T00:50:40.210454" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:40.210275" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.196457" 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-10-11T00:50:40.211703" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:40.211402" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:40.211161" elapsed="0.000613"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.211145" elapsed="0.000650"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.212339" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:40.212077" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:40.211844" elapsed="0.000583"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.211829" elapsed="0.000621"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.212981" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:40.212634" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.213276" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:40.213069" elapsed="0.000258"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.213831" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:40.213556" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:40.213379" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.213052" elapsed="0.000856"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.214433" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:40.214081" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.214736" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:40.214522" elapsed="0.000265"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.215221" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:40.214963" elapsed="0.000281"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:40.214809" elapsed="0.000467"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.214505" elapsed="0.000791"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:40.215452" elapsed="0.000304"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:50:40.216140" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:40.215914" elapsed="0.000250"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:50:40.216316" elapsed="0.000232"/>
</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-10-11T00:50:40.210876" elapsed="0.005742"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:50:40.216760" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:50:40.216678" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.216661" elapsed="0.000176"/>
</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-10-11T00:50:40.216980" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:50:40.217040" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:50:40.217198" 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-10-11T00:50:40.191927" elapsed="0.025295"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:40.217276" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:50:40.217399" 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-10-11T00:50:40.115196" elapsed="0.102241"/>
</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-10-11T00:50:40.217768" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:40.217529" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.217511" elapsed="0.000344"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:40.217885" elapsed="0.000024"/>
</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-10-11T00:50:40.114613" elapsed="0.103371"/>
</kw>
<doc>Configures bgp application peer.</doc>
<status status="PASS" start="2026-10-11T00:50:40.033198" elapsed="0.184897"/>
</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-10-11T00:50:40.219676" elapsed="0.000256"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:40.219319" elapsed="0.000664"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:40.220916" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:40.220829" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.220812" elapsed="0.000166"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:40.224365" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:40.224246" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.224228" elapsed="0.000231"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.225364" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:40.225039" elapsed="0.000350"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.225838" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:40.225558" elapsed="0.000304"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:40.225903" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:40.226028" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:40.224683" elapsed="0.001368"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:40.228562" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:40.228478" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.228460" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:40.229736" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:40.229649" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.229632" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:40.230114" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:40.229943" elapsed="0.000196"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:40.230468" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:40.230299" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:40.265608" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:40.231066" elapsed="0.034674"/>
</kw>
<msg time="2026-10-11T00:50:40.265935" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:40.265976" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:40.230740" elapsed="0.035273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:40.301460" 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-10-11T00:50:40.266659" elapsed="0.034934"/>
</kw>
<msg time="2026-10-11T00:50:40.301748" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:40.301789" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:40.266209" elapsed="0.035615"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.302126" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:40.301905" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.301880" elapsed="0.000318"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.302661" 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-10-11T00:50:40.302377" elapsed="0.000355"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.302993" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:40.302794" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.302777" elapsed="0.000287"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:40.303098" 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-10-11T00:50:40.305724" elapsed="0.000293"/>
</kw>
<msg time="2026-10-11T00:50:40.306080" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:40.304604" elapsed="0.001666"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.306628" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.306997" 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-10-11T00:50:40.303952" elapsed="0.003263"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:50:40.303448" 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-10-11T00:50:40.229337" elapsed="0.078016"/>
</kw>
<msg time="2026-10-11T00:50:40.307475" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:40.307519" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:40.228800" elapsed="0.078754"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:40.307734" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:50:40.307647" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.307628" elapsed="0.000183"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.308147" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.308484" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:40.308551" 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-10-11T00:50:40.228180" elapsed="0.080472"/>
</kw>
<msg time="2026-10-11T00:50:40.308738" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:40.308780" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:40.226377" elapsed="0.082438"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.309102" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:40.308882" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.308866" elapsed="0.000310"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:40.226238" elapsed="0.082960"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:40.226099" elapsed="0.083129"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:40.223942" elapsed="0.085336"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:40.220559" elapsed="0.088772"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:40.220131" elapsed="0.089242"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:40.218965" elapsed="0.090575"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.310340" 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-10-11T00:50:40.309771" elapsed="0.000599"/>
</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-10-11T00:50:40.321001" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:40.320693" elapsed="0.000335"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:40.321753" 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-10-11T00:50:40.321515" elapsed="0.000316">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-10-11T00:50:40.321950" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:40.321184" elapsed="0.000790"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.322472" 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-10-11T00:50:40.322145" elapsed="0.000352"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:40.322785" 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-10-11T00:50:40.322935" 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-10-11T00:50:40.322672" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.323370" 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-10-11T00:50:40.323151" elapsed="0.000277"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.324347" 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-10-11T00:50:40.324113" elapsed="0.000276"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.325029" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:50:40.324605" elapsed="0.000449"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.325705" 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-10-11T00:50:40.325389" elapsed="0.000341"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:40.326398" 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-10-11T00:50:40.326207" elapsed="0.000231"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:40.326484" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:40.326624" 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-10-11T00:50:40.325900" elapsed="0.000747"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:40.326809" elapsed="0.000186"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:50:40.325257" elapsed="0.001774"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.327539" 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-10-11T00:50:40.327256" elapsed="0.000308"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:40.328241" 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-10-11T00:50:40.328066" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:40.328308" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:40.328446" 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-10-11T00:50:40.327756" elapsed="0.000714"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:40.328640" elapsed="0.000165"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:50:40.327130" elapsed="0.001711"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.329326" 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-10-11T00:50:40.329063" elapsed="0.000287"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:40.330026" 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-10-11T00:50:40.329847" elapsed="0.000203"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:40.330093" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:40.330215" 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-10-11T00:50:40.329530" elapsed="0.000707"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:40.330396" elapsed="0.000192"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:50:40.328938" elapsed="0.001687"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.331160" 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-10-11T00:50:40.330891" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:40.331859" 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-10-11T00:50:40.331683" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:40.331926" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:40.332049" 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-10-11T00:50:40.331352" elapsed="0.000719"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:40.332230" elapsed="0.000164"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:50:40.330762" elapsed="0.001686"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.332952" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:40.332685" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:40.333705" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:40.333503" elapsed="0.000226"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:40.333773" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:50:40.333900" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:40.333164" elapsed="0.000759"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:40.334085" elapsed="0.000166"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:40.332549" elapsed="0.001740"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.335012" 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-10-11T00:50:40.334533" elapsed="0.000504"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:40.335729" 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-10-11T00:50:40.335539" elapsed="0.000214"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:40.335797" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:40.335920" 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-10-11T00:50:40.335208" elapsed="0.000737"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:40.336105" elapsed="0.000163"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:50:40.334388" elapsed="0.001917"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.336828" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:40.336545" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:40.337541" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:40.337349" elapsed="0.000228"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:40.337623" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:40.337746" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:40.337047" elapsed="0.000722"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:40.337928" elapsed="0.000163"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:40.336403" elapsed="0.001724"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.338664" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:40.338347" elapsed="0.000342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:40.339334" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:40.339159" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:40.339402" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T00:50:40.339543" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:40.338856" elapsed="0.000723"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:40.339742" elapsed="0.000166"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:40.338223" elapsed="0.001726"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:50:40.325102" elapsed="0.014937"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:50:40.340083" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:50:40.340215" 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-10-11T00:50:40.323769" elapsed="0.016471"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:40.323492" elapsed="0.016777"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.340463" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:40.340291" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.323474" elapsed="0.017064"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.341353" 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-10-11T00:50:40.340720" elapsed="0.000659"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:40.341440" 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_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-10-11T00:50:40.320166" elapsed="0.021376"/>
</kw>
<msg time="2026-10-11T00:50:40.341609" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:40.315691" elapsed="0.025963"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:40.345878" 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_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-10-11T00:50:40.350276" 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_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-10-11T00:50:40.354502" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.354696" 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-10-11T00:50:40.354876" 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-10-11T00:50:40.355211" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:40.355069" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:40.355056" 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-10-11T00:50:40.355451" 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-10-11T00:50:40.355643" 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-10-11T00:50:40.355805" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:40.355031" elapsed="0.000820"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:40.354943" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.356057" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:40.356124" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:50:40.356234" 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-10-11T00:50:40.315075" elapsed="0.041184"/>
</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-10-11T00:50:40.365391" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:40.365088" elapsed="0.000353"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:40.366100" 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-10-11T00:50:40.365931" elapsed="0.000228">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-10-11T00:50:40.366241" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:40.365616" elapsed="0.000647"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.366771" 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-10-11T00:50:40.366449" elapsed="0.000346"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:40.367063" 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-10-11T00:50:40.367183" 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-10-11T00:50:40.366957" elapsed="0.000252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.367662" 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-10-11T00:50:40.367416" 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-10-11T00:50:40.368025" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:40.367779" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.368530" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:40.368243" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:40.368100" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.367762" elapsed="0.000860"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.369447" 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-10-11T00:50:40.368781" elapsed="0.000695"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:40.369520" 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_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-10-11T00:50:40.364560" elapsed="0.005078"/>
</kw>
<msg time="2026-10-11T00:50:40.369720" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:40.360111" elapsed="0.009653"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:40.374110" 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_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-10-11T00:50:40.378356" 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_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-10-11T00:50:40.382716" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.382906" 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-10-11T00:50:40.383089" 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-10-11T00:50:40.383485" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:40.383311" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:40.383297" 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-10-11T00:50:40.383735" 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-10-11T00:50:40.383914" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.384077" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:40.383268" elapsed="0.000856"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:40.383158" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.384297" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:40.384364" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:50:40.384507" 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-10-11T00:50:40.359387" elapsed="0.025149"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:40.385768" 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-10-11T00:50:40.385538" elapsed="0.000294">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-10-11T00:50:40.385916" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:40.385179" 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-10-11T00:50:40.386226" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:40.386002" elapsed="0.000275"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.386772" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:40.386489" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:40.386299" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.385985" elapsed="0.000863"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.387344" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:40.387008" elapsed="0.000360"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:50:40.387427" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:40.387553" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:50:40.384824" elapsed="0.002764"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.388823" 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-10-11T00:50:40.388592" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.389270" 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-10-11T00:50:40.389059" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.389772" 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-10-11T00:50:40.389525" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.390214" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:40.390001" elapsed="0.000252"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:40.391007" 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-10-11T00:50:40.390840" elapsed="0.000192"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:50:40.391327" 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-10-11T00:50:40.391182" elapsed="0.000169"/>
</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-10-11T00:50:40.391526" elapsed="0.000174"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.392111" 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-10-11T00:50:40.391891" elapsed="0.000262"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:50:40.392191" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:40.392318" 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-10-11T00:50:40.390463" elapsed="0.001878"/>
</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-10-11T00:50:40.406170" level="INFO">PUT Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.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-10-11T00:50:40.406261" level="INFO">PUT Response : url=http://10.30.170.173: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-10-11T00:50:40.406362" 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-10-11T00:50:40.392660" elapsed="0.013726"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:40.392404" elapsed="0.014053"/>
</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-10-11T00:50:40.406652" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:40.406484" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.392387" elapsed="0.014346"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.407900" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:40.407625" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:40.407360" elapsed="0.000610"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.407343" elapsed="0.000650"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.408556" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:40.408274" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:40.408043" elapsed="0.000597"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.408028" elapsed="0.000634"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.409198" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:40.408834" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.409508" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:40.409286" elapsed="0.000275"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.410012" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:40.409752" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:40.409593" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.409269" elapsed="0.000819"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.410616" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:40.410257" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.410905" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:40.410704" elapsed="0.000252"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.411387" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:40.411130" elapsed="0.000295"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:40.410977" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.410687" elapsed="0.000791"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:40.411631" elapsed="0.000291"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:50:40.412310" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:40.412081" elapsed="0.000254"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:50:40.412502" elapsed="0.000228"/>
</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-10-11T00:50:40.407071" elapsed="0.005715"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:50:40.412926" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:50:40.412844" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.412827" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.413147" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:50:40.413206" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:50:40.413364" 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-10-11T00:50:40.387892" elapsed="0.025496"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:40.413495" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:40.413635" 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-10-11T00:50:40.311238" elapsed="0.102421"/>
</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-10-11T00:50:40.413948" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:40.413747" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.413731" elapsed="0.000302"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:40.414063" elapsed="0.000024"/>
</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-10-11T00:50:40.310655" elapsed="0.103504"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:50:40.414633" level="INFO">Creating Session using : alias=session, url=http://10.30.170.173:8181, headers={'Content-Type': 'application/json'},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x74344725a9d0&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-10-11T00:50:40.414336" elapsed="0.000446"/>
</kw>
<doc>Configure BGP peer modules with initiate-connection set to false with short ipv6 address.</doc>
<status status="PASS" start="2026-10-11T00:50:40.218339" elapsed="0.196564"/>
</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-10-11T00:50:40.416347" elapsed="0.000271"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:40.416077" elapsed="0.000612"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:40.417689" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:40.417601" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.417582" elapsed="0.000171"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:40.419955" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:40.419872" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.419855" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.420935" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:40.420611" elapsed="0.000349"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.421368" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:40.421108" elapsed="0.000284"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:40.421448" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:40.421674" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:40.420225" elapsed="0.001474"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:40.424233" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:40.424149" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.424132" elapsed="0.000162"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:40.425352" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:40.425267" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.425250" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:40.425841" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:40.425668" elapsed="0.000197"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:40.426168" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:40.426028" elapsed="0.000163"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:40.460712" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:40.426736" elapsed="0.034118"/>
</kw>
<msg time="2026-10-11T00:50:40.461045" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:40.461185" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:40.426344" elapsed="0.034880"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:40.485595" 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-10-11T00:50:40.461869" elapsed="0.023819"/>
</kw>
<msg time="2026-10-11T00:50:40.485837" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:40.485877" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:40.461448" elapsed="0.024466"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.486217" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:40.485994" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.485970" elapsed="0.000321"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.486741" 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-10-11T00:50:40.486492" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.487060" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:40.486861" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.486844" elapsed="0.000287"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:40.487167" 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-10-11T00:50:40.489707" elapsed="0.000289"/>
</kw>
<msg time="2026-10-11T00:50:40.490056" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:40.488678" elapsed="0.001517"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.490520" elapsed="0.000087"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.490874" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:50:40.488018" elapsed="0.003047"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:50:40.487512" 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-10-11T00:50:40.425012" elapsed="0.066188"/>
</kw>
<msg time="2026-10-11T00:50:40.491284" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:40.491325" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:40.424455" elapsed="0.066907"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:40.491546" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-10-11T00:50:40.491459" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.491440" elapsed="0.000200"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.491977" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.492281" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:40.492346" 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-10-11T00:50:40.423863" elapsed="0.068590"/>
</kw>
<msg time="2026-10-11T00:50:40.492538" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:40.492606" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:40.422032" elapsed="0.070617"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:40.492968" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:40.492718" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.492702" elapsed="0.000339"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:40.421892" elapsed="0.071172"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:40.421747" elapsed="0.071348"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:40.419543" elapsed="0.073603"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:40.417302" elapsed="0.075896"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:40.416893" elapsed="0.076347"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:40.415728" elapsed="0.077562"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.493857" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:40.493551" elapsed="0.000335"/>
</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-10-11T00:50:40.495427" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:40.495135" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.495883" 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-10-11T00:50:40.495663" elapsed="0.000261"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:40.498133" 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-10-11T00:50:40.496496" elapsed="0.001688"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:50:40.502953" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<msg time="2026-10-11T00:50:40.503036" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T00:50:40.498353" elapsed="0.004707"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.503643" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:40.503373" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:40.503123" elapsed="0.000595"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:40.503105" elapsed="0.000637"/>
</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-10-11T00:50:40.496141" elapsed="0.007642"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:40.505643" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exaipv4.cfg &gt; exaipv4.log</msg>
<msg time="2026-10-11T00:50:40.505722" 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-10-11T00:50:40.503932" elapsed="0.001814"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.506162" 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-10-11T00:50:40.505941" elapsed="0.000263"/>
</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-10-11T00:50:40.494832" elapsed="0.011421"/>
</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-10-11T00:50:40.508069" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:40.507770" elapsed="0.000325"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.508565" 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-10-11T00:50:40.508266" elapsed="0.000334"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:50:40.515604" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:50:40.515771" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:50:40.515860" 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-10-11T00:50:40.508759" elapsed="0.007130"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.516424" 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-10-11T00:50:40.516124" elapsed="0.000345"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T00:50:40.517022" 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-10-11T00:50:40.516654" elapsed="0.000442">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-10-11T00:50:40.507294" elapsed="0.009910">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.520125" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:43.519277" elapsed="0.000915"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.521352" 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-10-11T00:50:43.520686" elapsed="0.000751"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:50:43.532248" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:50:43.532653" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:50:43.532864" 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-10-11T00:50:43.521821" elapsed="0.011098"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.534084" 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-10-11T00:50:43.533374" elapsed="0.000814"/>
</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-10-11T00:50:43.534646" elapsed="0.000721"/>
</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-10-11T00:50:43.518108" elapsed="0.017425"/>
</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-10-11T00:50:40.506830" elapsed="3.028838"/>
</kw>
<msg time="2026-10-11T00:50:43.535875" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:43.535965" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:40.506420" elapsed="3.029593"/>
</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-10-11T00:50:43.536842" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:43.536202" elapsed="0.000754"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.536156" elapsed="0.000852"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="PASS" start="2026-10-11T00:50:43.537308" elapsed="0.000071"/>
</return>
<status status="PASS" start="2026-10-11T00:50:43.537118" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.537087" elapsed="0.000433"/>
</if>
<var name="${idx}">0</var>
<status status="PASS" start="2026-10-11T00:50:40.494670" elapsed="3.042905"/>
</iter>
<var>${idx}</var>
<value>${connection_retries}</value>
<status status="PASS" start="2026-10-11T00:50:40.494468" elapsed="3.043197"/>
</for>
<kw name="Fail" owner="BuiltIn">
<arg>Unable to connect ExaBgp to ODL</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.538007" elapsed="0.000045"/>
</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-10-11T00:50:40.494168" elapsed="3.044002"/>
</kw>
<doc>Start exabgp and Verify BGP connection</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:50:40.415150" elapsed="3.123239"/>
</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-10-11T00:50:43.541706" elapsed="0.000592"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:43.540854" elapsed="0.001606"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:43.544808" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:43.544584" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.544543" elapsed="0.000408"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:43.549996" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:43.549808" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.549770" elapsed="0.000367"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.552237" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:43.551480" elapsed="0.000813"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.553273" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:43.552686" elapsed="0.000641"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:43.553447" elapsed="0.000064"/>
</return>
<msg time="2026-10-11T00:50:43.553761" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:43.550654" elapsed="0.003158"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:43.559834" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:43.559641" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.559578" elapsed="0.000396"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:43.562483" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:43.562244" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.562205" elapsed="0.000470"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:43.563387" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:43.563003" elapsed="0.000493"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:43.564223" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:43.563906" elapsed="0.000370"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:43.601863" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:43.565518" elapsed="0.036530"/>
</kw>
<msg time="2026-10-11T00:50:43.602292" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:43.602352" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:43.564714" elapsed="0.037687"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:43.630664" 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-10-11T00:50:43.603263" elapsed="0.027499"/>
</kw>
<msg time="2026-10-11T00:50:43.630912" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:43.630953" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:43.602723" elapsed="0.028266"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.631301" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:43.631073" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.631048" elapsed="0.000326"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.631858" 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-10-11T00:50:43.631578" elapsed="0.000342"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.632178" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:43.631981" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.631964" elapsed="0.000340"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:43.632342" 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-10-11T00:50:43.635092" elapsed="0.000122"/>
</kw>
<msg time="2026-10-11T00:50:43.635272" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:43.633850" elapsed="0.001583"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.635751" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.636084" 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-10-11T00:50:43.633188" 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-10-11T00:50:43.632699" elapsed="0.003634"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:50:43.561654" elapsed="0.074775"/>
</kw>
<msg time="2026-10-11T00:50:43.636515" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:43.636554" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:43.560303" elapsed="0.076286"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:43.636792" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-11T00:50:43.636681" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.636658" 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-10-11T00:50:43.637235" 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-10-11T00:50:43.637566" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:43.637644" 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-10-11T00:50:43.558945" elapsed="0.078786"/>
</kw>
<msg time="2026-10-11T00:50:43.637815" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:43.637856" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:43.554576" elapsed="0.083314"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.638177" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:43.637958" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.637942" elapsed="0.000306"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:43.554234" elapsed="0.084035"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:43.553921" elapsed="0.084377"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:43.549092" elapsed="0.089256"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:43.543970" elapsed="0.094430"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:43.542889" elapsed="0.095639"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:43.539956" elapsed="0.098622"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.639334" 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-10-11T00:50:43.638794" elapsed="0.000567"/>
</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-10-11T00:50:43.650111" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:43.649811" elapsed="0.000361"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:43.650910" 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-10-11T00:50:43.650684" elapsed="0.000303">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-10-11T00:50:43.651072" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:43.650334" elapsed="0.000760"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.651593" 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-10-11T00:50:43.651265" elapsed="0.000366"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:43.651912" 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-10-11T00:50:43.652062" 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-10-11T00:50:43.651800" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.652510" 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-10-11T00:50:43.652277" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.655162" 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-10-11T00:50:43.653214" elapsed="0.001994"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.655679" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:50:43.655385" elapsed="0.000319"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.656303" 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-10-11T00:50:43.656032" elapsed="0.000295"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:43.657027" 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-10-11T00:50:43.656838" elapsed="0.000214"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:43.657097" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:43.657223" 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-10-11T00:50:43.656513" elapsed="0.000733"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:43.657422" elapsed="0.000194"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.12</var>
<status status="PASS" start="2026-10-11T00:50:43.655902" elapsed="0.001751"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.658149" 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-10-11T00:50:43.657881" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:43.658854" 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-10-11T00:50:43.658676" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:43.658923" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:43.659046" 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-10-11T00:50:43.658340" elapsed="0.000729"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:43.659229" elapsed="0.000165"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:50:43.657753" elapsed="0.001693"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.659961" 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-10-11T00:50:43.659692" elapsed="0.000294"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:43.660659" 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-10-11T00:50:43.660469" elapsed="0.000214"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:43.660727" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:43.660849" 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-10-11T00:50:43.660152" elapsed="0.000720"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:43.661065" elapsed="0.000164"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:50:43.659552" elapsed="0.001714"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.661789" 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-10-11T00:50:43.661506" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:43.662472" 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-10-11T00:50:43.662281" elapsed="0.000215"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:43.662540" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:43.662676" 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-10-11T00:50:43.661979" elapsed="0.000719"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:43.662880" elapsed="0.000168"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:50:43.661364" elapsed="0.001722"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.663608" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:43.663311" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:43.664278" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:43.664103" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:43.664345" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:43.664484" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:43.663801" elapsed="0.000706"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:43.664694" elapsed="0.000167"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:43.663184" elapsed="0.001714"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.665563" 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-10-11T00:50:43.665121" elapsed="0.000465"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:43.666245" 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-10-11T00:50:43.666069" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:43.666312" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:50:43.666450" 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-10-11T00:50:43.665764" elapsed="0.000709"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:43.666656" elapsed="0.000166"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:50:43.664996" elapsed="0.001862"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.667350" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:43.667083" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:43.668043" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:43.667869" elapsed="0.000198"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:43.668110" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:43.668232" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:43.667555" elapsed="0.000699"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:43.668427" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:43.666957" elapsed="0.001681"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.669128" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:43.668863" elapsed="0.000288"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:43.669822" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:43.669646" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:43.669889" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:50:43.670010" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:43.669314" elapsed="0.000719"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:43.670227" elapsed="0.000167"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:43.668737" elapsed="0.001709"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:50:43.655750" elapsed="0.014728"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:50:43.670516" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:50:43.670660" 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-10-11T00:50:43.652876" elapsed="0.017809"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:43.652626" elapsed="0.018087"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.670880" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:43.670736" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.652607" elapsed="0.018342"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.671742" 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-10-11T00:50:43.671103" elapsed="0.000666"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:43.671814" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:43.649284" elapsed="0.022629"/>
</kw>
<msg time="2026-10-11T00:50:43.671962" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:43.644864" elapsed="0.027141"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:43.676201" 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/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-10-11T00:50:43.680559" 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/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-10-11T00:50:43.684758" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.684938" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.685117" 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-10-11T00:50:43.685464" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:43.685308" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:43.685295" 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-10-11T00:50:43.685832" 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-10-11T00:50:43.686011" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.686207" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:43.685269" elapsed="0.000986"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:43.685182" elapsed="0.001097"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.686441" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:43.686509" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:50:43.686644" 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-10-11T00:50:43.644236" elapsed="0.042435"/>
</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-10-11T00:50:43.695780" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:43.695466" elapsed="0.000340"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:43.696457" 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-10-11T00:50:43.696269" elapsed="0.000249">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-10-11T00:50:43.696614" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:43.695957" elapsed="0.000681"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.697110" 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-10-11T00:50:43.696805" elapsed="0.000330"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:43.697418" 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-10-11T00:50:43.697544" 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-10-11T00:50:43.697295" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.698005" 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-10-11T00:50:43.697789" elapsed="0.000268"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:50:43.698363" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:43.698117" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.698874" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:43.698609" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:43.698455" elapsed="0.000476"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.698100" elapsed="0.000851"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.699536" 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-10-11T00:50:43.699109" elapsed="0.000484"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:43.699665" 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-10-11T00:50:43.694952" elapsed="0.004816"/>
</kw>
<msg time="2026-10-11T00:50:43.699819" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:43.690508" elapsed="0.009355"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:43.704183" 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/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-10-11T00:50:43.708426" 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_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-10-11T00:50:43.712717" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.712907" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.713093" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.713458" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:43.713298" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:43.713282" 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-10-11T00:50:43.713701" 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-10-11T00:50:43.713879" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.714040" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:43.713253" elapsed="0.000835"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:43.713161" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.714263" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:43.714329" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:50:43.714482" 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-10-11T00:50:43.689812" elapsed="0.024699"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:43.715782" 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-10-11T00:50:43.715536" elapsed="0.000313">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-10-11T00:50:43.715935" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:43.715168" 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-10-11T00:50:43.716249" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:43.716022" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.716793" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:43.716514" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:43.716323" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.716005" elapsed="0.000865"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.717373" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:43.717033" elapsed="0.000363"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:50:43.717458" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:43.717585" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:50:43.714854" elapsed="0.002767"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.718954" 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-10-11T00:50:43.718729" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.719400" 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-10-11T00:50:43.719189" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.719908" 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-10-11T00:50:43.719687" elapsed="0.000261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.720346" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:43.720133" elapsed="0.000253"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:43.721186" 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-10-11T00:50:43.721017" elapsed="0.000193"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:50:43.721523" 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-10-11T00:50:43.721362" elapsed="0.000185"/>
</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-10-11T00:50:43.721732" elapsed="0.000162"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.722308" 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-10-11T00:50:43.722088" elapsed="0.000260"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:50:43.722386" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T00:50:43.722530" 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-10-11T00:50:43.720583" elapsed="0.001970"/>
</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-10-11T00:50:43.758963" level="INFO">POST Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.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-10-11T00:50:43.759055" level="INFO">POST Response : url=http://10.30.170.173: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.173: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-10-11T00:50:43.759153" 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-10-11T00:50:43.722855" elapsed="0.036323"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:43.722626" elapsed="0.036593"/>
</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-10-11T00:50:43.759395" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:43.759243" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.722610" elapsed="0.036887"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.760748" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:43.760458" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:43.760204" elapsed="0.000615"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.760187" elapsed="0.000655"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.761392" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:43.761128" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:43.760892" elapsed="0.000590"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.760877" elapsed="0.000626"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.762043" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:43.761690" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.762339" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:43.762131" elapsed="0.000259"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.762863" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:43.762588" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:43.762427" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.762114" elapsed="0.000825"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.763464" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:43.763115" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.763772" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:43.763553" elapsed="0.000271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.764259" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:43.764002" elapsed="0.000281"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:43.763846" elapsed="0.000469"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.763536" elapsed="0.000798"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:43.764489" elapsed="0.000304"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:50:43.765179" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:43.764951" elapsed="0.000252"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:50:43.765354" elapsed="0.000230"/>
</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-10-11T00:50:43.759840" elapsed="0.005816"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:50:43.765805" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:50:43.765721" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.765704" elapsed="0.000180"/>
</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-10-11T00:50:43.766026" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:50:43.766092" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:50:43.766250" 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-10-11T00:50:43.717918" elapsed="0.048357"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:43.766371" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:43.766516" 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-10-11T00:50:43.640308" elapsed="0.126231"/>
</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-10-11T00:50:43.766847" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:43.766643" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.766627" elapsed="0.000304"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:43.766961" elapsed="0.000024"/>
</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-10-11T00:50:43.639670" elapsed="0.127388"/>
</kw>
<doc>Inject the Ipv6 route from controller</doc>
<status status="PASS" start="2026-10-11T00:50:43.538946" elapsed="0.228222"/>
</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-10-11T00:50:43.770182" elapsed="0.000329"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:43.769753" elapsed="0.000839"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:43.771718" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:43.771566" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.771534" 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-10-11T00:50:43.774261" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:43.774177" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.774159" elapsed="0.000166"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.775303" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:43.774960" elapsed="0.000372"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.775785" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:43.775502" elapsed="0.000307"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:43.775852" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T00:50:43.775990" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:43.774555" elapsed="0.001458"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:43.778661" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:43.778559" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.778540" elapsed="0.000185"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:43.779831" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:43.779747" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.779730" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:43.780223" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:43.780047" elapsed="0.000202"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:43.780577" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:43.780432" elapsed="0.000181"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:43.817171" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:43.781095" elapsed="0.036177"/>
</kw>
<msg time="2026-10-11T00:50:43.817453" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:43.817495" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:43.780767" elapsed="0.036825"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:43.852558" 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-10-11T00:50:43.818112" elapsed="0.034555"/>
</kw>
<msg time="2026-10-11T00:50:43.852817" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:43.852857" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:43.817773" elapsed="0.035119"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.853170" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:43.852963" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.852945" elapsed="0.000297"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.853707" 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-10-11T00:50:43.853448" elapsed="0.000325"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.854030" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:43.853833" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.853817" elapsed="0.000285"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:43.854132" 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-10-11T00:50:43.856675" elapsed="0.000235"/>
</kw>
<msg time="2026-10-11T00:50:43.856972" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:43.855534" elapsed="0.001577"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.857437" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.857787" 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-10-11T00:50:43.854929" elapsed="0.003047"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:50:43.854448" elapsed="0.003587"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:50:43.779473" elapsed="0.078635"/>
</kw>
<msg time="2026-10-11T00:50:43.858190" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:43.858229" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:43.778873" elapsed="0.079392"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:43.858447" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:50:43.858333" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.858315" 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-10-11T00:50:43.858869" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.859171" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:43.859235" 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-10-11T00:50:43.778256" elapsed="0.081063"/>
</kw>
<msg time="2026-10-11T00:50:43.859423" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:43.859467" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:43.776374" elapsed="0.083129"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.859805" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:43.859570" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.859554" elapsed="0.000357"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:43.776230" elapsed="0.083703"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:43.776069" elapsed="0.083894"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:43.773874" elapsed="0.086140"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:43.771237" elapsed="0.088827"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:43.770769" elapsed="0.089336"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:43.768696" elapsed="0.091456"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.861040" level="INFO">&amp;{mapping} = { IP=10.30.170.173 | 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-10-11T00:50:43.860357" elapsed="0.000711"/>
</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-10-11T00:50:43.877118" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:43.876812" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:43.877884" 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-10-11T00:50:43.877649" elapsed="0.000318">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-10-11T00:50:43.878053" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:43.877299" elapsed="0.000777"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.878573" 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-10-11T00:50:43.878247" elapsed="0.000363"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:43.878890" 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-10-11T00:50:43.879046" 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-10-11T00:50:43.878778" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.879499" 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-10-11T00:50:43.879263" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.880658" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T00:50:43.880217" elapsed="0.000485"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.881129" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:50:43.880878" elapsed="0.000276"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.881787" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:43.881492" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:43.882654" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:43.882303" elapsed="0.000376"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:43.882724" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:50:43.882850" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:43.881986" elapsed="0.000888"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:43.883039" elapsed="0.000193"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T00:50:43.881344" elapsed="0.001957"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.883841" 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-10-11T00:50:43.883552" elapsed="0.000313"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:43.884695" 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-10-11T00:50:43.884339" elapsed="0.000381"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:43.884765" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:43.884890" 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-10-11T00:50:43.884032" elapsed="0.000880"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:43.885079" elapsed="0.000165"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:50:43.883420" elapsed="0.001861"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.885815" 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-10-11T00:50:43.885527" elapsed="0.000312"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:43.886663" 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-10-11T00:50:43.886312" elapsed="0.000377"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:43.886733" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:43.886857" 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-10-11T00:50:43.886005" 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-10-11T00:50:43.887042" elapsed="0.000165"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:50:43.885379" elapsed="0.001867"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.887784" 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-10-11T00:50:43.887495" elapsed="0.000313"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:43.888618" 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-10-11T00:50:43.888281" elapsed="0.000363"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:43.888688" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:50:43.888812" 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-10-11T00:50:43.887975" elapsed="0.000860"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:43.888997" elapsed="0.000164"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:50:43.887345" elapsed="0.001854"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.889730" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:43.889447" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:43.890553" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:43.890232" elapsed="0.000346"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:43.890635" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:50:43.890761" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:43.889921" elapsed="0.000862"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:43.890944" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:43.889297" elapsed="0.001848"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.891838" 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-10-11T00:50:43.891370" elapsed="0.000493"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:43.892670" 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-10-11T00:50:43.892334" elapsed="0.000361"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:43.892738" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:43.892862" 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-10-11T00:50:43.892030" elapsed="0.000855"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:43.893045" elapsed="0.000166"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:50:43.891243" elapsed="0.002005"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.893831" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:43.893536" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:43.894660" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:43.894327" elapsed="0.000358"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:43.894729" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:43.894852" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:43.894023" 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-10-11T00:50:43.895035" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:43.893380" elapsed="0.001857"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.895786" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:43.895485" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:43.896612" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:43.896277" elapsed="0.000361"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:43.896682" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:43.896806" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:43.895975" 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-10-11T00:50:43.896990" elapsed="0.000165"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:43.895335" elapsed="0.001856"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:50:43.881196" elapsed="0.016026"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:50:43.897259" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:50:43.897389" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', '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-10-11T00:50:43.879876" elapsed="0.017562"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:43.879616" elapsed="0.017852"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.897665" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:43.897490" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.879584" elapsed="0.018153"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.898561" 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-10-11T00:50:43.897896" elapsed="0.000691"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:43.898644" 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_rib.vanadium/${file_name} 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-10-11T00:50:43.876283" elapsed="0.022463"/>
</kw>
<msg time="2026-10-11T00:50:43.898794" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:43.871797" elapsed="0.027040"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:43.903087" 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_rib.vanadium/${file_name} 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-10-11T00:50:43.907457" 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_rib.vanadium/${file_name} 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-10-11T00:50:43.911738" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.911919" 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-10-11T00:50:43.912099" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.912451" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:43.912292" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:43.912278" 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-10-11T00:50:43.912691" 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-10-11T00:50:43.912869" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.913029" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:43.912253" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:43.912166" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.913257" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:43.913323" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:50:43.913443" 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-10-11T00:50:43.871177" elapsed="0.042291"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:43.914578" 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-10-11T00:50:43.914368" elapsed="0.000284">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-10-11T00:50:43.914735" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:43.914047" elapsed="0.000711"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.915037" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:43.914821" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.915550" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:43.915271" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:43.915109" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.914804" elapsed="0.000836"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.916131" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:43.915799" elapsed="0.000356"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:50:43.916199" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:43.916321" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:50:43.913749" elapsed="0.002595"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:43.917514" 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-10-11T00:50:43.917306" elapsed="0.000267">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-10-11T00:50:43.917718" 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-10-11T00:50:43.916921" elapsed="0.000821"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:50:43.917908" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:50:43.917807" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.917789" elapsed="0.000195"/>
</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-10-11T00:50:43.918135" elapsed="0.000019"/>
</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-10-11T00:50:43.918308" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:50:43.918366" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:50:43.918507" 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-10-11T00:50:43.916624" elapsed="0.001907"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.919796" 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-10-11T00:50:43.919545" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.920240" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:43.920025" elapsed="0.000255"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:50:43.941728" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:50:43.942100" level="INFO">GET Response : url=http://10.30.170.173: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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-types:unicast-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-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:ipv6-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-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-10-11T00:50:43.942493" 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-10-11T00:50:43.920583" elapsed="0.021936"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:43.920339" elapsed="0.022219"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.942746" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:43.942582" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.920322" elapsed="0.022501"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.944136" 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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-10-11T00:50:43.943753" elapsed="0.000610"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:43.943502" elapsed="0.000894"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.943484" elapsed="0.000952"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.945010" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:43.944737" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:43.944489" elapsed="0.000597"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.944473" elapsed="0.000637"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.945668" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:43.945281" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.945965" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:43.945757" elapsed="0.000260"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.946477" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:43.946196" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:43.946039" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.945740" elapsed="0.000814"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.947077" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:43.946739" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:43.947369" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:43.947166" elapsed="0.000271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.947894" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:43.947628" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:43.947460" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.947149" elapsed="0.000822"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:43.948112" elapsed="0.000292"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:50:43.948821" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:43.948579" elapsed="0.000267"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:50:43.948995" elapsed="0.000216"/>
</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-10-11T00:50:43.943148" elapsed="0.006119"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:43.949425" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:43.949329" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.949312" elapsed="0.000175"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:50:43.956064" 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-10-11T00:50:43.949635" elapsed="0.006458"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:50:43.956140" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:43.956271" 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-10-11T00:50:43.918829" elapsed="0.037467"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:43.956352" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:50:43.956496" 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-10-11T00:50:43.863690" elapsed="0.092831"/>
</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-10-11T00:50:43.956872" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:43.956595" elapsed="0.000376"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.956578" elapsed="0.000417"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:43.957026" 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-10-11T00:50:43.863071" elapsed="0.094058"/>
</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-10-11T00:50:43.861266" elapsed="0.095912"/>
</kw>
<doc>Check for the presence of Ipv6 Prefix in the BGP RIB</doc>
<status status="PASS" start="2026-10-11T00:50:43.767478" elapsed="0.189810"/>
</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-10-11T00:50:43.958682" elapsed="0.000202"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:43.958421" elapsed="0.000512"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:43.959831" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:43.959746" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.959729" elapsed="0.000164"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:43.961885" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:43.961803" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.961786" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.962848" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:43.962513" elapsed="0.000360"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:43.963279" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:43.963021" elapsed="0.000281"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:43.963342" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:43.963483" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:43.962146" elapsed="0.001360"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:43.967147" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:43.967062" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.967044" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:43.968250" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:43.968168" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:43.968151" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:43.968665" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:43.968480" elapsed="0.000210"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:43.968986" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:43.968850" elapsed="0.000159"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:44.005166" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:43.969504" elapsed="0.035759"/>
</kw>
<msg time="2026-10-11T00:50:44.005432" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:44.005475" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:43.969162" elapsed="0.036347"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:44.038095" 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-10-11T00:50:44.006022" elapsed="0.032176"/>
</kw>
<msg time="2026-10-11T00:50:44.038375" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:44.038481" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:44.005686" elapsed="0.032833"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:44.038838" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:44.038593" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.038574" elapsed="0.000337"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.039313" 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-10-11T00:50:44.039089" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:44.039677" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:44.039456" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.039438" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:44.039805" 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-10-11T00:50:44.042220" elapsed="0.000115"/>
</kw>
<msg time="2026-10-11T00:50:44.042392" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:44.041175" elapsed="0.001365"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:44.042858" elapsed="0.000071"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:44.043182" elapsed="0.000070"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:50:44.040592" elapsed="0.002772"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:50:44.040105" elapsed="0.003339"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:50:43.967911" elapsed="0.075608"/>
</kw>
<msg time="2026-10-11T00:50:44.043685" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:44.043729" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:43.967358" elapsed="0.076407"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:44.043919" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:50:44.043834" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.043816" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:44.044304" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:44.044654" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:44.044719" 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-10-11T00:50:43.966769" elapsed="0.078034"/>
</kw>
<msg time="2026-10-11T00:50:44.044887" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:44.044926" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:43.963837" elapsed="0.081124"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:44.045243" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:44.045027" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.045011" elapsed="0.000302"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:43.963698" elapsed="0.081636"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:43.963551" elapsed="0.081810"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:43.961500" elapsed="0.083933"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:43.959484" elapsed="0.086001"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:43.959078" elapsed="0.086483"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:43.958069" elapsed="0.087552"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.046337" 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-10-11T00:50:44.045815" 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-10-11T00:50:44.060121" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:44.059817" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:44.060845" 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-10-11T00:50:44.060668" elapsed="0.000236">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-10-11T00:50:44.060988" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:44.060303" elapsed="0.000708"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.061508" 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-10-11T00:50:44.061183" elapsed="0.000351"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:44.061821" 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-10-11T00:50:44.061941" 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-10-11T00:50:44.061711" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.062372" 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-10-11T00:50:44.062156" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.063374" 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-10-11T00:50:44.063105" elapsed="0.000326"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.063867" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:50:44.063619" elapsed="0.000272"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.064487" 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-10-11T00:50:44.064207" elapsed="0.000304"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:44.065182" 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-10-11T00:50:44.065002" elapsed="0.000204"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:44.065251" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:44.065374" 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-10-11T00:50:44.064699" elapsed="0.000698"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:44.065574" elapsed="0.000181"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.12</var>
<status status="PASS" start="2026-10-11T00:50:44.064079" elapsed="0.001713"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.066284" 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-10-11T00:50:44.066016" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:44.066986" 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-10-11T00:50:44.066809" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:44.067088" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:50:44.067216" 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-10-11T00:50:44.066491" elapsed="0.000748"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:44.067399" elapsed="0.000183"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:50:44.065890" elapsed="0.001823"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.068358" 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-10-11T00:50:44.067944" elapsed="0.000439"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:44.069064" 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-10-11T00:50:44.068888" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:44.069133" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:44.069256" 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-10-11T00:50:44.068570" elapsed="0.000708"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:44.069454" elapsed="0.000331"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:50:44.067815" elapsed="0.002009"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.070316" 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-10-11T00:50:44.070051" elapsed="0.000288"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:44.071013" 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-10-11T00:50:44.070838" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:44.071081" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:44.071204" 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-10-11T00:50:44.070521" elapsed="0.000705"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:44.071386" elapsed="0.000181"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:50:44.069923" elapsed="0.001706"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.072122" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:44.071859" elapsed="0.000287"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:44.072817" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:44.072640" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:44.072885" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:44.073007" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:44.072311" elapsed="0.000718"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:44.073188" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:44.071733" elapsed="0.001657"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.073931" 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-10-11T00:50:44.073664" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:44.074638" 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-10-11T00:50:44.074438" elapsed="0.000224"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:44.074706" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:44.074828" 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-10-11T00:50:44.074122" elapsed="0.000728"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:44.075009" elapsed="0.000165"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:50:44.073505" elapsed="0.001706"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.075732" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:44.075450" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:44.076402" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:44.076227" elapsed="0.000214"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:44.076519" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:50:44.076660" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:44.075923" elapsed="0.000759"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:44.076844" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:44.075311" elapsed="0.001735"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.077555" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:44.077272" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:44.078393" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:44.078064" elapsed="0.000371"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:44.078480" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:44.078654" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:44.077761" elapsed="0.000917"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:44.078839" elapsed="0.000165"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:44.077146" elapsed="0.001894"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:50:44.063934" elapsed="0.015137"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:50:44.079108" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:50:44.079239" 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-10-11T00:50:44.062769" elapsed="0.016494"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:44.062492" elapsed="0.016799"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:44.079473" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:44.079313" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.062474" elapsed="0.017070"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.080302" 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-10-11T00:50:44.079711" elapsed="0.000616"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:44.080372" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:44.059255" elapsed="0.021234"/>
</kw>
<msg time="2026-10-11T00:50:44.080537" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:44.054805" elapsed="0.025775"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:44.084832" 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/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-10-11T00:50:44.089028" 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/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-10-11T00:50:44.093242" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:44.093469" 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-10-11T00:50:44.093679" 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-10-11T00:50:44.094015" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:44.093873" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:44.093859" 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-10-11T00:50:44.094239" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:44.094431" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:44.094595" elapsed="0.000031"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:44.093835" elapsed="0.000821"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:44.093747" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:44.094827" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:44.094893" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:50:44.095000" 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-10-11T00:50:44.054161" elapsed="0.040863"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.096043" 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-10-11T00:50:44.095819" elapsed="0.000267"/>
</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-10-11T00:50:44.106232" level="INFO">DELETE Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:50:44.106276" level="INFO">DELETE Response : url=http://10.30.170.173: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-10-11T00:50:44.106365" 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-10-11T00:50:44.096371" elapsed="0.010018"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:44.096146" elapsed="0.010302"/>
</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-10-11T00:50:44.106642" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:44.106472" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.096129" elapsed="0.010591"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.107901" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:44.107628" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:44.107364" elapsed="0.000609"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.107347" elapsed="0.000648"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.108562" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:44.108279" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:44.108044" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.108029" elapsed="0.000645"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.109191" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:44.108846" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:44.109497" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:44.109278" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.110060" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:44.109797" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:44.109633" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.109262" elapsed="0.000875"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.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-10-11T00:50:44.110305" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:44.110965" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:44.110761" elapsed="0.000255"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.111470" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:44.111194" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:44.111038" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.110745" elapsed="0.000801"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:44.111700" elapsed="0.000288"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:50:44.112369" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:44.112150" elapsed="0.000244"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:50:44.112558" elapsed="0.000384"/>
</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-10-11T00:50:44.107035" elapsed="0.005964"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:50:44.113042" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:44.113215" 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-10-11T00:50:44.095261" elapsed="0.017979"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:44.113287" elapsed="0.000025"/>
</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-10-11T00:50:44.046681" elapsed="0.066701"/>
</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-10-11T00:50:44.114135" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:44.114051" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.114034" elapsed="0.000163"/>
</if>
<for flavor="IN RANGE">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.114912" 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.3/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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:44.114629" elapsed="0.000310"/>
</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-10-11T00:50:44.116701" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:44.116617" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.116586" elapsed="0.000177"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:44.118555" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:44.118303" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.118286" elapsed="0.000354"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:44.118948" level="INFO">index=7
host=10.30.170.173
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-10-11T00:50:44.119040" level="INFO">${current_ssh_connection} = index=7
host=10.30.170.173
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-10-11T00:50:44.118833" elapsed="0.000231"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.119550" 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.3/data/log/karaf.log" on remote system "10.30.170.173" 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-10-11T00:50:44.119251" elapsed="0.000343"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:44.120132" 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-10-11T00:50:44.119814" elapsed="0.000343"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.121003" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:50:44.121073" 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-10-11T00:50:44.120757" elapsed="0.000338"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:44.121244" elapsed="0.000297"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:50:44.122308" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:50:44.758756" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 00:50:44 UTC 2026

  System load:  0.29               Processes:             126
  Usage of /:   14.2% of 77.35GB   Users logged in:       1
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.173
  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.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:48:42 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:50:44.122080" elapsed="0.636782"/>
</kw>
<msg time="2026-10-11T00:50:44.758940" 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-10-11T00:50:44.121720" elapsed="0.637292"/>
</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-10-11T00:50:44.120352" elapsed="0.638766"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:50:44.759652" 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.3/data/log/karaf.log'.</msg>
<msg time="2026-10-11T00:50:44.772713" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:50:44.772852" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T00:50:44.772908" 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-10-11T00:50:44.759400" elapsed="0.013539"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:50:44.773158" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.774118" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:44.773783" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T00:50:44.774400" elapsed="0.000043"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:44.774268" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.774240" elapsed="0.000272"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:50:44.774716" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-10-11T00:50:44.774580" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.774559" elapsed="0.000265"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T00:50:44.774868" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:44.776540" elapsed="0.000176"/>
</kw>
<msg time="2026-10-11T00:50:44.776771" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:44.775850" elapsed="0.000999"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:44.777093" elapsed="0.000028"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:44.777306" elapsed="0.000026"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:50:44.775263" elapsed="0.002165"/>
</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-10-11T00:50:44.117891" elapsed="0.659636"/>
</kw>
<msg time="2026-10-11T00:50:44.777592" 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-10-11T00:50:44.117348" elapsed="0.660321"/>
</kw>
<msg time="2026-10-11T00:50:44.777804" 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-10-11T00:50:44.116913" elapsed="0.660923"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T00:50:44.778465" 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-10-11T00:50:44.778155" elapsed="0.000346"/>
</kw>
<return>
<value>${log_lines}</value>
<status status="PASS" start="2026-10-11T00:50:44.778560" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:50:44.778754" 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-10-11T00:50:44.116206" elapsed="0.662581"/>
</kw>
<kw name="Verify Exceptions" owner="excepts">
<msg time="2026-10-11T00:50:44.779232" level="INFO">${exlist} = []</msg>
<msg time="2026-10-11T00:50:44.779289" 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-10-11T00:50:44.779025" elapsed="0.000293"/>
</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-10-11T00:50:44.779574" elapsed="0.000500"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.780708" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:50:44.780805" 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-10-11T00:50:44.780305" elapsed="0.000531"/>
</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-10-11T00:50:44.781313" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:44.780927" elapsed="0.000462"/>
</branch>
<branch type="ELSE">
<kw name="Log List" owner="Collections">
<msg time="2026-10-11T00:50:44.781869" 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-10-11T00:50:44.781720" elapsed="0.000205"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:44.781441" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.780902" elapsed="0.001091"/>
</if>
<var name="${i}">1</var>
<status status="PASS" start="2026-10-11T00:50:44.114463" elapsed="0.667561"/>
</iter>
<var>${i}</var>
<value>1</value>
<value>${NUM_ODL_SYSTEM} + 1</value>
<status status="PASS" start="2026-10-11T00:50:44.114232" elapsed="0.667832"/>
</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-10-11T00:50:44.113726" elapsed="0.668412"/>
</kw>
<doc>Delete the injected IPV6 routes</doc>
<status status="PASS" start="2026-10-11T00:50:43.957587" elapsed="0.824685"/>
</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-10-11T00:50:44.784252" elapsed="0.000307"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:44.783911" elapsed="0.000733"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:44.785905" elapsed="0.000280"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:44.785784" elapsed="0.000445"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.785758" elapsed="0.000502"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:44.789165" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:44.789050" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.789026" elapsed="0.000225"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.790569" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:44.790086" elapsed="0.000508"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.791020" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:44.790760" elapsed="0.000284"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:44.791083" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:44.791209" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:44.789558" 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-10-11T00:50:44.793793" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:44.793708" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.793691" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:44.794963" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:44.794878" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.794860" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:44.795346" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:44.795175" elapsed="0.000195"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:44.795698" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:44.795550" elapsed="0.000172"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:44.833556" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:44.796202" elapsed="0.037477"/>
</kw>
<msg time="2026-10-11T00:50:44.833860" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:44.833903" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:44.795877" elapsed="0.038061"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:44.865493" 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-10-11T00:50:44.834477" elapsed="0.031118"/>
</kw>
<msg time="2026-10-11T00:50:44.865757" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:44.865798" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:44.834110" elapsed="0.031722"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:44.866107" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:44.865901" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.865883" elapsed="0.000296"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.866627" 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-10-11T00:50:44.866357" elapsed="0.000336"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:44.866951" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:44.866753" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.866737" elapsed="0.000287"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:44.867053" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:44.869619" elapsed="0.000118"/>
</kw>
<msg time="2026-10-11T00:50:44.869795" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:44.868547" elapsed="0.001377"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:44.870226" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:44.870580" elapsed="0.000084"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:50:44.867819" elapsed="0.002958"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:50:44.867321" elapsed="0.003514"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:50:44.794555" elapsed="0.076353"/>
</kw>
<msg time="2026-10-11T00:50:44.870989" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:44.871028" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:44.794002" elapsed="0.077060"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:44.871216" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:50:44.871130" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.871113" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:44.871676" 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-10-11T00:50:44.872013" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:44.872078" 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-10-11T00:50:44.793399" elapsed="0.078764"/>
</kw>
<msg time="2026-10-11T00:50:44.872247" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:44.872286" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:44.791575" elapsed="0.080745"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:44.872644" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:44.872387" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.872370" elapsed="0.000346"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:44.791435" elapsed="0.081303"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:44.791279" elapsed="0.081485"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:44.788640" elapsed="0.084172"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:44.785391" elapsed="0.087470"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:44.784848" elapsed="0.088053"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:44.783374" elapsed="0.089574"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.873820" 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-10-11T00:50:44.873143" 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-10-11T00:50:44.887338" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:44.887036" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:44.888052" 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-10-11T00:50:44.887866" elapsed="0.000255">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-10-11T00:50:44.888204" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:44.887536" elapsed="0.000690"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.888730" 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-10-11T00:50:44.888395" elapsed="0.000360"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:44.889027" 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-10-11T00:50:44.889146" 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-10-11T00:50:44.888918" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.889596" 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-10-11T00:50:44.889363" 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-10-11T00:50:44.890549" 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-10-11T00:50:44.890298" elapsed="0.000344"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.891068" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:50:44.890818" elapsed="0.000274"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.891884" 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-10-11T00:50:44.891426" elapsed="0.000483"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:44.892591" 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-10-11T00:50:44.892391" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:44.892675" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:50:44.892802" 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-10-11T00:50:44.892081" elapsed="0.000744"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:44.892988" elapsed="0.000173"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:50:44.891282" elapsed="0.001916"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.893741" 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-10-11T00:50:44.893440" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:44.894429" 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-10-11T00:50:44.894238" elapsed="0.000216"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:44.894498" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:44.894638" 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-10-11T00:50:44.893933" elapsed="0.000728"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:44.894823" elapsed="0.000165"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:50:44.893299" elapsed="0.001725"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.895532" 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-10-11T00:50:44.895249" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:44.896214" 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-10-11T00:50:44.896039" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:44.896281" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:44.896403" 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-10-11T00:50:44.895735" elapsed="0.000708"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:44.896603" elapsed="0.000177"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:50:44.895123" elapsed="0.001693"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.897306" 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-10-11T00:50:44.897038" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:44.898012" 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-10-11T00:50:44.897836" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:44.898079" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:50:44.898201" 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-10-11T00:50:44.897518" elapsed="0.000705"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:44.898381" elapsed="0.000183"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:50:44.896913" elapsed="0.001688"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.899107" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:44.898839" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:44.899805" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:44.899629" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:44.899872" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:50:44.899996" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:44.899296" elapsed="0.000723"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:44.900177" elapsed="0.000205"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:44.898712" elapsed="0.001722"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.900946" 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-10-11T00:50:44.900675" elapsed="0.000295"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:44.901842" 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-10-11T00:50:44.901659" elapsed="0.000208"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:44.901912" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:44.902038" 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-10-11T00:50:44.901135" elapsed="0.000925"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:44.902220" elapsed="0.000166"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:50:44.900536" elapsed="0.001903"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.902950" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:44.902679" elapsed="0.000295"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:44.903654" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:44.903457" elapsed="0.000222"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:44.903723" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:44.903846" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:44.903139" elapsed="0.000730"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:44.904029" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:44.902541" elapsed="0.001687"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.904769" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:44.904469" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:44.905451" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:44.905257" elapsed="0.000219"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:44.905520" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:44.905683" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:44.904958" elapsed="0.000748"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:44.905867" elapsed="0.000162"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:44.904327" elapsed="0.001738"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:50:44.891135" elapsed="0.014961"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:50:44.906133" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:50:44.906263" 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-10-11T00:50:44.889961" elapsed="0.016326"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:44.889711" elapsed="0.016604"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:44.906497" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:44.906337" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.889694" elapsed="0.016873"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.907349" 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-10-11T00:50:44.906742" elapsed="0.000633"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:44.907434" 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_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-10-11T00:50:44.886525" elapsed="0.021009"/>
</kw>
<msg time="2026-10-11T00:50:44.907626" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:44.882005" elapsed="0.025667"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:44.911874" 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_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-10-11T00:50:44.916072" 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_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-10-11T00:50:44.920456" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:44.920650" 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-10-11T00:50:44.920832" 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-10-11T00:50:44.921167" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:44.921025" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:44.921012" 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-10-11T00:50:44.921390" 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-10-11T00:50:44.921583" 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-10-11T00:50:44.921758" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:44.920987" elapsed="0.000818"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:44.920898" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:44.921975" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:44.922041" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:50:44.922152" 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-10-11T00:50:44.881367" elapsed="0.040810"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.923174" 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-10-11T00:50:44.922952" elapsed="0.000265"/>
</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-10-11T00:50:44.934667" level="INFO">DELETE Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:50:44.934747" level="INFO">DELETE Response : url=http://10.30.170.173: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-10-11T00:50:44.934831" 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-10-11T00:50:44.923514" elapsed="0.011341"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:44.923276" elapsed="0.011616"/>
</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-10-11T00:50:44.935063" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:44.934916" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.923259" elapsed="0.011878"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.936347" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:44.936077" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:44.935840" elapsed="0.000594"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.935823" elapsed="0.000634"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.937018" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:44.936753" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:44.936507" elapsed="0.000582"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.936492" elapsed="0.000619"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.937654" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:44.937280" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:44.937946" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:44.937742" elapsed="0.000256"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.938452" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:44.938175" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:44.938019" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.937726" elapsed="0.000803"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.939072" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:44.938736" elapsed="0.000361"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:44.939360" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:44.939159" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.939881" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:44.939620" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:44.939450" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.939142" elapsed="0.000815"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:44.940096" elapsed="0.000291"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:50:44.940795" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:44.940559" elapsed="0.000260"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:50:44.940969" elapsed="0.000213"/>
</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-10-11T00:50:44.935470" elapsed="0.005769"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:50:44.941279" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:44.941467" 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-10-11T00:50:44.922422" elapsed="0.019069"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:44.941538" elapsed="0.000024"/>
</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-10-11T00:50:44.874063" elapsed="0.067584"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-10-11T00:50:44.782656" elapsed="0.159084"/>
</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-10-11T00:50:44.943120" elapsed="0.000352"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:44.942878" elapsed="0.000678"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:44.944473" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:44.944369" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.944351" elapsed="0.000185"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:44.946544" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:44.946461" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.946443" elapsed="0.000174"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.947510" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:44.947173" elapsed="0.000362"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:44.947965" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:44.947705" elapsed="0.000284"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:44.948029" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:44.948154" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:44.946820" elapsed="0.001357"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:44.950732" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:44.950648" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.950629" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:44.951842" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:44.951758" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:44.951740" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:44.952210" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:44.952046" elapsed="0.000188"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:44.952545" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:44.952394" elapsed="0.000174"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:44.988148" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:44.953083" elapsed="0.035170"/>
</kw>
<msg time="2026-10-11T00:50:44.988429" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:44.988473" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:44.952759" elapsed="0.035748"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:45.018750" 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-10-11T00:50:44.989029" elapsed="0.029824"/>
</kw>
<msg time="2026-10-11T00:50:45.019004" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:45.019045" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:44.988691" elapsed="0.030388"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.019353" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.019149" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.019131" elapsed="0.000319"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.021277" 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-10-11T00:50:45.019646" elapsed="0.001698"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.021648" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.021427" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.021388" elapsed="0.000366"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:45.021787" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:45.024163" elapsed="0.000114"/>
</kw>
<msg time="2026-10-11T00:50:45.024334" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:45.023119" 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-10-11T00:50:45.024801" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.025126" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:50:45.022542" elapsed="0.002767"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:50:45.022055" elapsed="0.003312"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:50:44.951479" elapsed="0.073984"/>
</kw>
<msg time="2026-10-11T00:50:45.025546" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:45.025584" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:44.950940" elapsed="0.074691"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:45.025786" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:50:45.025700" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.025683" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.026175" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.026533" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.026598" elapsed="0.000046"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:50:44.950337" elapsed="0.076380"/>
</kw>
<msg time="2026-10-11T00:50:45.026800" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:45.026838" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:44.948511" elapsed="0.078361"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.027152" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.026938" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.026922" elapsed="0.000300"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:44.948358" elapsed="0.078886"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:44.948223" elapsed="0.079047"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:44.946157" elapsed="0.081160"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:44.944116" elapsed="0.083249"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:44.943721" elapsed="0.083765"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:44.942526" elapsed="0.085010"/>
</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-10-11T00:50:45.044346" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:45.044044" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:45.045049" 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-10-11T00:50:45.044873" elapsed="0.000238">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-10-11T00:50:45.045228" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:45.044543" elapsed="0.000707"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.045770" 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-10-11T00:50:45.045437" elapsed="0.000358"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:45.046066" 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-10-11T00:50:45.046184" 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-10-11T00:50:45.045957" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.046648" 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-10-11T00:50:45.046397" 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-10-11T00:50:45.047582" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:45.047334" elapsed="0.000301"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.048061" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.047811" elapsed="0.000274"/>
</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-10-11T00:50:45.048361" elapsed="0.000020"/>
</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-10-11T00:50:45.048561" 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-10-11T00:50:45.048758" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:50:45.048236" elapsed="0.000574"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.048128" elapsed="0.000709"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:50:45.048875" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:45.049005" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:50:45.046998" elapsed="0.002031"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.046751" elapsed="0.002306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.049223" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.049080" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.046733" elapsed="0.002558"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.049862" 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-10-11T00:50:45.049460" elapsed="0.000427"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:45.049930" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:45.043531" elapsed="0.006497"/>
</kw>
<msg time="2026-10-11T00:50:45.050075" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:45.039101" elapsed="0.011018"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:45.054513" 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/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-10-11T00:50:45.058739" 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/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-10-11T00:50:45.062992" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.063173" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.063350" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.063713" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.063557" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:45.063543" 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-10-11T00:50:45.063940" 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-10-11T00:50:45.064117" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.064278" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:45.063518" elapsed="0.000808"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.063429" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.064512" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.064580" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:50:45.064702" 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-10-11T00:50:45.038495" elapsed="0.026231"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:45.065832" 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-10-11T00:50:45.065644" elapsed="0.000248">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-10-11T00:50:45.065975" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:45.065289" elapsed="0.000708"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.066276" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.066059" elapsed="0.000269"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.066811" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:45.066531" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.066350" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.066042" elapsed="0.000845"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.067377" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:45.067045" elapsed="0.000356"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:50:45.067476" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:45.067602" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:50:45.064990" elapsed="0.002654"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:45.068755" 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-10-11T00:50:45.068558" elapsed="0.000255">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-10-11T00:50:45.068896" 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-10-11T00:50:45.068224" elapsed="0.000694"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:50:45.069079" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:50:45.068981" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.068964" elapsed="0.000191"/>
</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-10-11T00:50:45.069307" elapsed="0.000019"/>
</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-10-11T00:50:45.069494" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.069555" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:50:45.069690" 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-10-11T00:50:45.067927" elapsed="0.001787"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.070937" 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-10-11T00:50:45.070714" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.071385" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:45.071167" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:50:45.080230" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:50:45.080368" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:50:45.080487" 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-10-11T00:50:45.071760" elapsed="0.008753"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.071502" elapsed="0.009050"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.080743" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.080576" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.071486" elapsed="0.009334"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.082067" 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-10-11T00:50:45.081738" elapsed="0.000373"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.081487" elapsed="0.000655"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.081470" elapsed="0.000694"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.082749" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:45.082465" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.082213" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.082198" elapsed="0.000645"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.083355" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:45.083014" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.083701" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.083459" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.084197" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:45.083935" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.083776" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.083441" elapsed="0.000865"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.084848" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:45.084494" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.085139" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.084935" elapsed="0.000255"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.085664" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:45.085371" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.085212" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.084919" elapsed="0.000822"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:45.085881" elapsed="0.000287"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:50:45.086562" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:45.086324" elapsed="0.000263"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.086752" elapsed="0.000208"/>
</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-10-11T00:50:45.081134" elapsed="0.005882"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.087164" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:45.087077" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.087060" elapsed="0.000164"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:50:45.087891" 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-10-11T00:50:45.087363" elapsed="0.000555"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:50:45.087964" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:45.088089" 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-10-11T00:50:45.069991" elapsed="0.018123"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:45.088173" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:50:45.088291" 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-10-11T00:50:45.030893" elapsed="0.057422"/>
</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-10-11T00:50:45.099346" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:45.099046" elapsed="0.000326"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:45.100094" 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-10-11T00:50:45.099875" elapsed="0.000336">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-10-11T00:50:45.100374" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:45.099548" elapsed="0.000850"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.100912" 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-10-11T00:50:45.100594" elapsed="0.000374"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:45.101245" 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-10-11T00:50:45.101360" 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-10-11T00:50:45.101135" elapsed="0.000250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.101827" 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-10-11T00:50:45.101595" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:50:45.102221" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.101931" elapsed="0.000345"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.102932" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:45.102468" elapsed="0.000489"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.102298" elapsed="0.000692"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.101913" elapsed="0.001096"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.103561" 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-10-11T00:50:45.103168" elapsed="0.000420"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:45.103646" 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_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-10-11T00:50:45.098531" elapsed="0.005217"/>
</kw>
<msg time="2026-10-11T00:50:45.103796" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:45.094003" elapsed="0.009837"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:45.108113" 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/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-10-11T00:50:45.112353" 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/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-10-11T00:50:45.116740" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.116921" 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-10-11T00:50:45.117100" 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-10-11T00:50:45.117486" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.117327" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:45.117313" 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-10-11T00:50:45.117725" 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-10-11T00:50:45.117903" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.118063" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:45.117288" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.117198" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.118283" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.118349" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:50:45.118471" 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-10-11T00:50:45.093141" elapsed="0.025356"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:45.118675" elapsed="0.000312"/>
</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-10-11T00:50:45.119893" 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-10-11T00:50:45.119640" elapsed="0.000280"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:50:45.120308" 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-10-11T00:50:45.120066" elapsed="0.000267"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:50:45.120530" elapsed="0.000292"/>
</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-10-11T00:50:45.119254" elapsed="0.001622"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.119058" elapsed="0.001849"/>
</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-10-11T00:50:45.121100" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.120929" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.119041" elapsed="0.002126"/>
</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-10-11T00:50:45.089273" elapsed="0.031937"/>
</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-10-11T00:50:45.088619" elapsed="0.032655"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.088387" elapsed="0.032926"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.088371" elapsed="0.032963"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:45.121364" elapsed="0.000026"/>
</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-10-11T00:50:45.030273" elapsed="0.091207"/>
</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-10-11T00:50:45.027960" elapsed="0.093569"/>
</kw>
<doc>Verifies that example-ipv6-topology is empty</doc>
<status status="PASS" start="2026-10-11T00:50:45.027672" elapsed="0.093912"/>
</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-10-11T00:50:44.941978" elapsed="0.179747"/>
</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-10-11T00:50:45.123126" elapsed="0.000198"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:45.122880" elapsed="0.000494"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.124274" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:45.124189" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.124171" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.126470" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:45.126373" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.126357" elapsed="0.000175"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.127434" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:45.127099" elapsed="0.000361"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.127901" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:45.127639" elapsed="0.000286"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:45.127966" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:45.128091" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:45.126746" elapsed="0.001368"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.130657" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:45.130552" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.130534" elapsed="0.000185"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.131758" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:45.131674" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.131655" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:45.132128" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.131963" elapsed="0.000190"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:45.132464" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:45.132312" elapsed="0.000176"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:45.166530" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:45.132987" elapsed="0.033657"/>
</kw>
<msg time="2026-10-11T00:50:45.166798" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:45.166840" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:45.132660" elapsed="0.034216"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:45.204320" 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-10-11T00:50:45.167382" elapsed="0.037072"/>
</kw>
<msg time="2026-10-11T00:50:45.204639" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:45.204685" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:45.167043" elapsed="0.037677"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.204993" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.204790" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.204771" elapsed="0.000294"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.205489" 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-10-11T00:50:45.205243" elapsed="0.000349"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.205870" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.205672" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.205654" elapsed="0.000288"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:45.205972" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:45.208357" elapsed="0.000272"/>
</kw>
<msg time="2026-10-11T00:50:45.208688" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:45.207310" elapsed="0.001507"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.209116" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.209469" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:50:45.206736" 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-10-11T00:50:45.206238" 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-10-11T00:50:45.131378" elapsed="0.078422"/>
</kw>
<msg time="2026-10-11T00:50:45.209879" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:45.209919" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:45.130867" elapsed="0.079088"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:45.210107" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:50:45.210022" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.210005" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.210525" 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-10-11T00:50:45.210843" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.210907" 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-10-11T00:50:45.130253" elapsed="0.080740"/>
</kw>
<msg time="2026-10-11T00:50:45.211074" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:45.211114" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:45.128449" elapsed="0.082700"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.211513" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.211216" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.211200" elapsed="0.000386"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:45.128295" elapsed="0.083326"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:45.128161" elapsed="0.083489"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:45.126081" elapsed="0.085618"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:45.123940" elapsed="0.087809"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:45.123536" elapsed="0.088253"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:45.122523" elapsed="0.089313"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.212658" 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-10-11T00:50:45.212028" elapsed="0.000658"/>
</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-10-11T00:50:45.223328" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:45.223028" elapsed="0.000326"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:45.224024" 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-10-11T00:50:45.223853" elapsed="0.000230">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-10-11T00:50:45.224169" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:45.223523" elapsed="0.000669"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.224699" 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-10-11T00:50:45.224361" elapsed="0.000363"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:45.224994" 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-10-11T00:50:45.225110" 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-10-11T00:50:45.224887" elapsed="0.000248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.225555" 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-10-11T00:50:45.225321" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.226499" 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-10-11T00:50:45.226248" elapsed="0.000294"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.227171" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.226751" elapsed="0.000444"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.227818" 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-10-11T00:50:45.227530" elapsed="0.000312"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:45.228514" 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-10-11T00:50:45.228316" elapsed="0.000223"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:45.228583" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:50:45.228724" 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-10-11T00:50:45.228009" elapsed="0.000739"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.228910" elapsed="0.000171"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:50:45.227385" elapsed="0.001734"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.229646" 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-10-11T00:50:45.229347" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:45.230316" 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-10-11T00:50:45.230139" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:45.230384" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T00:50:45.230526" 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-10-11T00:50:45.229835" elapsed="0.000714"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.230722" elapsed="0.000167"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:50:45.229220" elapsed="0.001706"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.231431" 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-10-11T00:50:45.231150" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:45.232155" 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-10-11T00:50:45.231978" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:45.232222" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:45.232346" 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-10-11T00:50:45.231670" elapsed="0.000698"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.232544" elapsed="0.000180"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:50:45.231025" elapsed="0.001735"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.233252" 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-10-11T00:50:45.232986" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:45.233956" 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-10-11T00:50:45.233781" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:45.234023" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:45.234153" 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-10-11T00:50:45.233465" elapsed="0.000710"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.234335" elapsed="0.000181"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:50:45.232860" elapsed="0.001693"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.235058" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:45.234793" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:45.235757" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.235567" elapsed="0.000214"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:45.235825" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:45.235948" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:45.235248" elapsed="0.000723"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.236129" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:45.234667" elapsed="0.001662"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.237005" 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-10-11T00:50:45.236571" elapsed="0.000458"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:45.237724" 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-10-11T00:50:45.237518" elapsed="0.000230"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:45.237791" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:45.237914" 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-10-11T00:50:45.237202" elapsed="0.000735"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.238095" elapsed="0.000164"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:50:45.236444" elapsed="0.001852"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.238823" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:45.238538" elapsed="0.000309"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:45.239513" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.239319" elapsed="0.000218"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:45.239581" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:50:45.239720" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:45.239015" elapsed="0.000728"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.239902" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:45.238395" elapsed="0.001713"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.240629" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:45.240332" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:45.241335" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.241160" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:45.241402" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T00:50:45.241543" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:45.240856" elapsed="0.000709"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.241740" elapsed="0.000166"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:45.240206" elapsed="0.001737"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:50:45.227238" elapsed="0.014737"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:50:45.242013" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:50:45.242143" 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-10-11T00:50:45.225914" elapsed="0.016254"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.225669" elapsed="0.016528"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.242364" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.242218" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.225652" elapsed="0.016797"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.243219" 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-10-11T00:50:45.242605" elapsed="0.000641"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:45.243289" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:45.222515" elapsed="0.020873"/>
</kw>
<msg time="2026-10-11T00:50:45.243453" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:45.217949" elapsed="0.025549"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:45.247897" 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/${file_name} 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-10-11T00:50:45.252122" 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/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-10-11T00:50:45.256326" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.256520" 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-10-11T00:50:45.256712" 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-10-11T00:50:45.257050" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.256906" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:45.256892" 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-10-11T00:50:45.257311" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.257506" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.257685" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:45.256867" elapsed="0.000867"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.256778" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.257907" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.257974" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:50:45.258084" 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-10-11T00:50:45.217332" elapsed="0.040777"/>
</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-10-11T00:50:45.267205" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:45.266905" elapsed="0.000327"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:45.267896" 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-10-11T00:50:45.267727" elapsed="0.000228">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-10-11T00:50:45.268037" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:45.267385" elapsed="0.000675"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.268551" 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-10-11T00:50:45.268228" elapsed="0.000349"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:45.268863" 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-10-11T00:50:45.268979" 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-10-11T00:50:45.268755" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.269429" 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-10-11T00:50:45.269197" 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-10-11T00:50:45.269804" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.269544" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.270286" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:45.270023" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.269879" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.269527" elapsed="0.000868"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.271263" 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-10-11T00:50:45.270570" elapsed="0.000721"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:45.271334" 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-10-11T00:50:45.266374" elapsed="0.005078"/>
</kw>
<msg time="2026-10-11T00:50:45.271505" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:45.261974" elapsed="0.009574"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:45.275884" 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/${file_name} 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-10-11T00:50:45.280079" 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/${file_name} 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-10-11T00:50:45.284273" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.284465" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.284658" 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-10-11T00:50:45.284989" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.284848" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:45.284835" 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-10-11T00:50:45.285213" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.285388" 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-10-11T00:50:45.285567" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:45.284811" elapsed="0.000911"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.284724" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.285898" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.285964" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:50:45.286115" 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-10-11T00:50:45.261242" elapsed="0.024900"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:45.287243" 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-10-11T00:50:45.287058" elapsed="0.000243">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-10-11T00:50:45.287383" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:45.286738" elapsed="0.000682"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.287713" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.287485" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.288210" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:45.287948" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.287787" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.287468" elapsed="0.000818"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.288814" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:45.288461" elapsed="0.000376"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:50:45.288882" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:45.289005" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:50:45.286425" elapsed="0.002603"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.290246" 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-10-11T00:50:45.290026" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.290719" 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-10-11T00:50:45.290492" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.291180" 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-10-11T00:50:45.290958" elapsed="0.000261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.291652" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:45.291420" elapsed="0.000272"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:45.292381" 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-10-11T00:50:45.292224" elapsed="0.000198"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:50:45.292750" 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-10-11T00:50:45.292574" 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-10-11T00:50:45.292933" elapsed="0.000155"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.293513" 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-10-11T00:50:45.293277" elapsed="0.000277"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:50:45.293641" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T00:50:45.293776" 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-10-11T00:50:45.291871" elapsed="0.001928"/>
</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-10-11T00:50:45.309597" level="INFO">PUT Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.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-10-11T00:50:45.309749" level="INFO">PUT Response : url=http://10.30.170.173: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-10-11T00:50:45.309934" 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-10-11T00:50:45.294091" elapsed="0.015892"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.293862" elapsed="0.016211"/>
</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-10-11T00:50:45.310473" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.310130" elapsed="0.000406"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.293846" elapsed="0.016710"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.311726" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:45.311436" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.311185" elapsed="0.000614"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.311168" elapsed="0.000653"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.312373" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:45.312105" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.311872" elapsed="0.000592"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.311856" elapsed="0.000631"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.313023" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:45.312677" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.313322" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.313118" elapsed="0.000255"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.313855" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:45.313569" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.313395" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.313098" elapsed="0.000834"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.314456" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:45.314103" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.314767" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.314545" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.315257" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:45.314998" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.314841" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.314528" elapsed="0.000805"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:45.315490" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:50:45.316220" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:45.315995" elapsed="0.000248"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.316392" elapsed="0.000239"/>
</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-10-11T00:50:45.310895" elapsed="0.005793"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:50:45.316830" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:50:45.316748" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.316731" elapsed="0.000175"/>
</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-10-11T00:50:45.317044" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.317104" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:50:45.317263" 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-10-11T00:50:45.289322" elapsed="0.027965"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:45.317342" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:50:45.317480" 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-10-11T00:50:45.213563" elapsed="0.103941"/>
</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-10-11T00:50:45.317809" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.317589" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.317573" elapsed="0.000320"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:45.317923" elapsed="0.000023"/>
</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-10-11T00:50:45.212969" elapsed="0.105050"/>
</kw>
<doc>Configure BGP peer modules with initiate-connection set to false with short ipv6 address.</doc>
<status status="PASS" start="2026-10-11T00:50:45.121972" elapsed="0.196139"/>
</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-10-11T00:50:45.319398" elapsed="0.000233"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:45.319154" 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-10-11T00:50:45.320567" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:45.320482" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.320464" elapsed="0.000178"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.322808" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:45.322724" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.322706" elapsed="0.000165"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.323793" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:45.323449" elapsed="0.000370"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.324233" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:45.323969" elapsed="0.000288"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:45.324298" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:45.324441" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:45.323078" elapsed="0.001387"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.327027" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:45.326943" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.326924" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.328132" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:45.328048" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.328031" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:45.328529" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.328336" elapsed="0.000218"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:45.328864" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:45.328728" elapsed="0.000159"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:45.366800" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:45.329365" elapsed="0.037535"/>
</kw>
<msg time="2026-10-11T00:50:45.367050" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:45.367092" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:45.329041" elapsed="0.038085"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:45.392256" 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-10-11T00:50:45.367665" elapsed="0.024686"/>
</kw>
<msg time="2026-10-11T00:50:45.392524" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:45.392566" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:45.367292" elapsed="0.025309"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.392886" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.392685" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.392666" elapsed="0.000291"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.393355" 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-10-11T00:50:45.393133" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.393702" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.393492" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.393476" elapsed="0.000297"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:45.393804" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:45.396203" elapsed="0.000264"/>
</kw>
<msg time="2026-10-11T00:50:45.396526" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:45.395141" 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-10-11T00:50:45.396992" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.397322" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:50:45.394549" elapsed="0.002979"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:50:45.394068" elapsed="0.003520"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:50:45.327791" elapsed="0.069885"/>
</kw>
<msg time="2026-10-11T00:50:45.397759" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:45.397798" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:45.327237" elapsed="0.070597"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:45.398031" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-11T00:50:45.397902" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.397884" 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-10-11T00:50:45.398453" 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-10-11T00:50:45.398776" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.398842" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:50:45.326605" elapsed="0.072321"/>
</kw>
<msg time="2026-10-11T00:50:45.399009" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:45.399049" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:45.324805" elapsed="0.074278"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.399364" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.399150" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.399134" elapsed="0.000384"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:45.324665" elapsed="0.074875"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:45.324511" elapsed="0.075056"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:45.322399" elapsed="0.077233"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:45.320214" elapsed="0.079471"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:45.319828" elapsed="0.079896"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:45.318810" elapsed="0.080962"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.400548" 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-10-11T00:50:45.399962" elapsed="0.000614"/>
</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-10-11T00:50:45.411300" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:45.410994" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:45.411998" 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-10-11T00:50:45.411825" elapsed="0.000233">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-10-11T00:50:45.412141" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:45.411496" elapsed="0.000667"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.412671" 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-10-11T00:50:45.412331" elapsed="0.000366"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:45.412968" 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-10-11T00:50:45.413085" 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-10-11T00:50:45.412859" elapsed="0.000250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.413535" 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-10-11T00:50:45.413299" 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-10-11T00:50:45.414661" 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-10-11T00:50:45.414388" elapsed="0.000316"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.415303" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.414882" elapsed="0.000446"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.415955" 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-10-11T00:50:45.415680" elapsed="0.000300"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:45.416671" 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-10-11T00:50:45.416471" elapsed="0.000225"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:45.416742" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:50:45.416869" 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-10-11T00:50:45.416148" elapsed="0.000744"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.417054" elapsed="0.000171"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.12</var>
<status status="PASS" start="2026-10-11T00:50:45.415536" elapsed="0.001727"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.417794" 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-10-11T00:50:45.417505" elapsed="0.000314"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:45.418484" 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-10-11T00:50:45.418289" elapsed="0.000219"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:45.418551" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:45.418692" 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-10-11T00:50:45.417986" elapsed="0.000730"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.418874" elapsed="0.000165"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:50:45.417362" elapsed="0.001714"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.419584" 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-10-11T00:50:45.419299" elapsed="0.000308"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:45.420290" 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-10-11T00:50:45.420115" elapsed="0.000198"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:45.420356" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:45.420495" 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-10-11T00:50:45.419814" elapsed="0.000704"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.420695" elapsed="0.000164"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:50:45.419174" elapsed="0.001723"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.421387" 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-10-11T00:50:45.421120" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:45.422087" 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-10-11T00:50:45.421912" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:45.422155" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:45.422277" 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-10-11T00:50:45.421592" elapsed="0.000707"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.422473" elapsed="0.000178"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:50:45.420995" elapsed="0.001693"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.423176" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:45.422912" elapsed="0.000288"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:45.423880" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.423703" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:45.423983" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:50:45.424111" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:45.423365" 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-10-11T00:50:45.424294" elapsed="0.000183"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:45.422787" elapsed="0.001728"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.425184" 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-10-11T00:50:45.424760" elapsed="0.000448"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:45.425891" 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-10-11T00:50:45.425714" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:45.425960" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:45.426085" 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-10-11T00:50:45.425374" elapsed="0.000733"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.426267" elapsed="0.000182"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:50:45.424631" elapsed="0.001856"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.427003" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:45.426733" elapsed="0.000295"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:45.427710" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.427514" elapsed="0.000220"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:45.427778" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:45.427902" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:45.427194" elapsed="0.000731"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.428084" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:45.426588" elapsed="0.001697"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.428814" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:45.428528" elapsed="0.000310"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:45.429499" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.429306" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:45.429566" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:45.429707" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:45.429004" elapsed="0.000726"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.429890" elapsed="0.000164"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:45.428384" elapsed="0.001705"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:50:45.415371" elapsed="0.014749"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:50:45.430158" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:50:45.430289" 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-10-11T00:50:45.414049" elapsed="0.016264"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.413799" elapsed="0.016543"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.430525" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.430363" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.413781" elapsed="0.016815"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.431355" 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-10-11T00:50:45.430768" elapsed="0.000613"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:45.431449" 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-10-11T00:50:45.410482" elapsed="0.021069"/>
</kw>
<msg time="2026-10-11T00:50:45.431651" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:45.406041" elapsed="0.025656"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:45.435919" 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/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-10-11T00:50:45.440285" 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/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-10-11T00:50:45.444503" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.444697" 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-10-11T00:50:45.444878" 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-10-11T00:50:45.445211" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.445070" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:45.445056" 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-10-11T00:50:45.445451" 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-10-11T00:50:45.445644" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.445808" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:45.445031" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.444943" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.446058" elapsed="0.000024"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.446131" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:50:45.446238" 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-10-11T00:50:45.405430" elapsed="0.040833"/>
</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-10-11T00:50:45.455391" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:45.455089" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:45.456090" 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-10-11T00:50:45.455919" elapsed="0.000261">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-10-11T00:50:45.456266" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:45.455588" elapsed="0.000700"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.456800" 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-10-11T00:50:45.456475" elapsed="0.000350"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:45.457096" 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-10-11T00:50:45.457213" 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-10-11T00:50:45.456988" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.457683" 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-10-11T00:50:45.457448" 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-10-11T00:50:45.458045" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.457798" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.458554" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:45.458263" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.458120" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.457780" elapsed="0.000868"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.459220" 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-10-11T00:50:45.458806" elapsed="0.000442"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:45.459291" 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-10-11T00:50:45.454578" elapsed="0.004814"/>
</kw>
<msg time="2026-10-11T00:50:45.459460" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:45.450129" elapsed="0.009375"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:45.463839" 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/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-10-11T00:50:45.468041" 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/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-10-11T00:50:45.472324" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.472518" 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-10-11T00:50:45.472747" 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-10-11T00:50:45.473080" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.472938" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:45.472924" 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-10-11T00:50:45.473305" 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-10-11T00:50:45.473496" 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-10-11T00:50:45.473671" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:45.472899" elapsed="0.000821"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.472813" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.473892" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.473957" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:50:45.474074" 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-10-11T00:50:45.449425" elapsed="0.024676"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:45.475204" 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-10-11T00:50:45.475019" elapsed="0.000245">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-10-11T00:50:45.475347" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:45.474699" elapsed="0.000671"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.475678" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.475448" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.476170" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:45.475911" elapsed="0.000283"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.475751" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.475431" elapsed="0.000814"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.476759" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:45.476402" elapsed="0.000381"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:50:45.476828" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:45.476950" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:50:45.474369" elapsed="0.002604"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.478343" 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-10-11T00:50:45.478123" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.478853" 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-10-11T00:50:45.478636" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.479309" 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-10-11T00:50:45.479092" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.479799" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:45.479551" elapsed="0.000288"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:45.480546" 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-10-11T00:50:45.480373" elapsed="0.000198"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:50:45.480879" 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-10-11T00:50:45.480738" elapsed="0.000164"/>
</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-10-11T00:50:45.481059" elapsed="0.000153"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.481649" 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-10-11T00:50:45.481400" elapsed="0.000289"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:50:45.481728" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:45.481854" 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-10-11T00:50:45.480016" elapsed="0.001861"/>
</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-10-11T00:50:45.497188" level="INFO">POST Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.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-10-11T00:50:45.497248" level="INFO">POST Response : url=http://10.30.170.173: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.173: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-10-11T00:50:45.497330" 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-10-11T00:50:45.482163" elapsed="0.015191"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.481939" elapsed="0.015456"/>
</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-10-11T00:50:45.497593" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.497442" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.481923" elapsed="0.015763"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.498896" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:45.498607" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.498352" elapsed="0.000614"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.498334" elapsed="0.000654"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.499557" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:45.499276" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.499038" elapsed="0.000605"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.499022" elapsed="0.000677"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.500218" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:45.499874" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.500526" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.500305" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.501033" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:45.500771" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.500600" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.500289" elapsed="0.000820"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.501665" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:45.501276" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.501956" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.501754" elapsed="0.000252"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.502459" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:45.502183" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.502028" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.501738" elapsed="0.000797"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:45.502691" elapsed="0.000288"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:50:45.503358" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:45.503134" elapsed="0.000248"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.503548" elapsed="0.000221"/>
</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-10-11T00:50:45.497998" elapsed="0.005827"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:50:45.503968" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:50:45.503888" elapsed="0.000135"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.503872" elapsed="0.000172"/>
</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-10-11T00:50:45.504183" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.504241" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:50:45.504398" 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-10-11T00:50:45.477262" elapsed="0.027176"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:45.504499" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:50:45.504631" 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-10-11T00:50:45.401478" elapsed="0.103177"/>
</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-10-11T00:50:45.504938" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.504743" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.504727" elapsed="0.000292"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:45.505048" elapsed="0.000023"/>
</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-10-11T00:50:45.400839" elapsed="0.104304"/>
</kw>
<doc>Inject the Ipv6 route from controller</doc>
<status status="PASS" start="2026-10-11T00:50:45.318349" elapsed="0.186932"/>
</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-10-11T00:50:45.506632" elapsed="0.000200"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:45.506356" 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-10-11T00:50:45.507787" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:45.507699" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.507681" elapsed="0.000168"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.510014" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:45.509932" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.509915" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.510976" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:45.510656" elapsed="0.000346"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.511425" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:45.511150" elapsed="0.000300"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:45.511491" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:45.511629" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:45.510277" elapsed="0.001375"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.514158" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:45.514075" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.514057" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.515253" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:45.515170" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.515153" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:45.515663" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.515479" elapsed="0.000208"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:45.515980" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:45.515847" elapsed="0.000156"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:45.551044" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:45.516493" elapsed="0.034649"/>
</kw>
<msg time="2026-10-11T00:50:45.551303" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:45.551344" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:45.516155" elapsed="0.035224"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:45.582897" 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-10-11T00:50:45.551917" elapsed="0.031088"/>
</kw>
<msg time="2026-10-11T00:50:45.583167" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:45.583209" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:45.551566" elapsed="0.031679"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.583553" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.583315" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.583297" elapsed="0.000346"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.584059" 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-10-11T00:50:45.583824" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.584440" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.584222" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.584204" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:45.584544" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:45.586958" elapsed="0.000234"/>
</kw>
<msg time="2026-10-11T00:50:45.587249" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:45.585910" 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-10-11T00:50:45.587724" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.588056" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:50:45.585297" elapsed="0.002944"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:50:45.584827" elapsed="0.003472"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:50:45.514912" elapsed="0.073462"/>
</kw>
<msg time="2026-10-11T00:50:45.588481" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:45.588521" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:45.514367" elapsed="0.074190"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:45.588728" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:50:45.588640" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.588609" elapsed="0.000196"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.589123" 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-10-11T00:50:45.589488" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.589554" 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-10-11T00:50:45.513794" elapsed="0.075881"/>
</kw>
<msg time="2026-10-11T00:50:45.589762" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:45.589802" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:45.511973" elapsed="0.077865"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.590125" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.589906" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.589890" elapsed="0.000306"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:45.511833" elapsed="0.078384"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:45.511698" elapsed="0.078546"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:45.509640" elapsed="0.080652"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:45.507428" elapsed="0.082914"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:45.507026" elapsed="0.083357"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:45.506020" elapsed="0.084487"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.591275" level="INFO">&amp;{mapping} = { IP=10.30.170.173 | 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-10-11T00:50:45.590715" elapsed="0.000589"/>
</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-10-11T00:50:45.607120" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:45.606817" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:45.607840" 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-10-11T00:50:45.607653" elapsed="0.000248">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-10-11T00:50:45.607986" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:45.607303" elapsed="0.000707"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.608507" 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-10-11T00:50:45.608181" elapsed="0.000352"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:45.608822" 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-10-11T00:50:45.609001" 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-10-11T00:50:45.608713" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.609456" 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-10-11T00:50:45.609220" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.610596" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T00:50:45.610338" elapsed="0.000318"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.611081" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.610830" elapsed="0.000276"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.611745" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:45.611443" elapsed="0.000327"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:45.612582" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.612248" elapsed="0.000360"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:45.612673" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:50:45.612801" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:45.611939" elapsed="0.000886"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.612988" elapsed="0.000170"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T00:50:45.611297" elapsed="0.001898"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.613727" 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-10-11T00:50:45.613438" elapsed="0.000314"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:45.614555" 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-10-11T00:50:45.614226" elapsed="0.000354"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:45.614640" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:45.614766" 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-10-11T00:50:45.613918" 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-10-11T00:50:45.614952" elapsed="0.000166"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:50:45.613294" elapsed="0.001860"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.615689" 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-10-11T00:50:45.615380" elapsed="0.000334"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:45.616505" 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-10-11T00:50:45.616188" elapsed="0.000342"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:45.616605" elapsed="0.000072"/>
</return>
<msg time="2026-10-11T00:50:45.616777" 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-10-11T00:50:45.615882" elapsed="0.000919"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.616964" elapsed="0.000167"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:50:45.615253" elapsed="0.001915"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.617707" 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-10-11T00:50:45.617397" elapsed="0.000335"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:45.618535" 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-10-11T00:50:45.618210" elapsed="0.000350"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:45.618605" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T00:50:45.618747" 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-10-11T00:50:45.617901" 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-10-11T00:50:45.618933" elapsed="0.000165"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:50:45.617269" elapsed="0.001867"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.619678" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:45.619364" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:45.620498" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.620176" elapsed="0.000348"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:45.620568" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:45.620711" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:45.619871" 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-10-11T00:50:45.620895" elapsed="0.000319"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:45.619237" elapsed="0.002014"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.621810" 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-10-11T00:50:45.621504" elapsed="0.000330"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:45.622659" 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-10-11T00:50:45.622305" elapsed="0.000380"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:45.622730" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:45.622856" 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-10-11T00:50:45.622002" elapsed="0.000877"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.623040" elapsed="0.000167"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:50:45.621353" elapsed="0.001891"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.623781" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:45.623495" elapsed="0.000311"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:45.624596" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.624275" elapsed="0.000361"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:45.624681" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:45.624807" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:45.623974" 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-10-11T00:50:45.624990" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:45.623343" elapsed="0.001848"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.625723" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:45.625438" elapsed="0.000310"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:45.626538" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.626217" elapsed="0.000347"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:45.626657" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:45.626783" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:45.625914" 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-10-11T00:50:45.626966" elapsed="0.000166"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:45.625289" elapsed="0.001880"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:50:45.611149" elapsed="0.016051"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:50:45.627238" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:50:45.627368" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', '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-10-11T00:50:45.609826" elapsed="0.017567"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.609560" elapsed="0.017888"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.627669" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.627472" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.609542" elapsed="0.018200"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.628509" 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-10-11T00:50:45.627896" elapsed="0.000639"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:45.628579" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:45.606284" elapsed="0.022411"/>
</kw>
<msg time="2026-10-11T00:50:45.628742" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:45.601832" elapsed="0.026954"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:45.634186" 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_rib.vanadium/${file_name} 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-10-11T00:50:45.638395" 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/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-10-11T00:50:45.642609" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.642799" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.642977" 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-10-11T00:50:45.643311" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.643169" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:45.643155" 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-10-11T00:50:45.643550" 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-10-11T00:50:45.643775" 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-10-11T00:50:45.643937" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:45.643130" elapsed="0.000855"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.643043" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.644155" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.644221" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:50:45.644327" 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-10-11T00:50:45.601212" elapsed="0.043139"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:45.645483" 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-10-11T00:50:45.645280" elapsed="0.000265">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-10-11T00:50:45.645641" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:45.644957" elapsed="0.000708"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.645948" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.645729" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.646463" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:45.646182" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.646021" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.645711" elapsed="0.000829"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.647049" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:45.646713" elapsed="0.000360"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:50:45.647118" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:45.647242" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:50:45.644654" elapsed="0.002611"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:45.648339" 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-10-11T00:50:45.648157" elapsed="0.000241">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-10-11T00:50:45.648499" 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-10-11T00:50:45.647840" elapsed="0.000681"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:50:45.648695" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:50:45.648585" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.648568" elapsed="0.000203"/>
</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-10-11T00:50:45.648921" elapsed="0.000019"/>
</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-10-11T00:50:45.649093" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.649151" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:50:45.649274" 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-10-11T00:50:45.647530" elapsed="0.001767"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.650527" 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-10-11T00:50:45.650286" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.651030" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:45.650810" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:50:45.661575" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:50:45.661785" level="INFO">GET Response : url=http://10.30.170.173: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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-types:unicast-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-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:ipv6-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-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-10-11T00:50:45.661981" 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-10-11T00:50:45.651353" elapsed="0.010654"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.651130" elapsed="0.010915"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.662218" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.662069" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.651113" elapsed="0.011180"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.663624" 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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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"}],"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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-10-11T00:50:45.663213" elapsed="0.000628"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.662977" elapsed="0.000897"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.662959" elapsed="0.000938"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.664467" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:45.664185" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.663948" elapsed="0.000591"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.663932" elapsed="0.000629"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.665085" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:45.664742" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.665376" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.665171" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.665909" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:45.665646" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.665467" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.665155" elapsed="0.000830"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.666506" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:45.666155" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.666832" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.666593" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.667318" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:45.667061" elapsed="0.000281"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.666906" elapsed="0.000469"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.666577" elapsed="0.000817"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:45.667550" elapsed="0.000306"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:50:45.668236" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:45.668012" elapsed="0.000248"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.668422" elapsed="0.000227"/>
</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-10-11T00:50:45.662640" elapsed="0.006065"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.668848" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:45.668766" elapsed="0.000122"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.668750" elapsed="0.000158"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:50:45.675204" 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-10-11T00:50:45.669045" elapsed="0.006188"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:50:45.675280" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:50:45.675430" 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-10-11T00:50:45.649583" elapsed="0.025873"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:45.675512" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:50:45.675646" 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-10-11T00:50:45.593823" elapsed="0.081849"/>
</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-10-11T00:50:45.675950" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.675746" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.675730" elapsed="0.000341"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:45.676102" elapsed="0.000025"/>
</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-10-11T00:50:45.593208" elapsed="0.082992"/>
</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-10-11T00:50:45.591545" elapsed="0.084705"/>
</kw>
<doc>Check for the presence of Ipv6 Prefix in the BGP RIB</doc>
<status status="PASS" start="2026-10-11T00:50:45.505545" elapsed="0.170806"/>
</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-10-11T00:50:45.677729" elapsed="0.000203"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:45.677447" 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-10-11T00:50:45.678894" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:45.678808" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.678791" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.680955" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:45.680873" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.680856" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.681923" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:45.681589" elapsed="0.000358"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.682356" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:45.682097" elapsed="0.000282"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:45.682437" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:50:45.682566" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:45.681221" elapsed="0.001367"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.685243" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:45.685158" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.685140" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.686351" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:45.686269" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.686252" elapsed="0.000184"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:45.686764" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.686581" elapsed="0.000208"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:45.687151" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:45.686949" elapsed="0.000226"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:45.741745" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:45.687696" elapsed="0.054156"/>
</kw>
<msg time="2026-10-11T00:50:45.742005" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:45.742046" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:45.687332" elapsed="0.054749"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:45.780424" 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-10-11T00:50:45.742608" elapsed="0.037919"/>
</kw>
<msg time="2026-10-11T00:50:45.780691" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:45.780768" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:45.742249" elapsed="0.038557"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.781081" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.780876" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.780858" elapsed="0.000295"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.781582" 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-10-11T00:50:45.781330" elapsed="0.000331"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.781919" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.781723" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.781706" elapsed="0.000284"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:45.782020" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:45.784436" elapsed="0.000115"/>
</kw>
<msg time="2026-10-11T00:50:45.784607" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:45.783358" elapsed="0.001396"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.785052" elapsed="0.000072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.785377" 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-10-11T00:50:45.782781" elapsed="0.002805"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:50:45.782293" elapsed="0.003363"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:50:45.686013" elapsed="0.099717"/>
</kw>
<msg time="2026-10-11T00:50:45.785811" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:45.785850" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:45.685472" elapsed="0.100413"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:45.786037" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:50:45.785952" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.785935" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.786457" 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-10-11T00:50:45.786768" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.786832" 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-10-11T00:50:45.684868" elapsed="0.102048"/>
</kw>
<msg time="2026-10-11T00:50:45.786999" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:45.787038" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:45.682929" elapsed="0.104146"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.787357" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.787140" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.787124" elapsed="0.000327"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:45.682789" elapsed="0.104684"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:45.682649" elapsed="0.104851"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:45.680565" elapsed="0.106983"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:45.678539" elapsed="0.109058"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:45.678129" elapsed="0.109579"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:45.677086" elapsed="0.110670"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.788573" 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-10-11T00:50:45.787949" elapsed="0.000653"/>
</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-10-11T00:50:45.802299" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:45.801997" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:45.803005" 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-10-11T00:50:45.802827" elapsed="0.000239">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-10-11T00:50:45.803153" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:45.802495" elapsed="0.000683"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.803690" 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-10-11T00:50:45.803348" elapsed="0.000367"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:45.803987" 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-10-11T00:50:45.804109" 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-10-11T00:50:45.803878" elapsed="0.000256"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.804560" 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-10-11T00:50:45.804323" elapsed="0.000279"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.805510" 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-10-11T00:50:45.805259" elapsed="0.000294"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.805997" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.805750" elapsed="0.000271"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.806632" 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-10-11T00:50:45.806337" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:45.807309" 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-10-11T00:50:45.807130" elapsed="0.000204"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:45.807377" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:45.807519" 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-10-11T00:50:45.806824" elapsed="0.000718"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.807716" elapsed="0.000170"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.12</var>
<status status="PASS" start="2026-10-11T00:50:45.806210" elapsed="0.001712"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.808426" 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-10-11T00:50:45.808145" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:45.809110" 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-10-11T00:50:45.808935" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:45.809214" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:50:45.809341" 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-10-11T00:50:45.808631" elapsed="0.000732"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.809539" elapsed="0.000197"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:50:45.808020" elapsed="0.001754"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.810431" 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-10-11T00:50:45.809999" elapsed="0.000458"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:45.811125" 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-10-11T00:50:45.810949" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:45.811193" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:45.811317" 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-10-11T00:50:45.810640" elapsed="0.000699"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.811516" elapsed="0.000180"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:50:45.809873" elapsed="0.001861"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.812227" 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-10-11T00:50:45.811961" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:45.812930" 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-10-11T00:50:45.812754" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:45.812998" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:45.813120" 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-10-11T00:50:45.812433" elapsed="0.000710"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.813301" elapsed="0.000181"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:50:45.811833" elapsed="0.001686"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.814098" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:45.813830" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:45.814856" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.814678" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:45.814923" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:45.815045" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:45.814286" 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-10-11T00:50:45.815227" elapsed="0.000163"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:45.813701" elapsed="0.001743"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.815952" 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-10-11T00:50:45.815684" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:45.816651" 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-10-11T00:50:45.816460" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:45.816720" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:45.816844" 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-10-11T00:50:45.816141" elapsed="0.000725"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.817025" elapsed="0.000167"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:50:45.815544" elapsed="0.001685"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.817754" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:45.817471" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:45.818441" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.818251" elapsed="0.000216"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:45.818544" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T00:50:45.818689" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:45.817946" 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-10-11T00:50:45.818874" elapsed="0.000168"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:45.817329" elapsed="0.001750"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.819594" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:45.819307" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:45.820460" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.820109" elapsed="0.000376"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:45.820530" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:45.820685" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:45.819803" elapsed="0.000906"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.820870" elapsed="0.000166"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:45.819180" elapsed="0.001892"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:50:45.806064" elapsed="0.015040"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:50:45.821142" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:50:45.821274" 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-10-11T00:50:45.804925" elapsed="0.016373"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.804676" elapsed="0.016650"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.821509" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.821348" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.804658" elapsed="0.016922"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.822334" 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-10-11T00:50:45.821748" elapsed="0.000612"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:45.822404" 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/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-10-11T00:50:45.801481" elapsed="0.021041"/>
</kw>
<msg time="2026-10-11T00:50:45.822570" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:45.796975" elapsed="0.025650"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:45.826873" 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/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-10-11T00:50:45.831122" 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/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-10-11T00:50:45.835352" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.835578" 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-10-11T00:50:45.835773" 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-10-11T00:50:45.836109" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.835966" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:45.835953" 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-10-11T00:50:45.836332" 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-10-11T00:50:45.836525" 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-10-11T00:50:45.836700" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:45.835928" elapsed="0.000820"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.835839" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.836919" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:45.836985" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:50:45.837092" 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-10-11T00:50:45.796339" elapsed="0.040777"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.838130" 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-10-11T00:50:45.837907" elapsed="0.000265"/>
</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-10-11T00:50:45.851378" level="INFO">DELETE Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:50:45.851443" level="INFO">DELETE Response : url=http://10.30.170.173: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-10-11T00:50:45.851523" 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-10-11T00:50:45.838471" elapsed="0.013076"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.838231" elapsed="0.013351"/>
</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-10-11T00:50:45.851772" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.851606" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.838215" elapsed="0.013631"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.853028" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:45.852756" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.852507" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.852490" elapsed="0.000632"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.853700" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:45.853400" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.853170" elapsed="0.000601"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.853156" elapsed="0.000637"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.854298" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:45.853961" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.854605" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.854384" elapsed="0.000329"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.855164" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:45.854901" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.854739" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.854368" elapsed="0.000872"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.855778" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:45.855425" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.856068" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.855865" elapsed="0.000255"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.856574" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:45.856295" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:45.856141" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.855849" elapsed="0.000817"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:45.856807" elapsed="0.000441"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:50:45.857666" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:45.857424" elapsed="0.000267"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:50:45.857843" elapsed="0.000213"/>
</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-10-11T00:50:45.852161" elapsed="0.005952"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:50:45.858154" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:45.858328" 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-10-11T00:50:45.837347" elapsed="0.021005"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:45.858399" elapsed="0.000049"/>
</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-10-11T00:50:45.788831" elapsed="0.069692"/>
</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-10-11T00:50:45.859256" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:45.859173" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.859156" elapsed="0.000163"/>
</if>
<for flavor="IN RANGE">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.860039" 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.3/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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:45.859760" elapsed="0.000305"/>
</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-10-11T00:50:45.861851" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:45.861769" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.861751" elapsed="0.000161"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:45.863707" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:45.863463" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:45.863444" elapsed="0.000336"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:45.864077" level="INFO">index=7
host=10.30.170.173
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-10-11T00:50:45.864167" level="INFO">${current_ssh_connection} = index=7
host=10.30.170.173
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-10-11T00:50:45.863970" elapsed="0.000222"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.864688" 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.3/data/log/karaf.log" on remote system "10.30.170.173" 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-10-11T00:50:45.864376" elapsed="0.000355"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:45.865260" 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-10-11T00:50:45.864941" elapsed="0.000344"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:50:45.866127" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:50:45.866196" 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-10-11T00:50:45.865887" elapsed="0.000331"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:45.866366" elapsed="0.000317"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:50:45.867452" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:50:46.217374" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 00:50:44 UTC 2026

  System load:  0.29               Processes:             126
  Usage of /:   14.2% of 77.35GB   Users logged in:       1
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.173
  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.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:50:44 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:50:45.867209" elapsed="0.350290"/>
</kw>
<msg time="2026-10-11T00:50:46.217577" 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-10-11T00:50:45.866847" elapsed="0.350824"/>
</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-10-11T00:50:45.865499" elapsed="0.352281"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:50:46.218273" 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.3/data/log/karaf.log'.</msg>
<msg time="2026-10-11T00:50:46.231323" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:50:46.231489" level="INFO">${stdout} = 2026-10-11T00:50:45,975 | INFO  | bgp-worker-4     | StrictBGPPeerRegistry            | 218 - org.opendaylight.bgpcep.bgp-rib-impl - 1.0.3 | BGP Open message session parameters differ, session still a...</msg>
<msg time="2026-10-11T00:50:46.231549" 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-10-11T00:50:46.218062" elapsed="0.013517"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:50:46.231816" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.232760" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:46.232388" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.233042" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:46.232909" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.232882" elapsed="0.000247"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:50:46.233309" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-10-11T00:50:46.233195" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.233176" elapsed="0.000260"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.233480" elapsed="0.000019"/>
</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-10-11T00:50:46.235136" elapsed="0.000161"/>
</kw>
<msg time="2026-10-11T00:50:46.235352" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:46.234458" elapsed="0.000996"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.235723" elapsed="0.000029"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.235940" elapsed="0.000026"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:50:46.233893" elapsed="0.002148"/>
</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-10-11T00:50:45.863035" elapsed="0.373101"/>
</kw>
<msg time="2026-10-11T00:50:46.236214" 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-10-11T00:50:45.862510" elapsed="0.373764"/>
</kw>
<msg time="2026-10-11T00:50:46.236538" level="INFO">${output} = 2026-10-11T00:50:45,975 | INFO  | bgp-worker-4     | StrictBGPPeerRegistry            | 218 - org.opendaylight.bgpcep.bgp-rib-impl - 1.0.3 | BGP Open message session parameters differ, session still a...</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-10-11T00:50:45.862060" elapsed="0.374513"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T00:50:46.237137" level="INFO">@{log_lines} = [ 2026-10-11T00:50:45,975 | INFO  | bgp-worker-4     | StrictBGPPeerRegistry            | 218 - org.opendaylight.bgpcep.bgp-rib-impl - 1.0.3 | BGP Open message session parameters differ, session still...</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-10-11T00:50:46.236848" elapsed="0.000325"/>
</kw>
<return>
<value>${log_lines}</value>
<status status="PASS" start="2026-10-11T00:50:46.237230" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:50:46.237435" level="INFO">${output} = ['2026-10-11T00:50:45,975 | INFO  | bgp-worker-4     | StrictBGPPeerRegistry            | 218 - org.opendaylight.bgpcep.bgp-rib-impl - 1.0.3 | BGP Open message session parameters differ, session still...</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-10-11T00:50:45.861322" elapsed="0.376150"/>
</kw>
<kw name="Verify Exceptions" owner="excepts">
<msg time="2026-10-11T00:50:46.237972" level="INFO">${exlist} = []</msg>
<msg time="2026-10-11T00:50:46.238029" 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-10-11T00:50:46.237726" elapsed="0.000332"/>
</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-10-11T00:50:46.238294" elapsed="0.000372"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.239230" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:50:46.239326" 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-10-11T00:50:46.238891" elapsed="0.000466"/>
</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-10-11T00:50:46.239876" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:46.239466" elapsed="0.000487"/>
</branch>
<branch type="ELSE">
<kw name="Log List" owner="Collections">
<msg time="2026-10-11T00:50:46.240318" 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-10-11T00:50:46.240173" elapsed="0.000201"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:46.239985" elapsed="0.000450"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.239441" elapsed="0.001023"/>
</if>
<var name="${i}">1</var>
<status status="PASS" start="2026-10-11T00:50:45.859591" elapsed="0.380906"/>
</iter>
<var>${i}</var>
<value>1</value>
<value>${NUM_ODL_SYSTEM} + 1</value>
<status status="PASS" start="2026-10-11T00:50:45.859352" elapsed="0.381182"/>
</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-10-11T00:50:45.858852" elapsed="0.381752"/>
</kw>
<doc>Delete the injected IPV6 routes</doc>
<status status="PASS" start="2026-10-11T00:50:45.676644" elapsed="0.564110"/>
</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-10-11T00:50:46.242559" elapsed="0.000297"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:46.242194" elapsed="0.000731"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.244482" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:46.244326" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.244300" elapsed="0.000271"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.247503" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:46.247367" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.247343" elapsed="0.000246"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.248886" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:46.248387" elapsed="0.000534"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.249519" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:46.249130" elapsed="0.000422"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:46.249609" elapsed="0.000058"/>
</return>
<msg time="2026-10-11T00:50:46.249807" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:46.247890" elapsed="0.001949"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.253240" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:46.253155" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.253138" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.254379" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:46.254295" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.254278" elapsed="0.000187"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:46.254793" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.254609" elapsed="0.000209"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:46.255107" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:46.254976" elapsed="0.000155"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:46.288421" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:46.255635" elapsed="0.032889"/>
</kw>
<msg time="2026-10-11T00:50:46.288693" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:46.288734" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:46.255283" elapsed="0.033486"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:46.314587" 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-10-11T00:50:46.289268" elapsed="0.025427"/>
</kw>
<msg time="2026-10-11T00:50:46.314842" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:46.314883" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:46.288935" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.315191" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:46.314989" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.314970" elapsed="0.000292"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.315712" 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-10-11T00:50:46.315471" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.316028" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:46.315831" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.315814" elapsed="0.000285"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:46.316129" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:46.318699" elapsed="0.000116"/>
</kw>
<msg time="2026-10-11T00:50:46.318873" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:46.317608" 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-10-11T00:50:46.319303" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.319685" 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-10-11T00:50:46.316883" elapsed="0.002986"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:50:46.316393" elapsed="0.003533"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:50:46.254034" elapsed="0.065965"/>
</kw>
<msg time="2026-10-11T00:50:46.320079" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:46.320118" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:46.253465" elapsed="0.066691"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:46.320355" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:50:46.320268" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.320249" 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-10-11T00:50:46.320802" 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-10-11T00:50:46.321107" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.321175" 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-10-11T00:50:46.252871" elapsed="0.068390"/>
</kw>
<msg time="2026-10-11T00:50:46.321343" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:46.321383" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:46.250340" elapsed="0.071095"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.321737" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:46.321505" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.321488" elapsed="0.000320"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:46.250147" elapsed="0.071681"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:46.249952" elapsed="0.071902"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:46.246961" elapsed="0.074940"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:46.243706" elapsed="0.078244"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:46.243127" elapsed="0.078863"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:46.241717" elapsed="0.080318"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.322793" 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-10-11T00:50:46.322227" elapsed="0.000594"/>
</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-10-11T00:50:46.336495" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:46.336177" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:46.337183" 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-10-11T00:50:46.337006" elapsed="0.000240">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-10-11T00:50:46.337332" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:46.336692" elapsed="0.000662"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.337863" 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-10-11T00:50:46.337539" elapsed="0.000349"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:46.338158" 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-10-11T00:50:46.338276" 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-10-11T00:50:46.338050" elapsed="0.000250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.338779" 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-10-11T00:50:46.338539" 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-10-11T00:50:46.339730" 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-10-11T00:50:46.339482" elapsed="0.000291"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.340371" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.339945" elapsed="0.000450"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.341013" 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-10-11T00:50:46.340744" elapsed="0.000294"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:46.341745" 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-10-11T00:50:46.341533" elapsed="0.000237"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:46.341815" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:50:46.341941" 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-10-11T00:50:46.341209" elapsed="0.000755"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.342124" elapsed="0.000169"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.12</var>
<status status="PASS" start="2026-10-11T00:50:46.340602" elapsed="0.001728"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.342855" 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-10-11T00:50:46.342572" elapsed="0.000308"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:46.343543" 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-10-11T00:50:46.343350" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:46.343611" elapsed="0.000046"/>
</return>
<msg time="2026-10-11T00:50:46.343753" 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-10-11T00:50:46.343045" elapsed="0.000730"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.343936" elapsed="0.000163"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:50:46.342444" elapsed="0.001691"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.344654" 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-10-11T00:50:46.344359" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:46.345322" 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-10-11T00:50:46.345148" elapsed="0.000197"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:46.345388" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T00:50:46.345528" 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-10-11T00:50:46.344844" elapsed="0.000706"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.345727" elapsed="0.000165"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:50:46.344234" elapsed="0.001694"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.346429" 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-10-11T00:50:46.346150" elapsed="0.000305"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:46.347121" 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-10-11T00:50:46.346946" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:46.347189" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:46.347312" 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-10-11T00:50:46.346640" elapsed="0.000694"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.347511" elapsed="0.000177"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:50:46.346025" elapsed="0.001700"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.348217" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:46.347951" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:46.348960" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.348784" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:46.349029" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:46.349151" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:46.348463" elapsed="0.000714"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.349338" elapsed="0.000182"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:46.347824" elapsed="0.001733"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.351334" 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-10-11T00:50:46.349794" elapsed="0.001565"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:46.352042" 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-10-11T00:50:46.351865" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:46.352110" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T00:50:46.352238" 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-10-11T00:50:46.351545" elapsed="0.000716"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.352436" elapsed="0.000169"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:50:46.349667" elapsed="0.003003"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.353168" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:46.352900" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:46.353873" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.353694" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:46.353941" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:46.354063" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:46.353358" elapsed="0.000727"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.354244" elapsed="0.000180"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:46.352771" elapsed="0.001691"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.354975" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:46.354703" elapsed="0.000296"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:46.355678" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.355484" elapsed="0.000218"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:46.355746" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:46.355870" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:46.355165" elapsed="0.000728"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.356052" elapsed="0.000164"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:46.354562" elapsed="0.001690"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:50:46.340454" elapsed="0.015830"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:50:46.356321" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:50:46.356467" 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-10-11T00:50:46.339130" elapsed="0.017362"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:46.338882" elapsed="0.017639"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.356704" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:46.356543" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.338865" elapsed="0.017909"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.357546" 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-10-11T00:50:46.356929" elapsed="0.000644"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:46.357668" 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/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-10-11T00:50:46.335672" elapsed="0.022100"/>
</kw>
<msg time="2026-10-11T00:50:46.357820" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:46.331166" elapsed="0.026697"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:46.362072" 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/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-10-11T00:50:46.366473" 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/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-10-11T00:50:46.370709" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.370891" 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-10-11T00:50:46.371070" 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-10-11T00:50:46.371402" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:46.371261" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:46.371247" 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-10-11T00:50:46.371651" 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-10-11T00:50:46.371830" 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-10-11T00:50:46.371991" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:46.371223" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.371135" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.372207" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.372273" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:50:46.372384" 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-10-11T00:50:46.330530" elapsed="0.041894"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.373460" 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-10-11T00:50:46.373220" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:50:46.393078" level="INFO">DELETE Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:50:46.393123" level="INFO">DELETE Response : url=http://10.30.170.173: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-10-11T00:50:46.393213" 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-10-11T00:50:46.373837" elapsed="0.019400"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:46.373564" elapsed="0.019709"/>
</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-10-11T00:50:46.393469" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:46.393298" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.373547" elapsed="0.019999"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.394753" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:46.394462" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:46.394211" elapsed="0.000612"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.394194" elapsed="0.000652"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.395395" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:46.395129" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:46.394895" elapsed="0.000590"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.394881" elapsed="0.000626"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.396038" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:46.395694" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.396339" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:46.396127" elapsed="0.000264"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.396873" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:46.396594" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:46.396433" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.396110" elapsed="0.000840"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.397472" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:46.397120" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.397779" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:46.397559" elapsed="0.000272"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.398269" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:46.398008" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:46.397853" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.397543" elapsed="0.000802"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:46.398500" elapsed="0.000307"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:50:46.399188" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:46.398963" elapsed="0.000249"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.399362" elapsed="0.000228"/>
</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-10-11T00:50:46.393881" elapsed="0.005778"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:50:46.399733" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T00:50:46.399911" 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-10-11T00:50:46.372699" elapsed="0.027236"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:46.399983" elapsed="0.000024"/>
</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-10-11T00:50:46.323033" elapsed="0.077045"/>
</kw>
<doc>Deletes bgp application peer.</doc>
<status status="PASS" start="2026-10-11T00:50:46.241087" elapsed="0.159084"/>
</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-10-11T00:50:46.401544" elapsed="0.000217"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:46.401281" 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-10-11T00:50:46.402872" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:46.402785" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.402767" elapsed="0.000168"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.404938" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:46.404856" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.404839" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.405902" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:46.405567" elapsed="0.000359"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.406332" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:46.406075" elapsed="0.000280"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:46.406395" elapsed="0.000044"/>
</return>
<msg time="2026-10-11T00:50:46.406539" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:46.405200" elapsed="0.001362"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.409097" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:46.409013" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.408996" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.410221" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:46.410137" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.410120" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:46.410616" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.410447" elapsed="0.000207"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:46.410947" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:46.410814" elapsed="0.000156"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:46.443852" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:46.411466" elapsed="0.032486"/>
</kw>
<msg time="2026-10-11T00:50:46.444102" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:46.444143" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:46.411123" elapsed="0.033054"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:46.473710" 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-10-11T00:50:46.444720" elapsed="0.029090"/>
</kw>
<msg time="2026-10-11T00:50:46.473957" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:46.473997" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:46.444344" elapsed="0.029688"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.474339" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:46.474135" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.474116" elapsed="0.000320"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.474859" 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-10-11T00:50:46.474617" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.475182" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:46.474984" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.474967" elapsed="0.000290"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:46.475287" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:46.477835" elapsed="0.000114"/>
</kw>
<msg time="2026-10-11T00:50:46.478005" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:46.476793" elapsed="0.001341"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.478451" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.478798" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:50:46.476179" elapsed="0.002803"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:50:46.475576" elapsed="0.003464"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:50:46.409878" elapsed="0.069236"/>
</kw>
<msg time="2026-10-11T00:50:46.479200" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:46.479240" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:46.409306" elapsed="0.069970"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:46.479455" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:50:46.479343" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.479326" 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-10-11T00:50:46.479862" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.480162" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.480226" 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-10-11T00:50:46.408730" elapsed="0.071580"/>
</kw>
<msg time="2026-10-11T00:50:46.480393" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:46.480458" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:46.406905" elapsed="0.073589"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.480792" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:46.480561" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.480545" elapsed="0.000317"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:46.406765" elapsed="0.074119"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:46.406608" elapsed="0.074301"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:46.404552" elapsed="0.076404"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:46.402516" elapsed="0.078490"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:46.401957" elapsed="0.079088"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:46.400944" elapsed="0.080186"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.481945" 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-10-11T00:50:46.481330" elapsed="0.000643"/>
</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-10-11T00:50:46.495519" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:46.495203" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:46.496218" 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-10-11T00:50:46.496046" elapsed="0.000233">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-10-11T00:50:46.496362" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:46.495729" elapsed="0.000655"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.496891" 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-10-11T00:50:46.496570" elapsed="0.000346"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:46.497185" 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-10-11T00:50:46.497303" 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-10-11T00:50:46.497078" elapsed="0.000250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.497764" 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-10-11T00:50:46.497534" elapsed="0.000272"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.498892" 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-10-11T00:50:46.498462" elapsed="0.000474"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.499360" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.499111" elapsed="0.000273"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.500001" 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-10-11T00:50:46.499732" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:46.500710" 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-10-11T00:50:46.500516" elapsed="0.000219"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:46.500780" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:46.500906" 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-10-11T00:50:46.500192" elapsed="0.000737"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.501090" elapsed="0.000169"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:50:46.499590" elapsed="0.001706"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.501831" 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-10-11T00:50:46.501541" elapsed="0.000315"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:46.502530" 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-10-11T00:50:46.502330" elapsed="0.000225"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:46.502599" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:50:46.502738" 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-10-11T00:50:46.502023" elapsed="0.000738"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.502957" elapsed="0.000167"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:50:46.501396" elapsed="0.001764"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.503683" 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-10-11T00:50:46.503385" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:46.504356" 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-10-11T00:50:46.504180" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:46.504441" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:50:46.504567" 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-10-11T00:50:46.503872" elapsed="0.000718"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.504765" elapsed="0.000166"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:50:46.503258" elapsed="0.001711"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.505480" 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-10-11T00:50:46.505195" elapsed="0.000310"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:46.506163" 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-10-11T00:50:46.505987" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:46.506231" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:46.506354" 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-10-11T00:50:46.505683" elapsed="0.000693"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.506552" elapsed="0.000193"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:50:46.505068" elapsed="0.001716"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.507281" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:46.507010" elapsed="0.000295"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:46.507979" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.507804" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:46.508046" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:46.508169" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:46.507487" elapsed="0.000704"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.508350" elapsed="0.000179"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:46.506883" elapsed="0.001683"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.509237" 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-10-11T00:50:46.508804" elapsed="0.000457"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:46.509945" 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-10-11T00:50:46.509769" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:46.510014" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:46.510136" 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-10-11T00:50:46.509442" elapsed="0.000716"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.510319" elapsed="0.000182"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:50:46.508677" elapsed="0.001862"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.511050" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:46.510782" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:46.511747" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.511558" elapsed="0.000213"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:46.511815" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:46.511940" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:46.511240" elapsed="0.000723"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.512159" elapsed="0.000167"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:46.510652" elapsed="0.001712"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.512887" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:46.512606" elapsed="0.000305"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:46.513575" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.513383" elapsed="0.000216"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:46.513656" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:50:46.513781" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:46.513076" elapsed="0.000727"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.513963" elapsed="0.000163"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:46.512479" elapsed="0.001685"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:50:46.499444" elapsed="0.014752"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:50:46.514235" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:50:46.514366" 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-10-11T00:50:46.498108" elapsed="0.016282"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:46.497866" elapsed="0.016569"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.514605" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:46.514458" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.497849" elapsed="0.016839"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.515448" 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-10-11T00:50:46.514843" elapsed="0.000632"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:46.515519" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:46.494703" elapsed="0.020925"/>
</kw>
<msg time="2026-10-11T00:50:46.515677" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:46.490265" elapsed="0.025455"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:46.519922" 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/${file_name} 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-10-11T00:50:46.524263" 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/${file_name} 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-10-11T00:50:46.528475" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.528727" 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-10-11T00:50:46.528911" 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-10-11T00:50:46.529253" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:46.529104" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:46.529090" 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-10-11T00:50:46.529497" 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-10-11T00:50:46.529692" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.529854" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:46.529065" elapsed="0.000837"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.528977" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.530074" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.530141" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:50:46.530252" 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-10-11T00:50:46.489652" elapsed="0.040625"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.531278" 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-10-11T00:50:46.531053" elapsed="0.000268"/>
</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-10-11T00:50:46.542199" level="INFO">DELETE Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:50:46.542244" level="INFO">DELETE Response : url=http://10.30.170.173: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-10-11T00:50:46.542331" 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-10-11T00:50:46.531630" elapsed="0.010725"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:46.531381" elapsed="0.011011"/>
</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-10-11T00:50:46.542590" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:46.542440" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.531364" elapsed="0.011317"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.543874" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:46.543590" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:46.543330" elapsed="0.000614"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.543313" elapsed="0.000653"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.544527" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:46.544246" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:46.544014" elapsed="0.000585"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.544000" elapsed="0.000631"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.545142" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:46.544803" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.545495" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:46.545266" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.546009" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:46.545744" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:46.545571" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.545248" elapsed="0.000837"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.546607" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:46.546256" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.546919" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:46.546710" elapsed="0.000260"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.547423" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:46.547148" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:46.546992" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.546693" elapsed="0.000809"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:46.547656" elapsed="0.000290"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:50:46.548326" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:46.548103" elapsed="0.000248"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.548515" elapsed="0.000222"/>
</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-10-11T00:50:46.543000" elapsed="0.005793"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:50:46.548834" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:46.549007" 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-10-11T00:50:46.530523" elapsed="0.018508"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:46.549077" elapsed="0.000025"/>
</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-10-11T00:50:46.482190" elapsed="0.066982"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-10-11T00:50:46.400425" elapsed="0.148836"/>
</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-10-11T00:50:46.550663" elapsed="0.000352"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:46.550383" elapsed="0.000684"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.551990" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:46.551904" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.551887" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.554048" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:46.553966" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.553948" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.555016" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:46.554696" elapsed="0.000345"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.555468" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:46.555190" elapsed="0.000302"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:46.555532" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:46.555671" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:46.554314" elapsed="0.001379"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.558248" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:46.558163" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.558142" elapsed="0.000168"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.559345" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:46.559262" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.559245" elapsed="0.000184"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:46.559758" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.559578" elapsed="0.000204"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:46.560076" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:46.559944" elapsed="0.000155"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:46.593937" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:46.560596" elapsed="0.033439"/>
</kw>
<msg time="2026-10-11T00:50:46.594187" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:46.594228" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:46.560254" elapsed="0.034009"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:46.621662" 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-10-11T00:50:46.594799" elapsed="0.026966"/>
</kw>
<msg time="2026-10-11T00:50:46.621914" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:46.621955" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:46.594445" elapsed="0.027544"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.622264" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:46.622058" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.622040" elapsed="0.000295"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.622899" 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-10-11T00:50:46.622537" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.623224" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:46.623026" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.623009" elapsed="0.000286"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:46.623325" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:46.625770" elapsed="0.000115"/>
</kw>
<msg time="2026-10-11T00:50:46.625941" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:46.624703" elapsed="0.001365"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.626364" elapsed="0.000096"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.626734" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:50:46.624082" 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-10-11T00:50:46.623611" elapsed="0.003366"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:50:46.559006" elapsed="0.068044"/>
</kw>
<msg time="2026-10-11T00:50:46.627131" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:46.627171" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:46.558474" elapsed="0.068732"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:46.627394" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-10-11T00:50:46.627307" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.627288" 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-10-11T00:50:46.627825" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.628120" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.628184" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:50:46.557836" elapsed="0.070433"/>
</kw>
<msg time="2026-10-11T00:50:46.628352" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:46.628391" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:46.556015" elapsed="0.072437"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.628793" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:46.628521" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.628505" elapsed="0.000360"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:46.555875" elapsed="0.073012"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:46.555740" elapsed="0.073173"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:46.553675" elapsed="0.075286"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:46.551651" elapsed="0.077359"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:46.551214" elapsed="0.077835"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:46.550045" elapsed="0.079052"/>
</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-10-11T00:50:46.645638" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:46.645297" elapsed="0.000369"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:46.646323" 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-10-11T00:50:46.646138" elapsed="0.000247">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-10-11T00:50:46.646488" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:46.645823" elapsed="0.000687"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.647024" 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-10-11T00:50:46.646693" elapsed="0.000356"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:46.647321" 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-10-11T00:50:46.647463" 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-10-11T00:50:46.647212" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.647913" 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-10-11T00:50:46.647694" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.648853" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:46.648611" elapsed="0.000284"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.649349" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.649067" elapsed="0.000306"/>
</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-10-11T00:50:46.649692" 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-10-11T00:50:46.649875" elapsed="0.000022"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:50:46.650053" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:50:46.649548" elapsed="0.000557"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.649438" elapsed="0.000693"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:50:46.650168" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:46.650297" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:50:46.648257" elapsed="0.002064"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:46.648015" elapsed="0.002335"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.650533" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:46.650372" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.647997" elapsed="0.002606"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.651140" 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-10-11T00:50:46.650771" elapsed="0.000394"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:46.651208" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:46.644799" elapsed="0.006508"/>
</kw>
<msg time="2026-10-11T00:50:46.651354" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:46.640350" elapsed="0.011047"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:46.655784" 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/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-10-11T00:50:46.659984" 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/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-10-11T00:50:46.664191" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.664369" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.664563" 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-10-11T00:50:46.664911" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:46.664767" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:46.664754" 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-10-11T00:50:46.665172" 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-10-11T00:50:46.665350" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.665528" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:46.664729" elapsed="0.000848"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.664642" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.665759" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.665825" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:50:46.665930" 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-10-11T00:50:46.639755" elapsed="0.026199"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:46.667047" 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-10-11T00:50:46.666861" elapsed="0.000245">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-10-11T00:50:46.667188" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:46.666528" elapsed="0.000683"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.667507" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:46.667273" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.668016" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:46.667754" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:46.667582" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.667256" elapsed="0.000834"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.668597" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:46.668248" elapsed="0.000386"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:50:46.668679" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:46.668804" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:50:46.666215" elapsed="0.002612"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:46.669904" 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-10-11T00:50:46.669717" elapsed="0.000245">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-10-11T00:50:46.670046" 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-10-11T00:50:46.669364" elapsed="0.000704"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:50:46.670228" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:50:46.670130" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.670113" elapsed="0.000191"/>
</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-10-11T00:50:46.670477" 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-10-11T00:50:46.670663" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.670722" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:50:46.670845" 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-10-11T00:50:46.669071" elapsed="0.001797"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.672126" 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-10-11T00:50:46.671904" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.672588" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:46.672355" 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-10-11T00:50:46.682731" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:50:46.682861" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:50:46.682954" 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-10-11T00:50:46.672925" elapsed="0.010054"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:46.672700" elapsed="0.010318"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.683195" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:46.683042" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.672683" elapsed="0.010590"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.684537" 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-10-11T00:50:46.684190" elapsed="0.000391"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:46.683956" elapsed="0.000657"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.683939" elapsed="0.000752"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.685249" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:46.684981" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:46.684743" elapsed="0.000579"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.684727" elapsed="0.000617"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.685889" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:46.685531" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.686182" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:46.685977" elapsed="0.000257"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.686711" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:46.686427" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:46.686256" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.685960" elapsed="0.000828"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.687297" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:46.686959" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.687605" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:46.687383" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.688109" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:46.687852" elapsed="0.000281"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:46.687694" elapsed="0.000471"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.687367" elapsed="0.000817"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:46.688324" elapsed="0.000321"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:50:46.689020" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:46.688802" elapsed="0.000242"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.689194" elapsed="0.000208"/>
</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-10-11T00:50:46.683605" elapsed="0.005870"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.689672" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:46.689572" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.689554" elapsed="0.000178"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:50:46.690363" 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-10-11T00:50:46.689872" elapsed="0.000518"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:50:46.690453" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:46.690580" 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-10-11T00:50:46.671178" elapsed="0.019426"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:46.690673" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:50:46.690793" 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-10-11T00:50:46.632077" elapsed="0.058740"/>
</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-10-11T00:50:46.702488" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:46.702168" elapsed="0.000348"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:46.703220" 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-10-11T00:50:46.703001" elapsed="0.000335">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-10-11T00:50:46.703524" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:46.702684" elapsed="0.000864"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.704046" 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-10-11T00:50:46.703735" elapsed="0.000336"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:46.704344" 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-10-11T00:50:46.704481" 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-10-11T00:50:46.704235" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.704933" 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-10-11T00:50:46.704712" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:50:46.705327" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:46.705036" elapsed="0.000345"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.706031" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:46.705574" elapsed="0.000481"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:46.705426" elapsed="0.000662"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.705018" elapsed="0.001090"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.706698" 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-10-11T00:50:46.706272" elapsed="0.000480"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:46.706799" 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-10-11T00:50:46.701665" elapsed="0.005237"/>
</kw>
<msg time="2026-10-11T00:50:46.706950" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:46.697133" elapsed="0.009860"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:46.711233" 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/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-10-11T00:50:46.715461" 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/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-10-11T00:50:46.719829" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.720011" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.720191" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.720540" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:46.720383" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:46.720369" 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-10-11T00:50:46.720781" 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-10-11T00:50:46.720958" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.721119" elapsed="0.000017"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:46.720344" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.720256" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.721336" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.721400" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T00:50:46.721523" 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-10-11T00:50:46.696418" elapsed="0.025129"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:46.721770" elapsed="0.000315"/>
</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-10-11T00:50:46.722990" 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-10-11T00:50:46.722740" elapsed="0.000277"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:50:46.723401" 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-10-11T00:50:46.723161" elapsed="0.000283"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:50:46.723638" elapsed="0.000281"/>
</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-10-11T00:50:46.722353" elapsed="0.001621"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:46.722154" elapsed="0.001850"/>
</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-10-11T00:50:46.724199" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:46.724026" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.722138" elapsed="0.002129"/>
</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-10-11T00:50:46.691771" elapsed="0.032538"/>
</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-10-11T00:50:46.691089" elapsed="0.033284"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:46.690889" elapsed="0.033538"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.690873" elapsed="0.033577"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:46.724479" elapsed="0.000026"/>
</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-10-11T00:50:46.631480" elapsed="0.093098"/>
</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-10-11T00:50:46.629607" elapsed="0.095036"/>
</kw>
<doc>Verifies that example-ipv6-topology is empty</doc>
<status status="PASS" start="2026-10-11T00:50:46.629215" elapsed="0.095485"/>
</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-10-11T00:50:46.549513" elapsed="0.175270"/>
</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-10-11T00:50:46.726104" elapsed="0.000198"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:46.725863" elapsed="0.000487"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.727239" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:46.727153" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.727136" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.729467" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:46.729369" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.729351" elapsed="0.000178"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.730435" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:46.730098" elapsed="0.000364"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.730891" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:46.730612" elapsed="0.000303"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:46.730955" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:46.731082" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:46.729744" elapsed="0.001360"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.733679" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:46.733574" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.733556" elapsed="0.000185"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.734796" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:46.734713" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.734696" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:46.735167" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.735000" elapsed="0.000191"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:46.735502" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:46.735350" elapsed="0.000176"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:46.768367" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:46.736045" elapsed="0.032437"/>
</kw>
<msg time="2026-10-11T00:50:46.768647" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:46.768690" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:46.735721" elapsed="0.033004"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:46.792685" 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-10-11T00:50:46.769222" elapsed="0.023558"/>
</kw>
<msg time="2026-10-11T00:50:46.792927" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:46.792968" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:46.768890" elapsed="0.024113"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.793273" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:46.793071" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.793052" elapsed="0.000291"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.793801" 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-10-11T00:50:46.793560" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.794117" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:46.793920" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.793903" elapsed="0.000285"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:46.794218" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:46.796648" elapsed="0.000237"/>
</kw>
<msg time="2026-10-11T00:50:46.796943" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:46.795594" 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-10-11T00:50:46.797372" elapsed="0.000096"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.797738" elapsed="0.000070"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:50:46.794992" elapsed="0.002929"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:50:46.794503" elapsed="0.003477"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:50:46.734431" elapsed="0.063622"/>
</kw>
<msg time="2026-10-11T00:50:46.798135" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:46.798175" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:46.733891" elapsed="0.064319"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:46.798395" elapsed="0.000055"/>
</return>
<status status="PASS" start="2026-10-11T00:50:46.798279" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.798261" 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-10-11T00:50:46.798837" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.799140" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.799204" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:50:46.733237" elapsed="0.066051"/>
</kw>
<msg time="2026-10-11T00:50:46.799372" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:46.799435" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:46.731444" elapsed="0.068028"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:46.799781" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:46.799540" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.799523" elapsed="0.000329"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:46.731290" elapsed="0.068584"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:46.731152" elapsed="0.068748"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:46.729069" elapsed="0.070879"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:46.726907" elapsed="0.073090"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:46.726511" elapsed="0.073525"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:46.725514" elapsed="0.074568"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:50:46.803489" level="INFO">Executing command 'cat exaipv4.log'.</msg>
<msg time="2026-10-11T00:50:46.816607" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:50:46.816706" level="INFO">${output_log} = 00:50:40 | 3620   | welcome         | Thank you for using ExaBGP
00:50:40 | 3620   | version         | 4.2.4
00:50:40 | 3620   | interpreter     | 3.10.12 (main, Aug 31 2026, 10:18:17) [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-10-11T00:50:46.803362" elapsed="0.013368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.817151" level="INFO">00:50:40 | 3620   | welcome         | Thank you for using ExaBGP
00:50:40 | 3620   | version         | 4.2.4
00:50:40 | 3620   | interpreter     | 3.10.12 (main, Aug 31 2026, 10:18:17) [GCC 11.4.0]
00:50:40 | 3620   | os              | Linux releng-26932-423-0-builder-0 5.15.0-194-generic #204-Ubuntu SMP Wed Sep 2 13:09:23 UTC 2026 x86_64
00:50:40 | 3620   | installation    | /tmp/defaultvenv
00:50:40 | 3620   | advice          | environment file missing
00:50:40 | 3620   | advice          | generate it using "exabgp --fi &gt; /tmp/defaultvenv/etc/exabgp/exabgp.env"
00:50:40 | 3620   | cli             | could not find the named pipes (exabgp.in and exabgp.out) required for the cli
00:50:40 | 3620   | cli             | we scanned the following folders (the number is your PID):
00:50:40 | 3620   | cli control     |  - /run/exabgp/
00:50:40 | 3620   | cli control     |  - /run/1001/
00:50:40 | 3620   | cli control     |  - /run/
00:50:40 | 3620   | cli control     |  - /var/run/exabgp/
00:50:40 | 3620   | cli control     |  - /var/run/1001/
00:50:40 | 3620   | cli control     |  - /var/run/
00:50:40 | 3620   | cli control     |  - /tmp/defaultvenv/run/exabgp/
00:50:40 | 3620   | cli control     |  - /tmp/defaultvenv/run/1001/
00:50:40 | 3620   | cli control     |  - /tmp/defaultvenv/run/
00:50:40 | 3620   | cli control     |  - /tmp/defaultvenv/var/run/exabgp/
00:50:40 | 3620   | cli control     |  - /tmp/defaultvenv/var/run/1001/
00:50:40 | 3620   | cli control     |  - /tmp/defaultvenv/var/run/
00:50:40 | 3620   | cli control     | please make them in one of the folder with the following commands:
00:50:40 | 3620   | cli control     | &gt; mkfifo /home/jenkins/run/exabgp.{in,out}
00:50:40 | 3620   | cli control     | &gt; chmod 600 /home/jenkins/run/exabgp.{in,out}
00:50:40 | 3620   | cli control     | &gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}
00:50:40 | 3620   | configuration   | performing reload of exabgp 4.2.4
00:50:40 | 3620   | configuration   | &gt; neighbor         | '10.30.170.173'
00:50:40 | 3620   | configuration   | . router-id        | '127.0.0.1'
00:50:40 | 3620   | configuration   | . local-address    | '127.0.0.1'
00:50:40 | 3620   | configuration   | . local-as         | '64496'
00:50:40 | 3620   | configuration   | . peer-as          | '64496'
00:50:40 | 3620   | configuration   | &gt; family           | 
00:50:40 | 3620   | configuration   | . ipv4             | 'unicast'
00:50:40 | 3620   | configuration   | &lt; family           | 
00:50:40 | 3620   | configuration   | &lt; neighbor         | 
00:50:40 | 3620   | reactor         | new peer: neighbor 10.30.170.173 local-ip 127.0.0.1 local-as 64496 peer-as 64496 router-id 127.0.0.1 family-allowed in-open
00:50:40 | 3620   | reactor         | loaded new configuration successfully
00:50:40 | 3620   | reactor         | initialising connection to peer-1
00:50:40 | 3620   | outgoing-1      | attempting connection to 10.30.170.173:1790
00:50:40 | 3620   | 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:50:40 | 3620   | 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:50:40 | 3620   | ka-outgoing-1   | receive-timer 60 second(s) left
00:50:40 | 3620   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0035 01
00:50:40 | 3620   | outgoing-1      | received TCP payload (  34) 04FB F000 B4C0 0002 0218 0216 4104 0000 FBF0 0600 0200 0104 0001 0001 4002 00B4 4700
00:50:40 | 3620   | outgoing-1      | &lt;&lt; message of type OPEN
00:50:40 | 3620   | 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:50:40 | 3620   | outgoing-1      | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:50:40 | 3620   | outgoing-1      | &gt;&gt; KEEPALIVE (OPENCONFIRM)
00:50:40 | 3620   | ka-outgoing-1   | receive-timer 180 second(s) left
00:50:40 | 3620   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:50:40 | 3620   | outgoing-1      | &lt;&lt; message of type KEEPALIVE
00:50:40 | 3620   | reactor         | connected to peer-1 with outgoing-1 127.0.0.1-10.30.170.173
00:50:40 | 3620   | outgoing-1      | sending TCP payload (  23) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 0200 0000 00
00:50:40 | 3620   | outgoing-1      | &gt;&gt; EOR ipv4 unicast
00:50:40 | 3620   | peer-1          | &gt;&gt; EOR(s)
00:50:40 | 3620   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02
00:50:40 | 3620   | outgoing-1      | received TCP payload (   4) 0000 0000
00:50:40 | 3620   | outgoing-1      | &lt;&lt; message of type UPDATE
00:50:40 | 3620   | parser          | parsing UPDATE (   4) 0000 0000
00:50:40 | 3620   | peer-1          | &lt;&lt; UPDATE #1
00:50:40 | 3620   | peer-1          |    UPDATE #1 nlri  (   4) eor 1/1 (ipv4 unicast)
00:50:40 | 3620   | ka-outgoing-1   | receive-timer 179 second(s) left
00:50:40 | 3620   | ka-outgoing-1   | send-timer 59 second(s) left
00:50:41 | 3620   | ka-outgoing-1   | receive-timer 178 second(s) left
00:50:41 | 3620   | ka-outgoing-1   | send-timer 58 second(s) left
00:50:42 | 3620   | ka-outgoing-1   | receive-timer 177 second(s) left
00:50:42 | 3620   | ka-outgoing-1   | send-timer 57 second(s) left
00:50:43 | 3620   | ka-outgoing-1   | receive-timer 176 second(s) left
00:50:43 | 3620   | ka-outgoing-1   | send-timer 56 second(s) left
00:50:44 | 3620   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0015 03
00:50:44 | 3620   | outgoing-1      | received TCP payload (   2) 0600
00:50:44 | 3620   | outgoing-1      | &lt;&lt; message of type NOTIFICATION
00:50:44 | 3620   | outgoing-1      | peer reset, message [notification received (6,0)] error[Cease / Unspecific]
00:50:44 | 3620   | outgoing-1      | outgoing-1 127.0.0.1-10.30.170.173, closing connection
00:50:44 | 3620   | reactor         | initialising connection to peer-1
00:50:44 | 3620   | outgoing-2      | attempting connection to 10.30.170.173:1790
00:50:44 | 3620   | 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:50:44 | 3620   | 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:50:44 | 3620   | ka-outgoing-2   | receive-timer 60 second(s) left
00:50:44 | 3620   | outgoing-2      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0015 03
00:50:44 | 3620   | outgoing-2      | received TCP payload (   2) 0605
00:50:44 | 3620   | outgoing-2      | &lt;&lt; message of type NOTIFICATION
00:50:44 | 3620   | outgoing-2      | peer reset, message [notification received (6,5)] error[Cease / Connection Rejected]
00:50:44 | 3620   | outgoing-2      | outgoing-2 127.0.0.1-10.30.170.173, closing connection
00:50:45 | 3620   | reactor         | initialising connection to peer-1
00:50:45 | 3620   | outgoing-3      | attempting connection to 10.30.170.173:1790
00:50:45 | 3620   | 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:50:45 | 3620   | 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:50:45 | 3620   | ka-outgoing-3   | receive-timer 60 second(s) left
00:50:45 | 3620   | outgoing-3      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 003B 01
00:50:45 | 3620   | 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:50:45 | 3620   | outgoing-3      | &lt;&lt; message of type OPEN
00:50:45 | 3620   | 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:50:45 | 3620   | outgoing-3      | --------------------------------------------------------------------
00:50:45 | 3620   | outgoing-3      | the connection can not carry the following family/families
00:50:45 | 3620   | outgoing-3      |  - exabgp is not configured for ipv6/unicast
00:50:45 | 3620   | outgoing-3      | therefore no routes of this kind can be announced on the connection
00:50:45 | 3620   | outgoing-3      | --------------------------------------------------------------------
00:50:45 | 3620   | outgoing-3      | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:50:45 | 3620   | outgoing-3      | &gt;&gt; KEEPALIVE (OPENCONFIRM)
00:50:45 | 3620   | ka-outgoing-3   | receive-timer 180 second(s) left
00:50:45 | 3620   | outgoing-3      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:50:45 | 3620   | outgoing-3      | &lt;&lt; message of type KEEPALIVE
00:50:45 | 3620   | reactor         | connected to peer-1 with outgoing-3 127.0.0.1-10.30.170.173
00:50:45 | 3620   | outgoing-3      | sending TCP payload (  23) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 0200 0000 00
00:50:45 | 3620   | outgoing-3      | &gt;&gt; EOR ipv4 unicast
00:50:45 | 3620   | peer-1          | &gt;&gt; EOR(s)
00:50:45 | 3620   | outgoing-3      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02
00:50:45 | 3620   | outgoing-3      | received TCP payload (   4) 0000 0000
00:50:45 | 3620   | outgoing-3      | &lt;&lt; message of type UPDATE
00:50:45 | 3620   | parser          | parsing UPDATE (   4) 0000 0000
00:50:45 | 3620   | ka-outgoing-3   | receive-timer 180 second(s) left
00:50:45 | 3620   | ka-outgoing-3   | send-timer 59 second(s) left
00:50:45 | 3620   | peer-1          | &lt;&lt; UPDATE #1
00:50:45 | 3620   | peer-1          |    UPDATE #1 nlri  (   4) eor 1/1 (ipv4 unicast)
00:50:46 | 3620   | outgoing-3      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0015 03
00:50:46 | 3620   | outgoing-3      | received TCP payload (   2) 0600
00:50:46 | 3620   | outgoing-3      | &lt;&lt; message of type NOTIFICATION
00:50:46 | 3620   | outgoing-3      | peer reset, message [notification received (6,0)] error[Cease / Unspecific]
00:50:46 | 3620   | outgoing-3      | outgoing-3 127.0.0.1-10.30.170.173, closing connection</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:46.816924" elapsed="0.000394"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:46.817811" 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-10-11T00:50:46.817518" elapsed="0.000345"/>
</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-10-11T00:50:46.802992" elapsed="0.014925"/>
</kw>
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-10-11T00:50:46.818510" level="INFO">[?2004l</msg>
<msg time="2026-10-11T00:50:46.818579" level="INFO">${output} = [?2004l</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-10-11T00:50:46.818395" elapsed="0.000206"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.819021" level="INFO">[?2004l</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:46.818802" elapsed="0.000259"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.819855" 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-10-11T00:50:46.819535" 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-10-11T00:50:46.820027" elapsed="0.000167"/>
</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-10-11T00:50:46.819245" elapsed="0.001000"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:50:46.981304" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<msg time="2026-10-11T00:50:46.981397" level="INFO">${output} = ^C[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T00:50:46.820400" elapsed="0.161039"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.981879" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:46.981652" elapsed="0.000269"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:46.984036" 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-10-11T00:50:46.982504" elapsed="0.001584"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:50:46.985048" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<msg time="2026-10-11T00:50:46.985128" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-423-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-10-11T00:50:46.984281" elapsed="0.000871"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.985725" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:46.985488" elapsed="0.000280"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:46.985214" elapsed="0.000584"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.985196" elapsed="0.000625"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-10-11T00:50:46.982143" elapsed="0.003718"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-10-11T00:50:46.818124" elapsed="0.167782"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:46.986170" 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-10-11T00:50:46.986304" level="INFO">${Log_Content} = 00:50:40 | 3620   | welcome         | Thank you for using ExaBGP
00:50:40 | 3620   | version         | 4.2.4
00:50:40 | 3620   | interpreter     | 3.10.12 (main, Aug 31 2026, 10:18:17) [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-10-11T00:50:46.986056" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.986786" level="INFO">00:50:40 | 3620   | welcome         | Thank you for using ExaBGP
00:50:40 | 3620   | version         | 4.2.4
00:50:40 | 3620   | interpreter     | 3.10.12 (main, Aug 31 2026, 10:18:17) [GCC 11.4.0]
00:50:40 | 3620   | os              | Linux releng-26932-423-0-builder-0 5.15.0-194-generic #204-Ubuntu SMP Wed Sep 2 13:09:23 UTC 2026 x86_64
00:50:40 | 3620   | installation    | /tmp/defaultvenv
00:50:40 | 3620   | advice          | environment file missing
00:50:40 | 3620   | advice          | generate it using "exabgp --fi &gt; /tmp/defaultvenv/etc/exabgp/exabgp.env"
00:50:40 | 3620   | cli             | could not find the named pipes (exabgp.in and exabgp.out) required for the cli
00:50:40 | 3620   | cli             | we scanned the following folders (the number is your PID):
00:50:40 | 3620   | cli control     |  - /run/exabgp/
00:50:40 | 3620   | cli control     |  - /run/1001/
00:50:40 | 3620   | cli control     |  - /run/
00:50:40 | 3620   | cli control     |  - /var/run/exabgp/
00:50:40 | 3620   | cli control     |  - /var/run/1001/
00:50:40 | 3620   | cli control     |  - /var/run/
00:50:40 | 3620   | cli control     |  - /tmp/defaultvenv/run/exabgp/
00:50:40 | 3620   | cli control     |  - /tmp/defaultvenv/run/1001/
00:50:40 | 3620   | cli control     |  - /tmp/defaultvenv/run/
00:50:40 | 3620   | cli control     |  - /tmp/defaultvenv/var/run/exabgp/
00:50:40 | 3620   | cli control     |  - /tmp/defaultvenv/var/run/1001/
00:50:40 | 3620   | cli control     |  - /tmp/defaultvenv/var/run/
00:50:40 | 3620   | cli control     | please make them in one of the folder with the following commands:
00:50:40 | 3620   | cli control     | &gt; mkfifo /home/jenkins/run/exabgp.{in,out}
00:50:40 | 3620   | cli control     | &gt; chmod 600 /home/jenkins/run/exabgp.{in,out}
00:50:40 | 3620   | cli control     | &gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}
00:50:40 | 3620   | configuration   | performing reload of exabgp 4.2.4
00:50:40 | 3620   | configuration   | &gt; neighbor         | '10.30.170.173'
00:50:40 | 3620   | configuration   | . router-id        | '127.0.0.1'
00:50:40 | 3620   | configuration   | . local-address    | '127.0.0.1'
00:50:40 | 3620   | configuration   | . local-as         | '64496'
00:50:40 | 3620   | configuration   | . peer-as          | '64496'
00:50:40 | 3620   | configuration   | &gt; family           | 
00:50:40 | 3620   | configuration   | . ipv4             | 'unicast'
00:50:40 | 3620   | configuration   | &lt; family           | 
00:50:40 | 3620   | configuration   | &lt; neighbor         | 
00:50:40 | 3620   | reactor         | new peer: neighbor 10.30.170.173 local-ip 127.0.0.1 local-as 64496 peer-as 64496 router-id 127.0.0.1 family-allowed in-open
00:50:40 | 3620   | reactor         | loaded new configuration successfully
00:50:40 | 3620   | reactor         | initialising connection to peer-1
00:50:40 | 3620   | outgoing-1      | attempting connection to 10.30.170.173:1790
00:50:40 | 3620   | 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:50:40 | 3620   | 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:50:40 | 3620   | ka-outgoing-1   | receive-timer 60 second(s) left
00:50:40 | 3620   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0035 01
00:50:40 | 3620   | outgoing-1      | received TCP payload (  34) 04FB F000 B4C0 0002 0218 0216 4104 0000 FBF0 0600 0200 0104 0001 0001 4002 00B4 4700
00:50:40 | 3620   | outgoing-1      | &lt;&lt; message of type OPEN
00:50:40 | 3620   | 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:50:40 | 3620   | outgoing-1      | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:50:40 | 3620   | outgoing-1      | &gt;&gt; KEEPALIVE (OPENCONFIRM)
00:50:40 | 3620   | ka-outgoing-1   | receive-timer 180 second(s) left
00:50:40 | 3620   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:50:40 | 3620   | outgoing-1      | &lt;&lt; message of type KEEPALIVE
00:50:40 | 3620   | reactor         | connected to peer-1 with outgoing-1 127.0.0.1-10.30.170.173
00:50:40 | 3620   | outgoing-1      | sending TCP payload (  23) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 0200 0000 00
00:50:40 | 3620   | outgoing-1      | &gt;&gt; EOR ipv4 unicast
00:50:40 | 3620   | peer-1          | &gt;&gt; EOR(s)
00:50:40 | 3620   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02
00:50:40 | 3620   | outgoing-1      | received TCP payload (   4) 0000 0000
00:50:40 | 3620   | outgoing-1      | &lt;&lt; message of type UPDATE
00:50:40 | 3620   | parser          | parsing UPDATE (   4) 0000 0000
00:50:40 | 3620   | peer-1          | &lt;&lt; UPDATE #1
00:50:40 | 3620   | peer-1          |    UPDATE #1 nlri  (   4) eor 1/1 (ipv4 unicast)
00:50:40 | 3620   | ka-outgoing-1   | receive-timer 179 second(s) left
00:50:40 | 3620   | ka-outgoing-1   | send-timer 59 second(s) left
00:50:41 | 3620   | ka-outgoing-1   | receive-timer 178 second(s) left
00:50:41 | 3620   | ka-outgoing-1   | send-timer 58 second(s) left
00:50:42 | 3620   | ka-outgoing-1   | receive-timer 177 second(s) left
00:50:42 | 3620   | ka-outgoing-1   | send-timer 57 second(s) left
00:50:43 | 3620   | ka-outgoing-1   | receive-timer 176 second(s) left
00:50:43 | 3620   | ka-outgoing-1   | send-timer 56 second(s) left
00:50:44 | 3620   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0015 03
00:50:44 | 3620   | outgoing-1      | received TCP payload (   2) 0600
00:50:44 | 3620   | outgoing-1      | &lt;&lt; message of type NOTIFICATION
00:50:44 | 3620   | outgoing-1      | peer reset, message [notification received (6,0)] error[Cease / Unspecific]
00:50:44 | 3620   | outgoing-1      | outgoing-1 127.0.0.1-10.30.170.173, closing connection
00:50:44 | 3620   | reactor         | initialising connection to peer-1
00:50:44 | 3620   | outgoing-2      | attempting connection to 10.30.170.173:1790
00:50:44 | 3620   | 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:50:44 | 3620   | 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:50:44 | 3620   | ka-outgoing-2   | receive-timer 60 second(s) left
00:50:44 | 3620   | outgoing-2      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0015 03
00:50:44 | 3620   | outgoing-2      | received TCP payload (   2) 0605
00:50:44 | 3620   | outgoing-2      | &lt;&lt; message of type NOTIFICATION
00:50:44 | 3620   | outgoing-2      | peer reset, message [notification received (6,5)] error[Cease / Connection Rejected]
00:50:44 | 3620   | outgoing-2      | outgoing-2 127.0.0.1-10.30.170.173, closing connection
00:50:45 | 3620   | reactor         | initialising connection to peer-1
00:50:45 | 3620   | outgoing-3      | attempting connection to 10.30.170.173:1790
00:50:45 | 3620   | 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:50:45 | 3620   | 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:50:45 | 3620   | ka-outgoing-3   | receive-timer 60 second(s) left
00:50:45 | 3620   | outgoing-3      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 003B 01
00:50:45 | 3620   | 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:50:45 | 3620   | outgoing-3      | &lt;&lt; message of type OPEN
00:50:45 | 3620   | 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:50:45 | 3620   | outgoing-3      | --------------------------------------------------------------------
00:50:45 | 3620   | outgoing-3      | the connection can not carry the following family/families
00:50:45 | 3620   | outgoing-3      |  - exabgp is not configured for ipv6/unicast
00:50:45 | 3620   | outgoing-3      | therefore no routes of this kind can be announced on the connection
00:50:45 | 3620   | outgoing-3      | --------------------------------------------------------------------
00:50:45 | 3620   | outgoing-3      | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:50:45 | 3620   | outgoing-3      | &gt;&gt; KEEPALIVE (OPENCONFIRM)
00:50:45 | 3620   | ka-outgoing-3   | receive-timer 180 second(s) left
00:50:45 | 3620   | outgoing-3      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:50:45 | 3620   | outgoing-3      | &lt;&lt; message of type KEEPALIVE
00:50:45 | 3620   | reactor         | connected to peer-1 with outgoing-3 127.0.0.1-10.30.170.173
00:50:45 | 3620   | outgoing-3      | sending TCP payload (  23) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 0200 0000 00
00:50:45 | 3620   | outgoing-3      | &gt;&gt; EOR ipv4 unicast
00:50:45 | 3620   | peer-1          | &gt;&gt; EOR(s)
00:50:45 | 3620   | outgoing-3      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02
00:50:45 | 3620   | outgoing-3      | received TCP payload (   4) 0000 0000
00:50:45 | 3620   | outgoing-3      | &lt;&lt; message of type UPDATE
00:50:45 | 3620   | parser          | parsing UPDATE (   4) 0000 0000
00:50:45 | 3620   | ka-outgoing-3   | receive-timer 180 second(s) left
00:50:45 | 3620   | ka-outgoing-3   | send-timer 59 second(s) left
00:50:45 | 3620   | peer-1          | &lt;&lt; UPDATE #1
00:50:45 | 3620   | peer-1          |    UPDATE #1 nlri  (   4) eor 1/1 (ipv4 unicast)
00:50:46 | 3620   | outgoing-3      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0015 03
00:50:46 | 3620   | outgoing-3      | received TCP payload (   2) 0600
00:50:46 | 3620   | outgoing-3      | &lt;&lt; message of type NOTIFICATION
00:50:46 | 3620   | outgoing-3      | peer reset, message [notification received (6,0)] error[Cease / Unspecific]
00:50:46 | 3620   | outgoing-3      | outgoing-3 127.0.0.1-10.30.170.173, closing connection</msg>
<arg>${Log_Content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:46.986551" elapsed="0.000407"/>
</kw>
<doc>Save exabgp logs as exaipv6.log, and stop exabgp with ctrl-c bash signal</doc>
<status status="PASS" start="2026-10-11T00:50:46.725034" elapsed="0.262015"/>
</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-10-11T00:50:46.988435" elapsed="0.000215"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:46.988176" 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-10-11T00:50:46.989838" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:46.989752" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.989734" elapsed="0.000168"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.991902" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:46.991820" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.991803" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.992871" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:46.992531" elapsed="0.000365"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:46.993308" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:46.993045" elapsed="0.000287"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:46.993371" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:46.993516" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:46.992164" elapsed="0.001375"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.996061" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:46.995977" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.995959" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:46.997236" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:46.997151" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:46.997134" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:46.997649" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:46.997467" elapsed="0.000207"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:46.997966" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:46.997833" elapsed="0.000156"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:47.030903" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:46.998482" elapsed="0.032520"/>
</kw>
<msg time="2026-10-11T00:50:47.031151" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:47.031193" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:46.998143" elapsed="0.033085"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:47.063056" 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-10-11T00:50:47.031762" elapsed="0.031398"/>
</kw>
<msg time="2026-10-11T00:50:47.063313" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:47.063354" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:47.031393" elapsed="0.031996"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:47.063703" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:47.063482" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:47.063463" elapsed="0.000314"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.064182" 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-10-11T00:50:47.063957" elapsed="0.000327"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:47.064565" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:47.064345" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:47.064328" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:47.064681" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:47.067136" elapsed="0.000113"/>
</kw>
<msg time="2026-10-11T00:50:47.067304" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:47.066148" elapsed="0.001300"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:47.067767" elapsed="0.000072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:47.068093" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:50:47.065565" elapsed="0.002710"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:50:47.064950" elapsed="0.003385"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:50:46.996835" elapsed="0.071633"/>
</kw>
<msg time="2026-10-11T00:50:47.068562" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:47.068601" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:46.996272" elapsed="0.072381"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:47.068809" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:50:47.068723" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:47.068705" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:47.069200" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:47.069557" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:47.069621" 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-10-11T00:50:46.995691" elapsed="0.074030"/>
</kw>
<msg time="2026-10-11T00:50:47.069805" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:47.069845" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:46.993875" elapsed="0.076004"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:47.070163" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:47.069946" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:47.069930" elapsed="0.000303"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:46.993736" elapsed="0.076518"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:46.993584" elapsed="0.076696"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:46.991517" elapsed="0.078811"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:46.989476" elapsed="0.080899"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:46.988847" elapsed="0.081649"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:46.987835" elapsed="0.082712"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.071307" 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-10-11T00:50:47.070752" elapsed="0.000582"/>
</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-10-11T00:50:47.082340" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:47.082030" elapsed="0.000337"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:47.083060" 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-10-11T00:50:47.082877" elapsed="0.000244">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-10-11T00:50:47.083205" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:47.082540" elapsed="0.000687"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.083755" 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-10-11T00:50:47.083398" elapsed="0.000383"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:47.084055" 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-10-11T00:50:47.084178" 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-10-11T00:50:47.083946" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.084642" 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-10-11T00:50:47.084394" 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-10-11T00:50:47.085589" 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-10-11T00:50:47.085333" elapsed="0.000320"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.086075" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:50:47.085828" elapsed="0.000270"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.086712" 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-10-11T00:50:47.086429" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:47.087389" 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-10-11T00:50:47.087208" elapsed="0.000221"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:47.087473" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:50:47.087600" 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-10-11T00:50:47.086902" elapsed="0.000734"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:47.087800" elapsed="0.000173"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">2607:f0d0:1002:0011:0000:0000:0000:0002</var>
<status status="PASS" start="2026-10-11T00:50:47.086285" elapsed="0.001725"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.088525" 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-10-11T00:50:47.088238" elapsed="0.000311"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:47.089213" 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-10-11T00:50:47.089035" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:47.089280" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:47.089418" 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-10-11T00:50:47.088728" elapsed="0.000714"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:47.089603" elapsed="0.000180"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:50:47.088111" elapsed="0.001709"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.090399" 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-10-11T00:50:47.090130" elapsed="0.000312"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:47.091112" 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-10-11T00:50:47.090936" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:47.091180" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:47.091304" 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-10-11T00:50:47.090612" elapsed="0.000714"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:47.091504" elapsed="0.000341"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:50:47.089999" elapsed="0.001885"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.092391" 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-10-11T00:50:47.092115" elapsed="0.000315"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:47.093096" 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-10-11T00:50:47.092919" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:47.093165" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:47.093289" 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-10-11T00:50:47.092599" elapsed="0.000712"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:47.093487" elapsed="0.000180"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:50:47.091987" elapsed="0.001716"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.094197" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:47.093931" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:47.094916" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:47.094737" elapsed="0.000203"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:47.094983" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:47.095107" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:47.094386" elapsed="0.000744"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:47.095291" elapsed="0.000181"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:47.093804" elapsed="0.001705"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.096017" 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-10-11T00:50:47.095751" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:47.096713" 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-10-11T00:50:47.096524" elapsed="0.000213"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:47.096781" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:47.096902" 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-10-11T00:50:47.096205" elapsed="0.000719"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:47.097082" elapsed="0.000164"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:50:47.095610" elapsed="0.001673"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.097805" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:47.097522" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:47.098493" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:47.098299" elapsed="0.000218"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:47.098562" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:47.098701" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:47.097994" elapsed="0.000729"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:47.098883" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:47.097381" elapsed="0.001703"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.099648" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:50:47.099310" elapsed="0.000364"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:50:47.100323" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:50:47.100147" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:50:47.100429" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:50:47.100559" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:50:47.099842" elapsed="0.000739"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:50:47.100757" elapsed="0.000167"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:50:47.099184" elapsed="0.001778"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:50:47.086140" elapsed="0.014853"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:50:47.101031" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:50:47.101162" 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-10-11T00:50:47.084996" elapsed="0.016190"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:47.084747" elapsed="0.016472"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:47.101389" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:47.101243" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:47.084729" elapsed="0.016749"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.102433" 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-10-11T00:50:47.101649" elapsed="0.000812"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:47.102507" 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/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-10-11T00:50:47.081509" elapsed="0.021100"/>
</kw>
<msg time="2026-10-11T00:50:47.102673" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:47.076617" elapsed="0.026100"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:47.106961" 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/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-10-11T00:50:47.111194" 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/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-10-11T00:50:47.115418" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:47.115599" 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-10-11T00:50:47.115794" 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-10-11T00:50:47.116162" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:47.116020" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:47.116006" 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-10-11T00:50:47.116389" 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-10-11T00:50:47.116586" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:47.116782" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:47.115981" elapsed="0.000850"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:47.115893" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:47.117005" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:47.117071" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:50:47.117181" 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-10-11T00:50:47.076014" elapsed="0.041192"/>
</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-10-11T00:50:47.126297" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:47.125994" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:47.126987" 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-10-11T00:50:47.126818" elapsed="0.000228">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-10-11T00:50:47.127130" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:47.126493" elapsed="0.000659"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.127675" 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-10-11T00:50:47.127320" elapsed="0.000382"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:47.127973" 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-10-11T00:50:47.128094" 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-10-11T00:50:47.127866" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.128550" 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-10-11T00:50:47.128313" 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-10-11T00:50:47.128963" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:47.128714" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.129473" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:47.129184" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:47.129039" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:47.128695" elapsed="0.000856"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.130392" 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-10-11T00:50:47.129726" elapsed="0.000709"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:50:47.130481" 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/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-10-11T00:50:47.125485" elapsed="0.005099"/>
</kw>
<msg time="2026-10-11T00:50:47.130648" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:47.121051" elapsed="0.009641"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:50:47.135062" 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/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-10-11T00:50:47.139280" 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/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-10-11T00:50:47.143937" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:47.144121" 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-10-11T00:50:47.144300" 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-10-11T00:50:47.144660" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:47.144505" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:50:47.144492" 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-10-11T00:50:47.144884" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:47.145058" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:47.145216" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:50:47.144466" elapsed="0.000801"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:50:47.144365" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:47.145487" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:50:47.145554" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:50:47.145688" 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-10-11T00:50:47.120322" elapsed="0.025394"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:50:47.146820" 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-10-11T00:50:47.146615" elapsed="0.000265">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-10-11T00:50:47.146964" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:50:47.146279" elapsed="0.000708"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:47.147266" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:47.147050" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.147791" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:47.147515" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:47.147339" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:47.147033" elapsed="0.000835"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.148358" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:47.148025" elapsed="0.000357"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:50:47.148443" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:47.148568" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:50:47.145983" elapsed="0.002608"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.149832" 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-10-11T00:50:47.149580" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.150277" 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-10-11T00:50:47.150063" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.150769" 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-10-11T00:50:47.150535" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.151208" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:47.150994" elapsed="0.000254"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:47.151970" 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-10-11T00:50:47.151812" elapsed="0.000183"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:50:47.152325" 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-10-11T00:50:47.152178" elapsed="0.000171"/>
</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-10-11T00:50:47.152525" elapsed="0.000168"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.153104" 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-10-11T00:50:47.152885" elapsed="0.000259"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:50:47.153181" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:50:47.153309" 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-10-11T00:50:47.151444" elapsed="0.001888"/>
</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-10-11T00:50:47.170995" level="INFO">PUT Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.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-10-11T00:50:47.171059" level="INFO">PUT Response : url=http://10.30.170.173: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-10-11T00:50:47.171152" 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-10-11T00:50:47.153647" elapsed="0.017529"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:47.153393" elapsed="0.017825"/>
</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-10-11T00:50:47.171392" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:47.171242" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:47.153378" elapsed="0.018118"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.172657" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:47.172349" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:47.172113" elapsed="0.000617"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:47.172096" elapsed="0.000656"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.173313" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:47.173047" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:47.172801" elapsed="0.000585"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:47.172786" elapsed="0.000642"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.173964" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:47.173604" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:47.174260" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:47.174052" elapsed="0.000259"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.174783" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:47.174507" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:47.174332" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:47.174035" elapsed="0.000824"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.175360" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:47.175028" elapsed="0.000356"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:47.175720" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:47.175499" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.176208" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:50:47.175950" elapsed="0.000282"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:47.175794" elapsed="0.000470"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:47.175480" elapsed="0.000804"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:47.176438" elapsed="0.000305"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:50:47.177120" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:50:47.176901" elapsed="0.000243"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:50:47.177293" elapsed="0.000223"/>
</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-10-11T00:50:47.171826" elapsed="0.005746"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:50:47.177728" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:50:47.177643" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:47.177614" elapsed="0.000190"/>
</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-10-11T00:50:47.177944" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:50:47.178003" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:50:47.178161" 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-10-11T00:50:47.148894" elapsed="0.029291"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:47.178240" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:50:47.178360" 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-10-11T00:50:47.072230" elapsed="0.106152"/>
</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-10-11T00:50:47.178700" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:47.178485" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:47.178469" elapsed="0.000314"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:50:47.178812" elapsed="0.000024"/>
</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-10-11T00:50:47.071654" elapsed="0.107253"/>
</kw>
<doc>Configure BGP peer modules with initiate-connection set to false with short ipv6 address.</doc>
<status status="PASS" start="2026-10-11T00:50:46.987281" elapsed="0.191718"/>
</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-10-11T00:50:47.180285" elapsed="0.000216"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:47.180037" elapsed="0.000514"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:47.181458" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:47.181353" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:47.181333" elapsed="0.000188"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:47.183712" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:47.183613" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:47.183596" elapsed="0.000178"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.184682" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:47.184327" elapsed="0.000380"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.185156" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:47.184895" elapsed="0.000285"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:47.185219" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:50:47.185345" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:47.183975" elapsed="0.001392"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:47.187901" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:47.187816" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:47.187799" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:47.188992" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:47.188909" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:47.188892" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:47.189361" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:47.189195" elapsed="0.000189"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:47.189728" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:47.189569" elapsed="0.000183"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:47.225038" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:47.190226" elapsed="0.034905"/>
</kw>
<msg time="2026-10-11T00:50:47.225279" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:47.225340" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:47.189904" elapsed="0.035471"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:47.250425" 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-10-11T00:50:47.225913" elapsed="0.024602"/>
</kw>
<msg time="2026-10-11T00:50:47.250676" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:47.250717" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:47.225562" elapsed="0.025191"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:47.251022" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:47.250820" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:47.250803" elapsed="0.000290"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.251518" 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-10-11T00:50:47.251270" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:47.251850" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:47.251652" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:47.251620" elapsed="0.000301"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:47.251950" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:47.255353" elapsed="0.000143"/>
</kw>
<msg time="2026-10-11T00:50:47.255555" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:47.253265" elapsed="0.002431"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:47.255999" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:47.256325" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:50:47.252702" elapsed="0.003843"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:50:47.252215" 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-10-11T00:50:47.188652" elapsed="0.068069"/>
</kw>
<msg time="2026-10-11T00:50:47.256802" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:47.256841" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:47.188111" elapsed="0.068765"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:47.257029" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:50:47.256944" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:47.256926" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:47.257438" 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-10-11T00:50:47.257754" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:47.257818" 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-10-11T00:50:47.187519" elapsed="0.070383"/>
</kw>
<msg time="2026-10-11T00:50:47.257984" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:47.258023" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:47.185721" elapsed="0.072338"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:47.258343" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:47.258125" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:47.258109" elapsed="0.000367"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:47.185568" elapsed="0.072931"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:47.185428" elapsed="0.073096"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:47.183306" elapsed="0.075266"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:47.181095" elapsed="0.077524"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:47.180711" elapsed="0.077964"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:47.179697" elapsed="0.079024"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.259151" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:47.258873" elapsed="0.000303"/>
</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-10-11T00:50:47.260748" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:47.260457" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.261177" 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-10-11T00:50:47.260964" elapsed="0.000253"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:47.263789" 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-10-11T00:50:47.261808" elapsed="0.002033"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:50:47.268437" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<msg time="2026-10-11T00:50:47.268519" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T00:50:47.264010" elapsed="0.004533"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.269093" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:47.268871" elapsed="0.000266"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:47.268605" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:47.268588" elapsed="0.000602"/>
</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-10-11T00:50:47.261447" elapsed="0.007784"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:47.271729" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exabgp_graceful_restart.cfg &gt; exabgp_graceful_restart.log</msg>
<msg time="2026-10-11T00:50:47.271813" 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-10-11T00:50:47.269432" elapsed="0.002405"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.272252" 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-10-11T00:50:47.272031" elapsed="0.000263"/>
</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-10-11T00:50:47.260146" elapsed="0.012197"/>
</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-10-11T00:50:47.274068" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:47.273768" elapsed="0.000325"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.274561" 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-10-11T00:50:47.274262" elapsed="0.000324"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:50:47.281516" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:50:47.281647" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:50:47.281744" 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-10-11T00:50:47.274755" elapsed="0.007013"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.282246" 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-10-11T00:50:47.281968" elapsed="0.000321"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T00:50:47.283019" 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-10-11T00:50:47.282478" elapsed="0.000602">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-10-11T00:50:47.273340" elapsed="0.009847">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:50:50.285691" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:50:50.284922" elapsed="0.000833"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:50.286845" 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-10-11T00:50:50.286146" elapsed="0.000754"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:50:50.298466" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:50:50.298784" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:50:50.299005" 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-10-11T00:50:50.287247" elapsed="0.011895"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:50.300316" 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-10-11T00:50:50.299642" elapsed="0.000826"/>
</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-10-11T00:50:50.300878" elapsed="0.000756"/>
</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-10-11T00:50:50.283897" elapsed="0.017893"/>
</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-10-11T00:50:47.272903" elapsed="3.028993"/>
</kw>
<msg time="2026-10-11T00:50:50.302098" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:50.302189" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:47.272513" elapsed="3.029724"/>
</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-10-11T00:50:50.302990" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:50.302446" elapsed="0.000659"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:50.302374" elapsed="0.000783"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="PASS" start="2026-10-11T00:50:50.303490" elapsed="0.000063"/>
</return>
<status status="PASS" start="2026-10-11T00:50:50.303269" elapsed="0.000344"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:50.303236" elapsed="0.000451"/>
</if>
<var name="${idx}">0</var>
<status status="PASS" start="2026-10-11T00:50:47.259987" elapsed="3.043758"/>
</iter>
<var>${idx}</var>
<value>${connection_retries}</value>
<status status="PASS" start="2026-10-11T00:50:47.259815" elapsed="3.043997"/>
</for>
<kw name="Fail" owner="BuiltIn">
<arg>Unable to connect ExaBgp to ODL</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:50.304159" elapsed="0.000045"/>
</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-10-11T00:50:47.259516" elapsed="3.044806"/>
</kw>
<doc>Start exabgp with</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:50:47.179237" elapsed="3.125331"/>
</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-10-11T00:50:50.307738" elapsed="0.000450"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:50:50.307125" elapsed="0.001175"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:50.310400" elapsed="0.000064"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:50.310206" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:50.310165" elapsed="0.000413"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:50.315579" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:50.315359" elapsed="0.000393"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:50.315320" elapsed="0.000480"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:50:50.317900" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:50:50.317111" elapsed="0.000847"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:50:50.318943" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:50:50.318295" elapsed="0.000702"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:50:50.319088" elapsed="0.000061"/>
</return>
<msg time="2026-10-11T00:50:50.319371" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:50:50.316260" elapsed="0.003191"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:50.325320" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:50.325132" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:50.325092" elapsed="0.000402"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:50:50.327934" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:50:50.327744" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:50.327705" elapsed="0.000368"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:50:50.328846" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:50:50.328397" elapsed="0.000504"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:50:50.329614" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:50.329263" elapsed="0.000426"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:50.363952" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:50:50.330834" elapsed="0.033250"/>
</kw>
<msg time="2026-10-11T00:50:50.364295" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:50:50.364351" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:50.330033" elapsed="0.034366"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:50:50.388244" 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-10-11T00:50:50.365150" elapsed="0.023190"/>
</kw>
<msg time="2026-10-11T00:50:50.388512" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:50:50.388553" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:50.364679" elapsed="0.023909"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:50.388931" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:50.388724" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:50.388639" elapsed="0.000363"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:50.389422" 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-10-11T00:50:50.389181" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:50.389754" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:50.389545" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:50.389528" elapsed="0.000297"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:50:50.389855" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:50:50.392270" elapsed="0.000265"/>
</kw>
<msg time="2026-10-11T00:50:50.392594" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:50:50.391212" 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-10-11T00:50:50.393046" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:50.393383" 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-10-11T00:50:50.390623" 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-10-11T00:50:50.390134" 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-10-11T00:50:50.327093" elapsed="0.066640"/>
</kw>
<msg time="2026-10-11T00:50:50.393816" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:50.393857" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:50.325854" elapsed="0.068038"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:50:50.394076" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:50:50.393961" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:50.393943" 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-10-11T00:50:50.394504" 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-10-11T00:50:50.394824" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:50:50.394889" 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-10-11T00:50:50.324366" elapsed="0.070609"/>
</kw>
<msg time="2026-10-11T00:50:50.395060" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:50:50.395100" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:50.320213" elapsed="0.074922"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:50:50.395500" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:50:50.395202" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:50.395185" elapsed="0.000389"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:50:50.319900" elapsed="0.075696"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:50:50.319558" elapsed="0.076065"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:50:50.314694" elapsed="0.080990"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:50:50.309597" elapsed="0.086138"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:50:50.308683" elapsed="0.087092"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:50:50.306297" elapsed="0.089524"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:50:50.399193" level="INFO">Executing command 'cat exabgp_graceful_restart.log'.</msg>
<msg time="2026-10-11T00:50:50.412493" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:50:50.412616" level="INFO">${output_log} = 00:50:47 | 3777   | welcome         | Thank you for using ExaBGP
00:50:47 | 3777   | version         | 4.2.4
00:50:47 | 3777   | interpreter     | 3.10.12 (main, Aug 31 2026, 10:18:17) [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-10-11T00:50:50.399079" elapsed="0.013588"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:50.413263" level="INFO">00:50:47 | 3777   | welcome         | Thank you for using ExaBGP
00:50:47 | 3777   | version         | 4.2.4
00:50:47 | 3777   | interpreter     | 3.10.12 (main, Aug 31 2026, 10:18:17) [GCC 11.4.0]
00:50:47 | 3777   | os              | Linux releng-26932-423-0-builder-0 5.15.0-194-generic #204-Ubuntu SMP Wed Sep 2 13:09:23 UTC 2026 x86_64
00:50:47 | 3777   | installation    | /tmp/defaultvenv
00:50:47 | 3777   | advice          | environment file missing
00:50:47 | 3777   | advice          | generate it using "exabgp --fi &gt; /tmp/defaultvenv/etc/exabgp/exabgp.env"
00:50:47 | 3777   | cli             | could not find the named pipes (exabgp.in and exabgp.out) required for the cli
00:50:47 | 3777   | cli             | we scanned the following folders (the number is your PID):
00:50:47 | 3777   | cli control     |  - /run/exabgp/
00:50:47 | 3777   | cli control     |  - /run/1001/
00:50:47 | 3777   | cli control     |  - /run/
00:50:47 | 3777   | cli control     |  - /var/run/exabgp/
00:50:47 | 3777   | cli control     |  - /var/run/1001/
00:50:47 | 3777   | cli control     |  - /var/run/
00:50:47 | 3777   | cli control     |  - /tmp/defaultvenv/run/exabgp/
00:50:47 | 3777   | cli control     |  - /tmp/defaultvenv/run/1001/
00:50:47 | 3777   | cli control     |  - /tmp/defaultvenv/run/
00:50:47 | 3777   | cli control     |  - /tmp/defaultvenv/var/run/exabgp/
00:50:47 | 3777   | cli control     |  - /tmp/defaultvenv/var/run/1001/
00:50:47 | 3777   | cli control     |  - /tmp/defaultvenv/var/run/
00:50:47 | 3777   | cli control     | please make them in one of the folder with the following commands:
00:50:47 | 3777   | cli control     | &gt; mkfifo /home/jenkins/run/exabgp.{in,out}
00:50:47 | 3777   | cli control     | &gt; chmod 600 /home/jenkins/run/exabgp.{in,out}
00:50:47 | 3777   | cli control     | &gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}
00:50:47 | 3777   | configuration   | performing reload of exabgp 4.2.4
00:50:47 | 3777   | configuration   | &gt; neighbor         | '::1'
00:50:47 | 3777   | configuration   | . router-id        | '1.2.3.4'
00:50:47 | 3777   | configuration   | . local-address    | '2607:f0d0:1002:0011:0000:0000:0000:0002'
00:50:47 | 3777   | configuration   | . local-as         | '64496'
00:50:47 | 3777   | configuration   | . peer-as          | '64496'
00:50:47 | 3777   | configuration   | &gt; capability       | 
00:50:47 | 3777   | configuration   | . graceful-restart | '40'
00:50:47 | 3777   | configuration   | &lt; capability       | 
00:50:47 | 3777   | configuration   | &gt; family           | 
00:50:47 | 3777   | configuration   | . ipv6             | 'unicast'
00:50:47 | 3777   | configuration   | &lt; family           | 
00:50:47 | 3777   | configuration   | &gt; static           | 
00:50:47 | 3777   | configuration   | . route            | '2a04:6d80::1/128' 'next-hop' 'self'
00:50:47 | 3777   | configuration   | &lt; static           | 
00:50:47 | 3777   | configuration   | &lt; neighbor         | 
00:50:47 | 3777   | 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:50:47 | 3777   | reactor         | loaded new configuration successfully
00:50:47 | 3777   | reactor         | initialising connection to peer-1
00:50:47 | 3777   | outgoing-1      | attempting connection to ::1:1790
00:50:47 | 3777   | 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:50:47 | 3777   | 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:50:47 | 3777   | ka-outgoing-1   | receive-timer 60 second(s) left
00:50:47 | 3777   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 003B 01
00:50:47 | 3777   | 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:50:47 | 3777   | outgoing-1      | &lt;&lt; message of type OPEN
00:50:47 | 3777   | 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:50:47 | 3777   | outgoing-1      | --------------------------------------------------------------------
00:50:47 | 3777   | outgoing-1      | the connection can not carry the following family/families
00:50:47 | 3777   | outgoing-1      |  - exabgp is not configured for ipv4/unicast
00:50:47 | 3777   | outgoing-1      | therefore no routes of this kind can be announced on the connection
00:50:47 | 3777   | outgoing-1      | --------------------------------------------------------------------
00:50:47 | 3777   | outgoing-1      | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:50:47 | 3777   | outgoing-1      | &gt;&gt; KEEPALIVE (OPENCONFIRM)
00:50:47 | 3777   | ka-outgoing-1   | receive-timer 180 second(s) left
00:50:47 | 3777   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:50:47 | 3777   | outgoing-1      | &lt;&lt; message of type KEEPALIVE
00:50:47 | 3777   | reactor         | connected to peer-1 with outgoing-1 2607:f0d0:1002:0011:0000:0000:0000:0002-::1
00:50:47 | 3777   | 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:50:47 | 3777   | outgoing-1      | &gt;&gt; 1 UPDATE(s)
00:50:47 | 3777   | outgoing-1      | sending TCP payload (  30) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001E 0200 0000 0790 0F00 0300 0201
00:50:47 | 3777   | outgoing-1      | &gt;&gt; EOR ipv6 unicast
00:50:47 | 3777   | peer-1          | &gt;&gt; EOR(s)
00:50:47 | 3777   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001D 02
00:50:47 | 3777   | outgoing-1      | received TCP payload (  10) 0000 0006 800F 0300 0201
00:50:47 | 3777   | outgoing-1      | &lt;&lt; message of type UPDATE
00:50:47 | 3777   | parser          | parsing UPDATE (  10) 0000 0006 800F 0300 0201
00:50:47 | 3777   | routes          | withdrawn NLRI none
00:50:47 | 3777   | parser          | attribute mp-unreach-nlri    flag 0x80 type 0x0f len 0x03 payload 0002 01
00:50:47 | 3777   | routes          | announced NLRI none
00:50:47 | 3777   | peer-1          | &lt;&lt; UPDATE #1
00:50:47 | 3777   | peer-1          |    UPDATE #1 nlri  (  11) eor 2/1 (ipv6 unicast)
00:50:47 | 3777   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02
00:50:47 | 3777   | outgoing-1      | received TCP payload (   4) 0000 0000
00:50:47 | 3777   | outgoing-1      | &lt;&lt; message of type UPDATE
00:50:47 | 3777   | parser          | parsing UPDATE (   4) 0000 0000
00:50:47 | 3777   | peer-1          | &lt;&lt; UPDATE #2
00:50:47 | 3777   | peer-1          |    UPDATE #2 nlri  (   4) eor 1/1 (ipv4 unicast)
00:50:47 | 3777   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02
00:50:47 | 3777   | outgoing-1      | received TCP payload (   4) 0000 0000
00:50:47 | 3777   | outgoing-1      | &lt;&lt; message of type UPDATE
00:50:47 | 3777   | parser          | parsing UPDATE (   4) 0000 0000
00:50:47 | 3777   | peer-1          | &lt;&lt; UPDATE #3
00:50:47 | 3777   | peer-1          |    UPDATE #3 nlri  (   4) eor 1/1 (ipv4 unicast)
00:50:47 | 3777   | ka-outgoing-1   | receive-timer 179 second(s) left
00:50:47 | 3777   | ka-outgoing-1   | send-timer 59 second(s) left
00:50:48 | 3777   | ka-outgoing-1   | receive-timer 178 second(s) left
00:50:48 | 3777   | ka-outgoing-1   | send-timer 58 second(s) left
00:50:49 | 3777   | ka-outgoing-1   | receive-timer 177 second(s) left
00:50:49 | 3777   | 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-10-11T00:50:50.412945" elapsed="0.000603"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T00:50:50.414090" 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-10-11T00:50:50.413801" elapsed="0.000340"/>
</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-10-11T00:50:50.398707" elapsed="0.015488"/>
</kw>
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-10-11T00:50:50.414798" level="INFO">[?2004l</msg>
<msg time="2026-10-11T00:50:50.414868" level="INFO">${output} = [?2004l</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-10-11T00:50:50.414701" elapsed="0.000190"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:50.415298" level="INFO">[?2004l</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:50.415077" elapsed="0.000262"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:50:50.416124" 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-10-11T00:50:50.415833" elapsed="0.000316"/>
</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-10-11T00:50:50.416297" elapsed="0.000180"/>
</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-10-11T00:50:50.415544" elapsed="0.000986"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:50:50.578874" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<msg time="2026-10-11T00:50:50.578975" level="INFO">${output} = ^C[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T00:50:50.416697" elapsed="0.162304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:50.579466" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:50.579209" elapsed="0.000301"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:50:50.581523" 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-10-11T00:50:50.580097" elapsed="0.001501"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:50:50.582573" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<msg time="2026-10-11T00:50:50.582667" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-423-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-10-11T00:50:50.581780" elapsed="0.000913"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:50:50.583240" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:50:50.583013" elapsed="0.000270"/>
</kw>
<status status="PASS" start="2026-10-11T00:50:50.582755" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-10-11T00:50:50.582737" elapsed="0.000599"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-10-11T00:50:50.579749" elapsed="0.003629"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-10-11T00:50:50.414398" elapsed="0.169049"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<msg time="2026-10-11T00:51:30.584117" level="INFO">Slept 40 seconds.</msg>
<arg>40s</arg>
<doc>Pauses execution for the given time.</doc>
<status status="PASS" start="2026-10-11T00:50:50.583607" elapsed="40.000729"/>
</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-10-11T00:51:30.586508" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:51:30.586253" elapsed="0.000361"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:30.586206" elapsed="0.000455"/>
</if>
<for flavor="IN RANGE">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:51:30.588400" level="INFO">${cmd} = sed '1,/ROBOT MESSAGE: Starting test bgpcep-userfeatures.txt.Bgp Ipv6 Basic.Stop_All_Exabgps_3/d' /tmp/karaf-0.23.3/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 variable.</doc>
<status status="PASS" start="2026-10-11T00:51:30.587679" elapsed="0.000811"/>
</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-10-11T00:51:30.593144" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:51:30.592952" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:30.592912" elapsed="0.000377"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:30.597478" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:30.596922" elapsed="0.000676"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:30.596881" elapsed="0.000767"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:51:30.598372" level="INFO">index=7
host=10.30.170.173
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-10-11T00:51:30.598615" level="INFO">${current_ssh_connection} = index=7
host=10.30.170.173
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-10-11T00:51:30.598134" elapsed="0.000537"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:30.599917" 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.3/data/log/karaf.log" on remote system "10.30.170.173" 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-10-11T00:51:30.599216" elapsed="0.000915"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:51:30.601322" 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-10-11T00:51:30.600567" elapsed="0.000811"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:51:30.603275" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:51:30.603458" 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-10-11T00:51:30.602701" elapsed="0.000809"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:51:30.603860" elapsed="0.000660"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:51:30.606295" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:51:30.979802" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 00:50:44 UTC 2026

  System load:  0.29               Processes:             126
  Usage of /:   14.2% of 77.35GB   Users logged in:       1
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.173
  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.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:50:46 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:51:30.605755" elapsed="0.374142"/>
</kw>
<msg time="2026-10-11T00:51:30.979953" 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-10-11T00:51:30.604903" elapsed="0.375113"/>
</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-10-11T00:51:30.601866" elapsed="0.378226"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:51:30.980473" 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.3/data/log/karaf.log'.</msg>
<msg time="2026-10-11T00:51:30.993358" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:51:30.993522" level="INFO">${stdout} = 2026-10-11T00:50:50,459 | INFO  | bgp-worker-5     | BGPSessionImpl                   | 218 - org.opendaylight.bgpcep.bgp-rib-impl - 1.0.3 | End of input detected. Close the session.
2026-10-11T00:50:...</msg>
<msg time="2026-10-11T00:51:30.993579" 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-10-11T00:51:30.980298" elapsed="0.013312"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:51:30.993824" elapsed="0.000510"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:30.995008" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:51:30.994655" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T00:51:30.995288" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:51:30.995157" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:30.995130" elapsed="0.000246"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:51:30.995580" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-10-11T00:51:30.995465" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:30.995444" elapsed="0.000243"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T00:51:30.995730" 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">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:51:30.997462" elapsed="0.000161"/>
</kw>
<msg time="2026-10-11T00:51:30.997677" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:51:30.996708" elapsed="0.001046"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:30.998017" elapsed="0.000029"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:30.998233" elapsed="0.000025"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:51:30.996148" elapsed="0.002187"/>
</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-10-11T00:51:30.595934" elapsed="0.402516"/>
</kw>
<msg time="2026-10-11T00:51:30.998534" 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-10-11T00:51:30.594700" elapsed="0.403945"/>
</kw>
<msg time="2026-10-11T00:51:30.998859" level="INFO">${output} = 2026-10-11T00:50:50,459 | INFO  | bgp-worker-5     | BGPSessionImpl                   | 218 - org.opendaylight.bgpcep.bgp-rib-impl - 1.0.3 | End of input detected. Close the session.
2026-10-11T00:50:...</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-10-11T00:51:30.593659" elapsed="0.405236"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T00:51:30.999474" level="INFO">@{log_lines} = [ 2026-10-11T00:50:50,459 | INFO  | bgp-worker-5     | BGPSessionImpl                   | 218 - org.opendaylight.bgpcep.bgp-rib-impl - 1.0.3 | End of input detected. Close the session. | 2026-10-11T00...</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-10-11T00:51:30.999155" elapsed="0.000357"/>
</kw>
<return>
<value>${log_lines}</value>
<status status="PASS" start="2026-10-11T00:51:30.999572" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:51:30.999761" level="INFO">${output} = ['2026-10-11T00:50:50,459 | INFO  | bgp-worker-5     | BGPSessionImpl                   | 218 - org.opendaylight.bgpcep.bgp-rib-impl - 1.0.3 | End of input detected. Close the session.', '2026-10-11T0...</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-10-11T00:51:30.592034" elapsed="0.407761"/>
</kw>
<kw name="Verify Exceptions" owner="excepts">
<msg time="2026-10-11T00:51:31.000303" level="INFO">${exlist} = []</msg>
<msg time="2026-10-11T00:51:31.000359" 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-10-11T00:51:31.000047" elapsed="0.000341"/>
</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-10-11T00:51:31.000649" elapsed="0.000353"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:51:31.001596" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:51:31.001692" 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-10-11T00:51:31.001227" elapsed="0.000495"/>
</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-10-11T00:51:31.002222" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:31.001811" elapsed="0.000488"/>
</branch>
<branch type="ELSE">
<kw name="Log List" owner="Collections">
<msg time="2026-10-11T00:51:31.002706" 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-10-11T00:51:31.002550" elapsed="0.000212"/>
</kw>
<status status="PASS" start="2026-10-11T00:51:31.002332" elapsed="0.000471"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:31.001787" elapsed="0.001043"/>
</if>
<var name="${i}">1</var>
<status status="PASS" start="2026-10-11T00:51:30.587242" elapsed="0.415635"/>
</iter>
<var>${i}</var>
<value>1</value>
<value>${NUM_ODL_SYSTEM} + 1</value>
<status status="PASS" start="2026-10-11T00:51:30.586740" elapsed="0.416178"/>
</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-10-11T00:51:30.585332" elapsed="0.417658"/>
</kw>
<doc>Save exabgp logs as exabgp_graceful_restart.log, and stop exabgp with ctrl-c bash signal</doc>
<status status="PASS" start="2026-10-11T00:50:50.305146" elapsed="40.697988"/>
</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-10-11T00:51:31.005012" elapsed="0.000282"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:51:31.004650" 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-10-11T00:51:31.006636" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:51:31.006517" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:31.006491" 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-10-11T00:51:31.009831" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:51:31.009715" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:31.009691" elapsed="0.000244"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:51:31.011212" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:51:31.010738" elapsed="0.000509"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:51:31.011871" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:51:31.011482" elapsed="0.000424"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:51:31.011962" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:51:31.012138" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:51:31.010223" elapsed="0.001947"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:51:31.015805" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:51:31.015688" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:31.015663" 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-10-11T00:51:31.017360" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:51:31.017245" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:31.017221" elapsed="0.000260"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:51:31.017938" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:51:31.017684" elapsed="0.000288"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:51:31.018379" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:51:31.018195" elapsed="0.000238"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:51:31.054381" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:51:31.019121" elapsed="0.035383"/>
</kw>
<msg time="2026-10-11T00:51:31.054665" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:51:31.054708" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:31.018649" elapsed="0.036095"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:51:31.077584" 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-10-11T00:51:31.055281" elapsed="0.022395"/>
</kw>
<msg time="2026-10-11T00:51:31.077824" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:51:31.077879" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:31.054929" elapsed="0.022987"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:31.078194" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:31.077985" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:31.077966" elapsed="0.000300"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:31.078699" 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-10-11T00:51:31.078469" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:31.079030" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:31.078816" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:31.078800" elapsed="0.000301"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:51:31.079132" 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-10-11T00:51:31.082218" elapsed="0.000278"/>
</kw>
<msg time="2026-10-11T00:51:31.082555" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:51:31.080969" elapsed="0.001718"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:31.083012" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:31.083344" 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-10-11T00:51:31.080066" elapsed="0.003486"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:51:31.079488" elapsed="0.004121"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:51:31.016889" elapsed="0.066794"/>
</kw>
<msg time="2026-10-11T00:51:31.083765" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:51:31.083851" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:31.016119" elapsed="0.067773"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:51:31.084053" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:51:31.083962" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:31.083944" elapsed="0.000185"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:31.084474" 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-10-11T00:51:31.084776" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:51:31.084857" 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-10-11T00:51:31.015271" elapsed="0.069673"/>
</kw>
<msg time="2026-10-11T00:51:31.085028" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:51:31.085068" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:31.012702" elapsed="0.072403"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:31.085389" elapsed="0.000098"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:31.085171" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:31.085155" elapsed="0.000387"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:51:31.012505" elapsed="0.073059"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:51:31.012281" elapsed="0.073311"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:51:31.009284" elapsed="0.076357"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:51:31.006145" elapsed="0.079545"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:31.005587" elapsed="0.080143"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:51:31.004145" elapsed="0.081631"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:51:31.086237" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:51:31.085950" elapsed="0.000312"/>
</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-10-11T00:51:31.087827" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:51:31.087549" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:31.088272" 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-10-11T00:51:31.088058" elapsed="0.000255"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:51:31.090753" 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-10-11T00:51:31.088897" elapsed="0.001909"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:51:31.094301" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<msg time="2026-10-11T00:51:31.094383" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T00:51:31.090991" elapsed="0.003434"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:31.094980" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:51:31.094742" elapsed="0.000281"/>
</kw>
<status status="PASS" start="2026-10-11T00:51:31.094489" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:31.094470" elapsed="0.000606"/>
</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-10-11T00:51:31.088542" elapsed="0.006575"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:51:31.097425" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exabgp_graceful_restart.cfg &gt; exabgp_graceful_restart.log</msg>
<msg time="2026-10-11T00:51:31.097506" 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-10-11T00:51:31.095265" elapsed="0.002266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:31.097998" 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-10-11T00:51:31.097760" elapsed="0.000281"/>
</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-10-11T00:51:31.087236" elapsed="0.010853"/>
</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-10-11T00:51:31.099828" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:51:31.099528" elapsed="0.000340"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:51:31.100318" 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-10-11T00:51:31.100036" elapsed="0.000305"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:51:31.106774" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:51:31.106933" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:51:31.107039" 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-10-11T00:51:31.100564" elapsed="0.006500"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:31.107571" 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-10-11T00:51:31.107266" elapsed="0.000349"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T00:51:31.108348" 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-10-11T00:51:31.107783" elapsed="0.000656">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-10-11T00:51:31.099108" elapsed="0.009439">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.110989" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:51:34.110215" elapsed="0.000836"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.112142" 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-10-11T00:51:34.111471" elapsed="0.000725"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:51:34.123169" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:51:34.123508" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:51:34.123727" 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-10-11T00:51:34.112574" elapsed="0.011207"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.124966" 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-10-11T00:51:34.124263" elapsed="0.000892"/>
</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-10-11T00:51:34.125568" elapsed="0.000756"/>
</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-10-11T00:51:34.109192" elapsed="0.017294"/>
</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-10-11T00:51:31.098641" elapsed="3.027953"/>
</kw>
<msg time="2026-10-11T00:51:34.126797" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:51:34.126908" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:31.098242" elapsed="3.028715"/>
</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-10-11T00:51:34.127690" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:34.127137" elapsed="0.000665"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:34.127095" elapsed="0.000781"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="PASS" start="2026-10-11T00:51:34.128176" elapsed="0.000061"/>
</return>
<status status="PASS" start="2026-10-11T00:51:34.127991" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:34.127959" elapsed="0.000387"/>
</if>
<var name="${idx}">0</var>
<status status="PASS" start="2026-10-11T00:51:31.087078" elapsed="3.041322"/>
</iter>
<var>${idx}</var>
<value>${connection_retries}</value>
<status status="PASS" start="2026-10-11T00:51:31.086899" elapsed="3.041599"/>
</for>
<kw name="Fail" owner="BuiltIn">
<arg>Unable to connect ExaBgp to ODL</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:34.128840" elapsed="0.000066"/>
</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-10-11T00:51:31.086601" elapsed="3.042424"/>
</kw>
<doc>Start exabgp with</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:51:31.003513" elapsed="3.125725"/>
</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-10-11T00:51:34.132445" elapsed="0.000478"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:51:34.131836" elapsed="0.001199"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:51:34.135097" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:51:34.134902" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:34.134841" elapsed="0.000415"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:51:34.140246" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:51:34.140061" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:34.140023" elapsed="0.000362"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.142497" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:51:34.141721" elapsed="0.000834"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.143600" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:51:34.142913" elapsed="0.000741"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:51:34.143742" elapsed="0.000060"/>
</return>
<msg time="2026-10-11T00:51:34.144043" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:51:34.140901" elapsed="0.003192"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:51:34.149900" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:51:34.149685" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:34.149645" elapsed="0.000396"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:51:34.152476" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:51:34.152247" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:34.152208" elapsed="0.000407"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:51:34.153339" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:51:34.152960" elapsed="0.000432"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:51:34.154120" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:51:34.153797" elapsed="0.000374"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:51:34.187923" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:51:34.155310" elapsed="0.032815"/>
</kw>
<msg time="2026-10-11T00:51:34.188343" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:51:34.188402" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:34.154549" elapsed="0.033934"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:51:34.217575" 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-10-11T00:51:34.189228" elapsed="0.028448"/>
</kw>
<msg time="2026-10-11T00:51:34.217827" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:51:34.217884" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:34.188719" elapsed="0.029200"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:34.218203" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:34.217990" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:34.217972" elapsed="0.000303"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.218712" 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-10-11T00:51:34.218483" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:34.219048" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:34.218837" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:34.218820" elapsed="0.000298"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:51:34.219148" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:51:34.221604" elapsed="0.000257"/>
</kw>
<msg time="2026-10-11T00:51:34.221922" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:51:34.220530" elapsed="0.001526"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:34.222360" elapsed="0.000093"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:34.222712" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:51:34.219930" elapsed="0.002981"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:51:34.219440" 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-10-11T00:51:34.151634" elapsed="0.071409"/>
</kw>
<msg time="2026-10-11T00:51:34.223124" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:51:34.223162" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:34.150370" elapsed="0.072826"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:51:34.223348" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:51:34.223263" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:34.223246" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:34.223776" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:34.224086" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:51:34.224149" 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-10-11T00:51:34.149017" elapsed="0.075217"/>
</kw>
<msg time="2026-10-11T00:51:34.224317" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:51:34.224357" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:34.144911" elapsed="0.079480"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:34.224728" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:34.224506" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:34.224489" elapsed="0.000309"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:51:34.144577" elapsed="0.080243"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:51:34.144212" elapsed="0.080648"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:51:34.139349" elapsed="0.085561"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:51:34.134284" elapsed="0.090676"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:34.133361" elapsed="0.091638"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:51:34.131037" elapsed="0.094008"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.225832" 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-10-11T00:51:34.225241" elapsed="0.000632"/>
</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-10-11T00:51:34.239389" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:51:34.239088" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:51:34.240132" 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-10-11T00:51:34.239923" elapsed="0.000277">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-10-11T00:51:34.240286" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:51:34.239588" elapsed="0.000721"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.240803" 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-10-11T00:51:34.240493" elapsed="0.000336"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:51:34.241124" 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-10-11T00:51:34.241263" 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-10-11T00:51:34.241012" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.241711" 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-10-11T00:51:34.241493" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.242699" 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-10-11T00:51:34.242463" elapsed="0.000278"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.243216" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:51:34.242971" elapsed="0.000269"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.243857" 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-10-11T00:51:34.243577" elapsed="0.000305"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:51:34.244754" 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-10-11T00:51:34.244562" elapsed="0.000255"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:51:34.244902" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T00:51:34.245033" 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-10-11T00:51:34.244052" 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-10-11T00:51:34.245220" elapsed="0.000184"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">2607:f0d0:1002:0011:0000:0000:0000:0002</var>
<status status="PASS" start="2026-10-11T00:51:34.243445" elapsed="0.002012"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.246569" 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-10-11T00:51:34.245684" elapsed="0.000909"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:51:34.247263" 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-10-11T00:51:34.247087" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:51:34.247330" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:51:34.247470" 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-10-11T00:51:34.246760" elapsed="0.000733"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:51:34.247654" elapsed="0.000165"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:51:34.245557" elapsed="0.002317"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.248368" 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-10-11T00:51:34.248103" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:51:34.249078" 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-10-11T00:51:34.248901" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:51:34.249144" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:51:34.249267" 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-10-11T00:51:34.248573" elapsed="0.000717"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:51:34.249464" elapsed="0.000166"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:51:34.247975" elapsed="0.001691"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.250172" 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-10-11T00:51:34.249907" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:51:34.250888" 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-10-11T00:51:34.250697" elapsed="0.000215"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:51:34.250956" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:51:34.251078" 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-10-11T00:51:34.250361" elapsed="0.000739"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:51:34.251260" elapsed="0.000178"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:51:34.249764" elapsed="0.001712"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.251977" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:51:34.251699" elapsed="0.000303"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:51:34.252682" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:51:34.252504" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:51:34.252750" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:51:34.252895" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:51:34.252166" elapsed="0.000752"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:51:34.253081" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:51:34.251573" elapsed="0.001708"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.253790" 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-10-11T00:51:34.253521" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:51:34.256299" 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-10-11T00:51:34.254336" elapsed="0.001988"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:51:34.256401" elapsed="0.000044"/>
</return>
<msg time="2026-10-11T00:51:34.256545" 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-10-11T00:51:34.254016" elapsed="0.002552"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:51:34.256732" elapsed="0.000181"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:51:34.253379" elapsed="0.003571"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.257469" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:51:34.257178" elapsed="0.000315"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:51:34.258156" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:51:34.257979" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:51:34.258223" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:51:34.258345" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:51:34.257660" elapsed="0.000708"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:51:34.258543" elapsed="0.000163"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:51:34.257050" elapsed="0.001693"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.259250" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:51:34.258980" elapsed="0.000294"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:51:34.259945" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:51:34.259757" elapsed="0.000213"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:51:34.260014" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:51:34.260136" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:51:34.259454" elapsed="0.000705"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:51:34.260319" elapsed="0.000178"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:51:34.258841" elapsed="0.001693"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:51:34.243282" elapsed="0.017283"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:51:34.260602" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:51:34.260732" 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-10-11T00:51:34.242107" elapsed="0.018649"/>
</kw>
<status status="PASS" start="2026-10-11T00:51:34.241813" elapsed="0.018972"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:34.260965" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:34.260807" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:34.241795" elapsed="0.019238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.261823" 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-10-11T00:51:34.261188" elapsed="0.000674"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:51:34.261906" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:51:34.238572" elapsed="0.023434"/>
</kw>
<msg time="2026-10-11T00:51:34.262053" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:51:34.234113" elapsed="0.027983"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:51:34.266313" 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/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-10-11T00:51:34.270579" 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/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-10-11T00:51:34.274778" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:34.274968" 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-10-11T00:51:34.275147" 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-10-11T00:51:34.275493" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:34.275336" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:51:34.275323" 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-10-11T00:51:34.275718" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:34.275920" 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-10-11T00:51:34.276083" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:51:34.275298" elapsed="0.000832"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:51:34.275212" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:34.276301" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:51:34.276367" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:51:34.276492" 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-10-11T00:51:34.233484" elapsed="0.043033"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.277523" 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-10-11T00:51:34.277281" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:51:34.290950" level="INFO">DELETE Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0253wmd38ivpec9ykl6a9d65h2.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:51:34.290994" level="INFO">DELETE Response : url=http://10.30.170.173: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-10-11T00:51:34.291083" 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-10-11T00:51:34.277883" elapsed="0.013224"/>
</kw>
<status status="PASS" start="2026-10-11T00:51:34.277628" elapsed="0.013543"/>
</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-10-11T00:51:34.291343" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:34.291196" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:34.277611" elapsed="0.013830"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.292818" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:51:34.292542" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-10-11T00:51:34.292284" elapsed="0.000620"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:34.292094" elapsed="0.000833"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.293499" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:51:34.293217" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-10-11T00:51:34.292977" elapsed="0.000595"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:34.292961" elapsed="0.000634"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.294127" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:51:34.293770" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:34.294440" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:34.294216" elapsed="0.000277"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.294960" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:51:34.294673" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-11T00:51:34.294515" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:34.294199" elapsed="0.000837"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.295555" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:51:34.295207" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:34.295860" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:34.295642" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.296348" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:51:34.296090" elapsed="0.000282"/>
</kw>
<status status="PASS" start="2026-10-11T00:51:34.295934" elapsed="0.000470"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:34.295626" elapsed="0.000813"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:51:34.296579" elapsed="0.000304"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:51:34.297265" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:51:34.297040" elapsed="0.000249"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:51:34.297453" elapsed="0.000216"/>
</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-10-11T00:51:34.291764" elapsed="0.005959"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:51:34.297763" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:51:34.297948" 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-10-11T00:51:34.276750" elapsed="0.021222"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:51:34.298018" elapsed="0.000024"/>
</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-10-11T00:51:34.226093" elapsed="0.072019"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-10-11T00:51:34.129828" elapsed="0.168377"/>
</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-10-11T00:51:34.299597" elapsed="0.000198"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:51:34.299337" 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-10-11T00:51:34.300761" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:51:34.300676" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:34.300659" elapsed="0.000163"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:51:34.302918" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:51:34.302817" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:34.302800" elapsed="0.000180"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.303891" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:51:34.303555" elapsed="0.000361"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.304328" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:51:34.304067" elapsed="0.000285"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:51:34.304392" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T00:51:34.304535" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:51:34.303186" elapsed="0.001372"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:51:34.307226" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:51:34.307142" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:34.307124" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:51:34.308330" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:51:34.308247" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:34.308230" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:51:34.308727" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:51:34.308559" elapsed="0.000193"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:51:34.309060" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:51:34.308926" elapsed="0.000158"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:51:34.342026" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:51:34.309637" elapsed="0.032485"/>
</kw>
<msg time="2026-10-11T00:51:34.342271" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:51:34.342313" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:34.309289" elapsed="0.033058"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:51:34.366263" 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-10-11T00:51:34.342877" elapsed="0.023480"/>
</kw>
<msg time="2026-10-11T00:51:34.366527" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:51:34.366568" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:34.342531" elapsed="0.024072"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:34.366888" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:34.366671" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:34.366653" elapsed="0.000307"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.367360" 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-10-11T00:51:34.367137" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:34.367693" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:34.367498" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:34.367481" elapsed="0.000282"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:51:34.367792" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:51:34.370207" elapsed="0.000114"/>
</kw>
<msg time="2026-10-11T00:51:34.370377" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:51:34.369151" 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-10-11T00:51:34.370880" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:34.371215" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:51:34.368553" elapsed="0.002844"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:51:34.368074" elapsed="0.003403"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:51:34.307990" elapsed="0.063561"/>
</kw>
<msg time="2026-10-11T00:51:34.371633" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:51:34.371672" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:34.307452" elapsed="0.064255"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:51:34.371872" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:51:34.371776" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:34.371758" elapsed="0.000191"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:34.372274" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:34.372595" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:51:34.372659" 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-10-11T00:51:34.306836" elapsed="0.065908"/>
</kw>
<msg time="2026-10-11T00:51:34.372826" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:51:34.372885" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:34.304890" elapsed="0.068031"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:34.373203" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:34.372987" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:34.372971" elapsed="0.000302"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:51:34.304740" elapsed="0.068555"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:51:34.304604" elapsed="0.068717"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:51:34.302527" elapsed="0.070843"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:51:34.300426" elapsed="0.073104"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:34.300024" elapsed="0.073549"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:51:34.298998" elapsed="0.074622"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:51:34.377170" level="INFO">Executing command 'cat exabgp_graceful_restart.log'.</msg>
<msg time="2026-10-11T00:51:34.390063" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:51:34.390152" level="INFO">${output_log} = 00:51:31 | 3855   | welcome         | Thank you for using ExaBGP
00:51:31 | 3855   | version         | 4.2.4
00:51:31 | 3855   | interpreter     | 3.10.12 (main, Aug 31 2026, 10:18:17) [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-10-11T00:51:34.377055" elapsed="0.013121"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.390626" level="INFO">00:51:31 | 3855   | welcome         | Thank you for using ExaBGP
00:51:31 | 3855   | version         | 4.2.4
00:51:31 | 3855   | interpreter     | 3.10.12 (main, Aug 31 2026, 10:18:17) [GCC 11.4.0]
00:51:31 | 3855   | os              | Linux releng-26932-423-0-builder-0 5.15.0-194-generic #204-Ubuntu SMP Wed Sep 2 13:09:23 UTC 2026 x86_64
00:51:31 | 3855   | installation    | /tmp/defaultvenv
00:51:31 | 3855   | advice          | environment file missing
00:51:31 | 3855   | advice          | generate it using "exabgp --fi &gt; /tmp/defaultvenv/etc/exabgp/exabgp.env"
00:51:31 | 3855   | cli             | could not find the named pipes (exabgp.in and exabgp.out) required for the cli
00:51:31 | 3855   | cli             | we scanned the following folders (the number is your PID):
00:51:31 | 3855   | cli control     |  - /run/exabgp/
00:51:31 | 3855   | cli control     |  - /run/1001/
00:51:31 | 3855   | cli control     |  - /run/
00:51:31 | 3855   | cli control     |  - /var/run/exabgp/
00:51:31 | 3855   | cli control     |  - /var/run/1001/
00:51:31 | 3855   | cli control     |  - /var/run/
00:51:31 | 3855   | cli control     |  - /tmp/defaultvenv/run/exabgp/
00:51:31 | 3855   | cli control     |  - /tmp/defaultvenv/run/1001/
00:51:31 | 3855   | cli control     |  - /tmp/defaultvenv/run/
00:51:31 | 3855   | cli control     |  - /tmp/defaultvenv/var/run/exabgp/
00:51:31 | 3855   | cli control     |  - /tmp/defaultvenv/var/run/1001/
00:51:31 | 3855   | cli control     |  - /tmp/defaultvenv/var/run/
00:51:31 | 3855   | cli control     | please make them in one of the folder with the following commands:
00:51:31 | 3855   | cli control     | &gt; mkfifo /home/jenkins/run/exabgp.{in,out}
00:51:31 | 3855   | cli control     | &gt; chmod 600 /home/jenkins/run/exabgp.{in,out}
00:51:31 | 3855   | cli control     | &gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}
00:51:31 | 3855   | configuration   | performing reload of exabgp 4.2.4
00:51:31 | 3855   | configuration   | &gt; neighbor         | '::1'
00:51:31 | 3855   | configuration   | . router-id        | '1.2.3.4'
00:51:31 | 3855   | configuration   | . local-address    | '2607:f0d0:1002:0011:0000:0000:0000:0002'
00:51:31 | 3855   | configuration   | . local-as         | '64496'
00:51:31 | 3855   | configuration   | . peer-as          | '64496'
00:51:31 | 3855   | configuration   | &gt; capability       | 
00:51:31 | 3855   | configuration   | . graceful-restart | '40'
00:51:31 | 3855   | configuration   | &lt; capability       | 
00:51:31 | 3855   | configuration   | &gt; family           | 
00:51:31 | 3855   | configuration   | . ipv6             | 'unicast'
00:51:31 | 3855   | configuration   | &lt; family           | 
00:51:31 | 3855   | configuration   | &gt; static           | 
00:51:31 | 3855   | configuration   | . route            | '2a04:6d80::1/128' 'next-hop' 'self'
00:51:31 | 3855   | configuration   | &lt; static           | 
00:51:31 | 3855   | configuration   | &lt; neighbor         | 
00:51:31 | 3855   | 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:51:31 | 3855   | reactor         | loaded new configuration successfully
00:51:31 | 3855   | reactor         | initialising connection to peer-1
00:51:31 | 3855   | outgoing-1      | attempting connection to ::1:1790
00:51:31 | 3855   | 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:51:31 | 3855   | 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:51:31 | 3855   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 003B 01
00:51:31 | 3855   | 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:51:31 | 3855   | outgoing-1      | &lt;&lt; message of type OPEN
00:51:31 | 3855   | 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:51:31 | 3855   | ka-outgoing-1   | receive-timer 60 second(s) left
00:51:31 | 3855   | outgoing-1      | --------------------------------------------------------------------
00:51:31 | 3855   | outgoing-1      | the connection can not carry the following family/families
00:51:31 | 3855   | outgoing-1      |  - exabgp is not configured for ipv4/unicast
00:51:31 | 3855   | outgoing-1      | therefore no routes of this kind can be announced on the connection
00:51:31 | 3855   | outgoing-1      | --------------------------------------------------------------------
00:51:31 | 3855   | outgoing-1      | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:51:31 | 3855   | outgoing-1      | &gt;&gt; KEEPALIVE (OPENCONFIRM)
00:51:31 | 3855   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04
00:51:31 | 3855   | outgoing-1      | &lt;&lt; message of type KEEPALIVE
00:51:31 | 3855   | ka-outgoing-1   | receive-timer 180 second(s) left
00:51:31 | 3855   | reactor         | connected to peer-1 with outgoing-1 2607:f0d0:1002:0011:0000:0000:0000:0002-::1
00:51:31 | 3855   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02
00:51:31 | 3855   | outgoing-1      | received TCP payload (   4) 0000 0000
00:51:31 | 3855   | outgoing-1      | &lt;&lt; message of type UPDATE
00:51:31 | 3855   | parser          | parsing UPDATE (   4) 0000 0000
00:51:31 | 3855   | peer-1          | &lt;&lt; UPDATE #1
00:51:31 | 3855   | peer-1          |    UPDATE #1 nlri  (   4) eor 1/1 (ipv4 unicast)
00:51:31 | 3855   | 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:51:31 | 3855   | outgoing-1      | &gt;&gt; 1 UPDATE(s)
00:51:31 | 3855   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02
00:51:31 | 3855   | outgoing-1      | received TCP payload (   4) 0000 0000
00:51:31 | 3855   | outgoing-1      | &lt;&lt; message of type UPDATE
00:51:31 | 3855   | parser          | parsing UPDATE (   4) 0000 0000
00:51:31 | 3855   | peer-1          | &lt;&lt; UPDATE #2
00:51:31 | 3855   | peer-1          |    UPDATE #2 nlri  (   4) eor 1/1 (ipv4 unicast)
00:51:31 | 3855   | outgoing-1      | sending TCP payload (  30) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001E 0200 0000 0790 0F00 0300 0201
00:51:31 | 3855   | outgoing-1      | &gt;&gt; EOR ipv6 unicast
00:51:31 | 3855   | peer-1          | &gt;&gt; EOR(s)
00:51:31 | 3855   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001D 02
00:51:31 | 3855   | outgoing-1      | received TCP payload (  10) 0000 0006 800F 0300 0201
00:51:31 | 3855   | outgoing-1      | &lt;&lt; message of type UPDATE
00:51:31 | 3855   | parser          | parsing UPDATE (  10) 0000 0006 800F 0300 0201
00:51:31 | 3855   | routes          | withdrawn NLRI none
00:51:31 | 3855   | parser          | attribute mp-unreach-nlri    flag 0x80 type 0x0f len 0x03 payload 0002 01
00:51:31 | 3855   | routes          | announced NLRI none
00:51:31 | 3855   | peer-1          | &lt;&lt; UPDATE #3
00:51:31 | 3855   | peer-1          |    UPDATE #3 nlri  (  11) eor 2/1 (ipv6 unicast)
00:51:31 | 3855   | ka-outgoing-1   | receive-timer 179 second(s) left
00:51:31 | 3855   | ka-outgoing-1   | send-timer 59 second(s) left
00:51:32 | 3855   | ka-outgoing-1   | receive-timer 178 second(s) left
00:51:33 | 3855   | ka-outgoing-1   | send-timer 58 second(s) left
00:51:33 | 3855   | ka-outgoing-1   | receive-timer 177 second(s) left
00:51:33 | 3855   | ka-outgoing-1   | send-timer 57 second(s) left
00:51:34 | 3855   | outgoing-1      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0015 03
00:51:34 | 3855   | outgoing-1      | received TCP payload (   2) 0600
00:51:34 | 3855   | outgoing-1      | &lt;&lt; message of type NOTIFICATION
00:51:34 | 3855   | outgoing-1      | peer reset, message [notification received (6,0)] error[Cease / Unspecific]
00:51:34 | 3855   | outgoing-1      | outgoing-1 2607:f0d0:1002:0011:0000:0000:0000:0002-::1, closing connection
00:51:34 | 3855   | reactor         | initialising connection to peer-1
00:51:34 | 3855   | outgoing-2      | attempting connection to ::1:1790
00:51:34 | 3855   | 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:51:34 | 3855   | 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:51:34 | 3855   | ka-outgoing-2   | receive-timer 60 second(s) left
00:51:34 | 3855   | outgoing-2      | received TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0015 03
00:51:34 | 3855   | outgoing-2      | received TCP payload (   2) 0605
00:51:34 | 3855   | outgoing-2      | &lt;&lt; message of type NOTIFICATION
00:51:34 | 3855   | outgoing-2      | peer reset, message [notification received (6,5)] error[Cease / Connection Rejected]
00:51:34 | 3855   | 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-10-11T00:51:34.390374" elapsed="0.000417"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T00:51:34.391326" 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-10-11T00:51:34.390984" elapsed="0.000395"/>
</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-10-11T00:51:34.376647" elapsed="0.014810"/>
</kw>
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-10-11T00:51:34.392077" level="INFO">[?2004l</msg>
<msg time="2026-10-11T00:51:34.392147" level="INFO">${output} = [?2004l</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-10-11T00:51:34.391979" elapsed="0.000191"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.392621" level="INFO">[?2004l</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:51:34.392379" elapsed="0.000283"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.393450" 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-10-11T00:51:34.393138" 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-10-11T00:51:34.393624" elapsed="0.000160"/>
</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-10-11T00:51:34.392859" elapsed="0.000979"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:51:34.552565" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<msg time="2026-10-11T00:51:34.552669" level="INFO">${output} = ^C[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T00:51:34.394014" elapsed="0.158682"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.553175" level="INFO">^C[?2004h(defaultvenv) [jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:51:34.552925" elapsed="0.000295"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:51:34.555382" 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-10-11T00:51:34.553811" elapsed="0.001637"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:51:34.556600" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<msg time="2026-10-11T00:51:34.556681" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-423-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-10-11T00:51:34.555614" elapsed="0.001090"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.557257" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:51:34.557031" elapsed="0.000268"/>
</kw>
<status status="PASS" start="2026-10-11T00:51:34.556766" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:34.556748" elapsed="0.000605"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-10-11T00:51:34.553465" elapsed="0.003930"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-10-11T00:51:34.391664" elapsed="0.165795"/>
</kw>
<doc>Save exabgp logs as exabgp_graceful_restart.log, and stop exabgp with ctrl-c bash signal</doc>
<status status="PASS" start="2026-10-11T00:51:34.298470" elapsed="0.259073"/>
</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-10-11T00:51:34.561218" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:51:34.560935" elapsed="0.000309"/>
</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-10-11T00:51:34.562585" level="INFO">Executing command 'cd '.' &amp;&amp; rm -rf /tmp/defaultvenv'.</msg>
<msg time="2026-10-11T00:51:34.625917" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:51:34.626069" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T00:51:34.626127" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T00:51:34.626182" 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-10-11T00:51:34.562427" elapsed="0.063785"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.627356" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T00:51:34.627002" elapsed="0.000438"/>
</kw>
<msg time="2026-10-11T00:51:34.627568" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T00:51:34.627626" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:34.626502" elapsed="0.001156"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.628485" 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-10-11T00:51:34.627945" elapsed="0.000577"/>
</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-10-11T00:51:34.629967" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:51:34.629549" elapsed="0.000477"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.630702" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:51:34.630361" elapsed="0.000398"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.631397" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:51:34.631081" elapsed="0.000396"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T00:51:34.629036" elapsed="0.002515"/>
</kw>
<status status="PASS" start="2026-10-11T00:51:34.628626" elapsed="0.002971"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:34.628599" elapsed="0.003032"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T00:51:34.631819" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:51:34.631706" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:34.631682" elapsed="0.000247"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:51:34.632099" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-10-11T00:51:34.631999" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:34.631978" elapsed="0.000233"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:34.632447" 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-10-11T00:51:34.561935" elapsed="0.070655"/>
</kw>
<msg time="2026-10-11T00:51:34.632657" 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-10-11T00:51:34.561402" elapsed="0.071335"/>
</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-10-11T00:51:34.560436" elapsed="0.072403"/>
</kw>
<msg time="2026-10-11T00:51:34.632921" 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-10-11T00:51:34.558826" elapsed="0.074169"/>
</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-10-11T00:51:34.558519" elapsed="0.074575"/>
</kw>
<doc>Deletes a directory with virtual env.</doc>
<status status="PASS" start="2026-10-11T00:51:34.558298" elapsed="0.074863"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-10-11T00:51:34.633366" elapsed="0.000469"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-10-11T00:51:34.634195" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects </doc>
<status status="PASS" start="2026-10-11T00:51:34.634098" elapsed="0.000218"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-10-11T00:51:34.635748" level="INFO">${output} = None</msg>
<msg time="2026-10-11T00:51:34.635805" 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-10-11T00:51:34.635526" elapsed="0.000773">No open connection.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.636979" level="INFO">None</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:51:34.636630" elapsed="0.000410"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.638093" 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-10-11T00:51:34.637657" elapsed="0.000473"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<msg time="2026-10-11T00:51:34.638584" 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-10-11T00:51:34.638348" elapsed="0.000589">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-10-11T00:51:34.637311" elapsed="0.001795">No open connection.</status>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:51:34.639581" level="INFO">${output} = None</msg>
<msg time="2026-10-11T00:51:34.639636" 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-10-11T00:51:34.639353" elapsed="0.000606">No open connection.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.640609" level="INFO">None</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:51:34.640257" elapsed="0.000412"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:51:34.641633" 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-10-11T00:51:34.641442" elapsed="0.000574">No open connection.</status>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:51:34.642819" level="INFO">${output} = None</msg>
<msg time="2026-10-11T00:51:34.642892" 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-10-11T00:51:34.642312" elapsed="0.000848">No open connection.</status>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.644023" level="INFO">None</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:51:34.643684" elapsed="0.000397"/>
</kw>
<status status="PASS" start="2026-10-11T00:51:34.643265" elapsed="0.000859"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:34.643240" elapsed="0.000916"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="FAIL" start="2026-10-11T00:51:34.641006" elapsed="0.003291">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-10-11T00:51:34.635142" elapsed="0.009327">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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:34.634569" elapsed="0.009966"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-10-11T00:51:34.558062" elapsed="0.086536"/>
</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-10-11T00:48:41.112624" elapsed="173.532010"/>
</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-10-11T00:51:34.679402" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:51:34.677833" elapsed="0.001631"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-10-11T00:51:34.677599" elapsed="0.001921"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.681782" 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-10-11T00:51:34.680485" elapsed="0.001323"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-10-11T00:51:34.681977" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:51:34.681894" elapsed="0.000122"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:34.681874" elapsed="0.000162"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.682547" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:51:34.682210" elapsed="0.000377"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.683047" 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-10-11T00:51:34.682747" elapsed="0.000325"/>
</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-10-11T00:51:34.683579" elapsed="0.000253"/>
</kw>
<msg time="2026-10-11T00:51:34.683949" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:51:34.683991" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:34.683232" elapsed="0.000780"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.684514" 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-10-11T00:51:34.684184" elapsed="0.000354"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.685420" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:51:34.685161" elapsed="0.000286"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.685829" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:51:34.685589" elapsed="0.000292"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.686323" 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-10-11T00:51:34.686056" elapsed="0.000291"/>
</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-10-11T00:51:34.687216" elapsed="0.000159"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.687824" level="INFO">${member_ip} = 10.30.170.173</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:51:34.687547" elapsed="0.000339"/>
</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-10-11T00:51:34.688052" elapsed="0.000167"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.689073" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:51:34.688672" elapsed="0.000426"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-11T00:51:34.689139" elapsed="0.000063"/>
</return>
<msg time="2026-10-11T00:51:34.689305" 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-10-11T00:51:34.688392" elapsed="0.000936"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:51:34.689839" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x743445906390&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-10-11T00:51:34.689514" elapsed="0.000460"/>
</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-10-11T00:51:34.690134" elapsed="0.000152"/>
</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-10-11T00:51:34.686764" elapsed="0.003576"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:51:34.686593" elapsed="0.003787"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-10-11T00:51:34.686394" elapsed="0.004029"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.690970" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:51:34.690607" elapsed="0.000403"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.691556" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.173'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:51:34.691192" elapsed="0.000404"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.692129" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:51:34.691777" elapsed="0.000390"/>
</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-10-11T00:51:34.684776" elapsed="0.007449"/>
</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-10-11T00:51:34.680163" elapsed="0.012111"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:51:34.692435" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:51:34.692332" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:34.692315" elapsed="0.000182"/>
</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-10-11T00:51:34.693678" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:51:34.693340" elapsed="0.000363"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.694217" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:51:34.693950" elapsed="0.000291"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:51:34.694281" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:51:34.694422" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:51:34.693043" elapsed="0.001404"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:51:34.695296" level="INFO">${member_ip} = 10.30.170.173</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-10-11T00:51:34.695088" elapsed="0.000233"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:51:34.696038" 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-10-11T00:51:34.696127" 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-10-11T00:51:34.695894" elapsed="0.000257"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:34.698956" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:34.698430" elapsed="0.000604"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:34.698390" elapsed="0.000679"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:51:34.699738" 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-10-11T00:51:34.700003" 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-10-11T00:51:34.699308" elapsed="0.000744"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.700937" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.173" 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-10-11T00:51:34.700349" elapsed="0.000707"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:51:34.702321" 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-10-11T00:51:34.701340" elapsed="0.001030"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:51:34.703999" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:51:34.704164" 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-10-11T00:51:34.703661" elapsed="0.000544"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:51:34.704719" elapsed="0.000425"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:51:34.706204" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:51:35.065010" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 00:50:44 UTC 2026

  System load:  0.29               Processes:             126
  Usage of /:   14.2% of 77.35GB   Users logged in:       1
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.173
  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.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:51:30 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:51:34.705968" elapsed="0.359148"/>
</kw>
<msg time="2026-10-11T00:51:35.065193" 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-10-11T00:51:34.705498" elapsed="0.359834"/>
</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-10-11T00:51:34.702808" elapsed="0.362711"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:51:35.066574" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-10-11T00:51:35.079737" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-10-11T00:51:35.079903" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T00:51:35.080000" 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-10-11T00:51:35.065978" elapsed="0.014069"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:51:35.080473" elapsed="0.000668"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:35.082723" 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-10-11T00:51:35.081996" elapsed="0.000931"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T00:51:35.083479" elapsed="0.000094"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:51:35.083143" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:35.083113" elapsed="0.000618"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:51:35.084121" elapsed="0.000106"/>
</return>
<status status="PASS" start="2026-10-11T00:51:35.083835" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:35.083814" elapsed="0.000583"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T00:51:35.084508" elapsed="0.000021"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:51:35.086278" elapsed="0.000618"/>
</kw>
<kw name="Open 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-10-11T00:51:35.087319" elapsed="0.000417"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:51:35.088118" elapsed="0.000306"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:51:35.085127" elapsed="0.003389"/>
</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-10-11T00:51:34.697758" elapsed="0.390904"/>
</kw>
<msg time="2026-10-11T00:51:35.088773" 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-10-11T00:51:34.697171" elapsed="0.391722"/>
</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-10-11T00:51:34.696763" elapsed="0.392233"/>
</kw>
<msg time="2026-10-11T00:51:35.089046" 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-10-11T00:51:34.696300" elapsed="0.392804"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:51:35.090044" elapsed="0.000434"/>
</kw>
<kw name="Open 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-10-11T00:51:35.090732" elapsed="0.000200"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:51:35.091128" elapsed="0.000120"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:51:35.089564" elapsed="0.001749"/>
</kw>
<msg time="2026-10-11T00:51:35.091452" 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-10-11T00:51:34.695532" elapsed="0.395954"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:35.092108" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:51:35.091774" elapsed="0.000397"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-11T00:51:35.092237" 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-10-11T00:51:34.694754" elapsed="0.397684"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:51:34.694592" elapsed="0.397905"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:51:34.694492" elapsed="0.398053"/>
</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-10-11T00:51:34.692695" elapsed="0.399919"/>
</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-10-11T00:51:35.092819" elapsed="0.000296"/>
</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-10-11T00:51:35.098632" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:51:35.098546" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:35.098527" elapsed="0.000168"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:51:35.099018" 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-10-11T00:51:35.099110" 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-10-11T00:51:35.098900" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:35.099576" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:51:35.099329" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:35.100034" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:51:35.099804" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:51:35.100779" 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-10-11T00:51:35.100609" elapsed="0.000279">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-10-11T00:51:35.100983" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T00:51:35.101023" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:35.100229" elapsed="0.000814"/>
</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-10-11T00:51:35.101323" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:35.101110" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:35.101093" elapsed="0.000334"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:51:35.102069" level="INFO">${ip_address} = 10.30.170.173</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-10-11T00:51:35.101863" elapsed="0.000230"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-10-11T00:51:35.102135" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:51:35.102291" level="INFO">${odl_ip} = 10.30.170.173</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-10-11T00:51:35.101610" elapsed="0.000704"/>
</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-10-11T00:51:35.102504" elapsed="0.000315"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:51:35.103141" level="INFO">index=4
host=10.30.170.173
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-10-11T00:51:35.103228" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.173
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-10-11T00:51:35.103045" elapsed="0.000207"/>
</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-10-11T00:51:35.103424" elapsed="0.000226"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-10-11T00:51:35.104046" level="INFO">Logging into '10.30.170.173:8101' as 'karaf'.</msg>
<msg time="2026-10-11T00:51:35.317973" 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-10-11T00:51:35.103835" elapsed="0.214223"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:51:35.320568" elapsed="0.000274"/>
</kw>
<kw name="Open 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-10-11T00:51:35.321045" elapsed="0.000140"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:51:35.321328" elapsed="0.000109"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:51:35.320211" elapsed="0.001273"/>
</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-10-11T00:51:35.318338" elapsed="0.003189"/>
</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-10-11T00:51:35.098301" elapsed="0.223273"/>
</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-10-11T00:51:35.093813" elapsed="0.227803"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:35.093438" elapsed="0.228223"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:51:35.093289" elapsed="0.228407"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-10-11T00:51:35.093179" elapsed="0.228548"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-10-11T00:51:34.679770" elapsed="0.642006"/>
</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-10-11T00:51:35.322609" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:51:35.322523" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:35.322503" elapsed="0.000171"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:51:35.324561" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:51:35.324480" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:35.324463" elapsed="0.000160"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:51:35.325502" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:51:35.325156" elapsed="0.000372"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:51:35.325957" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:51:35.325678" elapsed="0.000303"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:51:35.326023" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:51:35.326150" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:51:35.324824" elapsed="0.001383"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:51:35.328652" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:51:35.328568" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:35.328551" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:51:35.329746" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:51:35.329663" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:35.329646" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:51:35.330238" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:51:35.329968" elapsed="0.000295"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:51:35.330633" 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-10-11T00:51:35.330443" elapsed="0.000214"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:51:35.363555" 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-10-11T00:51:35.331321" elapsed="0.032362"/>
</kw>
<msg time="2026-10-11T00:51:35.363812" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:51:35.363873" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:35.330813" elapsed="0.033097"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:51:35.436291" 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-10-11T00:51:35.364603" elapsed="0.071928"/>
</kw>
<msg time="2026-10-11T00:51:35.436664" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:51:35.436706" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:35.364076" elapsed="0.072666"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:35.437034" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:35.436812" elapsed="0.000365"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:35.436793" elapsed="0.000408"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:35.437758" 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-10-11T00:51:35.437384" elapsed="0.000456"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:35.478839" elapsed="0.000157"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:35.437921" elapsed="0.041194"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:35.437903" elapsed="0.041245"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:51:35.479191" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:51:35.481294" elapsed="0.000438"/>
</kw>
<kw name="Open 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-10-11T00:51:35.482109" elapsed="0.000312"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:51:35.482743" 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-10-11T00:51:35.480550" elapsed="0.002515"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:51:35.479572" elapsed="0.003622"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:51:35.329459" elapsed="0.153814"/>
</kw>
<msg time="2026-10-11T00:51:35.483455" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:51:35.483500" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:35.328874" elapsed="0.154663"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:51:35.483706" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:51:35.483615" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:35.483595" elapsed="0.000191"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:35.484131" 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-10-11T00:51:35.484456" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:51:35.484522" 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-10-11T00:51:35.328321" elapsed="0.156286"/>
</kw>
<msg time="2026-10-11T00:51:35.484692" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:51:35.484733" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:35.326554" elapsed="0.158214"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:35.485072" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:35.484835" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:35.484819" elapsed="0.000325"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:51:35.326397" elapsed="0.158769"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:51:35.326256" elapsed="0.158940"/>
</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-10-11T00:51:35.324239" elapsed="0.161008"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-10-11T00:51:35.322332" elapsed="0.162963"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:35.321940" elapsed="0.163392"/>
</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-10-11T00:51:34.677316" elapsed="0.808060"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:51:35.485872" 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-10-11T00:51:35.485561" elapsed="0.000336"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:51:35.486375" level="INFO">${tools_system_conn_id} = 7</msg>
<arg>${tools_system_conn_id}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:51:35.486084" elapsed="0.000343"/>
</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-10-11T00:51:35.487934" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:51:35.488005" 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-10-11T00:51:35.487667" elapsed="0.000360"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:51:35.488175" elapsed="0.000411"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:51:35.489359" level="INFO">Logging into '10.30.171.7:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:51:36.198127" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Sun Oct 11 00:51:35 UTC 2026

  System load:  0.04               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.7
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:47:26 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:51:35.489129" elapsed="0.709087"/>
</kw>
<msg time="2026-10-11T00:51:36.198278" 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-10-11T00:51:35.488752" elapsed="0.709589"/>
</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-10-11T00:51:35.487278" elapsed="0.711232"/>
</kw>
<msg time="2026-10-11T00:51:36.198558" 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-10-11T00:51:35.486922" elapsed="0.711679"/>
</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-10-11T00:51:35.486606" elapsed="0.712063"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:51:36.199137" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x74344561dc10&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-10-11T00:51:36.198889" elapsed="0.000419"/>
</kw>
<kw name="Upload_Config_Files">
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T00:51:36.209464" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-10-11T00:51:36.219621" 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-10-11T00:51:36.199802" elapsed="0.019899"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-10-11T00:51:36.229958" level="INFO">2 files:
exa-md5.cfg
gobgp.cfg</msg>
<msg time="2026-10-11T00:51:36.230103" 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-10-11T00:51:36.219927" elapsed="0.010209"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:51:36.230886" level="INFO">Executing command 'sed -i -e 's/GOBGPIP/10.30.171.7/g' exa-md5.cfg'.</msg>
<msg time="2026-10-11T00:51:36.243398" 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-10-11T00:51:36.230689" elapsed="0.012817"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:51:36.243992" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' exa-md5.cfg'.</msg>
<msg time="2026-10-11T00:51:36.292616" 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-10-11T00:51:36.243782" elapsed="0.048954"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:51:36.293514" level="INFO">Executing command 'sed -i -e 's/ROUTERID/10.30.171.7/g' exa-md5.cfg'.</msg>
<msg time="2026-10-11T00:51:36.340752" 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-10-11T00:51:36.293188" elapsed="0.047709"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:51:36.341614" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exa-md5.cfg'.</msg>
<msg time="2026-10-11T00:51:36.388650" 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-10-11T00:51:36.341326" elapsed="0.047446"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:51:36.389506" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exa-md5.cfg'.</msg>
<msg time="2026-10-11T00:51:36.437055" 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-10-11T00:51:36.389216" elapsed="0.047971"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:51:36.437978" level="INFO">Executing command 'cat exa-md5.cfg'.</msg>
<msg time="2026-10-11T00:51:36.485061" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:51:36.485271" level="INFO">${stdout} = neighbor 10.30.170.173 {
  router-id 10.30.171.7;
  local-address 10.30.171.7;
  local-as 64496;
  peer-as 64496;
  md5-password topsecret;

  capability {
    route-refresh disable;
    add-path disa...</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-10-11T00:51:36.437676" elapsed="0.047652"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:36.486492" level="INFO">neighbor 10.30.170.173 {
  router-id 10.30.171.7;
  local-address 10.30.171.7;
  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-10-11T00:51:36.485910" elapsed="0.000682"/>
</kw>
<var name="${cfgfile}">exa-md5.cfg</var>
<status status="PASS" start="2026-10-11T00:51:36.230444" elapsed="0.256219"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:51:36.487615" level="INFO">Executing command 'sed -i -e 's/GOBGPIP/10.30.171.7/g' gobgp.cfg'.</msg>
<msg time="2026-10-11T00:51:36.533247" 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-10-11T00:51:36.487305" elapsed="0.046073"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:51:36.534188" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' gobgp.cfg'.</msg>
<msg time="2026-10-11T00:51:36.585060" 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-10-11T00:51:36.533886" elapsed="0.051308"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:51:36.585999" level="INFO">Executing command 'sed -i -e 's/ROUTERID/10.30.171.7/g' gobgp.cfg'.</msg>
<msg time="2026-10-11T00:51:36.637200" 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-10-11T00:51:36.585670" elapsed="0.051662"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:51:36.638102" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' gobgp.cfg'.</msg>
<msg time="2026-10-11T00:51:36.689162" 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-10-11T00:51:36.637809" elapsed="0.051559"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:51:36.690152" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' gobgp.cfg'.</msg>
<msg time="2026-10-11T00:51:36.741113" 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-10-11T00:51:36.689881" elapsed="0.051366"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:51:36.742031" level="INFO">Executing command 'cat gobgp.cfg'.</msg>
<msg time="2026-10-11T00:51:36.793158" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:51:36.793368" level="INFO">${stdout} = [global.config]
    as = 64496
    router-id = "10.30.171.7"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.173"
        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-10-11T00:51:36.741731" elapsed="0.051733"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:36.794541" level="INFO">[global.config]
    as = 64496
    router-id = "10.30.171.7"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.173"
        local-as = 64496
    [neighbors.transport.config]
        local-address = "10.30.171.7"
        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-10-11T00:51:36.793972" elapsed="0.000674"/>
</kw>
<var name="${cfgfile}">gobgp.cfg</var>
<status status="PASS" start="2026-10-11T00:51:36.486924" elapsed="0.307794"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-10-11T00:51:36.230214" elapsed="0.564567"/>
</for>
<doc>Uploads gobgp config files</doc>
<status status="PASS" start="2026-10-11T00:51:36.199549" elapsed="0.595367"/>
</kw>
<kw name="Download_Gobgp_Binary">
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:51:36.800525" 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-10-11T00:51:36.799783" elapsed="0.000800"/>
</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-10-11T00:51:36.803962" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:51:36.804118" 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-10-11T00:51:36.803361" elapsed="0.000804"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:51:36.804528" elapsed="0.000668"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:51:36.807026" level="INFO">Logging into '10.30.171.7:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:51:37.130686" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Sun Oct 11 00:51:35 UTC 2026

  System load:  0.04               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.7
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:51:36 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:51:36.806461" elapsed="0.324330"/>
</kw>
<msg time="2026-10-11T00:51:37.130886" 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-10-11T00:51:36.805594" elapsed="0.325364"/>
</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-10-11T00:51:36.802511" elapsed="0.328548"/>
</kw>
<msg time="2026-10-11T00:51:37.131118" 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-10-11T00:51:36.801643" elapsed="0.329531"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-10-11T00:51:36.800971" elapsed="0.330293"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-10-11T00:51:37.131315" 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-10-11T00:51:36.798984" elapsed="0.332513"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:51:37.131971" 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-10-11T00:51:37.551150" 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-10-11T00:51:37.131785" elapsed="0.419499"/>
</kw>
<kw name="File Should Exist" owner="SSHLibrary">
<msg time="2026-10-11T00:51:37.593525" 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-10-11T00:51:37.551672" elapsed="0.043783"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:51:37.596206" level="INFO">Executing command 'tar -xzf gobgp_2.18.0_linux_386.tar.gz'.</msg>
<msg time="2026-10-11T00:51:37.842302" 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-10-11T00:51:37.595932" elapsed="0.246544"/>
</kw>
<doc>Downloads gobgp binary and untar the binary zip file</doc>
<status status="PASS" start="2026-10-11T00:51:36.795197" elapsed="1.047412"/>
</kw>
<doc>Suite setup keyword.</doc>
<status status="PASS" start="2026-10-11T00:51:34.677066" elapsed="3.165645"/>
</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-10-11T00:51:37.846126" elapsed="0.000508"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:51:37.845528" 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-10-11T00:51:37.848954" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:51:37.848692" elapsed="0.000361"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:37.848647" elapsed="0.000452"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:51:37.853613" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:51:37.853392" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:37.853354" elapsed="0.000397"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:51:37.855918" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:51:37.855125" elapsed="0.000849"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:51:37.856956" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:51:37.856311" elapsed="0.000698"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:51:37.857099" elapsed="0.000062"/>
</return>
<msg time="2026-10-11T00:51:37.857378" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:51:37.854233" elapsed="0.003227"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:51:37.863124" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:51:37.862934" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:37.862891" elapsed="0.000371"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:51:37.865686" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:51:37.865494" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:37.865453" elapsed="0.000373"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:51:37.866599" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:51:37.866171" elapsed="0.000485"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:51:37.867345" 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-10-11T00:51:37.867039" elapsed="0.000359"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:51:37.928389" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:51:37.868573" elapsed="0.060043"/>
</kw>
<msg time="2026-10-11T00:51:37.928791" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:51:37.928836" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:37.867778" elapsed="0.061107"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:51:37.961111" 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-10-11T00:51:37.929432" elapsed="0.031787"/>
</kw>
<msg time="2026-10-11T00:51:37.961372" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:51:37.961436" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:37.929058" elapsed="0.032415"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:37.961757" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:37.961544" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:37.961525" elapsed="0.000305"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:37.962293" 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-10-11T00:51:37.962060" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:37.962638" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:37.962437" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:37.962403" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:51:37.962739" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:51:37.965232" elapsed="0.000116"/>
</kw>
<msg time="2026-10-11T00:51:37.965420" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:51:37.964147" 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-10-11T00:51:37.965871" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:37.966207" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:51:37.963550" elapsed="0.002841"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:51:37.963060" elapsed="0.003415"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:51:37.864877" elapsed="0.101672"/>
</kw>
<msg time="2026-10-11T00:51:37.966630" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:51:37.966670" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:37.863622" elapsed="0.103082"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:51:37.966870" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:51:37.966771" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:37.966754" elapsed="0.000193"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:37.967270" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:37.967613" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:51:37.967677" 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-10-11T00:51:37.862238" elapsed="0.105525"/>
</kw>
<msg time="2026-10-11T00:51:37.967846" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:51:37.967903" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:37.858209" elapsed="0.109729"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:37.968223" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:37.968005" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:37.967989" elapsed="0.000304"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:51:37.857896" elapsed="0.110420"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:51:37.857567" elapsed="0.110780"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:51:37.852719" elapsed="0.115677"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:51:37.848072" elapsed="0.120400"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:37.847101" elapsed="0.121414"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:51:37.844252" elapsed="0.124312"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:51:37.969349" level="INFO">&amp;{mapping} = { IP=10.30.171.7 | 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-10-11T00:51:37.968762" elapsed="0.000729"/>
</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-10-11T00:51:37.976294" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:51:37.975995" elapsed="0.000325"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:51:37.977023" 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-10-11T00:51:37.976809" elapsed="0.000291">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-10-11T00:51:37.977185" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:51:37.976492" elapsed="0.000715"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:51:37.977712" 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-10-11T00:51:37.977376" elapsed="0.000361"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:51:37.978028" 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-10-11T00:51:37.978149" 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-10-11T00:51:37.977915" elapsed="0.000259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:37.978618" 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-10-11T00:51:37.978367" 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-10-11T00:51:37.979578" level="INFO">mapping: {'IP': '10.30.171.7', '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-10-11T00:51:37.979325" elapsed="0.000296"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:51:37.980057" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:51:37.979793" elapsed="0.000288"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:51:37.980683" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:51:37.980399" elapsed="0.000308"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:51:37.981405" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:51:37.981216" elapsed="0.000228"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:51:37.981488" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:51:37.981614" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:51:37.980906" elapsed="0.000731"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:51:37.981800" elapsed="0.000190"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:51:37.980269" elapsed="0.001758"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:51:37.982531" 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-10-11T00:51:37.982251" elapsed="0.000304"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:51:37.983219" 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-10-11T00:51:37.983042" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:51:37.983288" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:51:37.983428" 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-10-11T00:51:37.982722" elapsed="0.000729"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:51:37.983659" elapsed="0.000167"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:51:37.982125" elapsed="0.001783"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:51:37.984561" 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-10-11T00:51:37.984138" elapsed="0.000447"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:51:37.985243" 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-10-11T00:51:37.985067" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:51:37.985311" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:51:37.985449" 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-10-11T00:51:37.984751" elapsed="0.000722"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:51:37.985633" elapsed="0.000164"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:51:37.984010" elapsed="0.001824"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:51:37.986339" 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-10-11T00:51:37.986074" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:51:37.987043" 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-10-11T00:51:37.986868" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:51:37.987111" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:51:37.987233" 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-10-11T00:51:37.986546" elapsed="0.000709"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:51:37.987429" elapsed="0.000166"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:51:37.985946" elapsed="0.001686"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:51:37.988135" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:51:37.987866" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:51:37.988822" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:51:37.988646" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:51:37.988904" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:51:37.989027" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:51:37.988324" elapsed="0.000726"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:51:37.989211" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:51:37.987729" elapsed="0.001698"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:51:37.989937" 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-10-11T00:51:37.989655" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:51:37.990623" 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-10-11T00:51:37.990446" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:51:37.990689" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:51:37.990811" 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-10-11T00:51:37.990127" elapsed="0.000706"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:51:37.991006" elapsed="0.000164"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:51:37.989528" elapsed="0.001679"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:51:37.991717" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:51:37.991448" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:51:37.992435" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:51:37.992244" elapsed="0.000216"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:51:37.992503" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:51:37.992626" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:51:37.991936" elapsed="0.000712"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:51:37.992807" elapsed="0.000176"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:51:37.991304" elapsed="0.001716"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:51:37.993578" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:51:37.993288" elapsed="0.000315"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:51:37.994434" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:51:37.994232" elapsed="0.000228"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:51:37.994504" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:51:37.994628" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:51:37.993771" elapsed="0.000880"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:51:37.994810" elapsed="0.000183"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:51:37.993159" elapsed="0.001871"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:51:37.980123" elapsed="0.014939"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:51:37.995100" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:51:37.995231" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', '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-10-11T00:51:37.978985" elapsed="0.016270"/>
</kw>
<status status="PASS" start="2026-10-11T00:51:37.978719" elapsed="0.016565"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:37.995470" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:37.995306" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:37.978702" elapsed="0.016838"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:51:37.996380" 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-10-11T00:51:37.995728" elapsed="0.000694"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:51:37.996467" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:51:37.975465" elapsed="0.021102"/>
</kw>
<msg time="2026-10-11T00:51:37.996617" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:51:37.974837" elapsed="0.021823"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:51:37.997026" 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/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-10-11T00:51:37.997389" 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/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-10-11T00:51:37.997765" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:37.997950" elapsed="0.000048"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:37.998164" 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-10-11T00:51:37.998518" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:37.998359" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:51:37.998345" 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-10-11T00:51:37.998743" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:37.998931" 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-10-11T00:51:37.999095" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:51:37.998319" elapsed="0.000823"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:51:37.998230" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:37.999315" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:51:37.999381" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:51:37.999507" 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-10-11T00:51:37.974231" elapsed="0.025301"/>
</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-10-11T00:51:38.004732" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:51:38.004432" elapsed="0.000326"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:51:38.005426" 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-10-11T00:51:38.005242" elapsed="0.000244">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-10-11T00:51:38.005570" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:51:38.004929" elapsed="0.000663"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:51:38.006108" 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-10-11T00:51:38.005762" elapsed="0.000371"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:51:38.006418" 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-10-11T00:51:38.006537" 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-10-11T00:51:38.006296" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:38.006988" 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-10-11T00:51:38.006757" 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-10-11T00:51:38.007551" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:38.007277" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:51:38.008057" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', '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 variable.</doc>
<status status="PASS" start="2026-10-11T00:51:38.007772" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-11T00:51:38.007628" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:38.007119" elapsed="0.001017"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:51:38.008980" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflecto...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:51:38.008295" elapsed="0.000713"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:51:38.009053" 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-10-11T00:51:38.003924" elapsed="0.005230"/>
</kw>
<msg time="2026-10-11T00:51:38.009207" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:51:38.003300" elapsed="0.005950"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:51:38.009615" elapsed="0.000023"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:51:38.009989" elapsed="0.000023"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-10-11T00:51:38.010345" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:38.010531" 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-10-11T00:51:38.010709" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:38.011049" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:38.010908" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:51:38.010895" 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-10-11T00:51:38.011270" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:38.011458" 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-10-11T00:51:38.011620" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:51:38.010869" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:51:38.010772" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:38.011889" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:51:38.011956" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:51:38.012074" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflecto...</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-10-11T00:51:38.002577" elapsed="0.009524"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:51:38.013198" 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-10-11T00:51:38.013014" elapsed="0.000243">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-10-11T00:51:38.013339" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:51:38.012685" elapsed="0.000677"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:38.013660" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:38.013442" elapsed="0.000269"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:51:38.014185" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:51:38.013922" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T00:51:38.013733" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:38.013423" elapsed="0.000838"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:51:38.014769" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:51:38.014434" elapsed="0.000359"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:51:38.014837" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T00:51:38.014975" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:51:38.012369" elapsed="0.002629"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:38.016212" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:51:38.015993" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:38.016669" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T00:51:38.016455" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:38.017135" 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-10-11T00:51:38.016917" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:38.017588" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:51:38.017357" elapsed="0.000270"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:51:38.018500" 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-10-11T00:51:38.018173" elapsed="0.000352"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:51:38.018869" 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-10-11T00:51:38.018678" 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-10-11T00:51:38.019053" elapsed="0.000154"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:38.019634" 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-10-11T00:51:38.019394" elapsed="0.000280"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:51:38.019712" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:51:38.019839" 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-10-11T00:51:38.017808" elapsed="0.002066"/>
</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-10-11T00:51:38.037983" level="INFO">PUT Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Content-Length': '985', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T00:51:38.038047" level="INFO">PUT Response : url=http://10.30.170.173: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.171.7 
 status=201, reason=Created 
 headers={'Set-Cookie': 'JSESSIONID=node069mi2megbzvs1xudvpix66wwm3.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Sat, 10-Oct-2026 00:51:38 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T00:51:38.038227" 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-10-11T00:51:38.020167" elapsed="0.018095"/>
</kw>
<status status="PASS" start="2026-10-11T00:51:38.019938" elapsed="0.018366"/>
</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-10-11T00:51:38.038505" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:38.038328" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:38.019921" elapsed="0.018666"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:38.039807" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:51:38.039531" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-10-11T00:51:38.039272" elapsed="0.000622"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:38.039255" elapsed="0.000661"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:38.040493" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:51:38.040197" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-10-11T00:51:38.039965" elapsed="0.000600"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:38.039950" elapsed="0.000637"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:51:38.041121" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:51:38.040758" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:38.041431" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:38.041208" elapsed="0.000276"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:51:38.041947" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:51:38.041663" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T00:51:38.041506" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:38.041191" elapsed="0.000832"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:51:38.042545" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:51:38.042193" elapsed="0.000377"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:38.042890" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:38.042666" elapsed="0.000275"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:51:38.043382" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:51:38.043120" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T00:51:38.042963" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:38.042649" elapsed="0.000825"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:51:38.043617" elapsed="0.000308"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:51:38.044306" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:51:38.044081" elapsed="0.000249"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:51:38.044495" elapsed="0.000214"/>
</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-10-11T00:51:38.038929" elapsed="0.005835"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:51:38.044918" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:51:38.044822" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:38.044806" elapsed="0.000190"/>
</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-10-11T00:51:38.045135" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:51:38.045194" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:51:38.045349" 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-10-11T00:51:38.015295" elapsed="0.030078"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:51:38.045443" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:51:38.045565" 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-10-11T00:51:37.970356" elapsed="0.075232"/>
</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-10-11T00:51:38.045924" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:38.045707" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:38.045688" elapsed="0.000320"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:51:38.046038" elapsed="0.000024"/>
</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-10-11T00:51:37.969748" elapsed="0.076385"/>
</kw>
<doc>Configure BGP peer modules with initiate-connection set to false with short ipv6 address.</doc>
<status status="PASS" start="2026-10-11T00:51:37.842836" elapsed="0.203394"/>
</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-10-11T00:51:38.047506" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:51:38.047207" 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-10-11T00:51:38.048820" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:51:38.048729" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:38.048554" elapsed="0.000341"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:51:38.050869" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:51:38.050771" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:38.050754" elapsed="0.000177"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:51:38.051819" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:51:38.051498" elapsed="0.000346"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:51:38.052266" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:51:38.052005" elapsed="0.000285"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:51:38.052363" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:51:38.052508" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:51:38.051132" elapsed="0.001399"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:51:38.054990" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:51:38.054905" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:38.054886" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:51:38.056090" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:51:38.056007" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:38.055989" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:51:38.056487" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:51:38.056296" elapsed="0.000215"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:51:38.056803" 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-10-11T00:51:38.056670" elapsed="0.000156"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:51:38.091295" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:51:38.057317" elapsed="0.034081"/>
</kw>
<msg time="2026-10-11T00:51:38.091579" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:51:38.091623" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:38.056994" elapsed="0.034665"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:51:38.113322" 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-10-11T00:51:38.092193" elapsed="0.021245"/>
</kw>
<msg time="2026-10-11T00:51:38.113590" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:51:38.113631" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:38.091830" elapsed="0.021836"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:38.113968" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:38.113735" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:38.113717" elapsed="0.000323"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:38.114458" 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-10-11T00:51:38.114217" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:38.114767" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:38.114573" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:38.114557" elapsed="0.000280"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:51:38.114881" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:51:38.117393" elapsed="0.000134"/>
</kw>
<msg time="2026-10-11T00:51:38.117584" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:51:38.116339" 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-10-11T00:51:38.118034" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:38.118365" 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-10-11T00:51:38.115626" elapsed="0.002951"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:51:38.115147" 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-10-11T00:51:38.055734" elapsed="0.063006"/>
</kw>
<msg time="2026-10-11T00:51:38.118822" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:51:38.118875" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:38.055199" elapsed="0.063715"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:51:38.119067" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:51:38.118982" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:38.118965" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:38.119487" 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-10-11T00:51:38.119783" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:51:38.119847" 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-10-11T00:51:38.054606" elapsed="0.065339"/>
</kw>
<msg time="2026-10-11T00:51:38.120028" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:51:38.120067" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:38.052864" elapsed="0.067239"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:51:38.120383" elapsed="0.000096"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:51:38.120169" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-10-11T00:51:38.120153" elapsed="0.000380"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:51:38.052714" elapsed="0.067841"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:51:38.052578" elapsed="0.068003"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:51:38.050477" elapsed="0.070150"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:51:38.048302" elapsed="0.072375"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:38.047919" elapsed="0.072797"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:51:38.046832" elapsed="0.073930"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:51:38.121203" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:51:38.120924" elapsed="0.000304"/>
</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-10-11T00:51:38.122563" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:51:38.122269" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:38.123009" 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-10-11T00:51:38.122780" elapsed="0.000270"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:51:38.125346" level="INFO">/home/jenkins/gobgpd -l debug -f /home/jenkins/gobgp.cfg &gt; gobgp.log</msg>
<msg time="2026-10-11T00:51:38.125445" 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-10-11T00:51:38.123198" elapsed="0.002273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:38.125900" 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-10-11T00:51:38.125667" elapsed="0.000275"/>
</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-10-11T00:51:38.121972" elapsed="0.004019"/>
</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-10-11T00:51:38.127732" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:51:38.127433" elapsed="0.000324"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:51:38.128217" 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-10-11T00:51:38.127939" elapsed="0.000301"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:51:38.135456" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node069mi2megbzvs1xudvpix66wwm3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:51:38.135603" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T00:51:38.135688" 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-10-11T00:51:38.128447" elapsed="0.007265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:38.136205" 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-10-11T00:51:38.135928" elapsed="0.000321"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T00:51:38.136720" level="INFO">Argument types are:
&lt;class 'list'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:51:38.136808" 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-10-11T00:51:38.136433" elapsed="0.000525">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-10-11T00:51:38.127019" elapsed="0.010048">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-10-11T00:51:53.143107" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:51:53.139148" elapsed="0.004026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:51:53.144304" 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-10-11T00:51:53.143614" elapsed="0.000744"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:51:53.155576" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node069mi2megbzvs1xudvpix66wwm3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:51:53.155905" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1063'} 
 body={"bgp-rib:peer":[{"peer-id":"bgp://10.30.171.7","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-10-11T00:51:53.156134" 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-10-11T00:51:53.144741" elapsed="0.011446"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:51:53.157351" level="INFO">{"bgp-rib:peer":[{"peer-id":"bgp://10.30.171.7","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-10-11T00:51:53.156673" elapsed="0.000824"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T00:51:53.158566" level="INFO">Argument types are:
&lt;class 'list'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:51:53.158768" 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-10-11T00:51:53.157893" elapsed="0.001264">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-10-11T00:51:53.137950" elapsed="0.021435">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-10-11T00:52:08.162353" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:52:08.161546" elapsed="0.000903"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.163606" 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-10-11T00:52:08.162908" elapsed="0.000753"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:52:08.176275" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node069mi2megbzvs1xudvpix66wwm3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:52:08.176613" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1063'} 
 body={"bgp-rib:peer":[{"peer-id":"bgp://10.30.171.7","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-10-11T00:52:08.176821" 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-10-11T00:52:08.164033" elapsed="0.012867"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.178067" level="INFO">{"bgp-rib:peer":[{"peer-id":"bgp://10.30.171.7","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-10-11T00:52:08.177357" elapsed="0.000823"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.179301" level="INFO">Argument types are:
&lt;class 'list'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:52:08.179528" 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-10-11T00:52:08.178590" elapsed="0.001192">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-10-11T00:52:08.160301" elapsed="0.019739">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-10-11T00:52:08.180232" 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-10-11T00:51:38.126537" elapsed="30.053909">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-10-11T00:52:08.180683" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T00:52:08.180774" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:51:38.126143" elapsed="30.054682"/>
</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-10-11T00:52:08.182596" level="INFO">[?2004l</msg>
<msg time="2026-10-11T00:52:08.182756" level="INFO">${output} = [?2004l</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-10-11T00:52:08.182328" elapsed="0.000479"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.183788" level="INFO">[?2004l</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:08.183255" elapsed="0.000650"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.185726" 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-10-11T00:52:08.185043" elapsed="0.000741"/>
</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-10-11T00:52:08.186139" elapsed="0.000452"/>
</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-10-11T00:52:08.184318" elapsed="0.002412"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:52:08.190731" level="INFO">^C
[?2004h[jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T00:52:08.190940" level="INFO">${output} = ^C
[?2004h[jenkins@releng-26932-423-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-10-11T00:52:08.187108" elapsed="0.003889"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.192020" level="INFO">^C
[?2004h[jenkins@releng-26932-423-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-10-11T00:52:08.191484" elapsed="0.000635"/>
</kw>
<doc>Stops the GoBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-10-11T00:52:08.181684" elapsed="0.010549"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:08.181126" elapsed="0.011164"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:08.181078" elapsed="0.011266"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-10-11T00:52:08.192696" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:08.192492" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:08.192456" elapsed="0.000371"/>
</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-10-11T00:51:38.121544" elapsed="30.071407"/>
</kw>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:51:38.046473" elapsed="30.146700"/>
</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-10-11T00:52:08.196497" elapsed="0.000472"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:52:08.195911" elapsed="0.001170"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:08.199632" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:08.199404" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:08.199364" elapsed="0.000409"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:08.204367" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:08.204178" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:08.204141" elapsed="0.000418"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.206653" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:08.205897" elapsed="0.000811"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.207718" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:52:08.207103" elapsed="0.000668"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:52:08.207882" elapsed="0.000064"/>
</return>
<msg time="2026-10-11T00:52:08.208166" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:52:08.205040" elapsed="0.003176"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:08.213964" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:08.213750" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:08.213710" elapsed="0.000393"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:08.215783" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:08.215666" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:08.215641" elapsed="0.000250"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:52:08.216341" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:52:08.216098" elapsed="0.000276"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:52:08.216818" 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-10-11T00:52:08.216624" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:08.251866" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:52:08.217622" elapsed="0.034345"/>
</kw>
<msg time="2026-10-11T00:52:08.252118" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:52:08.252159" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:08.217132" elapsed="0.035062"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:52:08.282021" 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-10-11T00:52:08.252719" elapsed="0.029400"/>
</kw>
<msg time="2026-10-11T00:52:08.282267" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:52:08.282309" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:08.252359" elapsed="0.029984"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:08.282643" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:08.282435" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:08.282393" elapsed="0.000322"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.283138" 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-10-11T00:52:08.282910" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:08.283477" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:08.283262" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:08.283245" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:52:08.283580" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:52:08.286194" elapsed="0.000114"/>
</kw>
<msg time="2026-10-11T00:52:08.286366" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:08.285125" 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-10-11T00:52:08.286824" elapsed="0.000091"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:08.287176" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:52:08.284521" elapsed="0.002840"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:52:08.283900" elapsed="0.003543"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:52:08.215276" elapsed="0.072243"/>
</kw>
<msg time="2026-10-11T00:52:08.287600" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:08.287639" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:08.214484" elapsed="0.073190"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:52:08.287827" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-10-11T00:52:08.287743" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:08.287725" elapsed="0.000197"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:08.288248" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:08.288608" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:52:08.288672" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:52:08.213076" elapsed="0.075680"/>
</kw>
<msg time="2026-10-11T00:52:08.288839" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:08.288929" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:08.209015" elapsed="0.079951"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:08.289254" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:08.289034" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:08.289018" elapsed="0.000305"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:52:08.208680" elapsed="0.080665"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:52:08.208323" elapsed="0.081050"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:52:08.203495" elapsed="0.086009"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:52:08.198809" elapsed="0.090746"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:08.197434" elapsed="0.092160"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:52:08.195052" elapsed="0.094587"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.290464" level="INFO">&amp;{mapping} = { IP=10.30.171.7 | 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-10-11T00:52:08.289836" elapsed="0.000656"/>
</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-10-11T00:52:08.299942" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:52:08.299629" elapsed="0.000340"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:52:08.300656" 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-10-11T00:52:08.300456" elapsed="0.000260">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-10-11T00:52:08.300801" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:52:08.300123" elapsed="0.000700"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.301310" 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-10-11T00:52:08.301006" elapsed="0.000329"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:52:08.301626" 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-10-11T00:52:08.301763" 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-10-11T00:52:08.301515" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.302211" 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-10-11T00:52:08.301994" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.303346" level="INFO">mapping: {'IP': '10.30.171.7', '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-10-11T00:52:08.302932" elapsed="0.000457"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.303830" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:52:08.303581" elapsed="0.000286"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.304475" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:52:08.304185" elapsed="0.000314"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:52:08.305217" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:52:08.305025" elapsed="0.000216"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:52:08.305285" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:52:08.305426" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:52:08.304669" 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-10-11T00:52:08.305612" elapsed="0.000184"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:52:08.304056" elapsed="0.001776"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.306357" 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-10-11T00:52:08.306089" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:52:08.307062" 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-10-11T00:52:08.306884" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:52:08.307128" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:52:08.307251" 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-10-11T00:52:08.306564" elapsed="0.000709"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:52:08.307447" elapsed="0.000167"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:52:08.305962" elapsed="0.001688"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.308154" 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-10-11T00:52:08.307887" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:52:08.308836" 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-10-11T00:52:08.308662" elapsed="0.000210"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:52:08.308915" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:52:08.309037" 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-10-11T00:52:08.308343" elapsed="0.000716"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:52:08.309218" elapsed="0.000163"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:52:08.307748" elapsed="0.001684"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.309947" 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-10-11T00:52:08.309658" elapsed="0.000313"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:52:08.310647" 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-10-11T00:52:08.310469" elapsed="0.000203"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:52:08.310715" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:52:08.310838" 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-10-11T00:52:08.310138" elapsed="0.000739"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:52:08.311038" elapsed="0.000165"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:52:08.309532" elapsed="0.001707"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.311751" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:52:08.311482" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:52:08.312449" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:52:08.312259" elapsed="0.000215"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:52:08.312517" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:52:08.312639" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:52:08.311952" elapsed="0.000710"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:52:08.312821" elapsed="0.000175"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:52:08.311337" elapsed="0.001695"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.313702" 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-10-11T00:52:08.313254" elapsed="0.000472"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:52:08.314387" 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-10-11T00:52:08.314212" elapsed="0.000245"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:52:08.314504" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:52:08.314630" 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-10-11T00:52:08.313906" elapsed="0.000747"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:52:08.314812" elapsed="0.000186"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:52:08.313130" elapsed="0.001905"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.315539" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:52:08.315258" elapsed="0.000305"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:52:08.316215" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:52:08.316042" elapsed="0.000197"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:52:08.316282" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:52:08.316423" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:52:08.315726" elapsed="0.000722"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:52:08.316608" elapsed="0.000163"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:52:08.315133" elapsed="0.001674"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.317324" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:52:08.317060" elapsed="0.000288"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:52:08.318016" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:52:08.317829" elapsed="0.000212"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:52:08.318084" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:52:08.318206" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:52:08.317529" elapsed="0.000699"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:52:08.318388" elapsed="0.000179"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:52:08.316933" elapsed="0.001672"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:52:08.303910" elapsed="0.014726"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:52:08.318673" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:52:08.318803" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', '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-10-11T00:52:08.302579" elapsed="0.016248"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:08.302313" elapsed="0.016555"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:08.319036" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:08.318890" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:08.302296" elapsed="0.016808"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.319918" 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-10-11T00:52:08.319259" elapsed="0.000685"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:52:08.319988" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:52:08.299118" elapsed="0.020970"/>
</kw>
<msg time="2026-10-11T00:52:08.320137" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:08.298505" 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/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-10-11T00:52:08.320545" elapsed="0.000023"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:52:08.320956" elapsed="0.000023"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-10-11T00:52:08.321314" elapsed="0.000022"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:08.321502" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:08.321681" 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-10-11T00:52:08.322031" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:08.321888" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:52:08.321874" 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-10-11T00:52:08.322258" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:08.322450" 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-10-11T00:52:08.322613" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:52:08.321835" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:52:08.321746" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:08.322831" elapsed="0.000029"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:52:08.322909" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:52:08.323018" 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-10-11T00:52:08.297878" elapsed="0.025165"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.324058" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:08.323815" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:52:08.336046" level="INFO">DELETE Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node069mi2megbzvs1xudvpix66wwm3.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:52:08.336091" level="INFO">DELETE Response : url=http://10.30.170.173: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.171.7 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-10-11T00:52:08.336182" 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-10-11T00:52:08.324386" elapsed="0.011820"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:08.324163" elapsed="0.012108"/>
</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-10-11T00:52:08.336472" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:08.336297" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:08.324145" elapsed="0.012403"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.337756" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:08.337481" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:08.337230" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:08.337213" elapsed="0.000679"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.338508" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:08.338214" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:08.337957" elapsed="0.000623"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:08.337937" elapsed="0.000665"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.339158" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:52:08.338774" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:08.339471" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:08.339246" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.339990" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:52:08.339706" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:08.339546" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:08.339230" elapsed="0.000837"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.340593" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:52:08.340237" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:08.340901" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:08.340681" elapsed="0.000272"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.341393" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:52:08.341133" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:08.340975" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:08.340664" elapsed="0.000826"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:08.341658" elapsed="0.000329"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:52:08.342371" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:52:08.342146" elapsed="0.000249"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:52:08.342563" elapsed="0.000217"/>
</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-10-11T00:52:08.336898" elapsed="0.005937"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:52:08.342900" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:52:08.343075" 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-10-11T00:52:08.323280" elapsed="0.019819"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:52:08.343145" elapsed="0.000025"/>
</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-10-11T00:52:08.290706" elapsed="0.052535"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-10-11T00:52:08.193883" elapsed="0.149451"/>
</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-10-11T00:52:08.344669" elapsed="0.000216"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:52:08.344422" elapsed="0.000512"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:08.345827" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:08.345739" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:08.345720" elapsed="0.000182"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:08.348056" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:08.347972" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:08.347955" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.349071" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:08.348701" elapsed="0.000396"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.349526" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:52:08.349247" elapsed="0.000304"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:52:08.349592" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:52:08.349718" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:52:08.348322" elapsed="0.001419"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:08.352222" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:08.352137" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:08.352120" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:08.353334" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:08.353249" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:08.353232" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:52:08.353737" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:52:08.353567" elapsed="0.000194"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:52:08.354124" 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-10-11T00:52:08.353971" elapsed="0.000176"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:08.388136" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:52:08.354760" elapsed="0.033472"/>
</kw>
<msg time="2026-10-11T00:52:08.388384" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:52:08.388449" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:08.354303" elapsed="0.034182"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:52:08.411802" 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-10-11T00:52:08.389006" elapsed="0.022905"/>
</kw>
<msg time="2026-10-11T00:52:08.412061" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:52:08.412102" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:08.388650" elapsed="0.023489"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:08.412436" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:08.412209" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:08.412191" elapsed="0.000318"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.412927" 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-10-11T00:52:08.412689" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:08.413240" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:08.413045" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:08.413029" elapsed="0.000281"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:52:08.413340" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:52:08.415759" elapsed="0.000251"/>
</kw>
<msg time="2026-10-11T00:52:08.416069" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:08.414710" elapsed="0.001493"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:08.416561" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:08.416924" 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-10-11T00:52:08.414102" elapsed="0.003008"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:52:08.413624" elapsed="0.003545"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:52:08.352992" elapsed="0.064251"/>
</kw>
<msg time="2026-10-11T00:52:08.417325" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:08.417364" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:08.352448" elapsed="0.064952"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:52:08.417582" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-11T00:52:08.417496" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:08.417478" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:08.417987" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:08.418284" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:52:08.418348" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:52:08.351839" elapsed="0.066620"/>
</kw>
<msg time="2026-10-11T00:52:08.418544" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:08.418583" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:08.350083" elapsed="0.068537"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:08.418917" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:08.418687" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:08.418671" elapsed="0.000317"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:52:08.349943" elapsed="0.069066"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:52:08.349788" elapsed="0.069248"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:52:08.347632" elapsed="0.071451"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:52:08.345483" elapsed="0.073649"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:08.345079" elapsed="0.074092"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:52:08.344070" elapsed="0.075147"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:08.422626" level="INFO">Executing command 'cat gobgp.log'.</msg>
<msg time="2026-10-11T00:52:08.435432" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:08.435521" level="INFO">${output_log} = {"level":"info","msg":"gobgpd started","time":"2026-10-11T00:51:38Z"}
{"Topic":"Config","level":"info","msg":"Finished reading the config file","time":"2026-10-11T00:51:38Z"}
{"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-10-11T00:52:08.422510" elapsed="0.013036"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.435993" level="INFO">{"level":"info","msg":"gobgpd started","time":"2026-10-11T00:51:38Z"}
{"Topic":"Config","level":"info","msg":"Finished reading the config file","time":"2026-10-11T00:51:38Z"}
{"level":"info","msg":"Peer 10.30.170.173 is added","time":"2026-10-11T00:51:38Z"}
{"Topic":"Peer","level":"info","msg":"Add a peer configuration for:10.30.170.173","time":"2026-10-11T00:51:38Z"}
{"Duration":0,"Key":"10.30.170.173","Topic":"Peer","level":"debug","msg":"IdleHoldTimer expired","time":"2026-10-11T00:51:38Z"}
{"Key":"10.30.170.173","Topic":"Peer","level":"debug","msg":"state changed","new":"BGP_FSM_ACTIVE","old":"BGP_FSM_IDLE","reason":{"Type":7,"BGPNotification":null,"Data":null},"time":"2026-10-11T00:51:38Z"}
{"Key":"10.30.170.173","Topic":"Peer","level":"debug","msg":"try to connect","time":"2026-10-11T00:51:47Z"}
{"Key":"10.30.170.173","Topic":"Peer","level":"debug","msg":"state changed","new":"BGP_FSM_OPENSENT","old":"BGP_FSM_ACTIVE","reason":{"Type":11,"BGPNotification":null,"Data":null},"time":"2026-10-11T00:51:47Z"}
{"Key":"10.30.170.173","Topic":"Peer","level":"debug","msg":"state changed","new":"BGP_FSM_OPENCONFIRM","old":"BGP_FSM_OPENSENT","reason":{"Type":12,"BGPNotification":null,"Data":null},"time":"2026-10-11T00:51:47Z"}
{"Key":"10.30.170.173","State":"BGP_FSM_OPENCONFIRM","Topic":"Peer","level":"info","msg":"Peer Up","time":"2026-10-11T00:51:47Z"}
{"Key":"10.30.170.173","Topic":"Peer","level":"debug","msg":"state changed","new":"BGP_FSM_ESTABLISHED","old":"BGP_FSM_OPENCONFIRM","reason":{"Type":13,"BGPNotification":null,"Data":null},"time":"2026-10-11T00:51:47Z"}
{"Key":"10.30.170.173","Topic":"Peer","attributes":[],"level":"debug","msg":"received update","nlri":[],"time":"2026-10-11T00:51:47Z","withdrawals":[]}
{"AddressFamily":65537,"Key":"10.30.170.173","Topic":"Peer","level":"debug","msg":"EOR received","time":"2026-10-11T00:51:47Z"}
{"Key":"10.30.170.173","Topic":"Peer","attributes":[],"level":"debug","msg":"received update","nlri":[],"time":"2026-10-11T00:51:47Z","withdrawals":[]}
{"AddressFamily":65537,"Key":"10.30.170.173","Topic":"Peer","level":"debug","msg":"EOR received","time":"2026-10-11T00:51:47Z"}</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:08.435746" elapsed="0.000339"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T00:52:08.436570" 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-10-11T00:52:08.436263" elapsed="0.000360"/>
</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-10-11T00:52:08.422126" elapsed="0.014551"/>
</kw>
<kw name="Stop_GoBgp" owner="GoBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-10-11T00:52:08.437291" level="INFO">${output} =  </msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-10-11T00:52:08.437155" elapsed="0.000160"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.437740" level="INFO"> </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:08.437517" elapsed="0.000263"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.438551" 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-10-11T00:52:08.438251" elapsed="0.000325"/>
</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-10-11T00:52:08.438720" elapsed="0.000171"/>
</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-10-11T00:52:08.437974" elapsed="0.000971"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:52:08.474589" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T00:52:08.474679" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-423-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-10-11T00:52:08.439101" elapsed="0.035603"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.475135" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-423-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-10-11T00:52:08.474910" elapsed="0.000270"/>
</kw>
<doc>Stops the GoBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-10-11T00:52:08.436887" elapsed="0.038343"/>
</kw>
<doc>Save exabgp logs as exaipv6.log, and stop exabgp with ctrl-c bash signal</doc>
<status status="PASS" start="2026-10-11T00:52:08.343589" elapsed="0.131724"/>
</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-10-11T00:52:08.475966" elapsed="0.000516"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-10-11T00:52:08.476697" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects </doc>
<status status="PASS" start="2026-10-11T00:52:08.476629" elapsed="0.000141"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Stop_GoBgp" owner="GoBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-10-11T00:52:08.477774" level="INFO">${output} = None</msg>
<msg time="2026-10-11T00:52:08.477818" 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-10-11T00:52:08.477598" elapsed="0.000550">No open connection.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.478602" level="INFO">None</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:08.478352" elapsed="0.000291"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.479344" 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-10-11T00:52:08.479059" elapsed="0.000310"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<msg time="2026-10-11T00:52:08.479673" 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-10-11T00:52:08.479534" elapsed="0.000387">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-10-11T00:52:08.478826" elapsed="0.001205">No open connection.</status>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:52:08.480336" level="INFO">${output} = None</msg>
<msg time="2026-10-11T00:52:08.480374" 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-10-11T00:52:08.480199" elapsed="0.000393">No open connection.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.481031" level="INFO">None</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:08.480793" elapsed="0.000279"/>
</kw>
<doc>Stops the GoBgp by sending ctrl+c</doc>
<status status="FAIL" start="2026-10-11T00:52:08.477347" elapsed="0.003828">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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:08.476965" elapsed="0.004257"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-10-11T00:52:08.475749" elapsed="0.005518"/>
</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-10-11T00:51:34.645635" elapsed="33.835658"/>
</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-10-11T00:52:08.508737" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:52:08.507139" elapsed="0.001641"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-10-11T00:52:08.506906" elapsed="0.001929"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.511184" 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-10-11T00:52:08.509857" elapsed="0.001353"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-10-11T00:52:08.511359" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:08.511280" elapsed="0.000118"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:08.511262" elapsed="0.000173"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.511946" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:52:08.511611" elapsed="0.000374"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.512435" 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-10-11T00:52:08.512144" elapsed="0.000317"/>
</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-10-11T00:52:08.512967" elapsed="0.000247"/>
</kw>
<msg time="2026-10-11T00:52:08.513300" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:08.513342" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:08.512621" elapsed="0.000742"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.513883" 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-10-11T00:52:08.513559" elapsed="0.000349"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.514761" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:52:08.514516" elapsed="0.000270"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.515181" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:52:08.514943" elapsed="0.000264"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.515668" 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-10-11T00:52:08.515380" elapsed="0.000314"/>
</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-10-11T00:52:08.516744" elapsed="0.000174"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.517538" level="INFO">${member_ip} = 10.30.170.173</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:52:08.517076" elapsed="0.000488"/>
</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-10-11T00:52:08.517729" elapsed="0.000189"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.518648" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:52:08.518361" elapsed="0.000313"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-11T00:52:08.518714" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:52:08.518856" 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-10-11T00:52:08.518098" elapsed="0.000783"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:52:08.519363" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x743445555b50&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-10-11T00:52:08.519052" elapsed="0.000440"/>
</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-10-11T00:52:08.519651" elapsed="0.000148"/>
</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-10-11T00:52:08.516281" elapsed="0.003586"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:52:08.515947" elapsed="0.003960"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-10-11T00:52:08.515739" elapsed="0.004196"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.520483" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:52:08.520119" elapsed="0.000404"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.521063" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.173'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:52:08.520704" elapsed="0.000398"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.521640" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:52:08.521283" 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-10-11T00:52:08.514132" elapsed="0.007635"/>
</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-10-11T00:52:08.509538" elapsed="0.012278"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:08.521978" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:08.521890" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:08.521872" elapsed="0.000167"/>
</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-10-11T00:52:08.523228" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:08.522908" elapsed="0.000345"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.523680" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:52:08.523404" elapsed="0.000300"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:52:08.523744" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:52:08.523885" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:52:08.522596" elapsed="0.001312"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:52:08.524751" level="INFO">${member_ip} = 10.30.170.173</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-10-11T00:52:08.524544" elapsed="0.000232"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:52:08.525508" 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-10-11T00:52:08.525599" 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-10-11T00:52:08.525350" elapsed="0.000273"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:08.529490" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:08.528943" elapsed="0.000629"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:08.528924" elapsed="0.000685"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:52:08.530291" 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-10-11T00:52:08.530536" 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-10-11T00:52:08.529869" elapsed="0.000717"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.531493" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.173" 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-10-11T00:52:08.530902" elapsed="0.000713"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:52:08.532791" 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-10-11T00:52:08.531922" elapsed="0.000930"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:52:08.534564" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:52:08.534730" 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-10-11T00:52:08.534218" elapsed="0.000553"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:08.535111" elapsed="0.000478"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:52:08.536653" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:52:09.138334" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 00:52:08 UTC 2026

  System load:  0.07               Processes:             122
  Usage of /:   14.2% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.173
  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.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:51:34 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:52:08.536399" elapsed="0.602134"/>
</kw>
<msg time="2026-10-11T00:52:09.138622" 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-10-11T00:52:08.535948" elapsed="0.602819"/>
</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-10-11T00:52:08.533265" elapsed="0.605676"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:09.139981" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-10-11T00:52:09.153498" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-10-11T00:52:09.153716" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T00:52:09.153876" 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-10-11T00:52:09.139396" elapsed="0.014550"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:52:09.154359" elapsed="0.000705"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:09.156681" 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-10-11T00:52:09.155952" elapsed="0.000917"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T00:52:09.157390" elapsed="0.000126"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:09.157088" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:09.157057" elapsed="0.000621"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:52:09.158077" elapsed="0.000107"/>
</return>
<status status="PASS" start="2026-10-11T00:52:09.157782" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:09.157759" elapsed="0.000594"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T00:52:09.158598" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:09.160247" elapsed="0.000677"/>
</kw>
<kw name="Open 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-10-11T00:52:09.161348" elapsed="0.000397"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:52:09.162131" elapsed="0.000381"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:52:09.159234" elapsed="0.003372"/>
</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-10-11T00:52:08.527259" elapsed="0.635494"/>
</kw>
<msg time="2026-10-11T00:52:09.162819" 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-10-11T00:52:08.526653" elapsed="0.636252"/>
</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-10-11T00:52:08.526249" elapsed="0.636754"/>
</kw>
<msg time="2026-10-11T00:52:09.163052" 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-10-11T00:52:08.525777" elapsed="0.637333"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:09.163988" elapsed="0.000381"/>
</kw>
<kw name="Open 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-10-11T00:52:09.164717" elapsed="0.000436"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:52:09.165359" elapsed="0.000148"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:52:09.163509" elapsed="0.002064"/>
</kw>
<msg time="2026-10-11T00:52:09.165684" 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-10-11T00:52:08.524990" elapsed="0.640726"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:09.166338" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:09.166022" elapsed="0.000372"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-11T00:52:09.166476" elapsed="0.000039"/>
</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-10-11T00:52:08.524219" elapsed="0.642399"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:52:08.524056" elapsed="0.642651"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:52:08.523955" elapsed="0.642795"/>
</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-10-11T00:52:08.522239" elapsed="0.644578"/>
</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-10-11T00:52:09.167052" elapsed="0.000278"/>
</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-10-11T00:52:09.174436" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:09.174335" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:09.174317" elapsed="0.000183"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:52:09.174815" 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-10-11T00:52:09.174921" 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-10-11T00:52:09.174697" elapsed="0.000249"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:09.175362" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:09.175135" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:09.175826" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:09.175608" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:52:09.176575" 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-10-11T00:52:09.176383" elapsed="0.000283">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-10-11T00:52:09.176760" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T00:52:09.176799" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:09.176037" elapsed="0.000784"/>
</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-10-11T00:52:09.177119" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:09.176903" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:09.176885" elapsed="0.000322"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:52:09.177873" level="INFO">${ip_address} = 10.30.170.173</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-10-11T00:52:09.177651" elapsed="0.000248"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-10-11T00:52:09.177940" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:52:09.178063" level="INFO">${odl_ip} = 10.30.170.173</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-10-11T00:52:09.177390" elapsed="0.000695"/>
</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-10-11T00:52:09.178258" elapsed="0.000328"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:52:09.178903" level="INFO">index=4
host=10.30.170.173
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-10-11T00:52:09.178991" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.173
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-10-11T00:52:09.178794" elapsed="0.000222"/>
</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-10-11T00:52:09.179174" elapsed="0.000226"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-10-11T00:52:09.179799" level="INFO">Logging into '10.30.170.173:8101' as 'karaf'.</msg>
<msg time="2026-10-11T00:52:09.351305" 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-10-11T00:52:09.179606" elapsed="0.171784"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:09.352617" elapsed="0.000292"/>
</kw>
<kw name="Open 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-10-11T00:52:09.353096" elapsed="0.000141"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:52:09.353380" elapsed="0.000120"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:52:09.352248" elapsed="0.001299"/>
</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-10-11T00:52:09.351725" elapsed="0.001863"/>
</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-10-11T00:52:09.174105" elapsed="0.179530"/>
</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-10-11T00:52:09.168298" elapsed="0.185378"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:09.167766" elapsed="0.185955"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:52:09.167575" elapsed="0.186180"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-10-11T00:52:09.167395" elapsed="0.186389"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-10-11T00:52:08.509138" elapsed="0.844696"/>
</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-10-11T00:52:09.354681" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:09.354594" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:09.354574" elapsed="0.000170"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:09.356717" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:09.356635" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:09.356618" elapsed="0.000160"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:09.357636" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:09.357298" elapsed="0.000364"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:52:09.358145" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:52:09.357812" elapsed="0.000358"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:52:09.358209" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:52:09.358335" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:52:09.356996" elapsed="0.001361"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:09.360976" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:09.360891" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:09.360871" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:09.362081" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:09.361998" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:09.361979" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:52:09.362577" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:52:09.362290" elapsed="0.000312"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:52:09.362969" 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-10-11T00:52:09.362768" elapsed="0.000225"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:09.395260" 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-10-11T00:52:09.363657" elapsed="0.031731"/>
</kw>
<msg time="2026-10-11T00:52:09.395618" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:52:09.395659" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:09.363149" elapsed="0.032546"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:52:09.465853" 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-10-11T00:52:09.396461" elapsed="0.069541"/>
</kw>
<msg time="2026-10-11T00:52:09.466147" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:52:09.466190" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:09.395926" elapsed="0.070300"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:09.466588" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:09.466296" elapsed="0.000435"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:09.466278" elapsed="0.000477"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:09.467309" 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-10-11T00:52:09.466956" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:09.467671" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:09.467470" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:09.467452" elapsed="0.000383"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:52:09.467881" elapsed="0.000026"/>
</return>
<kw name="Run Keyword 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:09.469785" elapsed="0.000423"/>
</kw>
<kw name="Open 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-10-11T00:52:09.470622" elapsed="0.000283"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:52:09.471223" elapsed="0.000234"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:52:09.469065" elapsed="0.002476"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:52:09.468152" elapsed="0.003515"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:52:09.361762" elapsed="0.109981"/>
</kw>
<msg time="2026-10-11T00:52:09.471826" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:09.471898" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:09.361187" elapsed="0.110748"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:52:09.472089" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:52:09.472004" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:09.471987" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:09.472574" 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-10-11T00:52:09.472892" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:52:09.472956" 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-10-11T00:52:09.360624" elapsed="0.112416"/>
</kw>
<msg time="2026-10-11T00:52:09.473123" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:09.473162" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:09.358699" elapsed="0.114499"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:09.473561" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:09.473264" elapsed="0.000380"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:09.473249" elapsed="0.000419"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:52:09.358558" elapsed="0.115133"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:52:09.358419" elapsed="0.115298"/>
</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-10-11T00:52:09.356394" elapsed="0.117371"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-10-11T00:52:09.354400" elapsed="0.119414"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:09.354002" elapsed="0.119865"/>
</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-10-11T00:52:08.506626" elapsed="0.967287"/>
</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-10-11T00:52:09.474066" elapsed="0.000145"/>
</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-10-11T00:52:09.474591" elapsed="0.000188"/>
</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-10-11T00:52:09.476445" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:52:09.476517" 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-10-11T00:52:09.476185" elapsed="0.000353"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:09.476691" elapsed="0.000295"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:52:09.477756" level="INFO">Logging into '10.30.171.7:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:52:09.836513" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Sun Oct 11 00:51:35 UTC 2026

  System load:  0.04               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.7
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:51:37 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:52:09.477527" elapsed="0.359091"/>
</kw>
<msg time="2026-10-11T00:52:09.836695" 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-10-11T00:52:09.477150" elapsed="0.359615"/>
</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-10-11T00:52:09.475634" elapsed="0.361252"/>
</kw>
<msg time="2026-10-11T00:52:09.836949" 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-10-11T00:52:09.475259" elapsed="0.361748"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-10-11T00:52:09.474975" elapsed="0.362124"/>
</kw>
<doc>Create a session for BGP peer.</doc>
<status status="PASS" start="2026-10-11T00:52:09.474336" elapsed="0.362826"/>
</kw>
<kw name="Require_Python" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:09.838743" level="INFO">Executing command 'python3 --help'.</msg>
<msg time="2026-10-11T00:52:09.851554" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:09.851780" 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-10-11T00:52:09.851895" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T00:52:09.851974" 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-10-11T00:52:09.838522" elapsed="0.013497"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:52:09.853266" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T00:52:09.852926" elapsed="0.000400"/>
</kw>
<msg time="2026-10-11T00:52:09.853468" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T00:52:09.853526" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:09.852395" elapsed="0.001161"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:09.854314" 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-10-11T00:52:09.853805" elapsed="0.000544"/>
</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-10-11T00:52:09.854912" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:09.854479" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:09.854451" elapsed="0.000577"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-10-11T00:52:09.855205" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-10-11T00:52:09.855100" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:09.855079" elapsed="0.000237"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-10-11T00:52:09.855451" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:09.855386" elapsed="0.000117"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:52:09.855366" elapsed="0.000165"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:09.855737" elapsed="0.000028"/>
</kw>
<msg time="2026-10-11T00:52:09.855925" 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-10-11T00:52:09.838021" elapsed="0.017937"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-10-11T00:52:09.856144" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-10-11T00:52:09.856045" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:09.856023" elapsed="0.000219"/>
</if>
<kw name="Fatal Error" owner="BuiltIn">
<arg>Python 3 is not installed!</arg>
<doc>Stops the whole execution.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:09.856454" elapsed="0.000029"/>
</kw>
<doc>Verify current SSH connection leads to machine with python working. Fatal fail otherwise.</doc>
<status status="PASS" start="2026-10-11T00:52:09.837519" elapsed="0.019036"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:09.858401" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-10-11T00:52:09.931526" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:09.931790" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T00:52:09.931916" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T00:52:09.932007" 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-10-11T00:52:09.858189" elapsed="0.073872"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:52:09.934005" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T00:52:09.933369" elapsed="0.000740"/>
</kw>
<msg time="2026-10-11T00:52:09.934316" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T00:52:09.934444" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:09.932527" elapsed="0.001971"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:09.935816" 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-10-11T00:52:09.934944" elapsed="0.000958"/>
</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-10-11T00:52:09.936726" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:09.936072" elapsed="0.000815"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:09.936029" elapsed="0.000912"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-10-11T00:52:09.937234" elapsed="0.000062"/>
</return>
<status status="PASS" start="2026-10-11T00:52:09.937060" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:09.937026" elapsed="0.000427"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-10-11T00:52:09.937650" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:09.937575" elapsed="0.000163"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:52:09.937542" elapsed="0.000244"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:09.938166" elapsed="0.000047"/>
</kw>
<msg time="2026-10-11T00:52:09.938486" 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-10-11T00:52:09.857670" elapsed="0.080875"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-10-11T00:52:09.938890" elapsed="0.000055"/>
</return>
<status status="PASS" start="2026-10-11T00:52:09.938697" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:09.938659" elapsed="0.000401"/>
</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-10-11T00:52:09.939491" elapsed="0.000048"/>
</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-10-11T00:52:09.856874" elapsed="0.082795"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T00:52:09.977800" level="INFO">[chan 3] Opened sftp connection (server version 3)</msg>
<msg time="2026-10-11T00:52:09.994942" 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-10-11T00:52:09.940105" elapsed="0.054971"/>
</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-10-11T00:52:09.996081" elapsed="0.000493"/>
</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-10-11T00:52:10.000231" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:52:10.000398" 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-10-11T00:52:09.999642" elapsed="0.000842"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:10.000872" elapsed="0.000728"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:52:10.003530" level="INFO">Logging into '10.30.171.7:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:52:10.394651" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Sun Oct 11 00:51:35 UTC 2026

  System load:  0.04               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.7
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:52:09 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:52:10.002954" elapsed="0.391777"/>
</kw>
<msg time="2026-10-11T00:52:10.394788" 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-10-11T00:52:10.002021" elapsed="0.392834"/>
</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-10-11T00:52:09.998700" elapsed="0.396233"/>
</kw>
<msg time="2026-10-11T00:52:10.394978" 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-10-11T00:52:09.997757" elapsed="0.397262"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-10-11T00:52:09.997036" elapsed="0.398046"/>
</kw>
<doc>Create a session for BGP peer.</doc>
<status status="PASS" start="2026-10-11T00:52:09.995492" elapsed="0.399634"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T00:52:10.404892" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-10-11T00:52:10.415762" 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-10-11T00:52:10.395305" elapsed="0.020548"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T00:52:10.429239" 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-10-11T00:52:10.429295" 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-10-11T00:52:10.416113" elapsed="0.013241"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:52:10.429944" level="INFO">Creating Session using : alias=session, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x74344572c210&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-10-11T00:52:10.429633" elapsed="0.000512"/>
</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-10-11T00:52:08.506355" elapsed="1.923871"/>
</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-10-11T00:52:10.432120" elapsed="0.000306"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:52:10.431747" elapsed="0.000753"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:10.433799" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:10.433673" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.433644" elapsed="0.000267"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:10.436280" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:10.436194" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.436177" elapsed="0.000164"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.437303" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:10.436976" elapsed="0.000352"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.437761" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:52:10.437498" elapsed="0.000287"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:52:10.437826" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:52:10.437966" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:52:10.436568" elapsed="0.001421"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:10.440678" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:10.440593" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.440575" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:10.441794" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:10.441711" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.441693" elapsed="0.000175"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:52:10.442185" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:52:10.442016" elapsed="0.000193"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:52:10.442524" 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-10-11T00:52:10.442370" elapsed="0.000177"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:10.477960" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:52:10.443045" elapsed="0.035019"/>
</kw>
<msg time="2026-10-11T00:52:10.478222" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:52:10.478264" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:10.442703" elapsed="0.035596"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:52:10.521721" 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-10-11T00:52:10.478856" elapsed="0.042975"/>
</kw>
<msg time="2026-10-11T00:52:10.521994" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:52:10.522035" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:10.478493" elapsed="0.043578"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.522345" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.522140" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.522121" elapsed="0.000319"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.522865" 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-10-11T00:52:10.522625" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.523192" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.522995" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.522979" elapsed="0.000284"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:52:10.523292" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:52:10.525676" elapsed="0.000112"/>
</kw>
<msg time="2026-10-11T00:52:10.525859" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:10.524665" elapsed="0.001328"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.526330" elapsed="0.000130"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.526735" 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-10-11T00:52:10.524064" 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-10-11T00:52:10.523587" elapsed="0.003406"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:52:10.441454" elapsed="0.085613"/>
</kw>
<msg time="2026-10-11T00:52:10.527150" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:10.527190" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:10.440903" elapsed="0.086322"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:52:10.527380" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-10-11T00:52:10.527294" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.527276" 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-10-11T00:52:10.527805" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.528117" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:52:10.528181" 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-10-11T00:52:10.440288" elapsed="0.087978"/>
</kw>
<msg time="2026-10-11T00:52:10.528349" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:10.528389" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:10.438325" elapsed="0.090122"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.528733" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.528516" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.528499" elapsed="0.000303"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:52:10.438182" elapsed="0.090641"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:52:10.438040" elapsed="0.090824"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:52:10.435906" elapsed="0.093007"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:52:10.433288" elapsed="0.095672"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:10.432706" elapsed="0.096294"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:52:10.431238" elapsed="0.097809"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.529936" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.171.7 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=exampl...</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-10-11T00:52:10.529246" elapsed="0.000718"/>
</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-10-11T00:52:10.540685" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:52:10.540364" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:52:10.541394" 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-10-11T00:52:10.541205" elapsed="0.000274">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-10-11T00:52:10.541603" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:52:10.540886" elapsed="0.000740"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.542123" 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-10-11T00:52:10.541800" elapsed="0.000349"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:52:10.542441" 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-10-11T00:52:10.542565" 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-10-11T00:52:10.542315" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.543039" 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-10-11T00:52:10.542784" 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-10-11T00:52:10.543996" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', '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-10-11T00:52:10.543749" elapsed="0.000290"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.544472" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:52:10.544213" elapsed="0.000283"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.545095" 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-10-11T00:52:10.544816" elapsed="0.000303"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:52:10.545805" 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-10-11T00:52:10.545617" elapsed="0.000212"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:52:10.545887" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:52:10.546013" 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-10-11T00:52:10.545289" elapsed="0.000747"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:52:10.546199" elapsed="0.000171"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:52:10.544686" elapsed="0.001734"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.546929" 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-10-11T00:52:10.546649" elapsed="0.000304"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:52:10.547617" 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-10-11T00:52:10.547439" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:52:10.547684" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:52:10.547806" 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-10-11T00:52:10.547119" elapsed="0.000709"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:52:10.548001" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-10-11T00:52:10.546520" elapsed="0.001681"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.548876" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:52:10.548443" elapsed="0.000458"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:52:10.549567" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:52:10.549374" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:52:10.549634" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:52:10.549756" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:52:10.549070" elapsed="0.000709"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:52:10.549957" elapsed="0.000165"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:52:10.548299" elapsed="0.001859"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.550695" 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-10-11T00:52:10.550382" elapsed="0.000337"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:52:10.551379" 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-10-11T00:52:10.551205" elapsed="0.000198"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:52:10.551462" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:52:10.551587" 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-10-11T00:52:10.550899" elapsed="0.000710"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:52:10.551770" elapsed="0.000179"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:52:10.550255" elapsed="0.001731"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.552492" 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-10-11T00:52:10.552212" elapsed="0.000304"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:52:10.553174" 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-10-11T00:52:10.553000" elapsed="0.000198"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:52:10.553241" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:52:10.553364" 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-10-11T00:52:10.552682" elapsed="0.000704"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:52:10.553563" elapsed="0.000164"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:52:10.552085" elapsed="0.001678"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.554284" 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-10-11T00:52:10.554020" elapsed="0.000288"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:52:10.554986" 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-10-11T00:52:10.554798" elapsed="0.000212"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:52:10.555052" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:52:10.555174" 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-10-11T00:52:10.554491" elapsed="0.000705"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:52:10.555357" elapsed="0.000179"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:52:10.553891" elapsed="0.001681"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.556075" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:52:10.555798" elapsed="0.000300"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:52:10.556765" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:52:10.556591" elapsed="0.000198"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:52:10.556832" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T00:52:10.556969" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:52:10.556266" elapsed="0.000725"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:52:10.557152" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:52:10.555670" elapsed="0.001682"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.557874" 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-10-11T00:52:10.557592" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:52:10.558712" 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-10-11T00:52:10.558536" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:52:10.558779" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:52:10.558916" 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-10-11T00:52:10.558067" 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-10-11T00:52:10.559100" elapsed="0.000165"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:52:10.557464" elapsed="0.001838"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.559813" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:52:10.559546" elapsed="0.000302"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:52:10.560544" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:52:10.560354" elapsed="0.000214"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:52:10.560611" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:52:10.560732" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:52:10.560050" elapsed="0.000704"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:52:10.560928" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:52:10.559400" elapsed="0.001729"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.561643" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:52:10.561352" elapsed="0.000315"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:52:10.562327" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:52:10.562152" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:52:10.562395" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T00:52:10.562536" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:52:10.561835" elapsed="0.000724"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:52:10.562720" elapsed="0.000176"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:52:10.561225" elapsed="0.001708"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:52:10.544539" elapsed="0.018425"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:52:10.563001" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:52:10.563130" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 't...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:52:10.543394" elapsed="0.019760"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:10.543143" elapsed="0.020040"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.563350" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.563204" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.543125" elapsed="0.020307"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.564266" 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-10-11T00:52:10.563595" elapsed="0.000698"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:52:10.564338" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:52:10.539859" elapsed="0.024594"/>
</kw>
<msg time="2026-10-11T00:52:10.564502" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:10.535515" elapsed="0.029031"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:52:10.568657" 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/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-10-11T00:52:10.572757" 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/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-10-11T00:52:10.577050" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.577231" 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-10-11T00:52:10.577423" 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-10-11T00:52:10.577763" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.577618" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:52:10.577604" 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-10-11T00:52:10.578002" 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-10-11T00:52:10.578182" elapsed="0.000017"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.578344" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:52:10.577580" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:52:10.577491" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.578583" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:52:10.578650" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:52:10.578760" 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-10-11T00:52:10.534905" elapsed="0.043880"/>
</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-10-11T00:52:10.587823" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:52:10.587521" elapsed="0.000339"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:52:10.588522" 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-10-11T00:52:10.588333" elapsed="0.000247">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-10-11T00:52:10.588664" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:52:10.588017" elapsed="0.000669"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.589176" 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-10-11T00:52:10.588868" elapsed="0.000333"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:52:10.589489" 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-10-11T00:52:10.589604" 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-10-11T00:52:10.589365" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.590055" 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-10-11T00:52:10.589823" 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-10-11T00:52:10.590472" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.590206" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.590973" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 't...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:52:10.590694" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:10.590549" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.590188" elapsed="0.000863"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.591937" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflecto...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:52:10.591211" elapsed="0.000754"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:52:10.592010" 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-10-11T00:52:10.587001" elapsed="0.005109"/>
</kw>
<msg time="2026-10-11T00:52:10.592162" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:10.582590" elapsed="0.009615"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:52:10.597324" 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/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-10-11T00:52:10.601478" 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/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-10-11T00:52:10.605557" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.605738" 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-10-11T00:52:10.605929" 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-10-11T00:52:10.606268" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.606122" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:52:10.606109" 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-10-11T00:52:10.606512" 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-10-11T00:52:10.606692" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.606867" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:52:10.606083" elapsed="0.000833"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:52:10.605995" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.607124" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:52:10.607192" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:52:10.607312" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflecto...</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-10-11T00:52:10.581877" elapsed="0.025462"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:52:10.608475" 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-10-11T00:52:10.608274" elapsed="0.000261">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-10-11T00:52:10.608619" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:52:10.607947" elapsed="0.000694"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.608950" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.608704" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.609466" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:52:10.609188" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:10.609024" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.608687" elapsed="0.000855"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.610054" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:10.609703" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:52:10.610123" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:52:10.610246" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:52:10.607632" elapsed="0.002636"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.611511" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:10.611275" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.611973" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T00:52:10.611745" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.612446" 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-10-11T00:52:10.612215" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.612900" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:10.612674" elapsed="0.000266"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:52:10.613659" 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-10-11T00:52:10.613494" elapsed="0.000189"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:52:10.613994" 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-10-11T00:52:10.613849" elapsed="0.000169"/>
</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-10-11T00:52:10.614215" elapsed="0.000156"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.614802" 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-10-11T00:52:10.614581" elapsed="0.000278"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:52:10.614899" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:52:10.615027" 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-10-11T00:52:10.613122" elapsed="0.001928"/>
</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-10-11T00:52:10.631599" level="INFO">PUT Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Content-Length': '1077', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T00:52:10.631665" level="INFO">PUT Response : url=http://10.30.170.173: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.171.7 
 status=201, reason=Created 
 headers={'Set-Cookie': 'JSESSIONID=node0b1d3klx1ezq21lvql84nhilbb4.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Sat, 10-Oct-2026 00:52:10 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T00:52:10.631764" 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-10-11T00:52:10.615339" elapsed="0.016450"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:10.615111" elapsed="0.016720"/>
</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-10-11T00:52:10.632026" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.631870" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.615095" elapsed="0.017009"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.633264" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:10.632991" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:10.632739" elapsed="0.000596"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.632721" elapsed="0.000636"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.633942" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:10.633661" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:10.633421" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.633391" elapsed="0.000645"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.634572" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:52:10.634210" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.634885" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.634660" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.635385" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:52:10.635122" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:10.634960" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.634643" elapsed="0.000835"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.636004" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:52:10.635657" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.636296" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.636090" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.636868" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:52:10.636589" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:10.636425" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.636074" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:10.637091" elapsed="0.000292"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:52:10.637787" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:52:10.637561" elapsed="0.000251"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:52:10.637980" elapsed="0.000217"/>
</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-10-11T00:52:10.632445" elapsed="0.005807"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:52:10.638391" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-10-11T00:52:10.638310" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.638294" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.638637" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:52:10.638695" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:52:10.638868" 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-10-11T00:52:10.610591" elapsed="0.028302"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:52:10.638948" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:52:10.639068" 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-10-11T00:52:10.530896" elapsed="0.108195"/>
</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-10-11T00:52:10.639376" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.639174" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.639159" elapsed="0.000316"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:52:10.639505" 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-10-11T00:52:10.530218" elapsed="0.109387"/>
</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-10-11T00:52:10.640156" elapsed="0.000232"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:52:10.639862" elapsed="0.000599"/>
</kw>
<doc>Configure BGP peer module with initiate-connection set to false.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:52:10.430315" elapsed="0.210182"/>
</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-10-11T00:52:10.641969" elapsed="0.000200"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:52:10.641673" 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-10-11T00:52:10.643146" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:10.643059" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.643041" elapsed="0.000167"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:10.645402" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:10.645318" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.645301" elapsed="0.000184"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.646387" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:10.646062" elapsed="0.000366"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.646911" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:52:10.646621" elapsed="0.000314"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:52:10.646976" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:52:10.647103" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:52:10.645693" elapsed="0.001432"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:10.649634" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:10.649550" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.649532" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:10.650746" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:10.650662" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.650645" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:52:10.651146" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:52:10.650978" elapsed="0.000192"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:52:10.651489" 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-10-11T00:52:10.651332" elapsed="0.000181"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:10.686734" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:52:10.652013" elapsed="0.034815"/>
</kw>
<msg time="2026-10-11T00:52:10.687047" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:52:10.687089" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:10.651670" elapsed="0.035454"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:52:10.729304" 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-10-11T00:52:10.687655" elapsed="0.041780"/>
</kw>
<msg time="2026-10-11T00:52:10.729592" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:52:10.729636" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:10.687292" elapsed="0.042380"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.729970" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.729743" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.729725" elapsed="0.000319"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.730493" 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-10-11T00:52:10.730224" elapsed="0.000342"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.730826" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.730626" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.730609" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:52:10.730943" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:52:10.733477" elapsed="0.000118"/>
</kw>
<msg time="2026-10-11T00:52:10.733653" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:10.732287" 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-10-11T00:52:10.734102" elapsed="0.000071"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.734490" 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-10-11T00:52:10.731701" elapsed="0.002975"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:52:10.731212" elapsed="0.003524"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:52:10.650382" elapsed="0.084428"/>
</kw>
<msg time="2026-10-11T00:52:10.734908" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:10.734949" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:10.649858" elapsed="0.085127"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:52:10.735141" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:52:10.735054" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.735036" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.735562" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.735880" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:52:10.735945" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:52:10.649244" elapsed="0.086785"/>
</kw>
<msg time="2026-10-11T00:52:10.736112" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:10.736152" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:10.647467" elapsed="0.088720"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.736559" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.736254" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.736238" elapsed="0.000394"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:52:10.647308" elapsed="0.089345"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:52:10.647171" elapsed="0.089508"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:52:10.645024" elapsed="0.091701"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:52:10.642778" elapsed="0.093995"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:10.642365" elapsed="0.094448"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:52:10.641312" elapsed="0.095561"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.737629" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | NAME=example-bgp-peer-app | RIB_INSTANCE_NAME=example-bgp-rib | IP=10.30.170.173 | 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-10-11T00:52:10.737070" elapsed="0.000586"/>
</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-10-11T00:52:10.748086" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:52:10.747770" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:52:10.748783" 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-10-11T00:52:10.748600" elapsed="0.000259">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-10-11T00:52:10.748944" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:52:10.748269" elapsed="0.000698"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.749498" 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-10-11T00:52:10.749138" elapsed="0.000386"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:52:10.749797" 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-10-11T00:52:10.749937" 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-10-11T00:52:10.749689" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.750374" 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-10-11T00:52:10.750156" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.751526" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer-app', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'IP': '10.30.170.173', '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-10-11T00:52:10.751101" elapsed="0.000468"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.752012" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:52:10.751746" elapsed="0.000290"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.752641" 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-10-11T00:52:10.752355" elapsed="0.000310"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:52:10.753360" 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-10-11T00:52:10.753180" elapsed="0.000204"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:52:10.753445" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:52:10.753572" 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-10-11T00:52:10.752834" elapsed="0.000761"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:52:10.753757" elapsed="0.000181"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:52:10.752223" elapsed="0.001751"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.754490" 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-10-11T00:52:10.754206" elapsed="0.000309"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:52:10.755176" 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-10-11T00:52:10.755001" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:52:10.755243" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:52:10.755365" 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-10-11T00:52:10.754683" elapsed="0.000705"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:52:10.755565" elapsed="0.000164"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-bgp-peer-app</var>
<status status="PASS" start="2026-10-11T00:52:10.754074" elapsed="0.001691"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.756268" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:52:10.756005" elapsed="0.000287"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:52:10.756971" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:52:10.756781" elapsed="0.000214"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:52:10.757039" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:52:10.757162" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:52:10.756476" elapsed="0.000709"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:52:10.757347" elapsed="0.000180"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:52:10.755876" elapsed="0.001689"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.758091" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:52:10.757793" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:52:10.758777" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:52:10.758603" elapsed="0.000230"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:52:10.758893" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:52:10.759021" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:52:10.758282" elapsed="0.000762"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:52:10.759207" elapsed="0.000164"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T00:52:10.757664" elapsed="0.001758"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.759936" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:52:10.759654" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:52:10.760628" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:52:10.760451" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:52:10.760696" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:52:10.760819" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:52:10.760129" elapsed="0.000727"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:52:10.761019" elapsed="0.000163"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:52:10.759524" elapsed="0.001694"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:52:10.752080" elapsed="0.009170"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:52:10.761288" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:52:10.761436" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer-app', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'IP': '10.30.170.173', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:52:10.750746" elapsed="0.010716"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:10.750495" elapsed="0.010996"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.761662" elapsed="0.000189"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.761513" elapsed="0.000375"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.750477" elapsed="0.011431"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.762637" 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-10-11T00:52:10.762070" elapsed="0.000593"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:52:10.762707" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:52:10.747252" elapsed="0.015553"/>
</kw>
<msg time="2026-10-11T00:52:10.762867" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:10.742835" elapsed="0.020076"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:52:10.767046" 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/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-10-11T00:52:10.771113" 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/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-10-11T00:52:10.775190" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.775419" 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-10-11T00:52:10.775605" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.775954" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.775798" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:52:10.775784" 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-10-11T00:52:10.776185" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.776371" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.776554" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:52:10.775759" elapsed="0.000843"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:52:10.775670" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.776780" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:52:10.776859" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:52:10.776972" 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-10-11T00:52:10.742235" elapsed="0.034762"/>
</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-10-11T00:52:10.786040" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:52:10.785704" elapsed="0.000363"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:52:10.786736" 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-10-11T00:52:10.786557" elapsed="0.000238">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-10-11T00:52:10.786896" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:52:10.786225" elapsed="0.000694"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.787396" 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-10-11T00:52:10.787090" elapsed="0.000348"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:52:10.787712" 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-10-11T00:52:10.787851" 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-10-11T00:52:10.787604" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.788288" 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-10-11T00:52:10.788072" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:52:10.788700" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.788448" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.789200" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer-app', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'IP': '10.30.170.173', '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 variable.</doc>
<status status="PASS" start="2026-10-11T00:52:10.788935" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:10.788775" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.788429" elapsed="0.000848"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.790019" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.173&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-10-11T00:52:10.789452" elapsed="0.000595"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:52:10.790092" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:52:10.785188" elapsed="0.005004"/>
</kw>
<msg time="2026-10-11T00:52:10.790239" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:10.780818" elapsed="0.009464"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:52:10.794656" 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/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-10-11T00:52:10.798774" 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/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-10-11T00:52:10.802876" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.803057" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.803238" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.803587" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.803442" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:52:10.803428" 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-10-11T00:52:10.803812" 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-10-11T00:52:10.804002" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.804165" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:52:10.803388" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:52:10.803302" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.804431" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:52:10.804500" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:52:10.804608" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.173&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-10-11T00:52:10.780103" elapsed="0.024532"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:52:10.805753" 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-10-11T00:52:10.805561" elapsed="0.000252">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-10-11T00:52:10.805920" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:52:10.805220" elapsed="0.000723"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.806231" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.806007" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.806747" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:52:10.806484" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:10.806303" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.805990" elapsed="0.000834"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.807333" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:10.806998" elapsed="0.000358"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:52:10.807401" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T00:52:10.807542" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:52:10.804921" elapsed="0.002644"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.808793" 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.173</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:10.808572" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.809250" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.173&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-10-11T00:52:10.809038" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.809713" 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-10-11T00:52:10.809498" elapsed="0.000256"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.810189" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:10.809975" elapsed="0.000253"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:52:10.810939" 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-10-11T00:52:10.810773" elapsed="0.000191"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:52:10.811253" 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-10-11T00:52:10.811113" elapsed="0.000163"/>
</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-10-11T00:52:10.811450" elapsed="0.000155"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.812032" 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-10-11T00:52:10.811797" elapsed="0.000275"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:52:10.812109" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:52:10.812236" 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-10-11T00:52:10.810420" elapsed="0.001839"/>
</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-10-11T00:52:10.830355" level="INFO">PUT Request : url=http://10.30.170.173: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.173 
 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.173 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0b1d3klx1ezq21lvql84nhilbb4.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.173&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-10-11T00:52:10.830444" level="INFO">PUT Response : url=http://10.30.170.173: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.173 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T00:52:10.830552" 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-10-11T00:52:10.812600" elapsed="0.017978"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:10.812354" elapsed="0.018267"/>
</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-10-11T00:52:10.830803" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.830645" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.812337" elapsed="0.018569"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.832079" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:10.831791" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:10.831541" elapsed="0.000609"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.831522" elapsed="0.000650"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.832749" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:10.832484" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:10.832220" elapsed="0.000600"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.832206" elapsed="0.000651"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.833376" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:52:10.833037" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.833688" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.833480" elapsed="0.000259"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.834207" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:52:10.833947" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:10.833761" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.833463" elapsed="0.000819"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.834812" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:52:10.834474" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.835118" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.834913" elapsed="0.000256"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.835672" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:52:10.835351" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:10.835190" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.834896" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:10.835904" elapsed="0.000291"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:52:10.836589" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:52:10.836354" elapsed="0.000259"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:52:10.836765" elapsed="0.000222"/>
</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-10-11T00:52:10.831229" elapsed="0.005813"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:52:10.837214" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:52:10.837131" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.837113" elapsed="0.000179"/>
</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-10-11T00:52:10.837447" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:52:10.837509" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:52:10.837667" 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-10-11T00:52:10.807884" elapsed="0.029806"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:52:10.837745" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:52:10.837875" 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-10-11T00:52:10.738504" elapsed="0.099395"/>
</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-10-11T00:52:10.838179" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.837982" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.837967" elapsed="0.000293"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:52:10.838289" elapsed="0.000023"/>
</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-10-11T00:52:10.737908" elapsed="0.100476"/>
</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-10-11T00:52:10.838942" elapsed="0.000223"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:52:10.838642" elapsed="0.000581"/>
</kw>
<doc>Configure BGP application peer module.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:52:10.640805" elapsed="0.198451"/>
</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-10-11T00:52:10.840616" elapsed="0.000197"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:52:10.840352" 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-10-11T00:52:10.841807" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:10.841721" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.841703" elapsed="0.000181"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:10.844086" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:10.844004" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.843987" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.845101" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:10.844737" elapsed="0.000389"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.845556" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:52:10.845279" elapsed="0.000301"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:52:10.845620" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:52:10.845745" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:52:10.844353" elapsed="0.001414"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:10.848313" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:10.848230" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.848212" elapsed="0.000162"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:10.849447" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:10.849342" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.849325" elapsed="0.000184"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:52:10.849881" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:52:10.849696" elapsed="0.000210"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:52:10.850202" 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-10-11T00:52:10.850069" elapsed="0.000156"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:10.886051" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:52:10.850726" elapsed="0.035419"/>
</kw>
<msg time="2026-10-11T00:52:10.886293" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:52:10.886353" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:10.850381" elapsed="0.036010"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:52:10.926638" 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-10-11T00:52:10.886936" elapsed="0.039806"/>
</kw>
<msg time="2026-10-11T00:52:10.926903" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:52:10.926945" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:10.886582" elapsed="0.040398"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.927257" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.927050" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.927031" elapsed="0.000298"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.927765" 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-10-11T00:52:10.927534" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.928110" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.927909" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.927892" elapsed="0.000288"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:52:10.928210" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:52:10.930779" elapsed="0.000129"/>
</kw>
<msg time="2026-10-11T00:52:10.930965" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:10.929622" elapsed="0.001475"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.931401" elapsed="0.000097"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.931755" 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-10-11T00:52:10.929030" 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-10-11T00:52:10.928496" elapsed="0.003520"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:52:10.849087" elapsed="0.083002"/>
</kw>
<msg time="2026-10-11T00:52:10.932169" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:10.932209" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:10.848539" elapsed="0.083705"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:52:10.932396" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-10-11T00:52:10.932312" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.932295" 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-10-11T00:52:10.932819" 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-10-11T00:52:10.933176" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:52:10.933241" 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-10-11T00:52:10.847946" elapsed="0.085380"/>
</kw>
<msg time="2026-10-11T00:52:10.933433" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:10.933476" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:10.846106" elapsed="0.087405"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.933797" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.933579" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.933562" elapsed="0.000319"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:52:10.845965" elapsed="0.087937"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:52:10.845813" elapsed="0.088115"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:52:10.843701" elapsed="0.090274"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:52:10.841465" elapsed="0.092560"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:10.841058" elapsed="0.093007"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:52:10.840014" elapsed="0.094097"/>
</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-10-11T00:52:10.950580" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:52:10.950257" elapsed="0.000349"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:52:10.951347" 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-10-11T00:52:10.951106" elapsed="0.000322">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-10-11T00:52:10.951515" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:52:10.950765" elapsed="0.000773"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.952033" 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-10-11T00:52:10.951709" elapsed="0.000349"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:52:10.952330" 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-10-11T00:52:10.952528" 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-10-11T00:52:10.952223" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.952986" 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-10-11T00:52:10.952750" elapsed="0.000277"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.954241" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:10.953700" elapsed="0.000599"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.954972" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:52:10.954500" elapsed="0.000496"/>
</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-10-11T00:52:10.955331" 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-10-11T00:52:10.956080" elapsed="0.000048"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:52:10.956444" elapsed="0.000047"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:52:10.955145" elapsed="0.001497"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:52:10.955038" elapsed="0.001667"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:52:10.956748" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:52:10.956894" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:52:10.953338" elapsed="0.003580"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:10.953088" elapsed="0.003859"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.957117" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.956968" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.953070" elapsed="0.004115"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.957755" 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-10-11T00:52:10.957340" elapsed="0.000441"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:52:10.957824" 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/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-10-11T00:52:10.949740" elapsed="0.008196"/>
</kw>
<msg time="2026-10-11T00:52:10.957983" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:10.945247" elapsed="0.012780"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:52:10.962188" 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/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-10-11T00:52:10.966263" 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/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-10-11T00:52:10.970507" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.970688" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.970882" 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-10-11T00:52:10.971218" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.971075" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:52:10.971062" 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-10-11T00:52:10.971457" 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-10-11T00:52:10.971638" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.971799" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:52:10.971036" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:52:10.970948" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.972066" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:52:10.972133" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:52:10.972239" 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-10-11T00:52:10.944623" elapsed="0.027640"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:52:10.973354" 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-10-11T00:52:10.973169" elapsed="0.000260">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-10-11T00:52:10.973514" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:52:10.972847" elapsed="0.000689"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.973816" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.973599" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.974326" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:52:10.974066" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:10.973904" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.973582" elapsed="0.000820"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.974925" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:10.974579" elapsed="0.000370"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:52:10.974992" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:52:10.975115" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:52:10.972540" elapsed="0.002597"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:52:10.976207" 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-10-11T00:52:10.976023" elapsed="0.000242">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-10-11T00:52:10.976348" 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-10-11T00:52:10.975697" elapsed="0.000673"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:52:10.976548" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:52:10.976449" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.976431" elapsed="0.000193"/>
</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-10-11T00:52:10.976775" elapsed="0.000019"/>
</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-10-11T00:52:10.976966" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:52:10.977025" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:52:10.977146" 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-10-11T00:52:10.975385" elapsed="0.001784"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.978420" 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-10-11T00:52:10.978185" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.978879" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:10.978653" elapsed="0.000267"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:52:10.986244" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0b1d3klx1ezq21lvql84nhilbb4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:52:10.986449" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:52:10.986538" 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-10-11T00:52:10.979207" elapsed="0.007356"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:10.978979" elapsed="0.007622"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.986774" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.986624" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.978962" elapsed="0.007908"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.989273" 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-10-11T00:52:10.988943" elapsed="0.000374"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:10.988671" elapsed="0.000678"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.988653" elapsed="0.000718"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.989959" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:10.989678" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:10.989438" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.989422" elapsed="0.000631"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.990587" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:52:10.990226" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.990922" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.990675" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.991434" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:52:10.991156" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:10.990996" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.990658" elapsed="0.000854"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.992035" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:52:10.991683" elapsed="0.000377"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:10.992328" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:10.992122" elapsed="0.000257"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:10.992850" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:52:10.992577" elapsed="0.000298"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:10.992401" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.992106" elapsed="0.000820"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:10.993069" elapsed="0.000287"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:52:10.993752" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:52:10.993531" elapsed="0.000245"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:52:10.993938" elapsed="0.000210"/>
</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-10-11T00:52:10.988314" elapsed="0.005888"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:52:10.994344" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:10.994263" elapsed="0.000121"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.994246" elapsed="0.000158"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:52:10.995085" 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-10-11T00:52:10.994561" elapsed="0.000551"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:52:10.995157" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:52:10.995283" 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-10-11T00:52:10.977463" elapsed="0.017883"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:52:10.995405" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T00:52:10.995544" 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-10-11T00:52:10.937313" elapsed="0.058254"/>
</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-10-11T00:52:11.006913" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:52:11.006145" elapsed="0.000795"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:52:11.009017" 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-10-11T00:52:11.008522" elapsed="0.000610">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-10-11T00:52:11.009255" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:52:11.007099" elapsed="0.002179"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.010128" 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-10-11T00:52:11.009476" elapsed="0.000677"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:52:11.010543" 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-10-11T00:52:11.010757" 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-10-11T00:52:11.010320" elapsed="0.000462"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.011670" 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-10-11T00:52:11.011003" elapsed="0.000727"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:52:11.012338" elapsed="0.000093"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:11.011792" elapsed="0.000717"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.013322" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:52:11.012710" elapsed="0.000651"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:11.012534" elapsed="0.000958"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.011775" elapsed="0.001740"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.014501" 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-10-11T00:52:11.013678" elapsed="0.000850"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:52:11.014571" 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-10-11T00:52:11.005616" elapsed="0.009057"/>
</kw>
<msg time="2026-10-11T00:52:11.014719" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:11.001038" elapsed="0.013726"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:52:11.019015" 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/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-10-11T00:52:11.023148" 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/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-10-11T00:52:11.027275" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:11.027472" 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-10-11T00:52:11.027656" 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-10-11T00:52:11.028033" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:11.027888" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:52:11.027874" 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-10-11T00:52:11.028257" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:11.028453" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:11.028619" elapsed="0.000017"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:52:11.027832" elapsed="0.000833"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:52:11.027720" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:11.028851" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:52:11.028918" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:52:11.029023" 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-10-11T00:52:11.000192" elapsed="0.028856"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:11.029213" elapsed="0.000329"/>
</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-10-11T00:52:11.030486" 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-10-11T00:52:11.030193" elapsed="0.000321"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:52:11.030935" 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-10-11T00:52:11.030662" elapsed="0.000355"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:52:11.031203" elapsed="0.000298"/>
</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-10-11T00:52:11.029813" elapsed="0.001743"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:11.029612" elapsed="0.001973"/>
</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-10-11T00:52:11.031781" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:11.031608" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.029596" elapsed="0.002267"/>
</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-10-11T00:52:10.996539" elapsed="0.035368"/>
</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-10-11T00:52:10.995861" elapsed="0.036111"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:10.995639" elapsed="0.036371"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:10.995623" elapsed="0.036408"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:52:11.032061" elapsed="0.000026"/>
</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-10-11T00:52:10.936689" elapsed="0.095470"/>
</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-10-11T00:52:10.935139" elapsed="0.097072"/>
</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-10-11T00:52:10.934702" elapsed="0.097549"/>
</kw>
<arg>empty_topology</arg>
<arg>timeout=180s</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="PASS" start="2026-10-11T00:52:10.934229" elapsed="0.098070"/>
</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-10-11T00:52:11.032873" elapsed="0.000415"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:52:11.032555" elapsed="0.000790"/>
</kw>
<doc>Sanity check example-ipv4-topology is up but empty.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:52:10.839517" elapsed="0.193861"/>
</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-10-11T00:52:11.034870" elapsed="0.000198"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:52:11.034605" elapsed="0.000513"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:11.036022" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:11.035936" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.035919" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:11.038097" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:11.038014" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.037997" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.039073" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:11.038732" elapsed="0.000367"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.039528" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:52:11.039250" elapsed="0.000302"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:52:11.039593" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:52:11.039719" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:52:11.038360" elapsed="0.001381"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:11.042346" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:11.042261" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.042243" elapsed="0.000181"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:11.043478" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:11.043366" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.043349" elapsed="0.000226"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:52:11.043926" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:52:11.043724" elapsed="0.000227"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:52:11.044249" 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-10-11T00:52:11.044114" elapsed="0.000159"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:11.080519" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:52:11.044779" elapsed="0.035842"/>
</kw>
<msg time="2026-10-11T00:52:11.080770" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:52:11.080831" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:11.044447" elapsed="0.036438"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:52:11.124769" 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-10-11T00:52:11.081394" elapsed="0.043493"/>
</kw>
<msg time="2026-10-11T00:52:11.125035" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:52:11.125076" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:11.081056" elapsed="0.044056"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:11.125387" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:11.125181" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.125163" elapsed="0.000321"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.125905" 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-10-11T00:52:11.125664" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:11.126235" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:11.126036" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.126019" elapsed="0.000286"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:52:11.126335" 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-10-11T00:52:11.128725" elapsed="0.000131"/>
</kw>
<msg time="2026-10-11T00:52:11.128914" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:11.127689" elapsed="0.001355"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:11.129342" elapsed="0.000094"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:11.129694" elapsed="0.000070"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:52:11.127098" elapsed="0.002795"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:52:11.126623" elapsed="0.003329"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:52:11.043109" elapsed="0.086916"/>
</kw>
<msg time="2026-10-11T00:52:11.130107" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:11.130146" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:11.042577" elapsed="0.087604"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:52:11.130335" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:52:11.130249" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.130232" 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-10-11T00:52:11.130758" 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-10-11T00:52:11.131117" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:52:11.131182" 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-10-11T00:52:11.041973" elapsed="0.089295"/>
</kw>
<msg time="2026-10-11T00:52:11.131351" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:11.131390" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:11.040078" elapsed="0.091373"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:11.131742" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:11.131521" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.131504" elapsed="0.000309"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:52:11.039936" elapsed="0.091927"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:52:11.039787" elapsed="0.092106"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:52:11.037704" elapsed="0.094237"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:52:11.035675" elapsed="0.096314"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:11.035265" elapsed="0.096764"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:52:11.034243" elapsed="0.097831"/>
</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-10-11T00:52:11.132563" elapsed="0.000097"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:11.132186" elapsed="0.000525"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.136088" level="INFO">${start_cmd} = python3 bgp_app_peer.py --host 10.30.170.173 --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.173/tables=bgp-...</msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:52:11.135788" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.136543" level="INFO">python3 bgp_app_peer.py --host 10.30.170.173 --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.173/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-10-11T00:52:11.136306" elapsed="0.000281"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:11.141487" level="INFO">python3 bgp_app_peer.py --host 10.30.170.173 --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.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family &amp;&gt;/dev/null</msg>
<msg time="2026-10-11T00:52:11.141576" level="INFO">${output} =  python3 bgp_app_peer.py --host 10.30.170.173 --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.173/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-10-11T00:52:11.136740" elapsed="0.004859"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.142033" level="INFO"> python3 bgp_app_peer.py --host 10.30.170.173 --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.173/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-10-11T00:52:11.141795" elapsed="0.000283"/>
</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-10-11T00:52:11.135434" elapsed="0.006693"/>
</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-10-11T00:52:11.289020" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-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-10-11T00:52:11.144261" elapsed="0.144818"/>
</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-10-11T00:52:11.143795" elapsed="0.145328"/>
</kw>
<arg>${BGP_APP_PEER_TIMEOUT}</arg>
<doc>Wait ${timeout} for the tool exit.</doc>
<status status="PASS" start="2026-10-11T00:52:11.143467" elapsed="0.145708"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:11.292490" level="INFO">Executing command 'cat bgp_app_peer.log'.</msg>
<msg time="2026-10-11T00:52:11.305126" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:11.305214" level="INFO">${output_log} = 2026-10-11 00:52:11,256 INFO: Post 3 prefix(es) in a single request (starting from 8.0.1.0/28) into 10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:52:11.292364" elapsed="0.012875"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.305724" level="INFO">2026-10-11 00:52:11,256 INFO: Post 3 prefix(es) in a single request (starting from 8.0.1.0/28) into 10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family
2026-10-11 00:52:11,260 DEBUG: ...streaming chunk 1 (prefix: 8.0.1.0/28)
2026-10-11 00:52:11,260 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-10-11 00:52:11,261 DEBUG: ...streaming chunk 2 (prefix: 8.0.1.16/28)
2026-10-11 00:52:11,261 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-10-11 00:52:11,261 DEBUG: ...streaming chunk 3 (prefix: 8.0.1.32/28)
2026-10-11 00:52:11,261 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-10-11 00:52:11,276 DEBUG: &lt;PreparedRequest [POST]&gt; http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family
2026-10-11 00:52:11,276 DEBUG: Request headers: {'Content-Type': 'application/xml', 'Transfer-Encoding': 'chunked', 'Authorization': 'Basic YWRtaW46YWRtaW4='}:
2026-10-11 00:52:11,276 DEBUG: Response: 
2026-10-11 00:52:11,276 DEBUG: &lt;Response [201]&gt; Created
2026-10-11 00:52:11,276 INFO: Total test execution time: 0.020s
2026-10-11 00:52:11,276 INFO: Total build data time: 0.000s
2026-10-11 00:52:11,276 INFO: Total response time: 0.019s
2026-10-11 00:52:11,276 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-10-11T00:52:11.305457" elapsed="0.000343"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T00:52:11.306266" 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-10-11T00:52:11.305992" elapsed="0.000326"/>
</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-10-11T00:52:11.292017" elapsed="0.014354"/>
</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-10-11T00:52:11.306933" elapsed="0.000224"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:52:11.306630" elapsed="0.000585"/>
</kw>
<doc>Start BGP application peer tool and give it 30s</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:52:11.033729" elapsed="0.273518"/>
</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-10-11T00:52:11.308677" elapsed="0.000215"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:52:11.308429" elapsed="0.000512"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:11.309858" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:11.309756" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.309738" elapsed="0.000185"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:11.312078" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:11.311995" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.311977" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.313058" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:11.312718" elapsed="0.000365"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.313511" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:52:11.313234" elapsed="0.000301"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:52:11.313575" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:52:11.313702" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:52:11.312346" elapsed="0.001378"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:11.316260" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:11.316176" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.316159" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:11.317355" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:11.317272" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.317255" elapsed="0.000186"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:52:11.317755" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:52:11.317589" elapsed="0.000190"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:52:11.318098" 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-10-11T00:52:11.317962" elapsed="0.000160"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:11.354038" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:52:11.318626" elapsed="0.035505"/>
</kw>
<msg time="2026-10-11T00:52:11.354296" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:52:11.354338" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:11.318279" elapsed="0.036095"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:52:11.406905" 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-10-11T00:52:11.354910" elapsed="0.052108"/>
</kw>
<msg time="2026-10-11T00:52:11.407168" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:52:11.407208" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:11.354563" elapsed="0.052680"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:11.407542" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:11.407312" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.407295" elapsed="0.000320"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.408037" 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-10-11T00:52:11.407795" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:11.408369" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:11.408170" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.408154" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:52:11.408488" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:52:11.410878" elapsed="0.000236"/>
</kw>
<msg time="2026-10-11T00:52:11.411173" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:11.409828" 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-10-11T00:52:11.411627" elapsed="0.000072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:11.411971" 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-10-11T00:52:11.409230" 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-10-11T00:52:11.408757" elapsed="0.003456"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:52:11.317016" elapsed="0.095269"/>
</kw>
<msg time="2026-10-11T00:52:11.412365" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:11.412426" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:11.316486" elapsed="0.096007"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:52:11.412651" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:52:11.412565" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.412547" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:11.413060" 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-10-11T00:52:11.413365" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:52:11.413454" 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-10-11T00:52:11.315893" elapsed="0.097648"/>
</kw>
<msg time="2026-10-11T00:52:11.413624" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:11.413663" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:11.314103" elapsed="0.099595"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:11.414007" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:11.413764" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.413748" elapsed="0.000329"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:52:11.313961" elapsed="0.100137"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:52:11.313799" elapsed="0.100325"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:52:11.311688" elapsed="0.102483"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:52:11.309503" elapsed="0.104716"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:11.309090" elapsed="0.105168"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:52:11.308073" elapsed="0.106231"/>
</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-10-11T00:52:11.430757" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:52:11.430449" elapsed="0.000335"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:52:11.431521" 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-10-11T00:52:11.431277" elapsed="0.000306">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-10-11T00:52:11.431666" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:52:11.430959" elapsed="0.000729"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.432186" 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-10-11T00:52:11.431875" elapsed="0.000336"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:52:11.432508" 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-10-11T00:52:11.432623" 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-10-11T00:52:11.432376" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.433077" 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-10-11T00:52:11.432856" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.434370" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:11.433851" elapsed="0.000600"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.435101" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:52:11.434628" elapsed="0.000497"/>
</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-10-11T00:52:11.435474" 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-10-11T00:52:11.436170" elapsed="0.000047"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:52:11.436532" elapsed="0.000043"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:52:11.435275" elapsed="0.001412"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:52:11.435167" elapsed="0.001581"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:52:11.436790" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:52:11.436939" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:52:11.433493" elapsed="0.003469"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:11.433211" elapsed="0.003780"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:11.437160" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:11.437013" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.433192" elapsed="0.004036"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.437798" 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-10-11T00:52:11.437385" elapsed="0.000438"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:52:11.437885" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:52:11.429923" elapsed="0.008061"/>
</kw>
<msg time="2026-10-11T00:52:11.438031" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:11.425356" elapsed="0.012718"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:52:11.442306" 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/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-10-11T00:52:11.446448" 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/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-10-11T00:52:11.450693" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:11.450907" 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-10-11T00:52:11.451091" 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-10-11T00:52:11.451446" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:11.451284" elapsed="0.000250"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:52:11.451270" 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-10-11T00:52:11.451715" 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-10-11T00:52:11.451912" 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-10-11T00:52:11.452078" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:52:11.451245" elapsed="0.000881"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:52:11.451156" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:11.452300" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:52:11.452366" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:52:11.452491" 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-10-11T00:52:11.424756" elapsed="0.027759"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:52:11.453625" 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-10-11T00:52:11.453437" elapsed="0.000247">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-10-11T00:52:11.453768" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:52:11.453097" elapsed="0.000693"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:11.454088" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:11.453866" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.454618" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:52:11.454325" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:11.454161" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.453848" elapsed="0.000846"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.455202" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:11.454867" elapsed="0.000359"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:52:11.455270" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:52:11.455393" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:52:11.452779" elapsed="0.002653"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:52:11.456523" 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-10-11T00:52:11.456318" elapsed="0.000264">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-10-11T00:52:11.456666" 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-10-11T00:52:11.455999" elapsed="0.000689"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:52:11.456865" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:52:11.456751" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.456734" elapsed="0.000208"/>
</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-10-11T00:52:11.457097" elapsed="0.000019"/>
</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-10-11T00:52:11.457269" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:52:11.457328" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:52:11.457467" 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-10-11T00:52:11.455682" elapsed="0.001839"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.458758" 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-10-11T00:52:11.458533" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.459221" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:11.459005" elapsed="0.000256"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:52:11.466735" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0b1d3klx1ezq21lvql84nhilbb4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:52:11.466862" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:52:11.466948" 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-10-11T00:52:11.459570" elapsed="0.007402"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:11.459320" 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-10-11T00:52:11.467185" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:11.467034" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.459303" elapsed="0.007958"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.468700" 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-10-11T00:52:11.468346" elapsed="0.000399"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:11.468103" elapsed="0.000673"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.468086" elapsed="0.000713"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.469369" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:11.469103" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:11.468862" elapsed="0.000595"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.468834" elapsed="0.000645"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.470012" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:52:11.469658" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:11.470307" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:11.470099" elapsed="0.000260"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.470827" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:52:11.470562" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:11.470381" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.470083" elapsed="0.000833"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.471439" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:52:11.471089" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:11.471734" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:11.471528" elapsed="0.000257"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.472239" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:52:11.471980" elapsed="0.000283"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:11.471807" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.471511" elapsed="0.000803"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:11.472472" elapsed="0.000289"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:52:11.473171" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:52:11.472948" elapsed="0.000275"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:52:11.473379" elapsed="0.000234"/>
</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-10-11T00:52:11.467751" elapsed="0.005917"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:52:11.473810" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:11.473729" elapsed="0.000133"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.473712" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:52:11.474599" 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-10-11T00:52:11.474023" elapsed="0.000602"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:52:11.474671" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:52:11.474796" 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-10-11T00:52:11.457802" elapsed="0.017018"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:52:11.474890" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:52:11.475011" 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-10-11T00:52:11.417449" elapsed="0.057586"/>
</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-10-11T00:52:11.486219" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:52:11.485489" elapsed="0.000757"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:52:11.488276" 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-10-11T00:52:11.487792" elapsed="0.000598">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-10-11T00:52:11.488538" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:52:11.486425" elapsed="0.002137"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.489374" 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-10-11T00:52:11.488736" elapsed="0.000664"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:52:11.489820" 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-10-11T00:52:11.490042" 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-10-11T00:52:11.489631" elapsed="0.000436"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.490914" 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-10-11T00:52:11.490263" elapsed="0.000712"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:52:11.491574" elapsed="0.000074"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:11.491036" elapsed="0.000686"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.492598" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:52:11.491967" elapsed="0.000671"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:11.491774" elapsed="0.000940"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.491019" elapsed="0.001717"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.493709" 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-10-11T00:52:11.492913" elapsed="0.000824"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:52:11.493780" 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//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-10-11T00:52:11.484966" elapsed="0.008927"/>
</kw>
<msg time="2026-10-11T00:52:11.493942" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:11.480514" elapsed="0.013472"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:52:11.498194" 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/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-10-11T00:52:11.502272" 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/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-10-11T00:52:11.506610" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:11.506792" 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-10-11T00:52:11.506988" 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-10-11T00:52:11.507349" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:11.507205" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:52:11.507191" 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-10-11T00:52:11.507600" 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-10-11T00:52:11.507777" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:11.507970" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:52:11.507163" elapsed="0.000855"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:52:11.507053" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:11.508192" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:52:11.508257" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:52:11.508363" 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-10-11T00:52:11.479792" elapsed="0.028647"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:11.508614" elapsed="0.000434"/>
</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-10-11T00:52:11.511602" 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-10-11T00:52:11.510661" elapsed="0.001003"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:52:11.512710" 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-10-11T00:52:11.512051" elapsed="0.000686"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:52:11.512932" elapsed="0.000281"/>
</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-10-11T00:52:11.509765" elapsed="0.003502"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:11.509244" elapsed="0.004053"/>
</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-10-11T00:52:11.513515" elapsed="0.000101"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:11.513319" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.509202" elapsed="0.004468"/>
</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-10-11T00:52:11.475989" elapsed="0.037725"/>
</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-10-11T00:52:11.475309" elapsed="0.038469"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:11.475107" elapsed="0.038710"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.475091" elapsed="0.038757"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:52:11.513879" elapsed="0.000027"/>
</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-10-11T00:52:11.416818" elapsed="0.097162"/>
</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-10-11T00:52:11.415282" elapsed="0.098750"/>
</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-10-11T00:52:11.414877" elapsed="0.099194"/>
</kw>
<arg>filled_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="PASS" start="2026-10-11T00:52:11.414516" elapsed="0.099605"/>
</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-10-11T00:52:11.514670" elapsed="0.000237"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:52:11.514354" elapsed="0.000609"/>
</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-10-11T00:52:11.307508" elapsed="0.207487"/>
</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-10-11T00:52:11.516309" elapsed="0.000218"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:52:11.516062" elapsed="0.000515"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:11.517484" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:11.517376" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.517359" elapsed="0.000187"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:11.520648" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:11.520563" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.520546" elapsed="0.000164"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.521667" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:11.521322" elapsed="0.000371"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.522123" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:52:11.521860" elapsed="0.000287"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:52:11.522187" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:52:11.522312" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:52:11.520930" elapsed="0.001404"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:11.524859" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:11.524754" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.524736" elapsed="0.000188"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:11.525966" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:11.525882" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.525864" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:52:11.526341" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:52:11.526174" elapsed="0.000191"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:52:11.526689" 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-10-11T00:52:11.526555" elapsed="0.000157"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:11.588821" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:52:11.527205" elapsed="0.061727"/>
</kw>
<msg time="2026-10-11T00:52:11.589084" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:52:11.589125" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:11.526879" elapsed="0.062281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:52:11.622310" 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-10-11T00:52:11.589690" elapsed="0.032742"/>
</kw>
<msg time="2026-10-11T00:52:11.622585" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:52:11.622627" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:11.589324" elapsed="0.033338"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:11.622952" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:11.622731" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.622712" elapsed="0.000312"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.623441" 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-10-11T00:52:11.623200" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:11.623759" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:11.623562" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.623546" elapsed="0.000283"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:52:11.623875" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:52:11.626270" elapsed="0.000255"/>
</kw>
<msg time="2026-10-11T00:52:11.626583" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:11.625227" 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-10-11T00:52:11.627036" elapsed="0.000072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:11.627398" 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-10-11T00:52:11.624633" elapsed="0.002969"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:52:11.624141" elapsed="0.003520"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:52:11.525612" elapsed="0.102122"/>
</kw>
<msg time="2026-10-11T00:52:11.627815" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:11.627869" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:11.525075" elapsed="0.102831"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:52:11.628058" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:52:11.627974" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.627957" elapsed="0.000176"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:11.628474" 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-10-11T00:52:11.628778" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:52:11.628873" 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-10-11T00:52:11.524466" elapsed="0.104495"/>
</kw>
<msg time="2026-10-11T00:52:11.629045" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:11.629083" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:11.522675" elapsed="0.106443"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:11.629401" elapsed="0.000099"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:11.629183" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:11.629167" elapsed="0.000385"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:52:11.522534" elapsed="0.107040"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:52:11.522379" elapsed="0.107220"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:52:11.520247" elapsed="0.109399"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:52:11.517126" elapsed="0.112568"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:11.516725" elapsed="0.113007"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:52:11.515709" elapsed="0.114067"/>
</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-10-11T00:52:11.630179" elapsed="0.000092"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:11.629902" elapsed="0.000419"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.633519" level="INFO">${start_cmd} = python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T00:52:11.633223" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.633981" level="INFO">python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --peerport=1790 --debug </msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:11.633750" elapsed="0.000272"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:11.636782" level="INFO">python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --peerport=1790 --debug</msg>
<msg time="2026-10-11T00:52:11.636876" level="INFO">${output} =  python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --peerport=1790 --debug 
</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-10-11T00:52:11.634178" elapsed="0.002724"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:11.637328" level="INFO"> python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --peerport=1790 --debug 
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:11.637109" elapsed="0.000261"/>
</kw>
<arg>${BGP_PEER_COMMAND}</arg>
<arg>${BGP_PEER_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-10-11T00:52:11.632887" elapsed="0.004548"/>
</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-10-11T00:52:21.639686" level="FAIL">No match found for '&gt;' in 10 seconds
Output:
[?2004l2026-10-11 00:52:11,732 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:52:11,733 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 00:52:11,733 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 00:52:11,733 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 00:52:11,733 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 00:52:11,734 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:52:11,736 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:52:11,736 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:52:11,736 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:52:11,736 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-10-11 00:52:11,736 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-10-11 00:52:11,736 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 00:52:11,736 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 00:52:11,736 INFO BGP-Thread-1 (job):   My BGP Identifier: 169782023
2026-10-11 00:52:11,737 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 00:52:11,737 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 00:52:11,737 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 00:52:11,737 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 00:52:11,737 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 00:52:11,737 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 00:52:11,737 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-10-11 00:52:11,737 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-10-11 00:52:11,737 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 00:52:11,737 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 00:52:11,737 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 00:52:11,737 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:52:11,737 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-10-11 00:52:11,737 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 00:52:11,738 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 00:52:11,738 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-10-11 00:52:11,738 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 00:52:11,738 DEBUG BGP-Thread-1 (job):   BGP Identifier=169782023 (0x0a1eab07)
2026-10-11 00:52:11,738 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-10-11 00:52:11,738 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf0
2026-10-11 00:52:11,738 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf000b40a1eab07100206010400010001020641040000fbf0'
2026-10-11 00:52:11,738 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf000b40a1eab07100206010400010001020641040000fbf0
2026-10-11 00:52:11,740 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:52:11,740 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:52:11,740 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:52:11,740 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:52:11,740 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:52:11,740 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:52:11,740 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:52:11,740 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:52:11,740 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:52:11,741 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:52:11,741 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 00:52:11,741 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:52:11,741 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:52:11,741 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:52:11,750 INFO BGP-Thread-1 (job): ... idle for 0.009s
2026-10-11 00:52:11,750 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.009s
2026-10-11 00:52:11,751 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 00:52:11,751 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:52:11,751 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:52:11,751 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 00:52:11,751 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:52:11,751 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:52:11,751 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:11,751 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:11,751 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:11,751 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:11,751 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:11,752 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-10-11T00:52:11.639006" elapsed="10.001516">No match found for '&gt;' in 10 seconds
Output:
[?2004l
2026-10-11 00:52:11,732 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:52:11,733 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 00:52:11,733 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 00:52:11,733 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 00:52:11,733 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 00:52:11,734 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:52:11,736 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:52:11,736 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:52:11,736 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:52:11,736 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-10-11 00:52:11,736 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
    [ Message content over the limit has been removed. ]
2026-10-11 00:52:11,751 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:11,751 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:11,751 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:11,751 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:11,751 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:11,752 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-10-11T00:52:21.640941" elapsed="0.000030"/>
</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-10-11T00:52:11.638716" elapsed="10.002416">No match found for '&gt;' in 10 seconds
Output:
[?2004l
2026-10-11 00:52:11,732 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:52:11,733 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 00:52:11,733 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 00:52:11,733 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 00:52:11,733 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 00:52:11,734 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:52:11,736 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:52:11,736 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:52:11,736 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:52:11,736 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-10-11 00:52:11,736 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
    [ Message content over the limit has been removed. ]
2026-10-11 00:52:11,751 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:11,751 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:11,751 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:11,751 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:11,751 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:11,752 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-10-11T00:52:11.638335" elapsed="10.002932"/>
</kw>
<msg time="2026-10-11T00:52:21.641367" 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-10-11T00:52:11.637933" elapsed="10.003458"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-10-11T00:52:21.641576" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-10-11T00:52:21.641494" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:21.641468" elapsed="0.000191"/>
</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-10-11T00:52:21.641907" elapsed="0.000025"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:21.642087" elapsed="0.000018"/>
</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-10-11T00:52:11.637651" elapsed="10.004509"/>
</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-10-11T00:52:21.642755" elapsed="0.000322"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:52:21.642425" elapsed="0.000712"/>
</kw>
<doc>Start BGP peer tool</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:52:11.515255" elapsed="10.127916"/>
</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-10-11T00:52:21.645034" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:52:21.644451" elapsed="0.000841"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:21.646395" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:21.646295" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:21.646277" 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-10-11T00:52:21.648575" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:21.648491" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:21.648474" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:21.649570" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:21.649221" elapsed="0.000374"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:52:21.650032" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:52:21.649750" elapsed="0.000306"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:52:21.650096" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:52:21.650221" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:52:21.648862" elapsed="0.001382"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:21.652856" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:21.652758" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:21.652739" elapsed="0.000179"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:21.653979" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:21.653896" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:21.653879" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:52:21.654363" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:52:21.654189" elapsed="0.000198"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:52:21.654722" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:52:21.654579" elapsed="0.000166"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:21.690321" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:52:21.655254" elapsed="0.035181"/>
</kw>
<msg time="2026-10-11T00:52:21.690601" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:52:21.690645" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:21.654922" elapsed="0.035759"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:52:21.743102" 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-10-11T00:52:21.691210" elapsed="0.052125"/>
</kw>
<msg time="2026-10-11T00:52:21.743508" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:52:21.743550" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:21.690870" elapsed="0.052716"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:21.743883" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:21.743655" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:21.743638" elapsed="0.000318"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:21.744368" 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-10-11T00:52:21.744139" elapsed="0.000325"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:21.744725" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:21.744525" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:21.744508" elapsed="0.000287"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:52:21.744840" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:52:21.747316" elapsed="0.000138"/>
</kw>
<msg time="2026-10-11T00:52:21.747512" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:21.746214" 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-10-11T00:52:21.747986" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:21.748325" 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-10-11T00:52:21.745623" elapsed="0.002906"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:52:21.745130" elapsed="0.003460"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:52:21.653627" elapsed="0.095035"/>
</kw>
<msg time="2026-10-11T00:52:21.748745" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:21.748784" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:21.653068" elapsed="0.095793"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:52:21.749020" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:52:21.748933" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:21.748915" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:21.749441" 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-10-11T00:52:21.749746" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:52:21.749840" 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-10-11T00:52:21.652471" elapsed="0.097461"/>
</kw>
<msg time="2026-10-11T00:52:21.750016" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:21.750055" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:21.650632" elapsed="0.099458"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:21.750378" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:21.750156" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:21.750140" elapsed="0.000389"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:52:21.650454" elapsed="0.100097"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:52:21.650294" elapsed="0.100286"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:52:21.648183" elapsed="0.102445"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:52:21.645878" elapsed="0.104798"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:21.645460" elapsed="0.105255"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:52:21.644084" elapsed="0.106676"/>
</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-10-11T00:52:21.751164" elapsed="0.000093"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:21.750891" elapsed="0.000416"/>
</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-10-11T00:52:21.756024" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:21.769113" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:21.769202" 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-10-11T00:52:21.755897" elapsed="0.013327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:21.769678" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:21.769446" elapsed="0.000273"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:52:21.770195" level="FAIL">0 != 3</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-10-11T00:52:21.769889" elapsed="0.000365">0 != 3</status>
</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="FAIL" start="2026-10-11T00:52:21.755521" elapsed="0.014826">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:22.780485" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:22.793753" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:22.793976" 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-10-11T00:52:22.780168" elapsed="0.013860"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:22.795077" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:22.794523" elapsed="0.000647"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:52:22.796276" level="FAIL">0 != 3</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-10-11T00:52:22.795575" elapsed="0.000830">0 != 3</status>
</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="FAIL" start="2026-10-11T00:52:22.779280" elapsed="0.017369">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:23.806316" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:23.819582" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:23.819881" 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-10-11T00:52:23.806029" elapsed="0.013907"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:23.820988" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:23.820387" elapsed="0.000695"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:52:23.822199" level="FAIL">0 != 3</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-10-11T00:52:23.821487" elapsed="0.000842">0 != 3</status>
</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="FAIL" start="2026-10-11T00:52:23.805104" elapsed="0.017464">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:24.832163" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:24.845540" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:24.845737" 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-10-11T00:52:24.831880" elapsed="0.013909"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:24.846887" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:24.846267" elapsed="0.000719"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:52:24.848051" level="FAIL">0 != 3</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-10-11T00:52:24.847330" elapsed="0.000850">0 != 3</status>
</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="FAIL" start="2026-10-11T00:52:24.831004" elapsed="0.017381">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:25.858216" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:25.871557" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:25.871755" 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-10-11T00:52:25.857927" elapsed="0.013907"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:25.872886" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:25.872289" elapsed="0.000691"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:52:25.874044" level="FAIL">0 != 3</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-10-11T00:52:25.873322" elapsed="0.000850">0 != 3</status>
</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="FAIL" start="2026-10-11T00:52:25.857035" elapsed="0.017341">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:26.884566" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:26.897934" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:26.898137" 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-10-11T00:52:26.884247" elapsed="0.013941"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:26.899226" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:26.898678" elapsed="0.000639"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:52:26.900377" level="FAIL">0 != 3</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-10-11T00:52:26.899687" elapsed="0.000854">0 != 3</status>
</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="FAIL" start="2026-10-11T00:52:26.883362" elapsed="0.017385">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:27.910526" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:27.923633" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:27.923858" 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-10-11T00:52:27.910207" elapsed="0.013704"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:27.924958" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:27.924363" elapsed="0.000690"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:52:27.926115" level="FAIL">0 != 3</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-10-11T00:52:27.925394" elapsed="0.000851">0 != 3</status>
</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="FAIL" start="2026-10-11T00:52:27.909313" elapsed="0.017172">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:28.936195" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:28.949846" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:28.950045" 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-10-11T00:52:28.935909" elapsed="0.014189"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:28.951195" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:28.950642" elapsed="0.000648"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:52:28.952358" level="FAIL">0 != 3</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-10-11T00:52:28.951662" elapsed="0.000859">0 != 3</status>
</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="FAIL" start="2026-10-11T00:52:28.935029" elapsed="0.017817">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:29.962643" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:29.975994" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:29.976189" 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-10-11T00:52:29.962326" elapsed="0.013915"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:29.977294" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:29.976733" elapsed="0.000658"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:52:29.978503" level="FAIL">0 != 3</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-10-11T00:52:29.977769" elapsed="0.000867">0 != 3</status>
</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="FAIL" start="2026-10-11T00:52:29.961470" elapsed="0.017398">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:30.985890" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:30.999609" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:30.999749" 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-10-11T00:52:30.985678" elapsed="0.014125"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:31.000487" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:31.000097" elapsed="0.000451"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:52:31.001214" level="FAIL">0 != 3</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-10-11T00:52:31.000764" elapsed="0.000536">0 != 3</status>
</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="FAIL" start="2026-10-11T00:52:30.985058" elapsed="0.016399">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:32.011115" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:32.024205" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:32.024404" 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-10-11T00:52:32.010828" elapsed="0.013668"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.025533" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:32.024976" elapsed="0.000651"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.026686" level="FAIL">0 != 3</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-10-11T00:52:32.025989" elapsed="0.000846">0 != 3</status>
</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="FAIL" start="2026-10-11T00:52:32.009931" elapsed="0.017111">0 != 3</status>
</kw>
<msg time="2026-10-11T00:52:32.027221" level="FAIL">Keyword 'Check_File_For_Word_Count' failed after retrying for 10 seconds. The last error was: 0 != 3</msg>
<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="FAIL" start="2026-10-11T00:52:21.751537" elapsed="10.275901">Keyword 'Check_File_For_Word_Count' failed after retrying for 10 seconds. The last error was: 0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<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="NOT RUN" start="2026-10-11T00:52:32.035890" elapsed="0.000058"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<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="NOT RUN" start="2026-10-11T00:52:32.044186" elapsed="0.000055"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<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="NOT RUN" start="2026-10-11T00:52:32.052398" elapsed="0.000076"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<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="NOT RUN" start="2026-10-11T00:52:32.060794" elapsed="0.000056"/>
</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-10-11T00:52:32.063887" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:52:32.063171" elapsed="0.000807"/>
</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-10-11T00:52:32.062258" elapsed="0.001826"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:52:32.061498" elapsed="0.002697"/>
</kw>
<doc>Check incomming updates for new routes</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-10-11T00:52:21.643525" elapsed="10.420747">Keyword 'Check_File_For_Word_Count' failed after retrying for 10 seconds. The last error was: 0 != 3</status>
</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-10-11T00:52:32.067581" elapsed="0.000473"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:52:32.066994" elapsed="0.001286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:32.070568" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:32.070293" elapsed="0.000377"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.070240" elapsed="0.000476"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:32.074923" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:32.074760" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.074735" elapsed="0.000276"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.076304" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:32.075849" elapsed="0.000491"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.076967" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:52:32.076580" elapsed="0.000420"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:52:32.077057" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T00:52:32.077239" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:52:32.075304" elapsed="0.001967"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:32.080884" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:32.080748" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.080724" elapsed="0.000249"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:32.082504" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:32.082352" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.082328" elapsed="0.000263"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:52:32.083062" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:52:32.082818" elapsed="0.000277"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:52:32.083538" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:52:32.083324" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:32.121050" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:52:32.084270" elapsed="0.036889"/>
</kw>
<msg time="2026-10-11T00:52:32.121316" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:52:32.121358" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:32.083810" elapsed="0.037584"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:52:32.168157" 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-10-11T00:52:32.121978" elapsed="0.046453"/>
</kw>
<msg time="2026-10-11T00:52:32.168674" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:52:32.168718" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:32.121607" elapsed="0.047148"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:32.169241" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:32.168891" elapsed="0.000408"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.168851" elapsed="0.000474"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.169899" 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-10-11T00:52:32.169533" elapsed="0.000445"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:32.170241" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:32.170040" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.170022" elapsed="0.000365"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:52:32.170451" 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-10-11T00:52:32.173167" elapsed="0.000385"/>
</kw>
<msg time="2026-10-11T00:52:32.173613" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:32.172029" elapsed="0.001729"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:32.174086" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:32.174448" 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-10-11T00:52:32.171369" elapsed="0.003271"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:52:32.170838" 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-10-11T00:52:32.081994" elapsed="0.092783"/>
</kw>
<msg time="2026-10-11T00:52:32.174878" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:32.174918" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:32.081185" elapsed="0.093769"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:52:32.175112" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:52:32.175025" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.175007" elapsed="0.000183"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:32.175618" 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-10-11T00:52:32.175954" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:52:32.176019" 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-10-11T00:52:32.080335" elapsed="0.095771"/>
</kw>
<msg time="2026-10-11T00:52:32.176192" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:32.176233" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:32.077769" elapsed="0.098499"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:32.176636" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:32.176336" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.176320" elapsed="0.000386"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:52:32.077570" elapsed="0.099158"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:52:32.077343" elapsed="0.099421"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:52:32.074252" elapsed="0.102583"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:52:32.069655" elapsed="0.107236"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:32.068650" elapsed="0.108287"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:52:32.066084" elapsed="0.110906"/>
</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-10-11T00:52:32.177430" elapsed="0.000099"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:32.177129" elapsed="0.000451"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.180941" level="INFO">${start_cmd} = python3 bgp_app_peer.py --host 10.30.170.173 --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.173/tables=bg...</msg>
<var>${start_cmd}</var>
<arg>${command} ${tool_opt}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:52:32.180639" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.181380" level="INFO">python3 bgp_app_peer.py --host 10.30.170.173 --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.173/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-10-11T00:52:32.181165" elapsed="0.000312"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:32.186629" level="INFO">python3 bgp_app_peer.py --host 10.30.170.173 --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.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family &amp;&gt;/dev/null</msg>
<msg time="2026-10-11T00:52:32.186714" level="INFO">${output} =  python3 bgp_app_peer.py --host 10.30.170.173 --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.173/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-10-11T00:52:32.181636" elapsed="0.005103"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.187172" level="INFO"> python3 bgp_app_peer.py --host 10.30.170.173 --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.173/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-10-11T00:52:32.186949" elapsed="0.000271"/>
</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-10-11T00:52:32.180266" elapsed="0.007006"/>
</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-10-11T00:52:32.357102" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-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-10-11T00:52:32.189431" elapsed="0.167745"/>
</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-10-11T00:52:32.188947" elapsed="0.168278"/>
</kw>
<arg>${BGP_APP_PEER_TIMEOUT}</arg>
<doc>Wait ${timeout} for the tool exit.</doc>
<status status="PASS" start="2026-10-11T00:52:32.188604" elapsed="0.168679"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:32.360702" level="INFO">Executing command 'cat bgp_app_peer.log'.</msg>
<msg time="2026-10-11T00:52:32.372876" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:32.372967" level="INFO">${output_log} = 2026-10-11 00:52:32,301 INFO: Delete 3 prefix(es) (starting from 8.0.1.0/28) from 10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:52:32.360583" elapsed="0.012408"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.373457" level="INFO">2026-10-11 00:52:32,301 INFO: Delete 3 prefix(es) (starting from 8.0.1.0/28) from 10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family
2026-10-11 00:52:32,301 INFO: Deleting prefix 8.0.1.0/28/,0 from 10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family
2026-10-11 00:52:32,314 DEBUG: &lt;PreparedRequest [DELETE]&gt; http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11 00:52:32,314 DEBUG: Request headers: {'Content-Type': 'application/xml', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='}:
2026-10-11 00:52:32,314 DEBUG: Response: 
2026-10-11 00:52:32,314 DEBUG: &lt;Response [204]&gt; No Content
2026-10-11 00:52:32,314 INFO: Deleting prefix 8.0.1.16/28/,0 from 10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family
2026-10-11 00:52:32,325 DEBUG: &lt;PreparedRequest [DELETE]&gt; http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11 00:52:32,325 DEBUG: Request headers: {'Content-Type': 'application/xml', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='}:
2026-10-11 00:52:32,325 DEBUG: Response: 
2026-10-11 00:52:32,325 DEBUG: &lt;Response [204]&gt; No Content
2026-10-11 00:52:32,325 INFO: Deleting prefix 8.0.1.32/28/,0 from 10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family
2026-10-11 00:52:32,339 DEBUG: &lt;PreparedRequest [DELETE]&gt; http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11 00:52:32,339 DEBUG: Request headers: {'Content-Type': 'application/xml', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='}:
2026-10-11 00:52:32,339 DEBUG: Response: 
2026-10-11 00:52:32,339 DEBUG: &lt;Response [204]&gt; No Content
2026-10-11 00:52:32,339 INFO: Total test execution time: 0.038s
2026-10-11 00:52:32,340 INFO: Total build data time: 0.000s
2026-10-11 00:52:32,340 INFO: Total response time: 0.036s
2026-10-11 00:52:32,340 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-10-11T00:52:32.373191" elapsed="0.000330"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T00:52:32.374086" 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-10-11T00:52:32.373716" elapsed="0.000423"/>
</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-10-11T00:52:32.360192" elapsed="0.014000"/>
</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-10-11T00:52:32.374765" elapsed="0.000245"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:52:32.374469" elapsed="0.000599"/>
</kw>
<doc>Start BGP application peer tool and give him 30s</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:52:32.064976" elapsed="0.310126"/>
</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-10-11T00:52:32.376579" elapsed="0.000259"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:52:32.376309" 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-10-11T00:52:32.378167" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:32.378055" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.377725" elapsed="0.000513"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:32.380288" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:32.380200" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.380183" elapsed="0.000166"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.381285" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:32.380952" elapsed="0.000358"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.381744" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:52:32.381479" elapsed="0.000289"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:52:32.381832" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T00:52:32.381972" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:52:32.380579" elapsed="0.001416"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:32.384610" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:32.384524" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.384504" elapsed="0.000169"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:32.385749" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:32.385663" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.385645" elapsed="0.000179"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:52:32.386154" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:52:32.385976" elapsed="0.000202"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:52:32.386504" 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-10-11T00:52:32.386346" elapsed="0.000182"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:32.423262" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:52:32.387038" elapsed="0.036319"/>
</kw>
<msg time="2026-10-11T00:52:32.423537" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:52:32.423579" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:32.386688" elapsed="0.036926"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:52:32.466332" 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-10-11T00:52:32.424192" elapsed="0.042289"/>
</kw>
<msg time="2026-10-11T00:52:32.466659" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:52:32.466701" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:32.423837" elapsed="0.042899"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:32.467074" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:32.466826" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.466801" elapsed="0.000352"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.467586" 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-10-11T00:52:32.467335" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:32.467930" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:32.467714" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.467697" elapsed="0.000355"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:52:32.468083" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:52:32.470747" elapsed="0.000157"/>
</kw>
<msg time="2026-10-11T00:52:32.470963" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:32.469488" elapsed="0.001614"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:32.471427" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:32.471765" 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-10-11T00:52:32.468877" elapsed="0.003088"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:52:32.468363" elapsed="0.003662"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:52:32.385381" elapsed="0.086717"/>
</kw>
<msg time="2026-10-11T00:52:32.472179" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:32.472219" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:32.384839" elapsed="0.087418"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:52:32.472442" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:52:32.472327" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.472309" 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-10-11T00:52:32.472865" 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-10-11T00:52:32.473171" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:52:32.473235" 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-10-11T00:52:32.384197" elapsed="0.089123"/>
</kw>
<msg time="2026-10-11T00:52:32.473426" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:32.473470" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:32.382349" elapsed="0.091157"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:32.473807" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:32.473573" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.473557" elapsed="0.000322"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:52:32.382205" elapsed="0.091695"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:52:32.382049" elapsed="0.091880"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:52:32.379907" elapsed="0.094071"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:52:32.377475" elapsed="0.096553"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:32.377040" elapsed="0.097028"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:52:32.375965" elapsed="0.098149"/>
</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-10-11T00:52:32.490973" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:52:32.490644" elapsed="0.000356"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:52:32.491761" 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-10-11T00:52:32.491501" elapsed="0.000391">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-10-11T00:52:32.491981" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:52:32.491163" elapsed="0.000841"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.492518" 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-10-11T00:52:32.492179" elapsed="0.000365"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:52:32.492843" 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-10-11T00:52:32.492973" 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-10-11T00:52:32.492712" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.493428" 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-10-11T00:52:32.493191" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.494777" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:32.494222" elapsed="0.000630"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.495517" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:52:32.495033" elapsed="0.000509"/>
</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-10-11T00:52:32.495892" 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-10-11T00:52:32.496608" elapsed="0.000047"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:52:32.496970" elapsed="0.000044"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:52:32.495693" elapsed="0.001437"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:52:32.495585" elapsed="0.001606"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:52:32.497232" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:52:32.497363" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:52:32.493871" elapsed="0.003516"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:32.493557" elapsed="0.003881"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:32.497611" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:32.497462" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.493532" elapsed="0.004147"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.498246" 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-10-11T00:52:32.497857" elapsed="0.000415"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:52:32.498315" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:52:32.490073" elapsed="0.008367"/>
</kw>
<msg time="2026-10-11T00:52:32.498492" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:32.485381" elapsed="0.013155"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:52:32.502730" 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/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-10-11T00:52:32.506836" elapsed="0.000054"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${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-10-11T00:52:32.512441" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:32.512626" 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-10-11T00:52:32.512820" 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-10-11T00:52:32.513159" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:32.513012" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:52:32.512998" 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-10-11T00:52:32.513389" 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-10-11T00:52:32.513588" 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-10-11T00:52:32.513751" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:52:32.512974" elapsed="0.000840"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:52:32.512887" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:32.514001" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:52:32.514069" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:52:32.514175" 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-10-11T00:52:32.484789" elapsed="0.029410"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:52:32.515306" 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-10-11T00:52:32.515120" elapsed="0.000246">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-10-11T00:52:32.515464" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:52:32.514796" elapsed="0.000692"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:32.515774" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:32.515552" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.516310" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:52:32.516041" elapsed="0.000294"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:32.515875" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.515535" elapsed="0.000850"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.516909" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:32.516560" elapsed="0.000374"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:52:32.516978" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:52:32.517103" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:52:32.514484" elapsed="0.002642"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:52:32.518263" 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-10-11T00:52:32.518079" elapsed="0.000242">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-10-11T00:52:32.518420" 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-10-11T00:52:32.517742" elapsed="0.000703"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:52:32.518609" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:52:32.518509" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.518492" elapsed="0.000193"/>
</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-10-11T00:52:32.518853" 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-10-11T00:52:32.519033" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:52:32.519092" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:52:32.519215" 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-10-11T00:52:32.517439" elapsed="0.001801"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.520498" 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-10-11T00:52:32.520256" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.520969" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:32.520732" elapsed="0.000277"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:52:32.528266" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0b1d3klx1ezq21lvql84nhilbb4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:52:32.528437" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:52:32.528544" 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-10-11T00:52:32.521298" elapsed="0.007271"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:32.521069" 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-10-11T00:52:32.528800" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:32.528632" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.521053" elapsed="0.007826"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.530323" 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-10-11T00:52:32.529991" elapsed="0.000377"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:32.529730" elapsed="0.000670"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.529556" elapsed="0.000882"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.531015" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:32.530731" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:32.530490" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.530475" elapsed="0.000635"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.531665" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:52:32.531290" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:32.531983" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:32.531754" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.532499" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:52:32.532218" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:32.532057" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.531737" elapsed="0.000840"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.533140" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:52:32.532797" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:32.533457" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:32.533230" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.533976" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:52:32.533694" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:32.533533" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.533213" elapsed="0.000840"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:32.534197" elapsed="0.000308"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:52:32.534941" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:52:32.534670" elapsed="0.000295"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:52:32.535120" elapsed="0.000220"/>
</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-10-11T00:52:32.529220" elapsed="0.006175"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:52:32.535559" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:32.535475" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.535458" elapsed="0.000161"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:52:32.536274" 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-10-11T00:52:32.535762" elapsed="0.000538"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:52:32.536346" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:52:32.536489" 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-10-11T00:52:32.519544" elapsed="0.016970"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:52:32.536569" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:52:32.536687" 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-10-11T00:52:32.477375" elapsed="0.059336"/>
</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-10-11T00:52:32.548024" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:52:32.547248" elapsed="0.000803"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:52:32.550150" 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-10-11T00:52:32.549652" elapsed="0.000617">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-10-11T00:52:32.550393" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:52:32.548212" elapsed="0.002228"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.551271" 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-10-11T00:52:32.550616" elapsed="0.000681"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:52:32.551710" 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-10-11T00:52:32.551941" 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-10-11T00:52:32.551484" elapsed="0.000482"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.552694" 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-10-11T00:52:32.552161" elapsed="0.000591"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:52:32.553367" elapsed="0.000121"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:32.552829" elapsed="0.000735"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.554375" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:52:32.553766" elapsed="0.000694"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:32.553588" elapsed="0.000953"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.552811" elapsed="0.001753"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.555714" 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-10-11T00:52:32.554727" elapsed="0.001014"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:52:32.555844" 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-10-11T00:52:32.546729" elapsed="0.009220"/>
</kw>
<msg time="2026-10-11T00:52:32.555998" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:32.542118" elapsed="0.013925"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:52:32.560355" 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/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-10-11T00:52:32.564555" 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/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-10-11T00:52:32.568659" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:32.568867" 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-10-11T00:52:32.569054" 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-10-11T00:52:32.569479" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:32.569307" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:52:32.569292" 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-10-11T00:52:32.569711" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:32.569990" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:32.570157" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:52:32.569259" elapsed="0.000946"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:52:32.569124" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:32.570384" elapsed="0.000032"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:52:32.570470" elapsed="0.000017"/>
</return>
<msg time="2026-10-11T00:52:32.570599" 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-10-11T00:52:32.541381" elapsed="0.029244"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:32.570823" elapsed="0.000373"/>
</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-10-11T00:52:32.572209" 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-10-11T00:52:32.571893" elapsed="0.000343"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:52:32.572673" 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-10-11T00:52:32.572384" 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-10-11T00:52:32.572900" elapsed="0.000292"/>
</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-10-11T00:52:32.571494" elapsed="0.001752"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:32.571266" elapsed="0.002010"/>
</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-10-11T00:52:32.573492" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:32.573299" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.571250" elapsed="0.002313"/>
</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-10-11T00:52:32.537682" elapsed="0.035924"/>
</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-10-11T00:52:32.537010" elapsed="0.036665"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:32.536799" elapsed="0.036916"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.536767" elapsed="0.036970"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:52:32.573768" elapsed="0.000046"/>
</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-10-11T00:52:32.476740" elapsed="0.097151"/>
</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-10-11T00:52:32.475133" elapsed="0.098815"/>
</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-10-11T00:52:32.474676" elapsed="0.099316"/>
</kw>
<arg>empty_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="PASS" start="2026-10-11T00:52:32.474241" elapsed="0.099806"/>
</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-10-11T00:52:32.574629" elapsed="0.000457"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:52:32.574309" elapsed="0.000835"/>
</kw>
<doc>See new routes are deleted.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:52:32.375445" elapsed="0.199777"/>
</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-10-11T00:52:32.576776" elapsed="0.000225"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:52:32.576526" 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-10-11T00:52:32.577979" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:32.577892" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.577875" elapsed="0.000167"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:32.580073" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:32.579989" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.579973" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.581065" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:32.580713" elapsed="0.000377"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.581520" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:52:32.581242" elapsed="0.000302"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:52:32.581584" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:52:32.581710" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:52:32.580343" elapsed="0.001390"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:32.584404" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:32.584318" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.584301" elapsed="0.000182"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:32.585549" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:32.585465" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.585448" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:52:32.585950" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:52:32.585759" elapsed="0.000216"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:52:32.586282" 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-10-11T00:52:32.586141" elapsed="0.000164"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:32.616092" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:52:32.586829" elapsed="0.029357"/>
</kw>
<msg time="2026-10-11T00:52:32.616375" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:52:32.616446" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:32.586482" elapsed="0.030003"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:52:32.654088" 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-10-11T00:52:32.617051" elapsed="0.037145"/>
</kw>
<msg time="2026-10-11T00:52:32.654342" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:52:32.654383" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:32.616653" elapsed="0.037788"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:32.654718" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:32.654510" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.654493" elapsed="0.000309"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.655214" 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-10-11T00:52:32.654988" elapsed="0.000335"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:32.655605" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:32.655385" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.655368" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:52:32.655705" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:52:32.658146" elapsed="0.000120"/>
</kw>
<msg time="2026-10-11T00:52:32.658323" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:32.657082" elapsed="0.001396"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:32.658815" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:32.659151" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:52:32.656498" elapsed="0.002838"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:52:32.656006" elapsed="0.003389"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:52:32.585188" elapsed="0.074305"/>
</kw>
<msg time="2026-10-11T00:52:32.659574" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:32.659612" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:32.584636" elapsed="0.075012"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:52:32.659814" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-10-11T00:52:32.659716" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.659699" elapsed="0.000200"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:32.660230" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:32.660591" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:52:32.660656" 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-10-11T00:52:32.584033" elapsed="0.076710"/>
</kw>
<msg time="2026-10-11T00:52:32.660838" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:32.660881" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:32.582101" elapsed="0.078819"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:32.661206" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:32.660987" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:32.660971" elapsed="0.000305"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:52:32.581958" elapsed="0.079339"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:52:32.581810" elapsed="0.079514"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:52:32.579685" elapsed="0.081686"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:52:32.577615" elapsed="0.083888"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:32.577200" elapsed="0.084347"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:52:32.576156" elapsed="0.085438"/>
</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-10-11T00:52:32.662009" elapsed="0.000096"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:32.661715" elapsed="0.000440"/>
</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-10-11T00:52:32.667095" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:32.680168" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:32.680297" 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-10-11T00:52:32.666967" elapsed="0.013353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.680776" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:32.680544" elapsed="0.000288"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:52:32.681298" level="FAIL">0 != 3</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-10-11T00:52:32.680987" elapsed="0.000384">0 != 3</status>
</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="FAIL" start="2026-10-11T00:52:32.666591" elapsed="0.014905">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:33.691994" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:33.705502" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:33.705729" 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-10-11T00:52:33.691638" elapsed="0.014174"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:33.706951" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:33.706293" elapsed="0.000753"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:52:33.708154" level="FAIL">0 != 3</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-10-11T00:52:33.707391" elapsed="0.000916">0 != 3</status>
</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="FAIL" start="2026-10-11T00:52:33.690544" elapsed="0.018021">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:34.718660" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:34.732105" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:34.732317" 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-10-11T00:52:34.718316" elapsed="0.014054"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:34.733508" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:34.732903" elapsed="0.000700"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:52:34.734697" level="FAIL">0 != 3</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-10-11T00:52:34.733968" elapsed="0.000895">0 != 3</status>
</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="FAIL" start="2026-10-11T00:52:34.717327" elapsed="0.017757">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:35.745589" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:35.759368" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:35.759622" 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-10-11T00:52:35.745227" elapsed="0.014448"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:35.760827" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:35.760170" elapsed="0.000755"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:52:35.762027" level="FAIL">0 != 3</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-10-11T00:52:35.761270" elapsed="0.000907">0 != 3</status>
</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="FAIL" start="2026-10-11T00:52:35.744146" elapsed="0.018256">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:36.773169" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:36.786657" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:36.786894" 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-10-11T00:52:36.772850" elapsed="0.014099"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:36.788071" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:36.787460" elapsed="0.000705"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:52:36.789271" level="FAIL">0 != 3</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-10-11T00:52:36.788542" elapsed="0.000903">0 != 3</status>
</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="FAIL" start="2026-10-11T00:52:36.771837" elapsed="0.017835">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:37.799968" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:37.813533" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:37.813743" 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-10-11T00:52:37.799633" elapsed="0.014198"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:37.814966" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:37.814326" elapsed="0.000736"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:52:37.816294" level="FAIL">0 != 3</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-10-11T00:52:37.815401" elapsed="0.001087">0 != 3</status>
</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="FAIL" start="2026-10-11T00:52:37.798636" elapsed="0.018079">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:38.823300" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:38.836223" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:38.836363" 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-10-11T00:52:38.823087" elapsed="0.013310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:38.837130" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:38.836725" elapsed="0.000465"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:52:38.837938" level="FAIL">0 != 3</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-10-11T00:52:38.837427" elapsed="0.000611">0 != 3</status>
</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="FAIL" start="2026-10-11T00:52:38.822392" elapsed="0.015792">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:39.848532" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:39.862127" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:39.862338" 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-10-11T00:52:39.848196" elapsed="0.014195"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:39.863527" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:39.862920" elapsed="0.000702"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:52:39.864704" level="FAIL">0 != 3</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-10-11T00:52:39.863984" elapsed="0.000888">0 != 3</status>
</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="FAIL" start="2026-10-11T00:52:39.847218" elapsed="0.017878">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:40.876057" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:40.889471" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:40.889694" 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-10-11T00:52:40.875716" elapsed="0.014054"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:40.890886" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:40.890244" elapsed="0.000738"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:52:40.892066" level="FAIL">0 != 3</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-10-11T00:52:40.891327" elapsed="0.000881">0 != 3</status>
</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="FAIL" start="2026-10-11T00:52:40.874705" elapsed="0.017754">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:41.902845" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:41.915907" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:41.916151" 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-10-11T00:52:41.902504" elapsed="0.013705"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:41.917335" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:41.916722" elapsed="0.000739"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:52:41.918561" level="FAIL">0 != 3</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-10-11T00:52:41.917831" elapsed="0.000875">0 != 3</status>
</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="FAIL" start="2026-10-11T00:52:41.901460" elapsed="0.017496">0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:42.929049" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:42.942254" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:42.942504" 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-10-11T00:52:42.928681" elapsed="0.013880"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:42.943649" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:42.943050" elapsed="0.000715"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:52:42.944889" level="FAIL">0 != 3</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-10-11T00:52:42.944110" elapsed="0.000927">0 != 3</status>
</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="FAIL" start="2026-10-11T00:52:42.927677" elapsed="0.017575">0 != 3</status>
</kw>
<msg time="2026-10-11T00:52:42.945468" level="FAIL">Keyword 'Check_File_For_Word_Count' failed after retrying for 10 seconds. The last error was: 0 != 3</msg>
<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="FAIL" start="2026-10-11T00:52:32.662326" elapsed="10.283478">Keyword 'Check_File_For_Word_Count' failed after retrying for 10 seconds. The last error was: 0 != 3</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<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="NOT RUN" start="2026-10-11T00:52:42.954118" elapsed="0.000057"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<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="NOT RUN" start="2026-10-11T00:52:42.962979" elapsed="0.000061"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<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="NOT RUN" start="2026-10-11T00:52:42.971172" elapsed="0.000054"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<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="NOT RUN" start="2026-10-11T00:52:42.979158" elapsed="0.000034"/>
</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-10-11T00:52:42.981128" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:52:42.980653" elapsed="0.000546"/>
</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-10-11T00:52:42.980067" elapsed="0.001197"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:52:42.979613" elapsed="0.001723"/>
</kw>
<doc>Check incomming updates for new routes</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-10-11T00:52:32.575589" elapsed="10.405796">Keyword 'Check_File_For_Word_Count' failed after retrying for 10 seconds. The last error was: 0 != 3</status>
</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-10-11T00:52:42.983477" elapsed="0.000303"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:52:42.983108" elapsed="0.000742"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:42.985211" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:42.985054" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:42.985019" 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-10-11T00:52:42.988167" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:42.988052" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:42.988029" elapsed="0.000226"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:42.989574" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:42.989091" elapsed="0.000518"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:52:42.990207" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:52:42.989841" elapsed="0.000400"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:52:42.990297" elapsed="0.000044"/>
</return>
<msg time="2026-10-11T00:52:42.990504" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:52:42.988570" elapsed="0.001967"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:42.994283" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:42.994163" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:42.994138" 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-10-11T00:52:42.995924" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:42.995807" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:42.995782" elapsed="0.000228"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:52:42.996487" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:52:42.996219" elapsed="0.000302"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:52:42.996964" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:52:42.996765" elapsed="0.000231"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:43.034325" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:52:42.997704" elapsed="0.036735"/>
</kw>
<msg time="2026-10-11T00:52:43.034622" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:52:43.034665" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:42.997214" elapsed="0.037553"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:52:43.065189" 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-10-11T00:52:43.035281" elapsed="0.030005"/>
</kw>
<msg time="2026-10-11T00:52:43.065457" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:52:43.065500" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:43.034940" elapsed="0.030595"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:43.065829" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:43.065605" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:43.065586" elapsed="0.000317"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:43.066316" 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-10-11T00:52:43.066087" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:43.066656" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:43.066456" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:43.066438" elapsed="0.000290"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:52:43.066771" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:52:43.069259" elapsed="0.000115"/>
</kw>
<msg time="2026-10-11T00:52:43.069448" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:43.068170" elapsed="0.001415"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:43.069905" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:43.070238" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:52:43.067561" 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-10-11T00:52:43.067071" elapsed="0.003432"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:52:42.995401" elapsed="0.075176"/>
</kw>
<msg time="2026-10-11T00:52:43.070659" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:43.070699" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:42.994608" elapsed="0.076127"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:52:43.070914" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-11T00:52:43.070828" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:43.070811" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:43.071322" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:43.071665" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:52:43.071730" 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-10-11T00:52:42.993755" elapsed="0.078077"/>
</kw>
<msg time="2026-10-11T00:52:43.071916" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:43.071957" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:42.991038" elapsed="0.080954"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:43.072314" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:43.072058" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:43.072042" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:52:42.990836" elapsed="0.081597"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:52:42.990611" elapsed="0.081854"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:52:42.987632" elapsed="0.084885"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:52:42.984660" elapsed="0.087905"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:42.984062" elapsed="0.088544"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:52:42.982613" elapsed="0.090040"/>
</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-10-11T00:52:43.073059" elapsed="0.000095"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:43.072783" elapsed="0.000422"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:43.074551" 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-10-11T00:52:43.074224" 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-10-11T00:52:43.074730" elapsed="0.000200"/>
</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-10-11T00:52:43.073767" elapsed="0.001217"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-10-11T00:52:45.075811" level="INFO">2026-10-11 00:52:21,763 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-10-11 00:52:21,763 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.019s
2026-10-11 00:52:21,763 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:52:21,763 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:52:21,763 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:52:31,773 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-10-11 00:52:31,774 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.029s
2026-10-11 00:52:31,774 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:52:31,774 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:52:31,774 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:52:41,784 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-10-11 00:52:41,784 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 30.039s
2026-10-11 00:52:41,785 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:52:41,785 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:52:41,785 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
^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-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T00:52:45.076187" level="INFO">${output} = 2026-10-11 00:52:21,763 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-10-11 00:52:21,763 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.019s
2026-10-11 00:52:21,763 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-10-11T00:52:43.075146" elapsed="2.001103"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:45.077651" level="INFO">2026-10-11 00:52:21,763 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-10-11 00:52:21,763 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.019s
2026-10-11 00:52:21,763 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:52:21,763 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:52:21,763 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:52:31,773 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-10-11 00:52:31,774 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.029s
2026-10-11 00:52:31,774 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:52:31,774 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:52:31,774 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:52:41,784 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-10-11 00:52:41,784 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 30.039s
2026-10-11 00:52:41,785 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:52:41,785 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:52:41,785 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
^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-423-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-10-11T00:52:45.076935" elapsed="0.000900"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-10-11T00:52:43.073363" elapsed="2.004607"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:45.086017" level="INFO">Executing command 'cat bgp_peer.log'.</msg>
<msg time="2026-10-11T00:52:45.099946" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:45.100159" level="INFO">${output_log} = 2026-10-11 00:52:11,732 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:52:11,733 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 00:52:11,733 DEBUG BGP-Threa...</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-10-11T00:52:45.085755" elapsed="0.014459"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:45.101376" level="INFO">2026-10-11 00:52:11,732 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:52:11,733 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 00:52:11,733 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 00:52:11,733 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 00:52:11,733 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 00:52:11,734 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:52:11,736 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:52:11,736 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:52:11,736 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:52:11,736 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-10-11 00:52:11,736 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-10-11 00:52:11,736 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 00:52:11,736 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 00:52:11,736 INFO BGP-Thread-1 (job):   My BGP Identifier: 169782023
2026-10-11 00:52:11,737 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 00:52:11,737 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 00:52:11,737 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 00:52:11,737 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 00:52:11,737 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 00:52:11,737 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 00:52:11,737 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-10-11 00:52:11,737 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-10-11 00:52:11,737 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 00:52:11,737 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 00:52:11,737 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 00:52:11,737 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:52:11,737 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-10-11 00:52:11,737 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 00:52:11,738 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 00:52:11,738 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-10-11 00:52:11,738 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 00:52:11,738 DEBUG BGP-Thread-1 (job):   BGP Identifier=169782023 (0x0a1eab07)
2026-10-11 00:52:11,738 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-10-11 00:52:11,738 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf0
2026-10-11 00:52:11,738 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf000b40a1eab07100206010400010001020641040000fbf0'
2026-10-11 00:52:11,738 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf000b40a1eab07100206010400010001020641040000fbf0
2026-10-11 00:52:11,740 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:52:11,740 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:52:11,740 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:52:11,740 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:52:11,740 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:52:11,740 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:52:11,740 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:52:11,740 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:52:11,740 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:52:11,741 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:52:11,741 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 00:52:11,741 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:52:11,741 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:52:11,741 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:52:11,750 INFO BGP-Thread-1 (job): ... idle for 0.009s
2026-10-11 00:52:11,750 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.009s
2026-10-11 00:52:11,751 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 00:52:11,751 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:52:11,751 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:52:11,751 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 00:52:11,751 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:52:11,751 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:52:11,751 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:11,751 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:11,751 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:11,751 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:11,751 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:11,752 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:52:21,763 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-10-11 00:52:21,763 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.019s
2026-10-11 00:52:21,763 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:52:21,763 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:52:21,763 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:52:31,773 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-10-11 00:52:31,774 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.029s
2026-10-11 00:52:31,774 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:52:31,774 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:52:31,774 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:52:41,784 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-10-11 00:52:41,784 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 30.039s
2026-10-11 00:52:41,785 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:52:41,785 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:52:41,785 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:45.100855" elapsed="0.000777"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T00:52:45.102721" 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-10-11T00:52:45.102079" elapsed="0.000831"/>
</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-10-11T00:52:45.084863" elapsed="0.018169"/>
</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-10-11T00:52:45.104307" elapsed="0.000579"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:52:45.103624" elapsed="0.001393"/>
</kw>
<doc>Stop BGP peer tool</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:52:42.981955" elapsed="2.123138"/>
</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-10-11T00:52:45.108250" elapsed="0.000542"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:52:45.107643" elapsed="0.001266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:45.111210" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:45.110978" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:45.110931" elapsed="0.000432"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:45.116085" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:45.115901" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:45.115864" elapsed="0.000357"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:45.118349" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:45.117589" elapsed="0.000816"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:52:45.119385" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:52:45.118802" elapsed="0.000667"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:52:45.119560" elapsed="0.000073"/>
</return>
<msg time="2026-10-11T00:52:45.119881" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:52:45.116754" elapsed="0.003177"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:45.126310" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:45.126120" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:45.126081" elapsed="0.000403"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:45.129026" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:45.128836" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:45.128795" elapsed="0.000370"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:52:45.129940" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:52:45.129527" elapsed="0.000468"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:52:45.130712" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:52:45.130359" elapsed="0.000431"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:45.168783" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:52:45.131982" elapsed="0.036943"/>
</kw>
<msg time="2026-10-11T00:52:45.169168" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:52:45.169228" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:45.131143" elapsed="0.038135"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:52:45.203179" 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-10-11T00:52:45.170061" elapsed="0.033218"/>
</kw>
<msg time="2026-10-11T00:52:45.203453" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:52:45.203495" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:45.169550" elapsed="0.033980"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:45.203867" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:45.203636" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:45.203616" elapsed="0.000326"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:45.204351" 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-10-11T00:52:45.204121" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:45.204696" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:45.204494" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:45.204477" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:52:45.204814" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:52:45.207273" elapsed="0.000114"/>
</kw>
<msg time="2026-10-11T00:52:45.207463" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:45.206194" 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-10-11T00:52:45.207938" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:45.208274" 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-10-11T00:52:45.205585" elapsed="0.002898"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:52:45.205092" 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-10-11T00:52:45.128185" elapsed="0.080433"/>
</kw>
<msg time="2026-10-11T00:52:45.208706" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:45.208762" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:45.126886" elapsed="0.081916"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:52:45.208958" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:52:45.208872" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:45.208854" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:45.209365" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:45.209714" elapsed="0.000037"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:52:45.209797" 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-10-11T00:52:45.125376" elapsed="0.084506"/>
</kw>
<msg time="2026-10-11T00:52:45.209966" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:45.210006" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:45.120729" elapsed="0.089311"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:45.210325" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:45.210106" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:45.210090" elapsed="0.000304"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:52:45.120361" elapsed="0.090080"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:52:45.120041" elapsed="0.090430"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:52:45.115196" elapsed="0.095325"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:52:45.110302" elapsed="0.100268"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:45.109243" elapsed="0.101367"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:52:45.106831" elapsed="0.103824"/>
</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-10-11T00:52:45.211147" elapsed="0.000095"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:45.210873" elapsed="0.000419"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:45.216125" level="INFO">${start_cmd} = python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T00:52:45.215840" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:45.216577" level="INFO">python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --peerport=1790 --debug </msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:45.216344" elapsed="0.000275"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:45.219423" level="INFO">python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --peerport=1790 --debug</msg>
<msg time="2026-10-11T00:52:45.219509" level="INFO">${output} = python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --peerport=1790 --debug 
</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-10-11T00:52:45.216785" elapsed="0.002749"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:45.219969" level="INFO">python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --peerport=1790 --debug 
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:45.219744" elapsed="0.000267"/>
</kw>
<arg>${BGP_PEER_COMMAND}</arg>
<arg>${BGP_PEER_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-10-11T00:52:45.215483" elapsed="0.004578"/>
</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-10-11T00:52:55.222095" level="FAIL">No match found for '&gt;' in 10 seconds
Output:
[?2004l2026-10-11 00:52:45,314 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:52:45,314 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 00:52:45,314 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 00:52:45,314 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 00:52:45,314 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 00:52:45,315 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:52:45,317 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:52:45,317 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:52:45,317 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:52:45,317 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-10-11 00:52:45,318 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-10-11 00:52:45,318 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 00:52:45,318 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 00:52:45,318 INFO BGP-Thread-1 (job):   My BGP Identifier: 169782023
2026-10-11 00:52:45,318 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 00:52:45,318 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 00:52:45,318 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 00:52:45,318 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 00:52:45,318 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 00:52:45,319 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 00:52:45,319 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-10-11 00:52:45,319 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-10-11 00:52:45,319 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 00:52:45,319 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 00:52:45,319 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 00:52:45,319 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:52:45,319 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-10-11 00:52:45,320 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 00:52:45,320 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 00:52:45,320 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-10-11 00:52:45,320 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 00:52:45,320 DEBUG BGP-Thread-1 (job):   BGP Identifier=169782023 (0x0a1eab07)
2026-10-11 00:52:45,320 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-10-11 00:52:45,320 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf0
2026-10-11 00:52:45,320 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf000b40a1eab07100206010400010001020641040000fbf0'
2026-10-11 00:52:45,321 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf000b40a1eab07100206010400010001020641040000fbf0
2026-10-11 00:52:45,323 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:52:45,323 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:52:45,323 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:52:45,323 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:52:45,323 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:52:45,324 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:52:45,324 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:52:45,324 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:52:45,324 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:52:45,324 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:52:45,324 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 00:52:45,325 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:52:45,325 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:52:45,325 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:52:45,332 INFO BGP-Thread-1 (job): ... idle for 0.007s
2026-10-11 00:52:45,332 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.007s
2026-10-11 00:52:45,332 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 00:52:45,333 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:52:45,333 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:52:45,333 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 00:52:45,333 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:52:45,333 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:52:45,333 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:45,333 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:45,333 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:45,333 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:45,334 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-10-11T00:52:45.221620" elapsed="10.001383">No match found for '&gt;' in 10 seconds
Output:
[?2004l
2026-10-11 00:52:45,314 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:52:45,314 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 00:52:45,314 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 00:52:45,314 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 00:52:45,314 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 00:52:45,315 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:52:45,317 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:52:45,317 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:52:45,317 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:52:45,317 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-10-11 00:52:45,318 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
    [ Message content over the limit has been removed. ]
2026-10-11 00:52:45,333 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:45,333 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:45,333 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:45,333 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:45,334 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-10-11T00:52:55.223353" elapsed="0.000030"/>
</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-10-11T00:52:45.221326" elapsed="10.002222">No match found for '&gt;' in 10 seconds
Output:
[?2004l
2026-10-11 00:52:45,314 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:52:45,314 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 00:52:45,314 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 00:52:45,314 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 00:52:45,314 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 00:52:45,315 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:52:45,317 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:52:45,317 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:52:45,317 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:52:45,317 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-10-11 00:52:45,318 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
    [ Message content over the limit has been removed. ]
2026-10-11 00:52:45,333 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:45,333 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:45,333 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:45,333 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:45,334 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-10-11T00:52:45.220960" elapsed="10.002746"/>
</kw>
<msg time="2026-10-11T00:52:55.223823" 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-10-11T00:52:45.220564" elapsed="10.003283"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-10-11T00:52:55.224028" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-10-11T00:52:55.223945" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.223916" elapsed="0.000204"/>
</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-10-11T00:52:55.224361" elapsed="0.000026"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:55.224558" elapsed="0.000019"/>
</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-10-11T00:52:45.220271" elapsed="10.004362"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:55.229171" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:55.242762" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:55.242852" 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-10-11T00:52:55.229020" elapsed="0.013855"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.243374" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:55.243079" elapsed="0.000361"/>
</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-10-11T00:52:55.243595" elapsed="0.000296"/>
</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-10-11T00:52:55.228587" elapsed="0.015360"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:55.248290" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:55.297790" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:55.297917" 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-10-11T00:52:55.248168" elapsed="0.049783"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.298613" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:55.298244" elapsed="0.000429"/>
</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-10-11T00:52:55.298921" elapsed="0.000395"/>
</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-10-11T00:52:55.247799" elapsed="0.051599"/>
</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-10-11T00:52:55.300251" elapsed="0.000375"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:52:55.299812" elapsed="0.000914"/>
</kw>
<doc>Start BGP peer tool</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:52:45.105782" elapsed="10.194996"/>
</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-10-11T00:52:55.302990" elapsed="0.000295"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:52:55.302596" 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-10-11T00:52:55.304799" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:55.304643" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.304617" 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-10-11T00:52:55.308117" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:55.307992" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.307968" elapsed="0.000237"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.309538" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:55.309050" elapsed="0.000523"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.310205" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:52:55.309836" elapsed="0.000403"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:52:55.310294" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:52:55.310497" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:52:55.308523" elapsed="0.002007"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:55.314383" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:55.314264" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.314240" 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-10-11T00:52:55.316043" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:55.315926" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.315901" elapsed="0.000228"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:52:55.316609" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:52:55.316341" elapsed="0.000302"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:52:55.317109" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:52:55.316916" elapsed="0.000225"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:55.352675" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:52:55.317873" elapsed="0.034918"/>
</kw>
<msg time="2026-10-11T00:52:55.352967" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:52:55.353017" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:55.317356" elapsed="0.035696"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:52:55.392643" 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-10-11T00:52:55.353603" elapsed="0.039193"/>
</kw>
<msg time="2026-10-11T00:52:55.392946" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:52:55.392989" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:55.353225" elapsed="0.039800"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:55.393305" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:55.393093" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.393075" elapsed="0.000302"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.393829" 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-10-11T00:52:55.393583" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:55.394159" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:55.393958" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.393942" elapsed="0.000289"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:52:55.394260" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:52:55.396725" elapsed="0.000116"/>
</kw>
<msg time="2026-10-11T00:52:55.396898" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:55.395660" elapsed="0.001369"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:55.397331" elapsed="0.000093"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:55.397869" 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-10-11T00:52:55.395057" elapsed="0.003002"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:52:55.394574" 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-10-11T00:52:55.315548" elapsed="0.082642"/>
</kw>
<msg time="2026-10-11T00:52:55.398272" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:55.398311" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:55.314737" elapsed="0.083608"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:52:55.398527" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:52:55.398440" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.398396" 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-10-11T00:52:55.398952" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:55.399256" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:52:55.399319" 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-10-11T00:52:55.313863" elapsed="0.085564"/>
</kw>
<msg time="2026-10-11T00:52:55.399515" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:55.399556" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:55.311063" elapsed="0.088530"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:55.399895" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:55.399659" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.399643" elapsed="0.000323"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:52:55.310828" elapsed="0.089160"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:52:55.310604" elapsed="0.089414"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:52:55.307558" elapsed="0.092510"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:52:55.304241" elapsed="0.095912"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:55.303601" elapsed="0.096593"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:52:55.302062" elapsed="0.098179"/>
</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-10-11T00:52:55.400754" elapsed="0.000097"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:55.400363" elapsed="0.000538"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.404264" level="INFO">${start_cmd} = python3 bgp_app_peer.py --host 10.30.170.173 --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.173/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 variable.</doc>
<status status="PASS" start="2026-10-11T00:52:55.403981" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.404730" level="INFO">python3 bgp_app_peer.py --host 10.30.170.173 --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.173/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-10-11T00:52:55.404498" elapsed="0.000276"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:55.409711" level="INFO">python3 bgp_app_peer.py --host 10.30.170.173 --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.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family &amp;&gt;/dev/null</msg>
<msg time="2026-10-11T00:52:55.409799" level="INFO">${output} =  python3 bgp_app_peer.py --host 10.30.170.173 --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.173/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-10-11T00:52:55.404927" elapsed="0.004897"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.410238" level="INFO"> python3 bgp_app_peer.py --host 10.30.170.173 --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.173/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-10-11T00:52:55.410019" elapsed="0.000264"/>
</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-10-11T00:52:55.403610" elapsed="0.006722"/>
</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-10-11T00:52:55.552026" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-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-10-11T00:52:55.412507" elapsed="0.139580"/>
</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-10-11T00:52:55.412024" elapsed="0.140109"/>
</kw>
<arg>${BGP_APP_PEER_TIMEOUT}</arg>
<doc>Wait ${timeout} for the tool exit.</doc>
<status status="PASS" start="2026-10-11T00:52:55.411683" elapsed="0.140501"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:55.555484" level="INFO">Executing command 'cat bgp_app_peer.log'.</msg>
<msg time="2026-10-11T00:52:55.568127" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:55.568216" level="INFO">${output_log} = 2026-10-11 00:52:55,523 INFO: Put 3 prefix(es) in a single request (starting from 8.0.1.0/28) into 10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:52:55.555358" elapsed="0.012882"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.568707" level="INFO">2026-10-11 00:52:55,523 INFO: Put 3 prefix(es) in a single request (starting from 8.0.1.0/28) into 10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
2026-10-11 00:52:55,526 DEBUG: ...streaming chunk 1 (prefix: 8.0.1.0/28)
2026-10-11 00:52:55,526 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-10-11 00:52:55,526 DEBUG: ...streaming chunk 2 (prefix: 8.0.1.16/28)
2026-10-11 00:52:55,526 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-10-11 00:52:55,526 DEBUG: ...streaming chunk 3 (prefix: 8.0.1.32/28)
2026-10-11 00:52:55,526 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-10-11 00:52:55,538 DEBUG: &lt;PreparedRequest [PUT]&gt; http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
2026-10-11 00:52:55,538 DEBUG: Request headers: {'Content-Type': 'application/xml', 'Transfer-Encoding': 'chunked', 'Authorization': 'Basic YWRtaW46YWRtaW4='}:
2026-10-11 00:52:55,538 DEBUG: Response: 
2026-10-11 00:52:55,538 DEBUG: &lt;Response [201]&gt; Created
2026-10-11 00:52:55,538 INFO: Total test execution time: 0.015s
2026-10-11 00:52:55,538 INFO: Total build data time: 0.000s
2026-10-11 00:52:55,538 INFO: Total response time: 0.014s
2026-10-11 00:52:55,538 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-10-11T00:52:55.568462" elapsed="0.000354"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T00:52:55.569283" 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-10-11T00:52:55.568997" elapsed="0.000338"/>
</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-10-11T00:52:55.555008" elapsed="0.014380"/>
</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-10-11T00:52:55.569950" elapsed="0.000229"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:52:55.569644" elapsed="0.000592"/>
</kw>
<doc>Start BGP application peer tool and give him 30s</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:52:55.301254" elapsed="0.269016"/>
</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-10-11T00:52:55.571724" elapsed="0.000201"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:52:55.571462" elapsed="0.000513"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:55.572885" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:55.572796" elapsed="0.000134"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.572778" elapsed="0.000172"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:55.575140" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:55.575056" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.575039" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.576128" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:55.575798" elapsed="0.000356"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.576589" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:52:55.576306" elapsed="0.000307"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:52:55.576652" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:52:55.576801" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:52:55.575426" elapsed="0.001397"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:55.579345" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:55.579261" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.579243" elapsed="0.000181"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:55.580480" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:55.580371" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.580354" elapsed="0.000188"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:52:55.580872" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:52:55.580703" elapsed="0.000194"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:52:55.581194" 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-10-11T00:52:55.581060" elapsed="0.000158"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:55.616739" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:52:55.581741" elapsed="0.035111"/>
</kw>
<msg time="2026-10-11T00:52:55.617004" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:52:55.617046" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:55.581374" elapsed="0.035707"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:52:55.668359" 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-10-11T00:52:55.617610" elapsed="0.050878"/>
</kw>
<msg time="2026-10-11T00:52:55.668680" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:52:55.668751" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:55.617249" elapsed="0.051549"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:55.669117" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:55.668882" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.668862" elapsed="0.000354"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.669666" 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-10-11T00:52:55.669432" elapsed="0.000323"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:55.670020" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:55.669816" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.669799" elapsed="0.000292"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:52:55.670121" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:52:55.672554" elapsed="0.000252"/>
</kw>
<msg time="2026-10-11T00:52:55.672865" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:55.671489" 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-10-11T00:52:55.673305" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:55.673667" 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-10-11T00:52:55.670881" elapsed="0.002986"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:52:55.670392" elapsed="0.003534"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:52:55.580116" elapsed="0.093884"/>
</kw>
<msg time="2026-10-11T00:52:55.674081" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:55.674121" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:55.579579" elapsed="0.094577"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:52:55.674310" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:52:55.674224" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.674207" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:55.674750" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:55.675055" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:52:55.675119" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:52:55.578975" elapsed="0.096228"/>
</kw>
<msg time="2026-10-11T00:52:55.675285" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:55.675325" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:55.577144" elapsed="0.098216"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:55.675675" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:55.675450" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.675433" elapsed="0.000325"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:52:55.577002" elapsed="0.098778"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:52:55.576868" elapsed="0.098938"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:52:55.574762" elapsed="0.101091"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:52:55.572531" elapsed="0.103407"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:55.572122" elapsed="0.103857"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:52:55.571103" elapsed="0.104923"/>
</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-10-11T00:52:55.692645" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:52:55.692321" elapsed="0.000350"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:52:55.693428" 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-10-11T00:52:55.693169" elapsed="0.000326">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-10-11T00:52:55.693581" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:52:55.692845" elapsed="0.000759"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.694124" 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-10-11T00:52:55.693811" elapsed="0.000338"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:52:55.694446" 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-10-11T00:52:55.694573" 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-10-11T00:52:55.694319" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.695027" 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-10-11T00:52:55.694808" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.696291" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:55.695766" elapsed="0.000582"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.697034" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:52:55.696552" elapsed="0.000506"/>
</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-10-11T00:52:55.697397" elapsed="0.000061"/>
</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-10-11T00:52:55.698113" elapsed="0.000047"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:52:55.698476" elapsed="0.000045"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:52:55.697213" elapsed="0.001423"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:52:55.697103" elapsed="0.001606"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:52:55.698752" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:52:55.698884" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:52:55.695386" elapsed="0.003521"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:55.695130" elapsed="0.003807"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:55.699106" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:55.698958" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.695112" elapsed="0.004062"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.699791" 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-10-11T00:52:55.699333" elapsed="0.000484"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:52:55.699861" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:52:55.691811" elapsed="0.008149"/>
</kw>
<msg time="2026-10-11T00:52:55.700044" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:55.687242" elapsed="0.012848"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:52:55.704320" 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/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-10-11T00:52:55.708432" 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/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-10-11T00:52:55.712700" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:55.712887" 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-10-11T00:52:55.713069" 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-10-11T00:52:55.713428" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:55.713262" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:52:55.713248" 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-10-11T00:52:55.713660" 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-10-11T00:52:55.713853" 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-10-11T00:52:55.714017" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:52:55.713223" elapsed="0.000841"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:52:55.713136" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:55.714239" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:52:55.714304" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:52:55.714425" 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-10-11T00:52:55.686638" elapsed="0.027812"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:52:55.715567" 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-10-11T00:52:55.715362" elapsed="0.000264">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-10-11T00:52:55.715722" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:52:55.715033" elapsed="0.000713"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:55.716064" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:55.715810" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.716612" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:52:55.716308" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:55.716140" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.715793" elapsed="0.000906"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.717201" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:55.716864" elapsed="0.000360"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:52:55.717269" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:52:55.717393" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:52:55.714732" elapsed="0.002699"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:52:55.718586" 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-10-11T00:52:55.718384" elapsed="0.000261">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-10-11T00:52:55.718763" 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-10-11T00:52:55.718065" elapsed="0.000721"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:52:55.718948" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:52:55.718850" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.718833" elapsed="0.000192"/>
</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-10-11T00:52:55.719180" elapsed="0.000019"/>
</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-10-11T00:52:55.719357" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:52:55.719430" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:52:55.719555" 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-10-11T00:52:55.717760" elapsed="0.001818"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.720825" 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-10-11T00:52:55.720582" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.721277" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:55.721060" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:52:55.729199" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0b1d3klx1ezq21lvql84nhilbb4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:52:55.729361" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:52:55.729489" 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-10-11T00:52:55.721625" elapsed="0.007889"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:55.721377" elapsed="0.008175"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:55.729746" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:55.729576" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.721360" elapsed="0.008464"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.731249" 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-10-11T00:52:55.730919" elapsed="0.000375"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:55.730660" elapsed="0.000695"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.730643" elapsed="0.000738"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.731976" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:55.731704" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:55.731450" elapsed="0.000603"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.731433" elapsed="0.000643"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.732624" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:52:55.732251" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:55.732939" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:55.732725" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.733463" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:52:55.733182" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:55.733018" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.732707" elapsed="0.000833"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.734117" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:52:55.733778" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:55.734429" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:55.734205" elapsed="0.000276"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.734941" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:52:55.734664" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:55.734503" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.734188" elapsed="0.000828"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:55.735159" elapsed="0.000307"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:52:55.735882" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:52:55.735628" elapsed="0.000278"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:52:55.736059" elapsed="0.000212"/>
</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-10-11T00:52:55.730152" elapsed="0.006174"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:52:55.736486" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:55.736388" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.736371" elapsed="0.000175"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:52:55.737296" 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-10-11T00:52:55.736702" elapsed="0.000620"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:52:55.737368" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:52:55.737511" 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-10-11T00:52:55.719875" elapsed="0.017661"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:52:55.737591" elapsed="0.000023"/>
</return>
<msg time="2026-10-11T00:52:55.737721" 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-10-11T00:52:55.679235" elapsed="0.058511"/>
</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-10-11T00:52:55.748946" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:52:55.748184" elapsed="0.000790"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:52:55.751017" 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-10-11T00:52:55.750526" elapsed="0.000604">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-10-11T00:52:55.751252" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:52:55.749131" elapsed="0.002145"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.752115" 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-10-11T00:52:55.751472" elapsed="0.000669"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:52:55.752518" 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-10-11T00:52:55.752747" 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-10-11T00:52:55.752308" elapsed="0.000465"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.753493" 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-10-11T00:52:55.752973" elapsed="0.000582"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:52:55.754162" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:55.753617" elapsed="0.000696"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.755307" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:52:55.754712" elapsed="0.000633"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:55.754338" elapsed="0.001098"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.753600" elapsed="0.001859"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.756486" 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-10-11T00:52:55.755623" elapsed="0.000892"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:52:55.756558" 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-10-11T00:52:55.747630" elapsed="0.009031"/>
</kw>
<msg time="2026-10-11T00:52:55.756723" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:55.743049" elapsed="0.013719"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:52:55.760913" 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/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-10-11T00:52:55.764994" 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/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-10-11T00:52:55.769172" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:55.769355" 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-10-11T00:52:55.769549" 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-10-11T00:52:55.769929" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:55.769783" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:52:55.769769" 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-10-11T00:52:55.770156" 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-10-11T00:52:55.770445" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:55.770612" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:52:55.769742" elapsed="0.000918"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:52:55.769614" elapsed="0.001083"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:55.770850" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:52:55.770915" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:52:55.771023" 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-10-11T00:52:55.742321" elapsed="0.028726"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:55.771209" elapsed="0.000329"/>
</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-10-11T00:52:55.772598" 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-10-11T00:52:55.772179" elapsed="0.000447"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:52:55.773321" 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-10-11T00:52:55.772790" elapsed="0.000559"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:52:55.773559" elapsed="0.000301"/>
</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-10-11T00:52:55.771818" elapsed="0.002097"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:55.771607" elapsed="0.002338"/>
</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-10-11T00:52:55.774141" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:55.773967" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.771590" elapsed="0.002621"/>
</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-10-11T00:52:55.738709" elapsed="0.035545"/>
</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-10-11T00:52:55.738027" elapsed="0.036291"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:55.737819" elapsed="0.036570"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.737802" elapsed="0.036632"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:52:55.774467" elapsed="0.000027"/>
</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-10-11T00:52:55.678603" elapsed="0.095965"/>
</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-10-11T00:52:55.677019" elapsed="0.097603"/>
</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-10-11T00:52:55.676587" elapsed="0.098075"/>
</kw>
<arg>filled_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="PASS" start="2026-10-11T00:52:55.676141" elapsed="0.098588"/>
</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-10-11T00:52:55.775256" elapsed="0.000241"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:52:55.774966" elapsed="0.000588"/>
</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-10-11T00:52:55.570532" elapsed="0.205055"/>
</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-10-11T00:52:55.776991" elapsed="0.000197"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:52:55.776737" elapsed="0.000500"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:55.778163" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:55.778076" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.778058" elapsed="0.000166"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:55.780241" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:55.780158" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.780141" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.781208" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:55.780888" elapsed="0.000345"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.781661" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:52:55.781384" elapsed="0.000420"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:52:55.781848" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:52:55.781975" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:52:55.780522" elapsed="0.001476"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:55.784653" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:55.784569" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.784551" elapsed="0.000185"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:55.785780" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:55.785680" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.785663" elapsed="0.000179"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:52:55.786155" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:52:55.785988" elapsed="0.000191"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:52:55.786496" 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-10-11T00:52:55.786341" elapsed="0.000179"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:55.821863" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:52:55.787046" elapsed="0.034909"/>
</kw>
<msg time="2026-10-11T00:52:55.822120" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:52:55.822162" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:55.786676" elapsed="0.035521"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:52:55.873421" 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-10-11T00:52:55.822777" elapsed="0.050760"/>
</kw>
<msg time="2026-10-11T00:52:55.873700" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:52:55.873743" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:55.822397" elapsed="0.051383"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:55.874059" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:55.873851" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.873832" elapsed="0.000299"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.874564" 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-10-11T00:52:55.874312" elapsed="0.000330"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:55.874925" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:55.874725" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.874707" elapsed="0.000293"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:52:55.875030" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:52:55.877480" elapsed="0.000115"/>
</kw>
<msg time="2026-10-11T00:52:55.877652" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:55.876357" elapsed="0.001473"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:55.878132" elapsed="0.000072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:55.878482" 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-10-11T00:52:55.875788" 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-10-11T00:52:55.875298" elapsed="0.003450"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:52:55.785402" elapsed="0.093419"/>
</kw>
<msg time="2026-10-11T00:52:55.878901" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:55.878941" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:55.784886" elapsed="0.094090"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:52:55.879128" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:52:55.879044" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.879026" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:55.879554" 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-10-11T00:52:55.879867" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:52:55.879931" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:52:55.784268" elapsed="0.095748"/>
</kw>
<msg time="2026-10-11T00:52:55.880099" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:55.880138" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:55.782316" elapsed="0.097857"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:55.880481" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:55.880238" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:55.880223" elapsed="0.000361"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:52:55.782176" elapsed="0.098429"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:52:55.782043" elapsed="0.098589"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:52:55.779866" elapsed="0.100814"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:52:55.777821" elapsed="0.102923"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:55.777383" elapsed="0.103401"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:52:55.776362" elapsed="0.104469"/>
</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-10-11T00:52:55.881216" elapsed="0.000094"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:55.880944" elapsed="0.000416"/>
</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-10-11T00:52:55.887203" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:55.900088" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:55.900176" 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-10-11T00:52:55.887079" elapsed="0.013120"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.900648" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:55.900399" elapsed="0.000312"/>
</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-10-11T00:52:55.900866" elapsed="0.000266"/>
</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-10-11T00:52:55.886713" elapsed="0.014474"/>
</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-10-11T00:52:55.881619" elapsed="0.019615"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:55.905333" level="INFO">Executing command 'grep -o 'nlri_prefix_received: 8.0.1.0/28' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:55.949752" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:55.949875" 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-10-11T00:52:55.905213" elapsed="0.044694"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:55.950537" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:55.950187" 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-10-11T00:52:55.950822" elapsed="0.000369"/>
</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-10-11T00:52:55.904856" elapsed="0.046411"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:55.957061" level="INFO">Executing command 'grep -o 'nlri_prefix_received: 8.0.1.16/28' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:56.001822" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:56.002014" 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-10-11T00:52:55.956891" elapsed="0.045173"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.003086" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:56.002546" elapsed="0.000629"/>
</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-10-11T00:52:56.003554" elapsed="0.000623"/>
</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-10-11T00:52:55.956354" elapsed="0.047944"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:56.013655" level="INFO">Executing command 'grep -o 'nlri_prefix_received: 8.0.1.32/28' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:56.053812" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:56.054002" 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-10-11T00:52:56.013351" elapsed="0.040702"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.055079" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:56.054532" elapsed="0.000636"/>
</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-10-11T00:52:56.055538" elapsed="0.000621"/>
</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-10-11T00:52:56.012532" elapsed="0.043748"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:56.065892" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:56.105929" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:56.106121" 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-10-11T00:52:56.065590" elapsed="0.040582"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.107191" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:56.106655" elapsed="0.000629"/>
</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-10-11T00:52:56.107656" elapsed="0.000623"/>
</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-10-11T00:52:56.064663" elapsed="0.043739"/>
</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-10-11T00:52:56.109659" elapsed="0.000505"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:52:56.108983" elapsed="0.001308"/>
</kw>
<doc>Check incomming updates for new routes</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:52:55.775853" elapsed="0.334510"/>
</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-10-11T00:52:56.113585" elapsed="0.000465"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:52:56.112934" elapsed="0.001226"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:56.116615" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:56.116377" elapsed="0.000357"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.115967" elapsed="0.000813"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:56.121329" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:56.121145" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.121106" elapsed="0.000396"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.123619" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:56.122873" elapsed="0.000802"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.124651" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:52:56.124036" elapsed="0.000686"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:52:56.124812" elapsed="0.000063"/>
</return>
<msg time="2026-10-11T00:52:56.125093" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:52:56.122030" elapsed="0.003113"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:56.131149" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:56.130958" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.130917" elapsed="0.000373"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:56.133844" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:56.133632" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.133593" elapsed="0.000387"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:52:56.134732" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:52:56.134302" elapsed="0.000486"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:52:56.135492" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:52:56.135149" elapsed="0.000399"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:56.187643" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:52:56.136713" elapsed="0.051043"/>
</kw>
<msg time="2026-10-11T00:52:56.187914" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:52:56.187956" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:56.135919" elapsed="0.052073"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:52:56.235387" 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-10-11T00:52:56.188537" elapsed="0.047008"/>
</kw>
<msg time="2026-10-11T00:52:56.235709" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:52:56.235753" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:56.188163" elapsed="0.047626"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:56.236070" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:56.235858" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.235840" elapsed="0.000303"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.236578" 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-10-11T00:52:56.236323" elapsed="0.000325"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:56.236923" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:56.236722" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.236705" elapsed="0.000289"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:52:56.237024" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:52:56.239541" elapsed="0.000116"/>
</kw>
<msg time="2026-10-11T00:52:56.239727" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:56.238353" elapsed="0.001506"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:56.240157" elapsed="0.000072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:56.240510" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:52:56.237782" elapsed="0.002922"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:52:56.237291" 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-10-11T00:52:56.132982" elapsed="0.107856"/>
</kw>
<msg time="2026-10-11T00:52:56.240919" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:56.240958" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:56.131660" elapsed="0.109333"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:52:56.241145" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:52:56.241061" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.241044" elapsed="0.000176"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:56.241573" 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-10-11T00:52:56.241889" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:52:56.241953" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:52:56.130171" elapsed="0.111866"/>
</kw>
<msg time="2026-10-11T00:52:56.242119" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:56.242158" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:56.125937" elapsed="0.116256"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:56.242503" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:56.242259" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.242243" elapsed="0.000331"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:52:56.125574" elapsed="0.117021"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:52:56.125243" elapsed="0.117378"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:52:56.120468" elapsed="0.122200"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:52:56.115399" elapsed="0.127370"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:56.114519" elapsed="0.128291"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:52:56.112111" elapsed="0.130746"/>
</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-10-11T00:52:56.243237" elapsed="0.000094"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:56.242967" elapsed="0.000415"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.246654" level="INFO">${start_cmd} = python3 bgp_app_peer.py --host 10.30.170.173 --port 8181 --command delete-all --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.173/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 variable.</doc>
<status status="PASS" start="2026-10-11T00:52:56.246355" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.247100" level="INFO">python3 bgp_app_peer.py --host 10.30.170.173 --port 8181 --command delete-all --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:52:56.246884" elapsed="0.000260"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:56.252006" level="INFO">python3 bgp_app_peer.py --host 10.30.170.173 --port 8181 --command delete-all --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family &amp;&gt;/dev/null</msg>
<msg time="2026-10-11T00:52:56.252094" level="INFO">${output} =  python3 bgp_app_peer.py --host 10.30.170.173 --port 8181 --command delete-all --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:52:56.247295" elapsed="0.004823"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.252549" level="INFO"> python3 bgp_app_peer.py --host 10.30.170.173 --port 8181 --command delete-all --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:52:56.252311" elapsed="0.000283"/>
</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-10-11T00:52:56.246005" elapsed="0.006639"/>
</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-10-11T00:52:56.409758" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-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-10-11T00:52:56.254756" elapsed="0.155064"/>
</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-10-11T00:52:56.254286" elapsed="0.155582"/>
</kw>
<arg>${BGP_APP_PEER_TIMEOUT}</arg>
<doc>Wait ${timeout} for the tool exit.</doc>
<status status="PASS" start="2026-10-11T00:52:56.253961" elapsed="0.155962"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:56.413220" level="INFO">Executing command 'cat bgp_app_peer.log'.</msg>
<msg time="2026-10-11T00:52:56.426822" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:56.426913" level="INFO">${output_log} = 2026-10-11 00:52:56,366 INFO: Delete all prefixes from 10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:52:56.413107" elapsed="0.013831"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.427374" level="INFO">2026-10-11 00:52:56,366 INFO: Delete all prefixes from 10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family
2026-10-11 00:52:56,388 DEBUG: &lt;PreparedRequest [DELETE]&gt; http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
2026-10-11 00:52:56,388 DEBUG: Request headers: {'Content-Type': 'application/xml', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='}:
2026-10-11 00:52:56,388 DEBUG: Response: 
2026-10-11 00:52:56,388 DEBUG: &lt;Response [204]&gt; No Content
2026-10-11 00:52:56,388 INFO: Total test execution time: 0.022s
2026-10-11 00:52:56,388 INFO: Total build data time: 0.000s
2026-10-11 00:52:56,388 INFO: Total response time: 0.022s
2026-10-11 00:52:56,388 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-10-11T00:52:56.427138" elapsed="0.000309"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T00:52:56.427899" 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-10-11T00:52:56.427622" elapsed="0.000330"/>
</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-10-11T00:52:56.412751" elapsed="0.015256"/>
</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-10-11T00:52:56.428557" elapsed="0.000242"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:52:56.428248" elapsed="0.000610"/>
</kw>
<doc>Start BGP application peer tool and give him 30s</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:52:56.110988" elapsed="0.317903"/>
</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-10-11T00:52:56.430254" elapsed="0.000215"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:52:56.430003" elapsed="0.000518"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:56.431677" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:56.431579" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.431309" elapsed="0.000447"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:56.433782" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:56.433696" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.433667" elapsed="0.000177"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.434759" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:56.434418" elapsed="0.000366"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.435199" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:52:56.434937" elapsed="0.000285"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:52:56.435263" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:52:56.435390" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:52:56.434049" elapsed="0.001380"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:56.437932" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:56.437847" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.437829" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:56.439037" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:56.438954" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.438937" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:52:56.439436" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:52:56.439246" elapsed="0.000216"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:52:56.439842" 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-10-11T00:52:56.439626" elapsed="0.000240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:56.469785" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:52:56.440351" elapsed="0.029533"/>
</kw>
<msg time="2026-10-11T00:52:56.470034" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:52:56.470076" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:56.440024" elapsed="0.030086"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:52:56.504309" 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-10-11T00:52:56.470639" elapsed="0.033795"/>
</kw>
<msg time="2026-10-11T00:52:56.504584" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:52:56.504626" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:56.470278" elapsed="0.034383"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:56.504951" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:56.504743" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.504725" elapsed="0.000298"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.505445" 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-10-11T00:52:56.505203" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:56.505828" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:56.505609" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.505591" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:52:56.505929" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:52:56.508439" elapsed="0.000116"/>
</kw>
<msg time="2026-10-11T00:52:56.508613" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:56.507288" 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-10-11T00:52:56.509075" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:56.509475" 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-10-11T00:52:56.506712" elapsed="0.002958"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:52:56.506202" 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-10-11T00:52:56.438696" elapsed="0.071124"/>
</kw>
<msg time="2026-10-11T00:52:56.509902" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:56.509941" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:56.438145" elapsed="0.071831"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:52:56.510128" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:52:56.510043" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.510026" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:56.510601" 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-10-11T00:52:56.510921" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:52:56.510984" 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-10-11T00:52:56.437551" elapsed="0.073518"/>
</kw>
<msg time="2026-10-11T00:52:56.511152" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:56.511191" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:56.435770" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:56.511562" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:56.511291" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.511276" elapsed="0.000359"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:52:56.435614" elapsed="0.076042"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:52:56.435477" elapsed="0.076218"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:52:56.433380" elapsed="0.078365"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:52:56.431074" elapsed="0.080719"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:56.430671" elapsed="0.081162"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:52:56.429639" elapsed="0.082240"/>
</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-10-11T00:52:56.528322" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:52:56.528014" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:52:56.529124" 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-10-11T00:52:56.528897" elapsed="0.000292">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-10-11T00:52:56.529273" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:52:56.528559" elapsed="0.000737"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.529818" 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-10-11T00:52:56.529491" elapsed="0.000352"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:52:56.530119" 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-10-11T00:52:56.530238" 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-10-11T00:52:56.530010" elapsed="0.000252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.530709" 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-10-11T00:52:56.530473" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.531963" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:56.531425" elapsed="0.000594"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.532696" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:52:56.532198" elapsed="0.000523"/>
</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-10-11T00:52:56.533052" 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-10-11T00:52:56.533760" elapsed="0.000047"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:52:56.534097" elapsed="0.000043"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:52:56.532871" elapsed="0.001382"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:52:56.532764" elapsed="0.001550"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:52:56.534356" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:52:56.534512" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:52:56.531065" elapsed="0.003471"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:56.530813" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:56.534767" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:56.534587" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.530795" elapsed="0.004042"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.535370" 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-10-11T00:52:56.534998" elapsed="0.000397"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:52:56.535503" 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-10-11T00:52:56.527490" elapsed="0.008115"/>
</kw>
<msg time="2026-10-11T00:52:56.535653" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:56.522860" elapsed="0.012852"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:52:56.539866" 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/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-10-11T00:52:56.544006" 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/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-10-11T00:52:56.548245" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:56.548443" 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-10-11T00:52:56.548627" 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-10-11T00:52:56.548977" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:56.548833" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:52:56.548819" 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-10-11T00:52:56.549203" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:56.549379" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:56.549560" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:52:56.548794" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:52:56.548707" elapsed="0.000923"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:56.549802" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:52:56.549869" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:52:56.549975" 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-10-11T00:52:56.522243" elapsed="0.027756"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:52:56.551104" 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-10-11T00:52:56.550915" elapsed="0.000248">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-10-11T00:52:56.551247" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:52:56.550578" elapsed="0.000691"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:56.551568" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:56.551332" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.552083" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:52:56.551820" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:56.551643" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.551315" elapsed="0.000844"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.552676" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:56.552322" elapsed="0.000389"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:52:56.552756" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:52:56.552879" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:52:56.550262" elapsed="0.002671"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:52:56.554011" 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-10-11T00:52:56.553828" elapsed="0.000241">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-10-11T00:52:56.554153" 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-10-11T00:52:56.553499" elapsed="0.000677"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:52:56.554338" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:52:56.554239" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.554222" elapsed="0.000209"/>
</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-10-11T00:52:56.554586" elapsed="0.000019"/>
</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-10-11T00:52:56.554771" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:52:56.554829" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:52:56.554953" 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-10-11T00:52:56.553184" elapsed="0.001792"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.556188" 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-10-11T00:52:56.555966" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.556651" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:56.556433" 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-10-11T00:52:56.571216" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0b1d3klx1ezq21lvql84nhilbb4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:52:56.571339" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:52:56.571459" 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-10-11T00:52:56.557004" elapsed="0.014480"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:56.556779" elapsed="0.014745"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:56.571713" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:56.571548" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.556762" elapsed="0.015029"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.573201" 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-10-11T00:52:56.572872" elapsed="0.000373"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:56.572612" elapsed="0.000665"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.572444" elapsed="0.000856"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.573897" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:56.573608" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:56.573351" elapsed="0.000618"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.573336" elapsed="0.000655"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.574536" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:52:56.574167" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:56.574851" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:56.574625" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.575349" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:52:56.575086" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:56.574925" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.574609" elapsed="0.000871"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.576010" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:52:56.575655" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:56.576306" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:56.576098" elapsed="0.000260"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.576837" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:52:56.576558" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:56.576379" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.576081" elapsed="0.000833"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:56.577058" elapsed="0.000291"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:52:56.577774" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:52:56.577526" elapsed="0.000272"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:52:56.577952" elapsed="0.000212"/>
</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-10-11T00:52:56.572109" elapsed="0.006111"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:52:56.578362" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:56.578281" elapsed="0.000121"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.578264" elapsed="0.000176"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:52:56.579078" 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-10-11T00:52:56.578582" elapsed="0.000523"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:52:56.579152" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:52:56.579278" 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-10-11T00:52:56.555250" elapsed="0.024052"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:52:56.579356" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:52:56.579494" 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-10-11T00:52:56.514961" elapsed="0.064558"/>
</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-10-11T00:52:56.590677" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:52:56.589928" elapsed="0.000806"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:52:56.592768" 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-10-11T00:52:56.592259" elapsed="0.000623">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-10-11T00:52:56.593003" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:52:56.590894" elapsed="0.002132"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.593879" 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-10-11T00:52:56.593198" elapsed="0.000737"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:52:56.594298" 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-10-11T00:52:56.594524" 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-10-11T00:52:56.594105" elapsed="0.000445"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.595259" 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-10-11T00:52:56.594757" elapsed="0.000561"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:52:56.595946" elapsed="0.000075"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:56.595380" elapsed="0.000716"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.597081" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:52:56.596296" elapsed="0.000824"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:56.596121" elapsed="0.001075"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.595362" elapsed="0.001856"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.598185" 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-10-11T00:52:56.597383" elapsed="0.000829"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:52:56.598256" 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-10-11T00:52:56.589396" elapsed="0.008961"/>
</kw>
<msg time="2026-10-11T00:52:56.598460" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:56.584844" elapsed="0.013665"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:52:56.602659" 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-10-11T00:52:56.606744" 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/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-10-11T00:52:56.610854" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:56.611033" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:56.611212" 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-10-11T00:52:56.611602" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:56.611454" elapsed="0.000238"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:52:56.611439" 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-10-11T00:52:56.611878" 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-10-11T00:52:56.612057" 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-10-11T00:52:56.612221" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:52:56.611389" elapsed="0.000880"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:52:56.611278" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:56.612459" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:52:56.612527" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:52:56.612632" 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-10-11T00:52:56.584119" elapsed="0.028538"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:56.612854" elapsed="0.000311"/>
</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-10-11T00:52:56.614105" 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-10-11T00:52:56.613836" elapsed="0.000296"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:52:56.614563" 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-10-11T00:52:56.614279" 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-10-11T00:52:56.614786" elapsed="0.000279"/>
</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-10-11T00:52:56.613457" elapsed="0.001662"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:56.613235" elapsed="0.001913"/>
</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-10-11T00:52:56.615345" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:56.615171" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.613218" elapsed="0.002212"/>
</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-10-11T00:52:56.580491" elapsed="0.034983"/>
</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-10-11T00:52:56.579823" elapsed="0.035715"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:56.579593" elapsed="0.035984"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.579577" elapsed="0.036021"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:52:56.615628" elapsed="0.000026"/>
</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-10-11T00:52:56.514312" elapsed="0.101428"/>
</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-10-11T00:52:56.512801" elapsed="0.102993"/>
</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-10-11T00:52:56.512335" elapsed="0.103499"/>
</kw>
<arg>empty_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="PASS" start="2026-10-11T00:52:56.511990" elapsed="0.103893"/>
</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-10-11T00:52:56.616433" elapsed="0.000431"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:52:56.616120" elapsed="0.000837"/>
</kw>
<doc>See new routes are deleted.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:52:56.429163" elapsed="0.187827"/>
</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-10-11T00:52:56.618393" elapsed="0.000222"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:52:56.618148" elapsed="0.000517"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:56.619575" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:56.619489" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.619471" elapsed="0.000166"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:56.621656" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:56.621572" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.621555" elapsed="0.000176"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.622632" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:56.622290" elapsed="0.000367"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.623092" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:52:56.622832" elapsed="0.000284"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:52:56.623156" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:52:56.623280" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:52:56.621935" elapsed="0.001368"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:56.625932" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:56.625848" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.625830" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:56.627034" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:56.626946" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.626929" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:52:56.627429" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:52:56.627240" elapsed="0.000215"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:52:56.627808" 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-10-11T00:52:56.627617" elapsed="0.000215"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:56.659984" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:52:56.628319" elapsed="0.031764"/>
</kw>
<msg time="2026-10-11T00:52:56.660235" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:52:56.660277" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:56.627991" elapsed="0.032321"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:52:56.708796" 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-10-11T00:52:56.660865" elapsed="0.048042"/>
</kw>
<msg time="2026-10-11T00:52:56.709056" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:52:56.709096" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:56.660504" elapsed="0.048627"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:56.709427" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:56.709200" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.709181" elapsed="0.000353"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.709962" 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-10-11T00:52:56.709734" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:56.710298" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:56.710099" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.710082" elapsed="0.000286"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:52:56.710398" 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-10-11T00:52:56.712812" elapsed="0.000115"/>
</kw>
<msg time="2026-10-11T00:52:56.712983" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:56.711775" elapsed="0.001337"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:56.713431" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:56.713780" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:52:56.711158" elapsed="0.002805"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:52:56.710699" elapsed="0.003324"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:52:56.626692" elapsed="0.087404"/>
</kw>
<msg time="2026-10-11T00:52:56.714176" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:56.714215" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:56.626143" elapsed="0.088107"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:52:56.714402" elapsed="0.000049"/>
</return>
<status status="PASS" start="2026-10-11T00:52:56.714317" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.714300" elapsed="0.000202"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:56.714835" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:56.715135" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:52:56.715199" 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-10-11T00:52:56.625550" elapsed="0.089734"/>
</kw>
<msg time="2026-10-11T00:52:56.715367" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:56.715430" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:56.623639" elapsed="0.091830"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:56.715770" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:56.715537" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.715521" elapsed="0.000320"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:52:56.623498" elapsed="0.092364"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:52:56.623348" elapsed="0.092539"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:52:56.621267" elapsed="0.094667"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:52:56.619220" elapsed="0.096762"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:56.618829" elapsed="0.097193"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:52:56.617808" elapsed="0.098259"/>
</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-10-11T00:52:56.716537" elapsed="0.000134"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:56.716175" elapsed="0.000562"/>
</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-10-11T00:52:56.721530" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:56.734147" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:56.734233" 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-10-11T00:52:56.721390" elapsed="0.012866"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.734721" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:56.734474" elapsed="0.000289"/>
</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-10-11T00:52:56.734915" elapsed="0.000266"/>
</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-10-11T00:52:56.721030" elapsed="0.014206"/>
</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-10-11T00:52:56.716904" elapsed="0.018379"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:56.739395" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received: 8.0.1.0/28' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:56.785914" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:56.786041" 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-10-11T00:52:56.739274" elapsed="0.046801"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.786756" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:56.786368" elapsed="0.000449"/>
</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-10-11T00:52:56.787043" elapsed="0.000413"/>
</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-10-11T00:52:56.738911" elapsed="0.048627"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:56.793787" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received: 8.0.1.16/28' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:56.833885" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:56.834073" 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-10-11T00:52:56.793593" elapsed="0.040530"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.835129" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:56.834599" elapsed="0.000620"/>
</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-10-11T00:52:56.835586" elapsed="0.000610"/>
</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-10-11T00:52:56.793042" elapsed="0.043274"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:56.845669" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received: 8.0.1.32/28' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:56.885904" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:56.886091" 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-10-11T00:52:56.845373" elapsed="0.040768"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.887148" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:56.886618" elapsed="0.000620"/>
</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-10-11T00:52:56.887605" elapsed="0.000614"/>
</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-10-11T00:52:56.844568" elapsed="0.043772"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:56.897626" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:52:56.937908" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:56.938099" 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-10-11T00:52:56.897328" elapsed="0.040820"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.939150" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:56.938626" elapsed="0.000613"/>
</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-10-11T00:52:56.939603" elapsed="0.000603"/>
</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-10-11T00:52:56.896517" elapsed="0.043810"/>
</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-10-11T00:52:56.941575" elapsed="0.000508"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:52:56.940904" elapsed="0.001302"/>
</kw>
<doc>Check incomming updates for new routes</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:52:56.617265" elapsed="0.325089"/>
</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-10-11T00:52:56.945264" elapsed="0.000493"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:52:56.944711" elapsed="0.001157"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:56.950478" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:56.950252" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.950209" elapsed="0.000413"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:56.955173" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:56.954992" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.954953" elapsed="0.000357"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.957374" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:56.956634" elapsed="0.000827"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:52:56.958441" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:52:56.957828" elapsed="0.000671"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:52:56.958588" elapsed="0.000061"/>
</return>
<msg time="2026-10-11T00:52:56.958893" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:52:56.955811" elapsed="0.003131"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:56.964570" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:56.964351" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.964312" elapsed="0.000419"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:56.967123" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:56.966935" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:56.966897" elapsed="0.000363"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:52:56.968045" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:52:56.967616" elapsed="0.000482"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:52:56.968831" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:52:56.968502" elapsed="0.000380"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:57.002892" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:52:56.970025" elapsed="0.033002"/>
</kw>
<msg time="2026-10-11T00:52:57.003234" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:52:57.003292" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:56.969232" elapsed="0.034108"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:52:57.030004" 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-10-11T00:52:57.004128" elapsed="0.025971"/>
</kw>
<msg time="2026-10-11T00:52:57.030244" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:52:57.030285" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:57.003601" elapsed="0.026718"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:57.030611" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:57.030386" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:57.030369" elapsed="0.000328"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:57.031097" 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-10-11T00:52:57.030876" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:57.031477" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:57.031260" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:57.031243" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:52:57.031579" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:52:57.034128" elapsed="0.000115"/>
</kw>
<msg time="2026-10-11T00:52:57.034300" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:57.033051" elapsed="0.001399"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:57.034770" elapsed="0.000072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:57.035098" elapsed="0.000070"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:52:57.032322" elapsed="0.002957"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:52:57.031863" elapsed="0.003473"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:52:56.966280" elapsed="0.069149"/>
</kw>
<msg time="2026-10-11T00:52:57.035513" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:57.035552" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:56.965073" elapsed="0.070514"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:52:57.035759" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:52:57.035655" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:57.035638" elapsed="0.000197"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:57.036152" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:57.036478" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:52:57.036542" 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-10-11T00:52:56.963711" elapsed="0.072916"/>
</kw>
<msg time="2026-10-11T00:52:57.036723" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:57.036764" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:56.959703" elapsed="0.077095"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:57.037082" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:57.036864" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:57.036848" elapsed="0.000304"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:52:56.959338" elapsed="0.077835"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:52:56.959042" elapsed="0.078157"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:52:56.954291" elapsed="0.082956"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:52:56.947113" elapsed="0.090181"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:56.946196" elapsed="0.091138"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:52:56.943907" elapsed="0.093473"/>
</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-10-11T00:52:57.038004" elapsed="0.000094"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:57.037606" elapsed="0.000542"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:57.039198" 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-10-11T00:52:57.038906" elapsed="0.000317"/>
</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-10-11T00:52:57.039425" elapsed="0.000182"/>
</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-10-11T00:52:57.038615" elapsed="0.001046"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-10-11T00:52:59.040525" level="INFO">2026-10-11 00:52:55,343 INFO BGP-Thread-1 (job): ... idle for 10.008s
2026-10-11 00:52:55,343 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.015s
2026-10-11 00:52:55,343 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:52:55,343 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:52:55,344 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:52:55,598 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000100
2026-10-11 00:52:55,598 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:52:55,598 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:52:55,598 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-10-11 00:52:55,599 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:52:55,599 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:52:55,599 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:55,599 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:55,599 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:55,599 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:55,599 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:55,600 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:55,600 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:55,600 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:55,600 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:55,600 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:55,600 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-10-11 00:52:55,600 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000100'
2026-10-11 00:52:55,601 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:52:55,601 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:52:55,601 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:52:55,601 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:52:55,601 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:52:55,601 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:52:55,601 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:52:55,602 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:52:55,602 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:52:55,602 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:52:55,602 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:52:55,602 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:52:55,602 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-10-11 00:52:55,603 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000100'
2026-10-11 00:52:55,603 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:52:55,603 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:52:55,603 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-10-11 00:52:55,603 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-10-11 00:52:55,603 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-10-11 00:52:55,603 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000100'
2026-10-11 00:52:55,604 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.0/28']
2026-10-11 00:52:55,604 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.0/28
2026-10-11 00:52:55,604 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:55,604 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:55,604 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:52:55,604 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000120
2026-10-11 00:52:55,604 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:52:55,605 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:52:55,605 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-10-11 00:52:55,605 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:52:55,605 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:52:55,605 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:55,605 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:55,605 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:55,606 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:55,606 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:55,606 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:55,606 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:55,606 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:55,606 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:55,606 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:55,607 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-10-11 00:52:55,607 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000120'
2026-10-11 00:52:55,607 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:52:55,607 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:52:55,607 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:52:55,607 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:52:55,608 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:52:55,608 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:52:55,608 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:52:55,608 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:52:55,608 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:52:55,608 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:52:55,609 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:52:55,609 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:52:55,609 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-10-11 00:52:55,609 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000120'
2026-10-11 00:52:55,609 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:52:55,609 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:52:55,609 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-10-11 00:52:55,610 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-10-11 00:52:55,610 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-10-11 00:52:55,610 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000120'
2026-10-11 00:52:55,610 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.32/28']
2026-10-11 00:52:55,610 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.32/28
2026-10-11 00:52:55,610 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:55,610 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:55,610 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:52:55,611 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000110
2026-10-11 00:52:55,611 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:52:55,611 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:52:55,611 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-10-11 00:52:55,611 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:52:55,611 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:52:55,612 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:55,612 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:55,612 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:55,612 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:55,612 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:55,612 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:55,612 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:55,613 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:55,613 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:55,613 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:55,613 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-10-11 00:52:55,613 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000110'
2026-10-11 00:52:55,613 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:52:55,613 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:52:55,614 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:52:55,614 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:52:55,614 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:52:55,614 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:52:55,614 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:52:55,614 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:52:55,614 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:52:55,615 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:52:55,615 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:52:55,615 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:52:55,615 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-10-11 00:52:55,615 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000110'
2026-10-11 00:52:55,615 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:52:55,615 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:52:55,616 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-10-11 00:52:55,616 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-10-11 00:52:55,616 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-10-11 00:52:55,616 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000110'
2026-10-11 00:52:55,616 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.16/28']
2026-10-11 00:52:55,616 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.16/28
2026-10-11 00:52:55,617 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:55,617 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:55,617 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:52:56,395 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000100
2026-10-11 00:52:56,396 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:52:56,396 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:52:56,396 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-10-11 00:52:56,396 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:52:56,396 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:52:56,396 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:56,396 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000100'
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:52:56,398 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:52:56,398 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:52:56,398 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:52:56,398 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:52:56,398 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:52:56,398 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:52:56,399 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:52:56,399 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:52:56,399 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:52:56,399 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:52:56,399 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:52:56,399 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-10-11 00:52:56,399 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000100'
2026-10-11 00:52:56,399 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:52:56,400 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:52:56,400 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000100'
2026-10-11 00:52:56,400 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.0/28']
2026-10-11 00:52:56,400 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.0/28
2026-10-11 00:52:56,400 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:56,400 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:56,401 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:52:56,401 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000120
2026-10-11 00:52:56,401 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:52:56,401 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:52:56,401 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-10-11 00:52:56,401 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:52:56,401 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:52:56,402 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:56,402 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:56,402 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:56,402 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:56,402 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:56,402 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:56,402 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:56,403 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:56,403 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:56,403 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:56,403 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-10-11 00:52:56,403 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000120'
2026-10-11 00:52:56,403 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:52:56,403 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:52:56,404 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:52:56,404 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:52:56,404 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:52:56,404 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:52:56,404 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:52:56,404 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:52:56,405 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:52:56,405 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:52:56,405 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:52:56,405 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:52:56,405 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-10-11 00:52:56,405 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000120'
2026-10-11 00:52:56,405 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:52:56,406 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:52:56,406 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000120'
2026-10-11 00:52:56,406 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.32/28']
2026-10-11 00:52:56,406 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.32/28
2026-10-11 00:52:56,406 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:56,406 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:56,406 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:52:56,407 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000110
2026-10-11 00:52:56,407 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:52:56,407 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:52:56,407 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-10-11 00:52:56,407 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:52:56,407 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:52:56,408 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:56,408 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:56,408 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:56,408 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:56,408 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:56,408 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:56,408 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:56,409 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:56,409 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:56,409 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:56,409 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-10-11 00:52:56,409 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000110'
2026-10-11 00:52:56,409 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:52:56,409 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:52:56,410 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:52:56,410 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:52:56,410 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:52:56,410 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:52:56,410 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:52:56,410 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:52:56,411 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:52:56,411 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:52:56,411 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:52:56,411 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:52:56,411 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-10-11 00:52:56,411 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000110'
2026-10-11 00:52:56,411 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:52:56,412 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:52:56,412 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000110'
2026-10-11 00:52:56,412 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.16/28']
2026-10-11 00:52:56,412 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.16/28
2026-10-11 00:52:56,412 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:56,412 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:56,412 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-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T00:52:59.041396" level="INFO">${output} = 2026-10-11 00:52:55,343 INFO BGP-Thread-1 (job): ... idle for 10.008s
2026-10-11 00:52:55,343 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.015s
2026-10-11 00:52:55,343 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-10-11T00:52:57.039839" elapsed="2.001648"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.042694" level="INFO">2026-10-11 00:52:55,343 INFO BGP-Thread-1 (job): ... idle for 10.008s
2026-10-11 00:52:55,343 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.015s
2026-10-11 00:52:55,343 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:52:55,343 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:52:55,344 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:52:55,598 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000100
2026-10-11 00:52:55,598 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:52:55,598 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:52:55,598 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-10-11 00:52:55,599 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:52:55,599 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:52:55,599 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:55,599 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:55,599 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:55,599 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:55,599 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:55,600 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:55,600 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:55,600 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:55,600 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:55,600 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:55,600 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-10-11 00:52:55,600 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000100'
2026-10-11 00:52:55,601 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:52:55,601 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:52:55,601 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:52:55,601 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:52:55,601 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:52:55,601 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:52:55,601 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:52:55,602 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:52:55,602 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:52:55,602 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:52:55,602 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:52:55,602 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:52:55,602 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-10-11 00:52:55,603 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000100'
2026-10-11 00:52:55,603 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:52:55,603 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:52:55,603 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-10-11 00:52:55,603 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-10-11 00:52:55,603 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-10-11 00:52:55,603 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000100'
2026-10-11 00:52:55,604 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.0/28']
2026-10-11 00:52:55,604 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.0/28
2026-10-11 00:52:55,604 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:55,604 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:55,604 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:52:55,604 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000120
2026-10-11 00:52:55,604 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:52:55,605 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:52:55,605 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-10-11 00:52:55,605 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:52:55,605 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:52:55,605 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:55,605 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:55,605 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:55,606 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:55,606 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:55,606 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:55,606 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:55,606 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:55,606 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:55,606 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:55,607 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-10-11 00:52:55,607 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000120'
2026-10-11 00:52:55,607 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:52:55,607 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:52:55,607 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:52:55,607 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:52:55,608 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:52:55,608 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:52:55,608 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:52:55,608 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:52:55,608 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:52:55,608 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:52:55,609 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:52:55,609 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:52:55,609 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-10-11 00:52:55,609 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000120'
2026-10-11 00:52:55,609 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:52:55,609 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:52:55,609 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-10-11 00:52:55,610 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-10-11 00:52:55,610 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-10-11 00:52:55,610 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000120'
2026-10-11 00:52:55,610 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.32/28']
2026-10-11 00:52:55,610 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.32/28
2026-10-11 00:52:55,610 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:55,610 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:55,610 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:52:55,611 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000110
2026-10-11 00:52:55,611 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:52:55,611 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:52:55,611 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-10-11 00:52:55,611 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:52:55,611 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:52:55,612 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:55,612 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:55,612 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:55,612 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:55,612 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:55,612 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:55,612 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:55,613 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:55,613 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:55,613 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:55,613 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-10-11 00:52:55,613 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000110'
2026-10-11 00:52:55,613 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:52:55,613 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:52:55,614 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:52:55,614 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:52:55,614 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:52:55,614 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:52:55,614 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:52:55,614 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:52:55,614 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:52:55,615 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:52:55,615 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:52:55,615 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:52:55,615 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-10-11 00:52:55,615 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000110'
2026-10-11 00:52:55,615 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:52:55,615 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:52:55,616 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-10-11 00:52:55,616 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-10-11 00:52:55,616 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-10-11 00:52:55,616 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000110'
2026-10-11 00:52:55,616 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.16/28']
2026-10-11 00:52:55,616 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.16/28
2026-10-11 00:52:55,617 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:55,617 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:55,617 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:52:56,395 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000100
2026-10-11 00:52:56,396 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:52:56,396 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:52:56,396 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-10-11 00:52:56,396 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:52:56,396 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:52:56,396 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:56,396 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000100'
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:52:56,398 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:52:56,398 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:52:56,398 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:52:56,398 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:52:56,398 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:52:56,398 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:52:56,399 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:52:56,399 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:52:56,399 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:52:56,399 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:52:56,399 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:52:56,399 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-10-11 00:52:56,399 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000100'
2026-10-11 00:52:56,399 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:52:56,400 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:52:56,400 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000100'
2026-10-11 00:52:56,400 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.0/28']
2026-10-11 00:52:56,400 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.0/28
2026-10-11 00:52:56,400 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:56,400 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:56,401 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:52:56,401 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000120
2026-10-11 00:52:56,401 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:52:56,401 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:52:56,401 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-10-11 00:52:56,401 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:52:56,401 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:52:56,402 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:56,402 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:56,402 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:56,402 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:56,402 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:56,402 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:56,402 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:56,403 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:56,403 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:56,403 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:56,403 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-10-11 00:52:56,403 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000120'
2026-10-11 00:52:56,403 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:52:56,403 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:52:56,404 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:52:56,404 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:52:56,404 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:52:56,404 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:52:56,404 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:52:56,404 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:52:56,405 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:52:56,405 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:52:56,405 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:52:56,405 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:52:56,405 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-10-11 00:52:56,405 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000120'
2026-10-11 00:52:56,405 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:52:56,406 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:52:56,406 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000120'
2026-10-11 00:52:56,406 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.32/28']
2026-10-11 00:52:56,406 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.32/28
2026-10-11 00:52:56,406 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:56,406 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:56,406 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:52:56,407 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000110
2026-10-11 00:52:56,407 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:52:56,407 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:52:56,407 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-10-11 00:52:56,407 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:52:56,407 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:52:56,408 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:56,408 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:56,408 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:56,408 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:56,408 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:56,408 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:56,408 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:56,409 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:56,409 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:56,409 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:56,409 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-10-11 00:52:56,409 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000110'
2026-10-11 00:52:56,409 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:52:56,409 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:52:56,410 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:52:56,410 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:52:56,410 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:52:56,410 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:52:56,410 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:52:56,410 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:52:56,411 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:52:56,411 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:52:56,411 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:52:56,411 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:52:56,411 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-10-11 00:52:56,411 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000110'
2026-10-11 00:52:56,411 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:52:56,412 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:52:56,412 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000110'
2026-10-11 00:52:56,412 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.16/28']
2026-10-11 00:52:56,412 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.16/28
2026-10-11 00:52:56,412 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:56,412 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:56,412 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-423-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-10-11T00:52:59.042038" elapsed="0.001309"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-10-11T00:52:57.038303" elapsed="2.005204"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:59.051258" level="INFO">Executing command 'cat bgp_peer.log'.</msg>
<msg time="2026-10-11T00:52:59.065128" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:59.065323" level="INFO">${output_log} = 2026-10-11 00:52:45,314 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:52:45,314 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 00:52:45,314 DEBUG BGP-Threa...</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-10-11T00:52:59.051009" elapsed="0.014369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.066396" level="INFO">2026-10-11 00:52:45,314 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:52:45,314 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 00:52:45,314 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 00:52:45,314 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 00:52:45,314 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 00:52:45,315 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:52:45,317 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:52:45,317 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:52:45,317 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:52:45,317 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-10-11 00:52:45,318 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-10-11 00:52:45,318 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 00:52:45,318 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 00:52:45,318 INFO BGP-Thread-1 (job):   My BGP Identifier: 169782023
2026-10-11 00:52:45,318 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 00:52:45,318 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 00:52:45,318 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 00:52:45,318 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 00:52:45,318 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 00:52:45,319 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 00:52:45,319 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-10-11 00:52:45,319 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-10-11 00:52:45,319 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 00:52:45,319 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 00:52:45,319 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 00:52:45,319 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:52:45,319 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-10-11 00:52:45,320 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 00:52:45,320 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 00:52:45,320 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-10-11 00:52:45,320 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 00:52:45,320 DEBUG BGP-Thread-1 (job):   BGP Identifier=169782023 (0x0a1eab07)
2026-10-11 00:52:45,320 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-10-11 00:52:45,320 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf0
2026-10-11 00:52:45,320 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf000b40a1eab07100206010400010001020641040000fbf0'
2026-10-11 00:52:45,321 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf000b40a1eab07100206010400010001020641040000fbf0
2026-10-11 00:52:45,323 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:52:45,323 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:52:45,323 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:52:45,323 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:52:45,323 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:52:45,324 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:52:45,324 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:52:45,324 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:52:45,324 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:52:45,324 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:52:45,324 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 00:52:45,325 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:52:45,325 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:52:45,325 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:52:45,332 INFO BGP-Thread-1 (job): ... idle for 0.007s
2026-10-11 00:52:45,332 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.007s
2026-10-11 00:52:45,332 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 00:52:45,333 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:52:45,333 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:52:45,333 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 00:52:45,333 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:52:45,333 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:52:45,333 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:45,333 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:45,333 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:45,333 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:45,334 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:52:55,343 INFO BGP-Thread-1 (job): ... idle for 10.008s
2026-10-11 00:52:55,343 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.015s
2026-10-11 00:52:55,343 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:52:55,343 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:52:55,344 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:52:55,598 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000100
2026-10-11 00:52:55,598 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:52:55,598 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:52:55,598 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-10-11 00:52:55,599 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:52:55,599 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:52:55,599 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:55,599 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:55,599 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:55,599 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:55,599 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:55,600 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:55,600 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:55,600 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:55,600 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:55,600 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:55,600 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-10-11 00:52:55,600 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000100'
2026-10-11 00:52:55,601 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:52:55,601 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:52:55,601 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:52:55,601 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:52:55,601 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:52:55,601 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:52:55,601 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:52:55,602 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:52:55,602 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:52:55,602 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:52:55,602 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:52:55,602 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:52:55,602 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-10-11 00:52:55,603 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000100'
2026-10-11 00:52:55,603 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:52:55,603 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:52:55,603 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-10-11 00:52:55,603 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-10-11 00:52:55,603 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-10-11 00:52:55,603 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000100'
2026-10-11 00:52:55,604 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.0/28']
2026-10-11 00:52:55,604 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.0/28
2026-10-11 00:52:55,604 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:55,604 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:55,604 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:52:55,604 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000120
2026-10-11 00:52:55,604 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:52:55,605 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:52:55,605 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-10-11 00:52:55,605 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:52:55,605 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:52:55,605 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:55,605 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:55,605 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:55,606 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:55,606 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:55,606 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:55,606 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:55,606 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:55,606 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:55,606 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:55,607 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-10-11 00:52:55,607 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000120'
2026-10-11 00:52:55,607 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:52:55,607 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:52:55,607 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:52:55,607 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:52:55,608 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:52:55,608 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:52:55,608 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:52:55,608 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:52:55,608 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:52:55,608 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:52:55,609 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:52:55,609 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:52:55,609 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-10-11 00:52:55,609 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000120'
2026-10-11 00:52:55,609 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:52:55,609 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:52:55,609 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-10-11 00:52:55,610 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-10-11 00:52:55,610 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-10-11 00:52:55,610 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000120'
2026-10-11 00:52:55,610 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.32/28']
2026-10-11 00:52:55,610 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.32/28
2026-10-11 00:52:55,610 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:55,610 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:55,610 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:52:55,611 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000110
2026-10-11 00:52:55,611 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:52:55,611 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:52:55,611 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-10-11 00:52:55,611 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:52:55,611 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:52:55,612 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:55,612 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:55,612 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:55,612 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:55,612 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:55,612 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:55,612 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:55,613 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:55,613 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:55,613 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:55,613 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-10-11 00:52:55,613 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000110'
2026-10-11 00:52:55,613 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:52:55,613 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:52:55,614 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:52:55,614 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:52:55,614 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:52:55,614 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:52:55,614 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:52:55,614 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:52:55,614 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:52:55,615 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:52:55,615 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:52:55,615 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:52:55,615 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-10-11 00:52:55,615 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000110'
2026-10-11 00:52:55,615 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:52:55,615 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:52:55,616 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-10-11 00:52:55,616 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-10-11 00:52:55,616 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-10-11 00:52:55,616 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000110'
2026-10-11 00:52:55,616 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.16/28']
2026-10-11 00:52:55,616 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.16/28
2026-10-11 00:52:55,617 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:55,617 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:55,617 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:52:56,395 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000100
2026-10-11 00:52:56,396 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:52:56,396 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:52:56,396 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-10-11 00:52:56,396 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:52:56,396 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:52:56,396 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:56,396 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000100'
2026-10-11 00:52:56,397 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:52:56,398 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:52:56,398 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:52:56,398 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:52:56,398 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:52:56,398 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:52:56,398 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:52:56,399 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:52:56,399 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:52:56,399 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:52:56,399 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:52:56,399 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:52:56,399 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-10-11 00:52:56,399 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000100'
2026-10-11 00:52:56,399 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:52:56,400 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:52:56,400 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000100'
2026-10-11 00:52:56,400 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.0/28']
2026-10-11 00:52:56,400 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.0/28
2026-10-11 00:52:56,400 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:56,400 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:56,401 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:52:56,401 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000120
2026-10-11 00:52:56,401 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:52:56,401 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:52:56,401 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-10-11 00:52:56,401 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:52:56,401 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:52:56,402 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:56,402 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:56,402 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:56,402 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:56,402 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:56,402 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:56,402 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:56,403 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:56,403 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:56,403 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:56,403 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-10-11 00:52:56,403 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000120'
2026-10-11 00:52:56,403 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:52:56,403 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:52:56,404 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:52:56,404 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:52:56,404 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:52:56,404 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:52:56,404 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:52:56,404 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:52:56,405 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:52:56,405 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:52:56,405 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:52:56,405 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:52:56,405 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-10-11 00:52:56,405 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000120'
2026-10-11 00:52:56,405 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:52:56,406 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:52:56,406 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000120'
2026-10-11 00:52:56,406 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.32/28']
2026-10-11 00:52:56,406 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.32/28
2026-10-11 00:52:56,406 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:56,406 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:56,406 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:52:56,407 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000110
2026-10-11 00:52:56,407 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:52:56,407 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:52:56,407 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-10-11 00:52:56,407 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:52:56,407 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:52:56,408 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:56,408 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:56,408 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:56,408 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:56,408 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:56,408 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:56,408 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:56,409 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:56,409 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:56,409 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:56,409 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-10-11 00:52:56,409 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000110'
2026-10-11 00:52:56,409 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:52:56,409 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:52:56,410 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:52:56,410 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:52:56,410 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:52:56,410 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:52:56,410 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:52:56,410 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:52:56,411 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:52:56,411 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:52:56,411 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:52:56,411 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:52:56,411 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-10-11 00:52:56,411 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000110'
2026-10-11 00:52:56,411 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:52:56,412 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:52:56,412 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000110'
2026-10-11 00:52:56,412 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.16/28']
2026-10-11 00:52:56,412 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.16/28
2026-10-11 00:52:56,412 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:56,412 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:56,412 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-10-11T00:52:59.065887" elapsed="0.001234"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T00:52:59.068190" 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-10-11T00:52:59.067568" elapsed="0.000734"/>
</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-10-11T00:52:59.050154" elapsed="0.018299"/>
</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-10-11T00:52:59.069714" elapsed="0.000507"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:52:59.069019" elapsed="0.001329"/>
</kw>
<doc>Stop BGP peer tool</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:52:56.942933" elapsed="2.127519"/>
</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-10-11T00:52:59.073631" elapsed="0.000459"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:52:59.073050" elapsed="0.001149"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:59.076938" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:59.076718" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.076653" elapsed="0.000434"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:59.081703" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:59.081494" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.081452" elapsed="0.000390"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.083956" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:59.083175" elapsed="0.000838"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.084983" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:52:59.084352" elapsed="0.000684"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:52:59.085125" elapsed="0.000066"/>
</return>
<msg time="2026-10-11T00:52:59.085445" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:52:59.082298" elapsed="0.003202"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:59.091222" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:59.091036" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.090996" elapsed="0.000366"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:59.093799" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:59.093594" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.093555" elapsed="0.000381"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:52:59.094695" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:52:59.094263" elapsed="0.000488"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:52:59.095463" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:52:59.095116" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:59.131211" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:52:59.096659" elapsed="0.034685"/>
</kw>
<msg time="2026-10-11T00:52:59.131585" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:52:59.131644" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:59.095892" elapsed="0.035821"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:52:59.169180" 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-10-11T00:52:59.132441" elapsed="0.036842"/>
</kw>
<msg time="2026-10-11T00:52:59.169455" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:52:59.169530" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:59.131949" elapsed="0.037618"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:59.169863" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:59.169638" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.169619" elapsed="0.000316"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.170347" 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-10-11T00:52:59.170121" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:59.170708" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:59.170493" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.170475" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:52:59.170811" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:52:59.173378" elapsed="0.000132"/>
</kw>
<msg time="2026-10-11T00:52:59.173569" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:59.172295" elapsed="0.001700"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:59.174307" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:59.174682" 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-10-11T00:52:59.171572" elapsed="0.003298"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:52:59.171087" elapsed="0.003844"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:52:59.092978" elapsed="0.082027"/>
</kw>
<msg time="2026-10-11T00:52:59.175086" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:59.175125" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:59.091752" elapsed="0.083409"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:52:59.175314" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:52:59.175228" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.175211" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:59.175771" 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-10-11T00:52:59.176080" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:52:59.176144" 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-10-11T00:52:59.090348" elapsed="0.085881"/>
</kw>
<msg time="2026-10-11T00:52:59.176311" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:59.176351" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:59.086255" elapsed="0.090130"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:59.176718" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:59.176477" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.176460" elapsed="0.000330"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:52:59.085939" elapsed="0.090872"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:52:59.085605" elapsed="0.091234"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:52:59.080802" elapsed="0.096086"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:52:59.075520" elapsed="0.101449"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:59.074582" elapsed="0.102429"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:52:59.072243" elapsed="0.104813"/>
</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-10-11T00:52:59.177528" elapsed="0.000097"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:59.177175" elapsed="0.000516"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.180922" level="INFO">${start_cmd} = python3 bgp_app_peer.py --host 10.30.170.173 --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.173/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 variable.</doc>
<status status="PASS" start="2026-10-11T00:52:59.180619" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.181361" level="INFO">python3 bgp_app_peer.py --host 10.30.170.173 --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.173/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-10-11T00:52:59.181145" elapsed="0.000273"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:59.186210" level="INFO">python3 bgp_app_peer.py --host 10.30.170.173 --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.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family &amp;&gt;/dev/null</msg>
<msg time="2026-10-11T00:52:59.186300" level="INFO">${output} =  python3 bgp_app_peer.py --host 10.30.170.173 --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.173/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-10-11T00:52:59.181574" elapsed="0.004751"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.186781" level="INFO"> python3 bgp_app_peer.py --host 10.30.170.173 --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.173/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-10-11T00:52:59.186541" elapsed="0.000285"/>
</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-10-11T00:52:59.180251" elapsed="0.006624"/>
</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-10-11T00:52:59.332753" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-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-10-11T00:52:59.189030" elapsed="0.143782"/>
</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-10-11T00:52:59.188548" elapsed="0.144309"/>
</kw>
<arg>${BGP_APP_PEER_TIMEOUT}</arg>
<doc>Wait ${timeout} for the tool exit.</doc>
<status status="PASS" start="2026-10-11T00:52:59.188201" elapsed="0.144708"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:52:59.336219" level="INFO">Executing command 'cat bgp_app_peer.log'.</msg>
<msg time="2026-10-11T00:52:59.348898" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:52:59.348985" level="INFO">${output_log} = 2026-10-11 00:52:59,300 INFO: Put 3 prefix(es) in a single request (starting from 8.0.1.0/28) into 10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:52:59.336108" elapsed="0.012901"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.349461" level="INFO">2026-10-11 00:52:59,300 INFO: Put 3 prefix(es) in a single request (starting from 8.0.1.0/28) into 10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
2026-10-11 00:52:59,303 DEBUG: ...streaming chunk 1 (prefix: 8.0.1.0/28)
2026-10-11 00:52:59,303 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-10-11 00:52:59,303 DEBUG: ...streaming chunk 2 (prefix: 8.0.1.16/28)
2026-10-11 00:52:59,303 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-10-11 00:52:59,303 DEBUG: ...streaming chunk 3 (prefix: 8.0.1.32/28)
2026-10-11 00:52:59,303 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-10-11 00:52:59,318 DEBUG: &lt;PreparedRequest [PUT]&gt; http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
2026-10-11 00:52:59,319 DEBUG: Request headers: {'Content-Type': 'application/xml', 'Transfer-Encoding': 'chunked', 'Authorization': 'Basic YWRtaW46YWRtaW4='}:
2026-10-11 00:52:59,319 DEBUG: Response: 
2026-10-11 00:52:59,319 DEBUG: &lt;Response [201]&gt; Created
2026-10-11 00:52:59,319 INFO: Total test execution time: 0.019s
2026-10-11 00:52:59,319 INFO: Total build data time: 0.000s
2026-10-11 00:52:59,319 INFO: Total response time: 0.018s
2026-10-11 00:52:59,319 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-10-11T00:52:59.349211" elapsed="0.000362"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T00:52:59.349996" 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-10-11T00:52:59.349766" elapsed="0.000281"/>
</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-10-11T00:52:59.335755" elapsed="0.014344"/>
</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-10-11T00:52:59.350644" elapsed="0.000236"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:52:59.350335" elapsed="0.000602"/>
</kw>
<doc>Start BGP application peer tool and give him 30s</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:52:59.071110" elapsed="0.279861"/>
</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-10-11T00:52:59.352389" elapsed="0.000214"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:52:59.352144" elapsed="0.000508"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:59.353804" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:59.353716" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.353697" elapsed="0.000170"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:59.355892" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:59.355810" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.355793" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.356898" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:59.356530" elapsed="0.000393"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.357338" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:52:59.357076" elapsed="0.000286"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:52:59.357401" elapsed="0.000044"/>
</return>
<msg time="2026-10-11T00:52:59.357547" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:52:59.356159" elapsed="0.001411"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:59.360062" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:59.359979" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.359961" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:59.361180" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:59.361098" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.361080" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:52:59.361578" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:52:59.361388" elapsed="0.000215"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:52:59.361914" 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-10-11T00:52:59.361780" elapsed="0.000157"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:59.395792" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:52:59.362440" elapsed="0.033455"/>
</kw>
<msg time="2026-10-11T00:52:59.396053" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:52:59.396097" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:59.362094" elapsed="0.034038"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:52:59.447843" 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-10-11T00:52:59.396695" elapsed="0.051257"/>
</kw>
<msg time="2026-10-11T00:52:59.448138" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:52:59.448181" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:59.396306" elapsed="0.051910"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:59.448523" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:59.448287" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.448268" elapsed="0.000328"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.449021" 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-10-11T00:52:59.448790" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:59.449357" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:59.449156" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.449139" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:52:59.449476" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:52:59.452044" elapsed="0.000117"/>
</kw>
<msg time="2026-10-11T00:52:59.452218" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:59.450983" elapsed="0.001366"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:59.452688" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:59.453019" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:52:59.450361" elapsed="0.002841"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:52:59.449761" elapsed="0.003500"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:52:59.360843" elapsed="0.092492"/>
</kw>
<msg time="2026-10-11T00:52:59.453437" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:59.453478" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:59.360275" elapsed="0.093238"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:52:59.453680" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:52:59.453582" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.453565" elapsed="0.000193"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:59.454078" elapsed="0.000022"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:59.454379" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:52:59.454509" 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-10-11T00:52:59.359693" elapsed="0.094903"/>
</kw>
<msg time="2026-10-11T00:52:59.454691" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:59.454732" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:59.357907" elapsed="0.096859"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:59.455053" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:59.454833" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.454817" elapsed="0.000305"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:52:59.357766" elapsed="0.097378"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:52:59.357615" elapsed="0.097555"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:52:59.355506" elapsed="0.099711"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:52:59.353445" elapsed="0.101856"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:59.352811" elapsed="0.102530"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:52:59.351802" elapsed="0.103585"/>
</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-10-11T00:52:59.471994" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:52:59.471687" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:52:59.472775" 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-10-11T00:52:59.472519" elapsed="0.000335">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-10-11T00:52:59.472940" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:52:59.472181" elapsed="0.000782"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.473468" 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-10-11T00:52:59.473135" elapsed="0.000359"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:52:59.473788" 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-10-11T00:52:59.473912" 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-10-11T00:52:59.473661" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.474351" 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-10-11T00:52:59.474133" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.475636" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:59.475084" elapsed="0.000626"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.476358" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:52:59.475888" elapsed="0.000494"/>
</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-10-11T00:52:59.476755" 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-10-11T00:52:59.477465" 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-10-11T00:52:59.477851" elapsed="0.000046"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:52:59.476555" elapsed="0.001455"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:52:59.476445" elapsed="0.001625"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:52:59.478112" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:52:59.478245" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:52:59.474744" elapsed="0.003524"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:59.474471" elapsed="0.003826"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:59.478495" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:59.478318" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.474452" elapsed="0.004114"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.479128" 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-10-11T00:52:59.478738" elapsed="0.000415"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:52:59.479196" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:52:59.471150" elapsed="0.008145"/>
</kw>
<msg time="2026-10-11T00:52:59.479376" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:59.466742" elapsed="0.012705"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:52:59.483810" 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/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-10-11T00:52:59.487910" 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/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-10-11T00:52:59.492007" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:59.492191" 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-10-11T00:52:59.492371" 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-10-11T00:52:59.492738" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:59.492578" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:52:59.492564" 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-10-11T00:52:59.492967" 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-10-11T00:52:59.493147" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:59.493310" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:52:59.492540" elapsed="0.000817"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:52:59.492451" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:59.493547" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:52:59.493613" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:52:59.493732" 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-10-11T00:52:59.466093" elapsed="0.027663"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:52:59.494863" 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-10-11T00:52:59.494675" elapsed="0.000247">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-10-11T00:52:59.495004" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:52:59.494324" elapsed="0.000703"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:59.495342" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:59.495090" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.495881" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:52:59.495602" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:59.495434" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.495072" elapsed="0.000885"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.496467" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:59.496117" elapsed="0.000374"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:52:59.496535" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:52:59.496659" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:52:59.494026" elapsed="0.002670"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:52:59.497786" 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-10-11T00:52:59.497585" elapsed="0.000260">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-10-11T00:52:59.497929" 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-10-11T00:52:59.497248" elapsed="0.000704"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:52:59.498112" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:52:59.498015" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.497998" elapsed="0.000190"/>
</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-10-11T00:52:59.498342" elapsed="0.000020"/>
</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-10-11T00:52:59.498535" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:52:59.498594" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:52:59.498731" 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-10-11T00:52:59.496948" elapsed="0.001806"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.500004" 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-10-11T00:52:59.499781" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.500467" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:59.500235" elapsed="0.000272"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:52:59.508010" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0b1d3klx1ezq21lvql84nhilbb4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:52:59.508157" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:52:59.508260" 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-10-11T00:52:59.500811" elapsed="0.007474"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:59.500567" elapsed="0.007756"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:59.508525" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:59.508348" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.500549" elapsed="0.008055"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.509891" 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-10-11T00:52:59.509541" elapsed="0.000395"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:59.509285" elapsed="0.000712"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.509267" elapsed="0.000756"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.510608" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:59.510319" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:59.510080" elapsed="0.000631"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.510062" elapsed="0.000672"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.511265" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:52:59.510910" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:59.511579" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:59.511352" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.512091" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:52:59.511828" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:59.511653" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.511336" elapsed="0.000830"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.512705" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:52:59.512340" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:59.513001" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:59.512793" elapsed="0.000259"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.513512" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:52:59.513237" elapsed="0.000299"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:59.513077" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.512777" elapsed="0.000809"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:59.513741" elapsed="0.000289"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:52:59.514442" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:52:59.514189" elapsed="0.000278"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:52:59.514619" elapsed="0.000227"/>
</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-10-11T00:52:59.508946" elapsed="0.005956"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:52:59.515044" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:59.514963" elapsed="0.000120"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.514946" elapsed="0.000156"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:52:59.515860" 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-10-11T00:52:59.515245" elapsed="0.000642"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:52:59.515933" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:52:59.516060" 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-10-11T00:52:59.499041" elapsed="0.017048"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:52:59.516143" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:52:59.516262" 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-10-11T00:52:59.458586" elapsed="0.057700"/>
</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-10-11T00:52:59.527506" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:52:59.526768" elapsed="0.000765"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:52:59.529576" 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-10-11T00:52:59.529080" elapsed="0.000624">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-10-11T00:52:59.529826" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:52:59.527703" elapsed="0.002146"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.530722" 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-10-11T00:52:59.530020" elapsed="0.000728"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:52:59.531102" 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-10-11T00:52:59.531311" 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-10-11T00:52:59.530913" elapsed="0.000423"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.532181" 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-10-11T00:52:59.531682" elapsed="0.000560"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:52:59.532871" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:59.532304" elapsed="0.000717"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.533864" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:52:59.533220" elapsed="0.000684"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:59.533046" elapsed="0.000933"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.532286" elapsed="0.001715"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.534973" 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-10-11T00:52:59.534164" elapsed="0.000836"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:52:59.535042" 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//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-10-11T00:52:59.526208" elapsed="0.008935"/>
</kw>
<msg time="2026-10-11T00:52:59.535190" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:59.521809" elapsed="0.013425"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:52:59.539450" 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/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-10-11T00:52:59.543527" 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/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-10-11T00:52:59.547815" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:59.547996" 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-10-11T00:52:59.548174" 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-10-11T00:52:59.548561" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:59.548390" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:52:59.548376" 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-10-11T00:52:59.548947" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:59.549132" 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-10-11T00:52:59.549296" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:52:59.548349" elapsed="0.000994"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:52:59.548238" elapsed="0.001128"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:59.549535" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:52:59.549602" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:52:59.549732" 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-10-11T00:52:59.521057" elapsed="0.028700"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:59.549923" elapsed="0.000314"/>
</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-10-11T00:52:59.551300" 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-10-11T00:52:59.550910" elapsed="0.000417"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:52:59.551894" 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-10-11T00:52:59.551499" 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-10-11T00:52:59.552103" elapsed="0.000278"/>
</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-10-11T00:52:59.550534" elapsed="0.001919"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:59.550308" elapsed="0.002175"/>
</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-10-11T00:52:59.552693" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:59.552506" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.550290" elapsed="0.002475"/>
</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-10-11T00:52:59.517252" elapsed="0.035556"/>
</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-10-11T00:52:59.516583" elapsed="0.036289"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:59.516359" elapsed="0.036584"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.516342" elapsed="0.036624"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:52:59.552996" elapsed="0.000027"/>
</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-10-11T00:52:59.457953" elapsed="0.095143"/>
</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-10-11T00:52:59.456357" elapsed="0.096792"/>
</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-10-11T00:52:59.455941" elapsed="0.097249"/>
</kw>
<arg>filled_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="PASS" start="2026-10-11T00:52:59.455579" elapsed="0.097661"/>
</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-10-11T00:52:59.553803" elapsed="0.000225"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:52:59.553498" elapsed="0.000587"/>
</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-10-11T00:52:59.351214" elapsed="0.202905"/>
</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-10-11T00:52:59.555505" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:52:59.555238" 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-10-11T00:52:59.556651" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:59.556565" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.556547" elapsed="0.000183"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:59.559066" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:59.558984" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.558967" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.560046" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:52:59.559723" elapsed="0.000348"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.560497" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:52:59.560222" elapsed="0.000299"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:52:59.560560" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:52:59.560702" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:52:59.559332" elapsed="0.001394"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:59.563199" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:59.563116" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.563099" elapsed="0.000161"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:52:59.564284" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:52:59.564203" elapsed="0.000122"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.564186" elapsed="0.000159"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:52:59.564694" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:52:59.564513" elapsed="0.000206"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:52:59.565013" 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-10-11T00:52:59.564880" elapsed="0.000156"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:59.598457" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:52:59.565531" elapsed="0.033022"/>
</kw>
<msg time="2026-10-11T00:52:59.598733" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:52:59.598776" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:59.565190" elapsed="0.033621"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:52:59.657692" 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-10-11T00:52:59.599358" elapsed="0.058459"/>
</kw>
<msg time="2026-10-11T00:52:59.657972" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:52:59.658015" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:59.599020" elapsed="0.059032"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:59.658338" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:59.658124" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.658105" elapsed="0.000331"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.658868" 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-10-11T00:52:59.658621" elapsed="0.000329"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:59.659213" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:59.659011" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.658995" elapsed="0.000290"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:52:59.659315" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:52:59.662871" elapsed="0.000119"/>
</kw>
<msg time="2026-10-11T00:52:59.663048" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:52:59.660696" elapsed="0.002483"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:59.663506" elapsed="0.000072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:59.663848" elapsed="0.000070"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:52:59.660085" elapsed="0.003946"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:52:59.659604" elapsed="0.004484"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:52:59.563950" elapsed="0.100211"/>
</kw>
<msg time="2026-10-11T00:52:59.664241" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:59.664279" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:59.563423" elapsed="0.100891"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:52:59.664492" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:52:59.664381" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.664364" elapsed="0.000204"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:59.664898" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:59.665196" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:52:59.665259" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:52:59.562835" elapsed="0.102508"/>
</kw>
<msg time="2026-10-11T00:52:59.665500" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:52:59.665541" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:59.561047" elapsed="0.104529"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:52:59.665904" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:52:59.665642" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-10-11T00:52:59.665626" elapsed="0.000349"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:52:59.560905" elapsed="0.105092"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:52:59.560771" elapsed="0.105251"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:52:59.558691" elapsed="0.107378"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:52:59.556297" elapsed="0.109818"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:52:59.555915" elapsed="0.110239"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:52:59.554900" elapsed="0.111298"/>
</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-10-11T00:52:59.666637" elapsed="0.000107"/>
</kw>
<status status="PASS" start="2026-10-11T00:52:59.666309" elapsed="0.000486"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.669926" level="INFO">${start_cmd} = python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T00:52:59.669628" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.670359" level="INFO">python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --peerport=1790 --debug </msg>
<arg>${start_cmd}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:59.670145" elapsed="0.000254"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:52:59.673413" level="INFO">python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --peerport=1790 --debug</msg>
<msg time="2026-10-11T00:52:59.673500" level="INFO">${output} = python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --peerport=1790 --debug 
</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-10-11T00:52:59.670567" elapsed="0.002957"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:52:59.673954" level="INFO">python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --peerport=1790 --debug 
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:52:59.673732" elapsed="0.000263"/>
</kw>
<arg>${BGP_PEER_COMMAND}</arg>
<arg>${BGP_PEER_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-10-11T00:52:59.669282" elapsed="0.004763"/>
</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-10-11T00:53:09.676147" level="FAIL">No match found for '&gt;' in 10 seconds
Output:
[?2004l2026-10-11 00:52:59,769 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:52:59,769 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 00:52:59,769 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 00:52:59,769 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 00:52:59,770 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 00:52:59,771 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:52:59,773 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:52:59,773 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:52:59,774 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:52:59,774 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-10-11 00:52:59,774 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-10-11 00:52:59,774 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 00:52:59,774 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 00:52:59,775 INFO BGP-Thread-1 (job):   My BGP Identifier: 169782023
2026-10-11 00:52:59,775 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 00:52:59,775 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 00:52:59,775 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 00:52:59,775 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 00:52:59,775 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 00:52:59,775 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 00:52:59,775 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-10-11 00:52:59,775 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-10-11 00:52:59,775 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 00:52:59,775 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 00:52:59,775 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 00:52:59,775 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:52:59,775 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-10-11 00:52:59,775 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 00:52:59,775 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 00:52:59,775 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-10-11 00:52:59,775 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 00:52:59,775 DEBUG BGP-Thread-1 (job):   BGP Identifier=169782023 (0x0a1eab07)
2026-10-11 00:52:59,775 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-10-11 00:52:59,775 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf0
2026-10-11 00:52:59,775 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf000b40a1eab07100206010400010001020641040000fbf0'
2026-10-11 00:52:59,775 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf000b40a1eab07100206010400010001020641040000fbf0
2026-10-11 00:52:59,777 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:52:59,777 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:52:59,777 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:52:59,777 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:52:59,777 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:52:59,777 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:52:59,777 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:52:59,778 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:52:59,778 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:52:59,778 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:52:59,778 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 00:52:59,778 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:52:59,778 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:52:59,778 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:52:59,787 INFO BGP-Thread-1 (job): ... idle for 0.009s
2026-10-11 00:52:59,787 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.009s
2026-10-11 00:52:59,787 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 00:52:59,787 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000100
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000100'
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000100'
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000100'
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.0/28']
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.0/28
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:52:59,799 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000120
2026-10-11 00:52:59,799 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:52:59,799 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:52:59,799 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-10-11 00:52:59,799 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:52:59,799 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:52:59,799 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:59,799 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:59,799 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:59,799 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:59,799 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:59,799 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:59,799 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:59,800 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:59,800 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:59,800 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:59,800 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-10-11 00:52:59,800 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000120'
2026-10-11 00:52:59,800 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:52:59,800 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:52:59,800 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:52:59,800 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:52:59,800 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:52:59,800 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:52:59,800 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:52:59,800 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:52:59,800 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:52:59,800 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:52:59,801 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:52:59,801 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:52:59,801 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-10-11 00:52:59,801 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000120'
2026-10-11 00:52:59,801 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:52:59,801 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:52:59,801 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-10-11 00:52:59,801 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-10-11 00:52:59,801 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-10-11 00:52:59,801 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000120'
2026-10-11 00:52:59,801 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.32/28']
2026-10-11 00:52:59,801 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.32/28
2026-10-11 00:52:59,801 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:59,801 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:59,801 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:52:59,802 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000110
2026-10-11 00:52:59,802 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:52:59,802 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:52:59,802 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-10-11 00:52:59,802 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:52:59,802 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:52:59,802 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:59,802 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:59,802 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:59,802 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:59,802 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:59,802 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:59,802 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:59,802 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:59,803 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:59,803 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:59,803 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-10-11 00:52:59,803 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000110'
2026-10-11 00:52:59,803 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:52:59,803 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:52:59,803 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:52:59,803 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:52:59,803 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:52:59,803 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:52:59,803 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:52:59,803 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:52:59,803 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:52:59,803 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000110'
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000110'
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.16/28']
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.16/28
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:59,805 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-10-11T00:52:59.675573" elapsed="10.001652">No match found for '&gt;' in 10 seconds
Output:
[?2004l
2026-10-11 00:52:59,769 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:52:59,769 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 00:52:59,769 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 00:52:59,769 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 00:52:59,770 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 00:52:59,771 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:52:59,773 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:52:59,773 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:52:59,774 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:52:59,774 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-10-11 00:52:59,774 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-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000110'
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.16/28']
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.16/28
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:59,805 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-10-11T00:53:09.677581" elapsed="0.000044"/>
</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-10-11T00:52:59.675281" elapsed="10.002492">No match found for '&gt;' in 10 seconds
Output:
[?2004l
2026-10-11 00:52:59,769 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:52:59,769 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 00:52:59,769 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 00:52:59,769 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 00:52:59,770 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 00:52:59,771 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:52:59,773 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:52:59,773 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:52:59,774 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:52:59,774 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-10-11 00:52:59,774 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-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000110'
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.16/28']
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.16/28
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:59,805 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-10-11T00:52:59.674918" elapsed="10.002991"/>
</kw>
<msg time="2026-10-11T00:53:09.678016" 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-10-11T00:52:59.674540" elapsed="10.003500"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-10-11T00:53:09.678208" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-10-11T00:53:09.678131" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:09.678105" elapsed="0.000189"/>
</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-10-11T00:53:09.678544" elapsed="0.000026"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:09.678737" elapsed="0.000019"/>
</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-10-11T00:52:59.674257" elapsed="10.004554"/>
</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-10-11T00:53:09.684250" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:09.697999" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:09.698088" 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-10-11T00:53:09.684107" elapsed="0.014005"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:09.698579" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:09.698314" elapsed="0.000323"/>
</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-10-11T00:53:09.698795" elapsed="0.000276"/>
</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-10-11T00:53:09.683708" elapsed="0.015421"/>
</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-10-11T00:53:09.678992" elapsed="0.020185"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:09.703334" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:09.750129" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:09.750253" 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-10-11T00:53:09.703212" elapsed="0.047072"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:09.750928" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:09.750589" elapsed="0.000396"/>
</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-10-11T00:53:09.751197" elapsed="0.000394"/>
</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-10-11T00:53:09.702850" elapsed="0.048837"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:09.757474" level="INFO">Executing command 'grep -o 'nlri_prefix_received: 8.0.1.0/28' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:09.802057" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:09.802249" 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-10-11T00:53:09.757285" elapsed="0.045015"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:09.803325" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:09.802815" elapsed="0.000629"/>
</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-10-11T00:53:09.803810" elapsed="0.000627"/>
</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-10-11T00:53:09.756781" elapsed="0.047786"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:09.813973" level="INFO">Executing command 'grep -o 'nlri_prefix_received: 8.0.1.16/28' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:09.866175" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:09.866390" 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-10-11T00:53:09.813693" elapsed="0.052794"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:09.867544" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:09.866978" elapsed="0.000690"/>
</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-10-11T00:53:09.868016" elapsed="0.000654"/>
</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-10-11T00:53:09.812839" elapsed="0.055957"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:09.878200" level="INFO">Executing command 'grep -o 'nlri_prefix_received: 8.0.1.32/28' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:09.918311" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:09.918546" 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-10-11T00:53:09.877922" elapsed="0.040676"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:09.919638" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:09.919076" elapsed="0.000655"/>
</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-10-11T00:53:09.920073" elapsed="0.000648"/>
</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-10-11T00:53:09.877043" elapsed="0.043803"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:09.930256" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:09.970123" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:09.970321" 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-10-11T00:53:09.929981" elapsed="0.040391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:09.971397" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:09.970890" elapsed="0.000633"/>
</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-10-11T00:53:09.971881" elapsed="0.000625"/>
</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-10-11T00:53:09.929116" elapsed="0.043533"/>
</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-10-11T00:53:09.973897" elapsed="0.000492"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:53:09.973199" elapsed="0.001349"/>
</kw>
<doc>Start BGP peer tool</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:52:59.554367" elapsed="10.420285"/>
</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-10-11T00:53:09.978072" elapsed="0.000943"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:53:09.977318" elapsed="0.001813"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:09.981312" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:09.981100" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:09.981058" elapsed="0.000434"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:09.986199" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:09.986011" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:09.985972" elapsed="0.000365"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:09.988570" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:09.987704" elapsed="0.000947"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:09.989670" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:09.989000" elapsed="0.000724"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:09.989814" elapsed="0.000066"/>
</return>
<msg time="2026-10-11T00:53:09.990104" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:09.986855" elapsed="0.003299"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:09.996013" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:09.995822" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:09.995781" elapsed="0.000371"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:09.998668" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:09.998450" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:09.998378" elapsed="0.000432"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:09.999584" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:09.999147" elapsed="0.000518"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:10.000341" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:10.000035" elapsed="0.000357"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:10.038486" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:53:10.001588" elapsed="0.037054"/>
</kw>
<msg time="2026-10-11T00:53:10.038858" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:10.038916" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:10.000804" elapsed="0.038160"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:10.082690" 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-10-11T00:53:10.039728" elapsed="0.043074"/>
</kw>
<msg time="2026-10-11T00:53:10.082961" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:10.083004" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:10.039198" elapsed="0.043842"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:10.083327" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:10.083112" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.083092" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.083868" 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-10-11T00:53:10.083629" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:10.084336" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:10.083999" elapsed="0.000441"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.083982" elapsed="0.000482"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:10.084495" 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-10-11T00:53:10.086997" elapsed="0.000117"/>
</kw>
<msg time="2026-10-11T00:53:10.087172" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:10.085917" 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-10-11T00:53:10.087648" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:10.087988" 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-10-11T00:53:10.085281" 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-10-11T00:53:10.084802" elapsed="0.003434"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:53:09.997841" elapsed="0.090470"/>
</kw>
<msg time="2026-10-11T00:53:10.088395" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:10.088458" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:09.996516" elapsed="0.091978"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:10.088663" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:53:10.088562" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.088545" elapsed="0.000194"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:10.089071" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:10.089375" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:10.089464" 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-10-11T00:53:09.995130" elapsed="0.094420"/>
</kw>
<msg time="2026-10-11T00:53:10.089647" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:10.089688" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:09.990960" elapsed="0.098764"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:10.090013" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:10.089791" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.089775" elapsed="0.000309"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:09.990637" elapsed="0.099468"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:09.990265" elapsed="0.099869"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:53:09.985255" elapsed="0.104929"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:53:09.980468" elapsed="0.109766"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:09.979517" elapsed="0.110758"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:53:09.976529" elapsed="0.113792"/>
</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-10-11T00:53:10.090847" elapsed="0.000097"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:10.090556" elapsed="0.000439"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.094301" level="INFO">${start_cmd} = python3 bgp_app_peer.py --host 10.30.170.173 --port 8181 --command delete-all --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.173/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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:10.094018" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.094774" level="INFO">python3 bgp_app_peer.py --host 10.30.170.173 --port 8181 --command delete-all --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:53:10.094543" elapsed="0.000310"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:10.099267" level="INFO">python3 bgp_app_peer.py --host 10.30.170.173 --port 8181 --command delete-all --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family &amp;&gt;/dev/null</msg>
<msg time="2026-10-11T00:53:10.099356" level="INFO">${output} =  python3 bgp_app_peer.py --host 10.30.170.173 --port 8181 --command delete-all --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:53:10.095008" elapsed="0.004375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.099835" level="INFO"> python3 bgp_app_peer.py --host 10.30.170.173 --port 8181 --command delete-all --debug --stream=vanadium --uri data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:53:10.099600" elapsed="0.000279"/>
</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-10-11T00:53:10.093659" elapsed="0.006271"/>
</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-10-11T00:53:10.250819" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-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-10-11T00:53:10.102069" elapsed="0.148839"/>
</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-10-11T00:53:10.101595" elapsed="0.149369"/>
</kw>
<arg>${BGP_APP_PEER_TIMEOUT}</arg>
<doc>Wait ${timeout} for the tool exit.</doc>
<status status="PASS" start="2026-10-11T00:53:10.101251" elapsed="0.149774"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:10.254513" level="INFO">Executing command 'cat bgp_app_peer.log'.</msg>
<msg time="2026-10-11T00:53:10.268084" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:10.268177" level="INFO">${output_log} = 2026-10-11 00:53:10,212 INFO: Delete all prefixes from 10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:53:10.254375" elapsed="0.013826"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.268701" level="INFO">2026-10-11 00:53:10,212 INFO: Delete all prefixes from 10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family
2026-10-11 00:53:10,223 DEBUG: &lt;PreparedRequest [DELETE]&gt; http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes
2026-10-11 00:53:10,224 DEBUG: Request headers: {'Content-Type': 'application/xml', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='}:
2026-10-11 00:53:10,224 DEBUG: Response: 
2026-10-11 00:53:10,224 DEBUG: &lt;Response [204]&gt; No Content
2026-10-11 00:53:10,224 INFO: Total test execution time: 0.012s
2026-10-11 00:53:10,224 INFO: Total build data time: 0.000s
2026-10-11 00:53:10,224 INFO: Total response time: 0.011s
2026-10-11 00:53:10,224 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-10-11T00:53:10.268428" elapsed="0.000322"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T00:53:10.269268" 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-10-11T00:53:10.268948" elapsed="0.000370"/>
</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-10-11T00:53:10.253984" elapsed="0.015388"/>
</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-10-11T00:53:10.269951" elapsed="0.000235"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:53:10.269654" elapsed="0.000591"/>
</kw>
<doc>Start BGP application peer tool and give him 30s</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:53:09.975322" elapsed="0.294958"/>
</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-10-11T00:53:10.272017" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:53:10.271445" elapsed="0.000829"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:10.273235" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:10.273132" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.273110" 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-10-11T00:53:10.275352" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:10.275270" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.275253" elapsed="0.000180"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.276336" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:10.276010" elapsed="0.000352"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.276848" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:10.276567" elapsed="0.000305"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:10.276913" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T00:53:10.277048" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:10.275655" elapsed="0.001416"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:10.279629" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:10.279530" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.279513" elapsed="0.000181"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:10.280759" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:10.280674" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.280657" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:10.281139" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:10.280970" elapsed="0.000194"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:10.281484" 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-10-11T00:53:10.281328" elapsed="0.000180"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:10.318101" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:53:10.282011" elapsed="0.036190"/>
</kw>
<msg time="2026-10-11T00:53:10.318447" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:10.318493" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:10.281679" elapsed="0.036850"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:10.359476" 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-10-11T00:53:10.319064" elapsed="0.040520"/>
</kw>
<msg time="2026-10-11T00:53:10.359751" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:10.359793" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:10.318716" elapsed="0.041111"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:10.360108" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:10.359897" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.359879" elapsed="0.000302"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.360635" 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-10-11T00:53:10.360365" elapsed="0.000340"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:10.361096" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:10.360765" elapsed="0.000382"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.360748" elapsed="0.000422"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:10.361200" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:10.363666" elapsed="0.000114"/>
</kw>
<msg time="2026-10-11T00:53:10.363837" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:10.362593" elapsed="0.001383"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:10.364289" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:10.364715" 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-10-11T00:53:10.361985" 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-10-11T00:53:10.361502" elapsed="0.003521"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:53:10.280381" elapsed="0.084717"/>
</kw>
<msg time="2026-10-11T00:53:10.365180" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:10.365219" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:10.279844" elapsed="0.085410"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:10.365438" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-10-11T00:53:10.365322" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.365304" 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-10-11T00:53:10.365858" 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-10-11T00:53:10.366159" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:10.366224" 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-10-11T00:53:10.279229" elapsed="0.087080"/>
</kw>
<msg time="2026-10-11T00:53:10.366393" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:10.366457" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:10.277430" elapsed="0.089063"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:10.366810" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:10.366562" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.366545" elapsed="0.000336"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:10.277271" elapsed="0.089632"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:10.277123" elapsed="0.089808"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:53:10.274977" elapsed="0.092002"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:53:10.272868" elapsed="0.094160"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:10.272448" elapsed="0.094620"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:53:10.271083" elapsed="0.096031"/>
</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-10-11T00:53:10.383985" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:10.383676" elapsed="0.000336"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:53:10.384773" 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-10-11T00:53:10.384513" elapsed="0.000338">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-10-11T00:53:10.384937" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:53:10.384173" elapsed="0.000786"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.385464" 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-10-11T00:53:10.385132" elapsed="0.000357"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:53:10.385784" 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-10-11T00:53:10.385949" 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-10-11T00:53:10.385672" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.386391" 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-10-11T00:53:10.386170" elapsed="0.000280"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.387710" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:10.387127" elapsed="0.000640"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.388435" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:53:10.387948" elapsed="0.000513"/>
</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-10-11T00:53:10.388812" 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-10-11T00:53:10.389546" 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-10-11T00:53:10.389908" elapsed="0.000044"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:53:10.388624" elapsed="0.001442"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:53:10.388504" elapsed="0.001623"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:53:10.390170" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:53:10.390304" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:53:10.386785" elapsed="0.003543"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:10.386513" elapsed="0.003843"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:10.390557" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:10.390379" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.386494" elapsed="0.004166"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.391217" 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-10-11T00:53:10.390821" elapsed="0.000422"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:53:10.391286" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:53:10.383137" elapsed="0.008248"/>
</kw>
<msg time="2026-10-11T00:53:10.391460" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:10.378753" elapsed="0.012752"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:53:10.395913" 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/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-10-11T00:53:10.400063" 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/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-10-11T00:53:10.404182" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:10.404397" 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-10-11T00:53:10.404597" 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-10-11T00:53:10.404954" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:10.404805" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:53:10.404791" 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-10-11T00:53:10.405184" 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-10-11T00:53:10.405364" 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-10-11T00:53:10.405546" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:53:10.404766" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:53:10.404677" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:10.405785" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:53:10.405851" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:53:10.405959" 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-10-11T00:53:10.378119" elapsed="0.027864"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:53:10.407101" 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-10-11T00:53:10.406914" elapsed="0.000245">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-10-11T00:53:10.407242" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:53:10.406576" elapsed="0.000689"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:10.407566" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:10.407327" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.408083" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:10.407820" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:10.407654" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.407310" elapsed="0.000847"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.408684" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:10.408317" elapsed="0.000391"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:53:10.408752" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:53:10.408875" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:53:10.406256" elapsed="0.002641"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:53:10.409986" 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-10-11T00:53:10.409802" elapsed="0.000242">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-10-11T00:53:10.410128" 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-10-11T00:53:10.409465" elapsed="0.000686"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:53:10.410314" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:53:10.410214" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.410196" elapsed="0.000193"/>
</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-10-11T00:53:10.410561" elapsed="0.000020"/>
</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-10-11T00:53:10.410790" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:53:10.410850" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:53:10.410976" 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-10-11T00:53:10.409151" elapsed="0.001848"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.412240" 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-10-11T00:53:10.412017" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.412732" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:10.412486" 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-10-11T00:53:10.420145" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0b1d3klx1ezq21lvql84nhilbb4.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:53:10.420290" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:53:10.420397" 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-10-11T00:53:10.413064" elapsed="0.007383"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:10.412832" 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-10-11T00:53:10.420680" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:10.420512" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.412815" elapsed="0.007944"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.422035" 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-10-11T00:53:10.421705" elapsed="0.000374"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:10.421450" elapsed="0.000661"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.421431" elapsed="0.000703"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.422726" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:10.422440" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:10.422184" elapsed="0.000614"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.422169" elapsed="0.000651"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.423349" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:10.422995" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:10.423697" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:10.423454" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.424193" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:10.423931" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:10.423772" elapsed="0.000477"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.423436" elapsed="0.000832"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.424810" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:10.424460" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:10.425103" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:10.424897" elapsed="0.000257"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.425625" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:10.425333" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:10.425175" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.424881" elapsed="0.000821"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:10.425845" elapsed="0.000287"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:53:10.426587" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:10.426325" 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-10-11T00:53:10.426783" elapsed="0.000216"/>
</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-10-11T00:53:10.421093" elapsed="0.005962"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:53:10.427199" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:10.427117" elapsed="0.000122"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.427100" elapsed="0.000159"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:53:10.427924" 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-10-11T00:53:10.427400" elapsed="0.000551"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:53:10.427997" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:10.428125" 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-10-11T00:53:10.411283" elapsed="0.016866"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:53:10.428204" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:53:10.428324" 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-10-11T00:53:10.370492" elapsed="0.057856"/>
</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-10-11T00:53:10.439635" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:10.438870" elapsed="0.000793"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:53:10.441795" 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-10-11T00:53:10.441228" elapsed="0.000681">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-10-11T00:53:10.442029" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:53:10.439821" elapsed="0.002232"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.442904" 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-10-11T00:53:10.442226" elapsed="0.000704"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:53:10.443283" 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-10-11T00:53:10.443525" 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-10-11T00:53:10.443096" elapsed="0.000455"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.444265" 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-10-11T00:53:10.443757" elapsed="0.000565"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:53:10.445082" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:10.444385" elapsed="0.000849"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.446146" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:10.445503" elapsed="0.000683"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:10.445259" elapsed="0.001004"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.444367" elapsed="0.001918"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.447288" 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-10-11T00:53:10.446488" elapsed="0.000827"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:53:10.447359" 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-10-11T00:53:10.438334" elapsed="0.009146"/>
</kw>
<msg time="2026-10-11T00:53:10.447528" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:10.433908" elapsed="0.013665"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:53:10.451822" 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/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-10-11T00:53:10.455915" 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/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-10-11T00:53:10.460153" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:10.460337" 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-10-11T00:53:10.460542" 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-10-11T00:53:10.460926" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:10.460781" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:53:10.460767" 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-10-11T00:53:10.461153" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:10.461329" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:10.461514" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:53:10.460739" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:53:10.460623" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:10.461751" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:53:10.461817" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:53:10.461923" 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-10-11T00:53:10.433170" elapsed="0.028815"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:10.462157" elapsed="0.000334"/>
</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-10-11T00:53:10.463433" 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-10-11T00:53:10.463139" elapsed="0.000322"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:53:10.463891" 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-10-11T00:53:10.463629" elapsed="0.000287"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:53:10.464099" elapsed="0.000280"/>
</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-10-11T00:53:10.462778" elapsed="0.001676"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:10.462561" elapsed="0.001923"/>
</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-10-11T00:53:10.464695" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:10.464507" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.462545" elapsed="0.002219"/>
</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-10-11T00:53:10.429323" elapsed="0.035484"/>
</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-10-11T00:53:10.428663" elapsed="0.036208"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:10.428442" elapsed="0.036469"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.428424" elapsed="0.036508"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:53:10.464961" elapsed="0.000026"/>
</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-10-11T00:53:10.369736" elapsed="0.095324"/>
</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-10-11T00:53:10.368156" elapsed="0.096958"/>
</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-10-11T00:53:10.367725" elapsed="0.097429"/>
</kw>
<arg>empty_topology</arg>
<doc>Wait until Compare_Topology matches expected result.</doc>
<status status="PASS" start="2026-10-11T00:53:10.367235" elapsed="0.097969"/>
</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-10-11T00:53:10.465779" elapsed="0.000224"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:53:10.465471" elapsed="0.000589"/>
</kw>
<doc>See new routes are deleted.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:53:10.270583" elapsed="0.195511"/>
</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-10-11T00:53:10.467516" elapsed="0.000234"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:53:10.467248" 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-10-11T00:53:10.468709" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:10.468603" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.468586" elapsed="0.000184"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:10.470939" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:10.470855" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.470838" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.471972" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:10.471647" elapsed="0.000350"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.472425" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:10.472150" elapsed="0.000300"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:10.472491" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:53:10.472629" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:10.471206" elapsed="0.001448"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:10.475162" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:10.475078" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.475060" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:10.476270" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:10.476185" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.476168" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:10.476763" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:10.476573" elapsed="0.000214"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:10.477085" 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-10-11T00:53:10.476951" elapsed="0.000157"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:10.511555" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:53:10.477631" elapsed="0.034057"/>
</kw>
<msg time="2026-10-11T00:53:10.511849" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:10.511892" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:10.477264" elapsed="0.034664"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:10.584041" 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-10-11T00:53:10.512477" elapsed="0.071679"/>
</kw>
<msg time="2026-10-11T00:53:10.584309" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:10.584351" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:10.512101" elapsed="0.072285"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:10.584708" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:10.584481" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.584462" elapsed="0.000320"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.585192" 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-10-11T00:53:10.584962" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:10.585551" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:10.585329" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.585312" elapsed="0.000359"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:10.585701" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:10.589305" elapsed="0.000141"/>
</kw>
<msg time="2026-10-11T00:53:10.589506" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:10.587067" elapsed="0.002586"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:10.589993" elapsed="0.000072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:10.590322" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:53:10.586463" elapsed="0.004103"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:53:10.585974" elapsed="0.004665"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:53:10.475930" elapsed="0.114783"/>
</kw>
<msg time="2026-10-11T00:53:10.590794" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:10.590833" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:10.475374" elapsed="0.115493"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:10.591021" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:53:10.590936" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.590918" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:10.591459" 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-10-11T00:53:10.591777" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:10.591841" 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-10-11T00:53:10.474793" elapsed="0.117132"/>
</kw>
<msg time="2026-10-11T00:53:10.592007" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:10.592047" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:10.472979" elapsed="0.119102"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:10.592364" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:10.592147" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.592131" elapsed="0.000327"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:10.472837" elapsed="0.119642"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:10.472700" elapsed="0.119805"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:53:10.470550" elapsed="0.122003"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:53:10.468334" elapsed="0.124265"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:10.467948" elapsed="0.124706"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:53:10.466909" elapsed="0.125790"/>
</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-10-11T00:53:10.593079" elapsed="0.000094"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:10.592810" elapsed="0.000412"/>
</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-10-11T00:53:10.597935" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:10.610995" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:10.611083" 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-10-11T00:53:10.597809" elapsed="0.013297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.611557" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:10.611303" 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-10-11T00:53:10.611791" elapsed="0.000272"/>
</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-10-11T00:53:10.597436" elapsed="0.014681"/>
</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-10-11T00:53:10.593387" elapsed="0.018776"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:10.616387" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received: 8.0.1.0/28' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:10.665320" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:10.665498" 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-10-11T00:53:10.616267" elapsed="0.049266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.666148" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:10.665831" elapsed="0.000374"/>
</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-10-11T00:53:10.666437" elapsed="0.000395"/>
</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-10-11T00:53:10.615905" elapsed="0.051004"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:10.672659" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received: 8.0.1.16/28' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:10.714488" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:10.714729" 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-10-11T00:53:10.672461" elapsed="0.042320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.715791" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:10.715223" elapsed="0.000659"/>
</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-10-11T00:53:10.716223" elapsed="0.000654"/>
</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-10-11T00:53:10.671942" elapsed="0.045059"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:10.772285" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received: 8.0.1.32/28' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:10.785393" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:10.785555" 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-10-11T00:53:10.772126" elapsed="0.013462"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.786269" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:10.785900" elapsed="0.000428"/>
</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-10-11T00:53:10.786562" elapsed="0.000396"/>
</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-10-11T00:53:10.771620" elapsed="0.015420"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:10.792880" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:10.834288" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:10.834562" 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-10-11T00:53:10.792707" elapsed="0.041933"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.835718" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:10.835110" elapsed="0.000701"/>
</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-10-11T00:53:10.836154" elapsed="0.000668"/>
</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-10-11T00:53:10.792171" elapsed="0.044782"/>
</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-10-11T00:53:10.838291" elapsed="0.000579"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:53:10.837553" elapsed="0.001450"/>
</kw>
<doc>Check incomming updates for new routes</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:53:10.466361" elapsed="0.372720"/>
</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-10-11T00:53:10.842219" elapsed="0.000505"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:53:10.841664" elapsed="0.001173"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:10.844980" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:10.844755" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.844706" elapsed="0.000424"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:10.850165" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:10.849977" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.849938" elapsed="0.000369"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.852528" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:10.851759" elapsed="0.000826"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.853719" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:10.853058" elapsed="0.000717"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:10.853867" elapsed="0.000074"/>
</return>
<msg time="2026-10-11T00:53:10.854165" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:10.850890" elapsed="0.003326"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:10.860032" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:10.859841" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.859800" elapsed="0.000372"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:10.861850" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:10.861732" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.861707" elapsed="0.000231"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:10.862388" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:10.862145" elapsed="0.000299"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:10.862890" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:10.862692" elapsed="0.000230"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:10.897204" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:53:10.863640" elapsed="0.033667"/>
</kw>
<msg time="2026-10-11T00:53:10.897505" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:10.897550" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:10.863141" elapsed="0.034445"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:10.928332" 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-10-11T00:53:10.898182" elapsed="0.030279"/>
</kw>
<msg time="2026-10-11T00:53:10.928635" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:10.928679" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:10.897829" elapsed="0.030886"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:10.928998" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:10.928785" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.928766" elapsed="0.000306"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.929534" 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-10-11T00:53:10.929273" elapsed="0.000323"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:10.929880" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:10.929675" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.929658" elapsed="0.000293"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:10.929981" 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-10-11T00:53:10.932788" elapsed="0.000122"/>
</kw>
<msg time="2026-10-11T00:53:10.932972" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:10.931425" 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-10-11T00:53:10.933451" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:10.933847" elapsed="0.000086"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:53:10.930811" elapsed="0.003242"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:53:10.930282" elapsed="0.003868"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:53:10.861328" elapsed="0.072900"/>
</kw>
<msg time="2026-10-11T00:53:10.934310" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:10.934351" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:10.860547" elapsed="0.073839"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:10.934580" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-10-11T00:53:10.934489" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.934469" 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-10-11T00:53:10.935021" 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-10-11T00:53:10.935325" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:10.935389" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:53:10.859098" elapsed="0.076523"/>
</kw>
<msg time="2026-10-11T00:53:10.935711" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:10.935752" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:10.855037" elapsed="0.080751"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:10.936083" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:10.935856" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:10.935839" elapsed="0.000315"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:10.854712" elapsed="0.081464"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:10.854330" elapsed="0.081877"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:53:10.849250" elapsed="0.087011"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:53:10.844108" elapsed="0.092203"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:10.843167" elapsed="0.093185"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:53:10.840835" elapsed="0.095563"/>
</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-10-11T00:53:10.936857" elapsed="0.000095"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:10.936549" elapsed="0.000454"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:10.938070" 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-10-11T00:53:10.937773" elapsed="0.000323"/>
</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-10-11T00:53:10.938248" elapsed="0.000185"/>
</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-10-11T00:53:10.937475" elapsed="0.001021"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-10-11T00:53:12.939345" level="INFO">2026-10-11 00:53:09,811 INFO BGP-Thread-1 (job): ... idle for 10.006s
2026-10-11 00:53:09,811 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.024s
2026-10-11 00:53:09,811 INFO BGP-Thread-1 (job): total_received_update_message_counter: 4
2026-10-11 00:53:09,811 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 3
2026-10-11 00:53:09,811 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000100
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000100'
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000100'
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000100'
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.0/28']
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.0/28
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000120
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000120'
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000120'
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000120'
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.32/28']
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.32/28
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000110
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000110'
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000110'
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000110'
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.16/28']
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.16/28
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:10,234 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-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T00:53:12.940101" level="INFO">${output} = 2026-10-11 00:53:09,811 INFO BGP-Thread-1 (job): ... idle for 10.006s
2026-10-11 00:53:09,811 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.024s
2026-10-11 00:53:09,811 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-10-11T00:53:10.938672" elapsed="2.001493"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:12.941392" level="INFO">2026-10-11 00:53:09,811 INFO BGP-Thread-1 (job): ... idle for 10.006s
2026-10-11 00:53:09,811 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.024s
2026-10-11 00:53:09,811 INFO BGP-Thread-1 (job): total_received_update_message_counter: 4
2026-10-11 00:53:09,811 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 3
2026-10-11 00:53:09,811 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000100
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000100'
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000100'
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000100'
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.0/28']
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.0/28
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000120
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000120'
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000120'
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000120'
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.32/28']
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.32/28
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000110
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000110'
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000110'
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000110'
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.16/28']
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.16/28
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:10,234 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-423-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-10-11T00:53:12.940771" elapsed="0.001068"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-10-11T00:53:10.937161" elapsed="2.004809"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:12.949737" level="INFO">Executing command 'cat bgp_peer.log'.</msg>
<msg time="2026-10-11T00:53:12.963860" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:12.964062" level="INFO">${output_log} = 2026-10-11 00:52:59,769 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:52:59,769 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 00:52:59,769 DEBUG BGP-Threa...</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-10-11T00:53:12.949443" elapsed="0.014674"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:12.965201" level="INFO">2026-10-11 00:52:59,769 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:52:59,769 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 00:52:59,769 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 00:52:59,769 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 00:52:59,770 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 00:52:59,771 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:52:59,773 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:52:59,773 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:52:59,774 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:52:59,774 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-10-11 00:52:59,774 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-10-11 00:52:59,774 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 00:52:59,774 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 00:52:59,775 INFO BGP-Thread-1 (job):   My BGP Identifier: 169782023
2026-10-11 00:52:59,775 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 00:52:59,775 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 00:52:59,775 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 00:52:59,775 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 00:52:59,775 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 00:52:59,775 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 00:52:59,775 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-10-11 00:52:59,775 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-10-11 00:52:59,775 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 00:52:59,775 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 00:52:59,775 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 00:52:59,775 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:52:59,775 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-10-11 00:52:59,775 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 00:52:59,775 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 00:52:59,775 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-10-11 00:52:59,775 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 00:52:59,775 DEBUG BGP-Thread-1 (job):   BGP Identifier=169782023 (0x0a1eab07)
2026-10-11 00:52:59,775 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-10-11 00:52:59,775 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf0
2026-10-11 00:52:59,775 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf000b40a1eab07100206010400010001020641040000fbf0'
2026-10-11 00:52:59,775 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf000b40a1eab07100206010400010001020641040000fbf0
2026-10-11 00:52:59,777 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:52:59,777 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:52:59,777 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:52:59,777 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:52:59,777 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:52:59,777 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:52:59,777 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:52:59,778 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:52:59,778 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:52:59,778 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:52:59,778 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 00:52:59,778 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:52:59,778 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:52:59,778 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:52:59,787 INFO BGP-Thread-1 (job): ... idle for 0.009s
2026-10-11 00:52:59,787 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.009s
2026-10-11 00:52:59,787 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 00:52:59,787 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:59,788 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000100
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000100'
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:52:59,797 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000100'
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000100'
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.0/28']
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.0/28
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:59,798 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:52:59,799 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000120
2026-10-11 00:52:59,799 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:52:59,799 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:52:59,799 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-10-11 00:52:59,799 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:52:59,799 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:52:59,799 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:59,799 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:59,799 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:59,799 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:59,799 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:59,799 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:59,799 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:59,800 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:59,800 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:59,800 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:59,800 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-10-11 00:52:59,800 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000120'
2026-10-11 00:52:59,800 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:52:59,800 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:52:59,800 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:52:59,800 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:52:59,800 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:52:59,800 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:52:59,800 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:52:59,800 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:52:59,800 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:52:59,800 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:52:59,801 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:52:59,801 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:52:59,801 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-10-11 00:52:59,801 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000120'
2026-10-11 00:52:59,801 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:52:59,801 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:52:59,801 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-10-11 00:52:59,801 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-10-11 00:52:59,801 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-10-11 00:52:59,801 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000120'
2026-10-11 00:52:59,801 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.32/28']
2026-10-11 00:52:59,801 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.32/28
2026-10-11 00:52:59,801 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:59,801 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:59,801 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:52:59,802 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b020000003440010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000110
2026-10-11 00:52:59,802 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:52:59,802 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:52:59,802 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-10-11 00:52:59,802 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:52:59,802 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:52:59,802 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:52:59,802 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:52:59,802 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:52:59,802 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:52:59,802 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:52:59,802 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:52:59,802 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:52:59,802 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:52:59,803 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:52:59,803 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:52:59,803 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0034' (52)
2026-10-11 00:52:59,803 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800e0e00010104c0000201001c08000110'
2026-10-11 00:52:59,803 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:52:59,803 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:52:59,803 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:52:59,803 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:52:59,803 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:52:59,803 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:52:59,803 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:52:59,803 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:52:59,803 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:52:59,803 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08000110'
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08000110'
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.0.1.16/28']
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.0.1.16/28
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:52:59,804 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:52:59,805 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:53:09,811 INFO BGP-Thread-1 (job): ... idle for 10.006s
2026-10-11 00:53:09,811 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.024s
2026-10-11 00:53:09,811 INFO BGP-Thread-1 (job): total_received_update_message_counter: 4
2026-10-11 00:53:09,811 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 3
2026-10-11 00:53:09,811 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000100
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:10,228 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000100'
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-10-11 00:53:10,229 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000100'
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000100'
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.0/28']
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.0/28
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000120
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:10,230 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000120'
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:53:10,231 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000120'
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000120'
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.32/28']
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.32/28
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000110
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:10,232 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002e' (46)
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'40010100400200800404000000004005040000006480090429292929800a0428282828800f080001011c08000110'
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Attribute value=0xb''
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Attribute type=4 (MULTI_EXIT_DISC, flags:0xb'80')
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000000'
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:53:10,233 DEBUG BGP-Thread-1 (job): Attribute value=0xb'29292929'
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job): Attribute value=0xb'28282828'
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08000110'
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08000110'
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.0.1.16/28']
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.0.1.16/28
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:10,234 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:10,234 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-10-11T00:53:12.964673" elapsed="0.001247"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T00:53:12.967015" 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-10-11T00:53:12.966348" elapsed="0.000781"/>
</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-10-11T00:53:12.948579" elapsed="0.018673"/>
</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-10-11T00:53:12.968564" elapsed="0.000537"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:53:12.967868" elapsed="0.001361"/>
</kw>
<doc>Stop BGP peer tool</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:53:10.839779" elapsed="2.129527"/>
</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-10-11T00:53:12.973261" elapsed="0.000567"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:53:12.972692" elapsed="0.001259"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:12.976827" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:12.976577" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:12.976528" elapsed="0.000455"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:12.981753" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:12.981526" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:12.981476" elapsed="0.000421"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:12.984085" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:12.983273" elapsed="0.000869"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:12.985166" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:12.984520" elapsed="0.000702"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:12.985312" elapsed="0.000072"/>
</return>
<msg time="2026-10-11T00:53:12.985667" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:12.982367" elapsed="0.003354"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:12.991669" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:12.991390" elapsed="0.000382"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:12.991351" elapsed="0.000465"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:12.994267" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:12.994079" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:12.994040" elapsed="0.000405"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:12.995217" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:12.994832" elapsed="0.000439"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:12.996054" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:12.995736" elapsed="0.000371"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:13.031436" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:53:12.997293" elapsed="0.034286"/>
</kw>
<msg time="2026-10-11T00:53:13.031825" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:13.031884" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:12.996518" elapsed="0.035413"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:13.064820" 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-10-11T00:53:13.032698" elapsed="0.032223"/>
</kw>
<msg time="2026-10-11T00:53:13.065070" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:13.065146" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:13.032171" elapsed="0.033012"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:13.065486" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:13.065253" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:13.065235" elapsed="0.000325"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.065976" 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-10-11T00:53:13.065747" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:13.066304" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:13.066103" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:13.066086" elapsed="0.000288"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:13.066419" 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-10-11T00:53:13.068995" elapsed="0.000116"/>
</kw>
<msg time="2026-10-11T00:53:13.069170" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:13.067926" elapsed="0.001385"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:13.069650" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:13.069986" 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-10-11T00:53:13.067294" elapsed="0.002880"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:53:13.066712" elapsed="0.003520"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:53:12.993403" elapsed="0.076903"/>
</kw>
<msg time="2026-10-11T00:53:13.070386" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:13.070446" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:12.992155" elapsed="0.078327"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:13.070650" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:53:13.070551" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:13.070533" elapsed="0.000195"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:13.071051" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:13.071350" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:13.071435" 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-10-11T00:53:12.990749" elapsed="0.080773"/>
</kw>
<msg time="2026-10-11T00:53:13.071616" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:13.071657" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:12.986509" elapsed="0.085183"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:13.071978" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:13.071759" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:13.071742" elapsed="0.000305"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:12.986150" elapsed="0.085917"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:12.985832" elapsed="0.086265"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:53:12.980806" elapsed="0.091340"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:53:12.975945" elapsed="0.096250"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:12.974345" elapsed="0.097924"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:53:12.971709" elapsed="0.100608"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.073150" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.171.7 | 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-10-11T00:53:13.072610" 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-10-11T00:53:13.086550" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:13.086229" elapsed="0.000348"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:53:13.087304" 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-10-11T00:53:13.087067" elapsed="0.000317">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-10-11T00:53:13.087488" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:53:13.086747" elapsed="0.000765"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.088013" 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-10-11T00:53:13.087700" elapsed="0.000339"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:53:13.088317" 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-10-11T00:53:13.088460" 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-10-11T00:53:13.088207" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.088911" 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-10-11T00:53:13.088692" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.090050" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', '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-10-11T00:53:13.089815" elapsed="0.000277"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.090532" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:53:13.090269" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.091184" 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-10-11T00:53:13.090914" elapsed="0.000295"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:13.091914" 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-10-11T00:53:13.091722" elapsed="0.000216"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:13.091983" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:53:13.092108" 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-10-11T00:53:13.091382" elapsed="0.000749"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:13.092305" elapsed="0.000206"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:53:13.090779" elapsed="0.001770"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.093113" 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-10-11T00:53:13.092837" elapsed="0.000300"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:13.093826" 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-10-11T00:53:13.093648" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:13.093893" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:13.094053" 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-10-11T00:53:13.093306" 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-10-11T00:53:13.094239" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-10-11T00:53:13.092677" elapsed="0.001779"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.094964" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:53:13.094695" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:13.095706" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:53:13.095511" elapsed="0.000219"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:13.095775" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:13.095898" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:53:13.095182" elapsed="0.000739"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:13.096084" elapsed="0.000165"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:53:13.094555" elapsed="0.001730"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.096811" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:53:13.096528" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:13.097505" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:53:13.097308" elapsed="0.000221"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:13.097572" elapsed="0.000048"/>
</return>
<msg time="2026-10-11T00:53:13.097718" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:53:13.097003" elapsed="0.000738"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:13.097901" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:53:13.096383" elapsed="0.001719"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:53:13.090632" elapsed="0.007500"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:53:13.098170" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:53:13.098297" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:53:13.089269" elapsed="0.009052"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:13.089013" elapsed="0.009336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:13.098534" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:13.098371" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:13.088996" elapsed="0.009621"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.099338" 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-10-11T00:53:13.098776" elapsed="0.000589"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:53:13.099422" 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-10-11T00:53:13.085727" elapsed="0.013798"/>
</kw>
<msg time="2026-10-11T00:53:13.099573" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:13.081322" elapsed="0.018306"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:53:13.103926" 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/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-10-11T00:53:13.108077" 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/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-10-11T00:53:13.112165" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:13.112346" 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-10-11T00:53:13.112541" 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-10-11T00:53:13.112915" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:13.112766" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:53:13.112753" 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-10-11T00:53:13.113141" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:13.113317" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:13.113493" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:53:13.112728" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:53:13.112638" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:13.113728" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:53:13.113795" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:53:13.113905" 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-10-11T00:53:13.080710" elapsed="0.033220"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.114942" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:13.114718" elapsed="0.000268"/>
</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-10-11T00:53:13.125885" level="INFO">DELETE Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0b1d3klx1ezq21lvql84nhilbb4.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:53:13.125933" level="INFO">DELETE Response : url=http://10.30.170.173: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.171.7 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-10-11T00:53:13.126038" 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-10-11T00:53:13.115273" elapsed="0.010790"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:13.115046" elapsed="0.011054"/>
</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-10-11T00:53:13.126273" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:13.126124" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:13.115030" elapsed="0.011351"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.127629" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:13.127319" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:13.127079" elapsed="0.000623"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:13.127062" elapsed="0.000662"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.128276" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:13.128010" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:13.127773" elapsed="0.000575"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:13.127758" elapsed="0.000612"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.128931" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:13.128565" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:13.129229" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:13.129019" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.129764" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:13.129483" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:13.129302" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:13.129003" elapsed="0.000837"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.130346" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:13.130012" elapsed="0.000359"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:13.130667" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:13.130449" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.131156" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:13.130898" elapsed="0.000282"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:13.130740" elapsed="0.000472"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:13.130432" elapsed="0.000799"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:13.131375" elapsed="0.000316"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:53:13.132078" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:13.131852" elapsed="0.000250"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:53:13.132255" elapsed="0.000230"/>
</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-10-11T00:53:13.126744" elapsed="0.005797"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:53:13.132582" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:53:13.132769" 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-10-11T00:53:13.114166" elapsed="0.018627"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:53:13.132840" elapsed="0.000024"/>
</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-10-11T00:53:13.073390" elapsed="0.059545"/>
</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-10-11T00:53:13.133485" elapsed="0.000239"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:53:13.133178" elapsed="0.000604"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:53:12.970153" elapsed="0.163663"/>
</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-10-11T00:53:13.135401" elapsed="0.000234"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:53:13.135150" 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-10-11T00:53:13.136650" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:13.136550" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:13.136533" elapsed="0.000179"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:13.138770" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:13.138686" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:13.138669" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.139744" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:13.139390" elapsed="0.000380"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.140179" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:13.139921" elapsed="0.000282"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:13.140243" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:13.140367" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:13.139036" elapsed="0.001354"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:13.142941" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:13.142856" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:13.142839" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:13.144046" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:13.143963" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:13.143946" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:13.144440" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:13.144254" elapsed="0.000211"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:13.144782" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:13.144644" elapsed="0.000161"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:13.178796" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:53:13.145286" elapsed="0.033606"/>
</kw>
<msg time="2026-10-11T00:53:13.179044" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:13.179086" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:13.144961" elapsed="0.034160"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:13.221376" 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-10-11T00:53:13.179677" elapsed="0.041823"/>
</kw>
<msg time="2026-10-11T00:53:13.221667" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:13.221709" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:13.179290" elapsed="0.042455"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:13.222024" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:13.221815" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:13.221797" elapsed="0.000300"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.222534" 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-10-11T00:53:13.222280" elapsed="0.000334"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:13.222876" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:13.222676" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:13.222659" elapsed="0.000287"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:13.222976" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:13.225442" elapsed="0.000118"/>
</kw>
<msg time="2026-10-11T00:53:13.225633" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:13.224363" elapsed="0.001401"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:13.226066" elapsed="0.000072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:13.226394" 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-10-11T00:53:13.223784" elapsed="0.002844"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:53:13.223288" elapsed="0.003401"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:53:13.143705" elapsed="0.083057"/>
</kw>
<msg time="2026-10-11T00:53:13.226843" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:13.226882" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:13.143153" elapsed="0.083764"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:13.227070" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:53:13.226985" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:13.226968" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:13.227500" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:13.227813" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:13.227877" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:53:13.142558" elapsed="0.085402"/>
</kw>
<msg time="2026-10-11T00:53:13.228043" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:13.228082" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:13.140750" elapsed="0.087367"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:13.228401" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:13.228183" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:13.228167" elapsed="0.000329"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:13.140607" elapsed="0.087910"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:13.140453" elapsed="0.088091"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:53:13.138360" elapsed="0.090244"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:53:13.136249" elapsed="0.092406"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:13.135841" elapsed="0.092854"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:53:13.134649" elapsed="0.094093"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.229381" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | NAME=example-bgp-peer-app | IP=10.30.170.173 | 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-10-11T00:53:13.228922" 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-10-11T00:53:13.242951" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:13.242646" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:53:13.243670" 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-10-11T00:53:13.243469" elapsed="0.000300">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-10-11T00:53:13.243855" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:53:13.243136" elapsed="0.000742"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.244355" 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-10-11T00:53:13.244051" elapsed="0.000329"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:53:13.244694" 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-10-11T00:53:13.244823" 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-10-11T00:53:13.244571" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.245255" 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-10-11T00:53:13.245040" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.246233" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer-app', 'IP': '10.30.170.173', '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-10-11T00:53:13.246002" elapsed="0.000273"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.246723" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:53:13.246465" elapsed="0.000283"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.247322" 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-10-11T00:53:13.247059" elapsed="0.000287"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:13.248037" 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-10-11T00:53:13.247857" elapsed="0.000203"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:13.248104" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:53:13.248228" 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-10-11T00:53:13.247532" elapsed="0.000719"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:13.248429" elapsed="0.000190"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:53:13.246928" elapsed="0.001728"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.249153" 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-10-11T00:53:13.248885" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:13.249863" 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-10-11T00:53:13.249684" elapsed="0.000204"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:13.249931" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:53:13.250053" 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-10-11T00:53:13.249346" elapsed="0.000730"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:13.250240" elapsed="0.000163"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-bgp-peer-app</var>
<status status="PASS" start="2026-10-11T00:53:13.248755" elapsed="0.001699"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.250960" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:53:13.250694" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:13.251677" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:53:13.251485" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:13.251746" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:13.251870" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:53:13.251150" elapsed="0.000742"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:13.252055" elapsed="0.000312"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T00:53:13.250553" elapsed="0.001898"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.252971" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:53:13.252699" elapsed="0.000296"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:13.253827" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:53:13.253488" elapsed="0.000364"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:13.253896" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:53:13.254022" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:53:13.253166" 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-10-11T00:53:13.254208" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:53:13.252555" elapsed="0.001870"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:53:13.246791" elapsed="0.007667"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:53:13.254497" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:53:13.254639" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'NAME': 'example-bgp-peer-app', 'IP': '10.30.170.173', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:53:13.245657" elapsed="0.009007"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:13.245357" elapsed="0.009336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:13.254864" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:13.254714" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:13.245341" elapsed="0.009591"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.255646" 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-10-11T00:53:13.255088" elapsed="0.000585"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:53:13.255717" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:53:13.242109" elapsed="0.013708"/>
</kw>
<msg time="2026-10-11T00:53:13.255865" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:13.237620" elapsed="0.018287"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:53:13.260061" 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/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-10-11T00:53:13.264156" 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/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-10-11T00:53:13.268370" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:13.268566" elapsed="0.000060"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:13.268796" 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-10-11T00:53:13.269135" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:13.268990" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:53:13.268977" 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-10-11T00:53:13.269363" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:13.269559" 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-10-11T00:53:13.269735" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:53:13.268951" elapsed="0.000832"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:53:13.268862" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:13.269957" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:53:13.270022" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:53:13.270132" 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-10-11T00:53:13.236983" elapsed="0.033174"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.271165" 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.173</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:13.270942" elapsed="0.000266"/>
</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-10-11T00:53:13.280565" level="INFO">DELETE Request : url=http://10.30.170.173: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.173 
 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.173 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0b1d3klx1ezq21lvql84nhilbb4.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:53:13.280620" level="INFO">DELETE Response : url=http://10.30.170.173: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.173 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-10-11T00:53:13.280709" 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-10-11T00:53:13.271508" elapsed="0.009226"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:13.271268" elapsed="0.009502"/>
</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-10-11T00:53:13.280942" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:13.280793" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:13.271252" elapsed="0.009763"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.282197" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:13.281928" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:13.281689" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:13.281672" elapsed="0.000619"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.282877" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:13.282610" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:13.282339" elapsed="0.000609"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:13.282325" elapsed="0.000646"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.283506" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:13.283143" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:13.283853" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:13.283607" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.284535" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:13.284088" elapsed="0.000472"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:13.283928" elapsed="0.000676"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:13.283577" elapsed="0.001048"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.285143" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:13.284801" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:13.285456" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:13.285231" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.285968" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:13.285706" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:13.285531" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:13.285214" elapsed="0.000830"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:13.286189" elapsed="0.000310"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:53:13.286892" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:13.286670" elapsed="0.000246"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:53:13.287067" elapsed="0.000210"/>
</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-10-11T00:53:13.281330" elapsed="0.006002"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:53:13.287372" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:13.287560" 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-10-11T00:53:13.270388" elapsed="0.017196"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:53:13.287641" elapsed="0.000025"/>
</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-10-11T00:53:13.229725" elapsed="0.058012"/>
</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-10-11T00:53:13.288262" elapsed="0.000240"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:53:13.287973" elapsed="0.000587"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:53:13.134079" elapsed="0.154525"/>
</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-10-11T00:53:13.290055" level="INFO">Executing command 'ps -elf | egrep python | egrep 'play.py' | egrep -v grep'.</msg>
<msg time="2026-10-11T00:53:13.313157" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-10-11T00:53:13.313247" 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-10-11T00:53:13.289944" elapsed="0.023327"/>
</kw>
<return>
<value>${processes}</value>
<status status="PASS" start="2026-10-11T00:53:13.313314" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T00:53:13.313463" 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-10-11T00:53:13.289670" elapsed="0.023817"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.313946" level="INFO"/>
<arg>${processes}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:13.313719" elapsed="0.000267"/>
</kw>
<kw name="Kill_Remote_Processes" owner="KillPythonTool">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.314755" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:53:13.314824" 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-10-11T00:53:13.314491" elapsed="0.000355"/>
</kw>
<if>
<branch type="IF" condition="${arg_length} == 0">
<return>
<status status="PASS" start="2026-10-11T00:53:13.314998" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:53:13.314911" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:13.314893" elapsed="0.000177"/>
</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-10-11T00:53:13.315253" elapsed="0.000019"/>
</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-10-11T00:53:13.315473" elapsed="0.000020"/>
</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-10-11T00:53:13.315757" elapsed="0.000020"/>
</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-10-11T00:53:13.314200" elapsed="0.001636"/>
</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-10-11T00:53:13.289388" elapsed="0.026494"/>
</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-10-11T00:53:13.316734" level="INFO">Executing command 'ps -elf | egrep python | egrep 'bgp_app_peer.py' | egrep -v grep'.</msg>
<msg time="2026-10-11T00:53:13.372248" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-10-11T00:53:13.372472" 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-10-11T00:53:13.316624" elapsed="0.055902"/>
</kw>
<return>
<value>${processes}</value>
<status status="PASS" start="2026-10-11T00:53:13.372650" elapsed="0.000064"/>
</return>
<msg time="2026-10-11T00:53:13.372926" 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-10-11T00:53:13.316312" elapsed="0.056664"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.373943" level="INFO"/>
<arg>${processes}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:13.373402" elapsed="0.000624"/>
</kw>
<kw name="Kill_Remote_Processes" owner="KillPythonTool">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.378273" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:53:13.378458" 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-10-11T00:53:13.375125" elapsed="0.003386"/>
</kw>
<if>
<branch type="IF" condition="${arg_length} == 0">
<return>
<status status="PASS" start="2026-10-11T00:53:13.378864" elapsed="0.000055"/>
</return>
<status status="PASS" start="2026-10-11T00:53:13.378672" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:13.378634" elapsed="0.000392"/>
</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-10-11T00:53:13.379462" 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-10-11T00:53:13.379951" elapsed="0.000042"/>
</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-10-11T00:53:13.380389" elapsed="0.000068"/>
</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-10-11T00:53:13.374520" elapsed="0.006067"/>
</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-10-11T00:53:13.316065" elapsed="0.064644"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-10-11T00:53:13.381159" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects </doc>
<status status="PASS" start="2026-10-11T00:53:13.381003" elapsed="0.000303"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-10-11T00:53:13.381791" elapsed="0.001051"/>
</kw>
<doc>Make sure Python tool was killed.
Tear down imported Resources.</doc>
<status status="PASS" start="2026-10-11T00:53:13.289145" elapsed="0.093813"/>
</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="FAIL" start="2026-10-11T00:52:08.482365" elapsed="64.900651"/>
</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-10-11T00:53:13.462337" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:53:13.460671" elapsed="0.001712"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-10-11T00:53:13.460402" elapsed="0.002053"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.464813" 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-10-11T00:53:13.463398" elapsed="0.001441"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-10-11T00:53:13.465030" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:13.464947" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:13.464926" elapsed="0.000165"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.465628" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:53:13.465268" elapsed="0.000401"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.466113" 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-10-11T00:53:13.465833" elapsed="0.000305"/>
</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-10-11T00:53:13.466673" elapsed="0.000250"/>
</kw>
<msg time="2026-10-11T00:53:13.467010" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:13.467053" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:13.466301" elapsed="0.000773"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.467584" 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-10-11T00:53:13.467249" elapsed="0.000373"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.468573" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:13.468306" elapsed="0.000304"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.468996" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:13.468757" elapsed="0.000264"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.469478" 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-10-11T00:53:13.469196" elapsed="0.000308"/>
</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-10-11T00:53:13.470358" elapsed="0.000178"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.470994" level="INFO">${member_ip} = 10.30.170.173</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:13.470717" elapsed="0.000303"/>
</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-10-11T00:53:13.471186" elapsed="0.000167"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.472255" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:13.471986" elapsed="0.000294"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-11T00:53:13.472321" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T00:53:13.472468" 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-10-11T00:53:13.471545" elapsed="0.000948"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:53:13.472994" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7434494bd8d0&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-10-11T00:53:13.472679" elapsed="0.000434"/>
</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-10-11T00:53:13.473275" elapsed="0.000163"/>
</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-10-11T00:53:13.469917" elapsed="0.003575"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:13.469747" elapsed="0.003784"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-10-11T00:53:13.469553" elapsed="0.004007"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.474111" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:53:13.473758" elapsed="0.000393"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.474711" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.173'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:53:13.474335" elapsed="0.000415"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.475273" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:53:13.474935" elapsed="0.000376"/>
</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-10-11T00:53:13.467932" elapsed="0.007430"/>
</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-10-11T00:53:13.463094" elapsed="0.012371"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:13.475626" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:13.475524" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:13.475507" elapsed="0.000180"/>
</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-10-11T00:53:13.476884" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:13.476542" elapsed="0.000367"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.477322" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:13.477062" elapsed="0.000284"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:13.477386" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T00:53:13.477531" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:13.476224" elapsed="0.001330"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:13.478387" level="INFO">${member_ip} = 10.30.170.173</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-10-11T00:53:13.478181" elapsed="0.000245"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:13.479135" 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-10-11T00:53:13.479225" 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-10-11T00:53:13.478994" elapsed="0.000256"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:13.482115" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:13.481536" elapsed="0.000657"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:13.481518" elapsed="0.000712"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:13.483080" 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-10-11T00:53:13.483298" 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-10-11T00:53:13.482486" elapsed="0.000863"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.484252" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.173" 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-10-11T00:53:13.483686" elapsed="0.000687"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:13.485535" 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-10-11T00:53:13.484717" elapsed="0.000868"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:53:13.487217" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:53:13.487381" 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-10-11T00:53:13.486898" elapsed="0.000645"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:13.487884" elapsed="0.000410"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:53:13.489352" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:53:14.101348" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 00:53:13 UTC 2026

  System load:  0.02               Processes:             123
  Usage of /:   14.2% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.173
  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.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:52:09 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:53:13.489115" elapsed="0.612600"/>
</kw>
<msg time="2026-10-11T00:53:14.101848" 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-10-11T00:53:13.488666" elapsed="0.613401"/>
</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-10-11T00:53:13.486015" elapsed="0.616255"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:14.103706" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-10-11T00:53:14.117005" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-10-11T00:53:14.117238" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T00:53:14.117371" 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-10-11T00:53:14.102943" elapsed="0.014526"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:53:14.117907" elapsed="0.000761"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:14.120556" 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-10-11T00:53:14.119701" elapsed="0.001048"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T00:53:14.121358" elapsed="0.000132"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:14.121002" elapsed="0.000636"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:14.120959" elapsed="0.000736"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:53:14.122100" elapsed="0.000117"/>
</return>
<status status="PASS" start="2026-10-11T00:53:14.121810" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:14.121787" elapsed="0.000610"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T00:53:14.122512" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:14.124541" elapsed="0.000652"/>
</kw>
<kw name="Open 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-10-11T00:53:14.125716" elapsed="0.000409"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:53:14.126542" elapsed="0.000352"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:53:14.123230" elapsed="0.003759"/>
</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-10-11T00:53:13.480876" elapsed="0.646272"/>
</kw>
<msg time="2026-10-11T00:53:14.127223" 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-10-11T00:53:13.480273" elapsed="0.647025"/>
</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-10-11T00:53:13.479889" elapsed="0.647546"/>
</kw>
<msg time="2026-10-11T00:53:14.127496" 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-10-11T00:53:13.479418" elapsed="0.648157"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:14.128556" elapsed="0.000406"/>
</kw>
<kw name="Open 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-10-11T00:53:14.129220" elapsed="0.000185"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:53:14.129701" elapsed="0.000123"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:53:14.128007" elapsed="0.001881"/>
</kw>
<msg time="2026-10-11T00:53:14.130004" 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-10-11T00:53:13.478638" elapsed="0.651400"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:14.130689" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:14.130342" elapsed="0.000402"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-11T00:53:14.130796" elapsed="0.000038"/>
</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-10-11T00:53:13.477873" elapsed="0.653062"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:13.477713" elapsed="0.653323"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:13.477612" elapsed="0.653477"/>
</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-10-11T00:53:13.475888" elapsed="0.655282"/>
</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-10-11T00:53:14.131390" elapsed="0.000326"/>
</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-10-11T00:53:14.140263" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:14.140142" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:14.140116" elapsed="0.000235"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:14.140842" 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-10-11T00:53:14.140973" 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-10-11T00:53:14.140665" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:14.141647" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:14.141272" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:14.142274" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:14.141974" elapsed="0.000356"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:14.143346" 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-10-11T00:53:14.143093" elapsed="0.000428">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-10-11T00:53:14.143708" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T00:53:14.143778" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:14.142572" elapsed="0.001233"/>
</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-10-11T00:53:14.144110" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:14.143889" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:14.143867" elapsed="0.000331"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:14.144868" level="INFO">${ip_address} = 10.30.170.173</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-10-11T00:53:14.144660" elapsed="0.000233"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-10-11T00:53:14.144935" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:53:14.145056" level="INFO">${odl_ip} = 10.30.170.173</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-10-11T00:53:14.144385" elapsed="0.000693"/>
</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-10-11T00:53:14.145257" elapsed="0.000355"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:14.145925" level="INFO">index=4
host=10.30.170.173
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-10-11T00:53:14.146012" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.173
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-10-11T00:53:14.145828" elapsed="0.000209"/>
</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-10-11T00:53:14.146200" elapsed="0.000266"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-10-11T00:53:14.146864" level="INFO">Logging into '10.30.170.173:8101' as 'karaf'.</msg>
<msg time="2026-10-11T00:53:14.377365" 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-10-11T00:53:14.146666" elapsed="0.230823"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:14.380355" 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-10-11T00:53:14.380862" elapsed="0.000149"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:53:14.381158" elapsed="0.000093"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:53:14.379988" elapsed="0.001312"/>
</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-10-11T00:53:14.379330" elapsed="0.002011"/>
</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-10-11T00:53:14.139813" elapsed="0.241573"/>
</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-10-11T00:53:14.133118" elapsed="0.248329"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:14.132207" elapsed="0.249288"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:14.131967" elapsed="0.249569"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-10-11T00:53:14.131796" elapsed="0.249776"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-10-11T00:53:13.462719" elapsed="0.918925"/>
</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-10-11T00:53:14.382510" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:14.382398" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:14.382376" 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-10-11T00:53:14.384685" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:14.384601" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:14.384574" elapsed="0.000172"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:14.385641" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:14.385271" elapsed="0.000396"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:14.386085" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:14.385823" elapsed="0.000287"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:14.386150" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T00:53:14.386286" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:14.384960" elapsed="0.001349"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:14.388946" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:14.388862" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:14.388845" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:14.390066" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:14.389982" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:14.389964" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:14.390576" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:14.390276" elapsed="0.000340"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:14.390975" 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-10-11T00:53:14.390783" elapsed="0.000216"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:14.431056" 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-10-11T00:53:14.391689" elapsed="0.039497"/>
</kw>
<msg time="2026-10-11T00:53:14.431323" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:14.431365" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:14.391154" elapsed="0.040246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:14.507301" 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-10-11T00:53:14.432184" elapsed="0.075470"/>
</kw>
<msg time="2026-10-11T00:53:14.507797" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:14.507839" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:14.431667" elapsed="0.076208"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:14.508192" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:14.507953" elapsed="0.000381"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:14.507931" elapsed="0.000429"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:14.508965" 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-10-11T00:53:14.508566" elapsed="0.000481"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:14.509650" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:14.509108" elapsed="0.000687"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:14.509091" elapsed="0.000729"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:14.509853" 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">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:14.511800" 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-10-11T00:53:14.512603" elapsed="0.000278"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:53:14.513203" 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-10-11T00:53:14.511032" elapsed="0.002505"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:53:14.510169" elapsed="0.003511"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:53:14.389778" elapsed="0.123979"/>
</kw>
<msg time="2026-10-11T00:53:14.513840" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:14.513880" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:14.389161" elapsed="0.124754"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:14.514068" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:53:14.513983" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:14.513966" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:14.514561" 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-10-11T00:53:14.514892" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:14.514956" 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-10-11T00:53:14.388630" elapsed="0.126411"/>
</kw>
<msg time="2026-10-11T00:53:14.515124" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:14.515164" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:14.386713" elapsed="0.128487"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:14.515619" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:14.515268" elapsed="0.000445"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:14.515251" elapsed="0.000486"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:14.386528" elapsed="0.129232"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:14.386361" elapsed="0.129430"/>
</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-10-11T00:53:14.384338" elapsed="0.131504"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-10-11T00:53:14.382216" elapsed="0.133676"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:14.381800" elapsed="0.134131"/>
</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-10-11T00:53:13.460138" elapsed="1.055840"/>
</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-10-11T00:53:14.516139" elapsed="0.000148"/>
</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-10-11T00:53:14.516479" elapsed="0.000214"/>
</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-10-11T00:53:14.518218" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:53:14.518291" 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-10-11T00:53:14.517946" elapsed="0.000367"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:14.518483" elapsed="0.000301"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:53:14.519594" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:53:14.879943" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 00:53:13 UTC 2026

  System load:  0.02               Processes:             123
  Usage of /:   14.2% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.173
  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.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:53:14 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:53:14.519330" elapsed="0.360723"/>
</kw>
<msg time="2026-10-11T00:53:14.880122" 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-10-11T00:53:14.518958" elapsed="0.361230"/>
</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-10-11T00:53:14.517556" elapsed="0.362723"/>
</kw>
<msg time="2026-10-11T00:53:14.880325" 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-10-11T00:53:14.517170" elapsed="0.363197"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-10-11T00:53:14.516879" elapsed="0.363574"/>
</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-10-11T00:53:14.880695" elapsed="0.000556"/>
</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-10-11T00:53:14.882919" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:53:14.882995" 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-10-11T00:53:14.882658" elapsed="0.000359"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:14.883172" elapsed="0.000314"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:53:14.884271" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:53:15.245790" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 00:53:13 UTC 2026

  System load:  0.02               Processes:             123
  Usage of /:   14.2% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.173
  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.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:53:14 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:53:14.884041" elapsed="0.362005"/>
</kw>
<msg time="2026-10-11T00:53:15.246126" 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-10-11T00:53:14.883675" elapsed="0.362526"/>
</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-10-11T00:53:14.882253" elapsed="0.364048"/>
</kw>
<msg time="2026-10-11T00:53:15.246350" 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-10-11T00:53:14.881829" elapsed="0.364564"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-10-11T00:53:14.881493" elapsed="0.364992"/>
</kw>
<kw name="Require_Python" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:15.247900" level="INFO">Executing command 'python3 --help'.</msg>
<msg time="2026-10-11T00:53:15.260931" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:15.261086" 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-10-11T00:53:15.261145" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T00:53:15.261196" 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-10-11T00:53:15.247705" elapsed="0.013519"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.262432" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T00:53:15.262054" elapsed="0.000439"/>
</kw>
<msg time="2026-10-11T00:53:15.262629" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T00:53:15.262686" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:15.261513" elapsed="0.001202"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.263505" 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-10-11T00:53:15.262965" elapsed="0.000576"/>
</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-10-11T00:53:15.264057" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:15.263678" elapsed="0.000460"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.263642" elapsed="0.000534"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-10-11T00:53:15.264352" elapsed="0.000332"/>
</return>
<status status="PASS" start="2026-10-11T00:53:15.264247" elapsed="0.000485"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.264227" elapsed="0.000537"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-10-11T00:53:15.264882" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:15.264839" elapsed="0.000093"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:53:15.264818" elapsed="0.000141"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.265168" elapsed="0.000027"/>
</kw>
<msg time="2026-10-11T00:53:15.265335" 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-10-11T00:53:15.247292" elapsed="0.018076"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-10-11T00:53:15.265576" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-10-11T00:53:15.265476" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.265454" elapsed="0.000240"/>
</if>
<kw name="Fatal Error" owner="BuiltIn">
<arg>Python 3 is not installed!</arg>
<doc>Stops the whole execution.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.265889" elapsed="0.000027"/>
</kw>
<doc>Verify current SSH connection leads to machine with python working. Fatal fail otherwise.</doc>
<status status="PASS" start="2026-10-11T00:53:15.246866" elapsed="0.019121"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:15.267610" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-10-11T00:53:15.441699" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-10-11T00:53:15.442080" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T00:53:15.442168" 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-10-11T00:53:15.442256" 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-10-11T00:53:15.267366" elapsed="0.174939"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.444516" level="INFO">Length is 119.</msg>
<msg time="2026-10-11T00:53:15.444729" 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-10-11T00:53:15.443898" elapsed="0.000981">'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-10-11T00:53:15.445231" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-10-11T00:53:15.445320" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:15.442939" elapsed="0.002432"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.446722" 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-10-11T00:53:15.445825" elapsed="0.000954"/>
</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-10-11T00:53:15.449014" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:15.448495" elapsed="0.000607"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.450061" 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-10-11T00:53:15.449555" elapsed="0.000602"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.451677" level="INFO">1</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:15.450789" elapsed="0.001025"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T00:53:15.447673" elapsed="0.004291"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:15.446959" elapsed="0.005089"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.446908" elapsed="0.005199"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-10-11T00:53:15.452450" elapsed="0.000078"/>
</return>
<status status="PASS" start="2026-10-11T00:53:15.452230" elapsed="0.000399"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.452195" elapsed="0.000486"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-10-11T00:53:15.452872" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:15.452804" elapsed="0.000147"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:53:15.452768" elapsed="0.000226"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.453326" elapsed="0.000043"/>
</kw>
<msg time="2026-10-11T00:53:15.453671" 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-10-11T00:53:15.266862" elapsed="0.186863"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="NOT RUN" start="2026-10-11T00:53:15.454027" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:15.453868" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.453831" elapsed="0.000316"/>
</if>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T00:53:15.483916" level="INFO">[chan 3] Opened sftp connection (server version 3)</msg>
<msg time="2026-10-11T00:53:15.501876" 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-10-11T00:53:15.454552" elapsed="0.047455"/>
</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-10-11T00:53:15.266293" elapsed="0.235853"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T00:53:15.519552" 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-10-11T00:53:15.502621" elapsed="0.017079"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:53:15.520671" level="INFO">Creating Session using : alias=session, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7434456dea10&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-10-11T00:53:15.520119" elapsed="0.000878"/>
</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-10-11T00:53:15.522529" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:15.522299" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.522259" elapsed="0.000438"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:15.523451" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:15.523034" elapsed="0.000473"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:15.524212" 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-10-11T00:53:15.523900" elapsed="0.000364"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:15.532361" 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-10-11T00:53:15.525454" elapsed="0.007054"/>
</kw>
<msg time="2026-10-11T00:53:15.532736" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:15.532826" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:15.524669" elapsed="0.008205"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:15.539670" 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-10-11T00:53:15.534157" elapsed="0.005590"/>
</kw>
<msg time="2026-10-11T00:53:15.539871" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:15.539926" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:15.533328" elapsed="0.006632"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.540340" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:15.540055" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.540030" elapsed="0.000432"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.541044" 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-10-11T00:53:15.540732" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.541487" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:15.541188" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.541166" elapsed="0.000440"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:15.541648" 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-10-11T00:53:15.543891" elapsed="0.000156"/>
</kw>
<msg time="2026-10-11T00:53:15.544102" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:15.543135" elapsed="0.001045"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.544454" elapsed="0.000028"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.544703" 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-10-11T00:53:15.542748" elapsed="0.002059"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:53:15.542061" elapsed="0.002803"/>
</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-10-11T00:53:15.521818" elapsed="0.023145"/>
</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-10-11T00:53:15.545832" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:15.545715" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.545691" elapsed="0.000227"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:15.546366" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:15.546130" elapsed="0.000270"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:15.546866" 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-10-11T00:53:15.546676" elapsed="0.000223"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:15.597494" 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-10-11T00:53:15.547640" elapsed="0.049910"/>
</kw>
<msg time="2026-10-11T00:53:15.597659" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:15.597699" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:15.547124" elapsed="0.050596"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:15.599710" 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-10-11T00:53:15.598225" elapsed="0.001538"/>
</kw>
<msg time="2026-10-11T00:53:15.599847" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:15.599896" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:15.597889" elapsed="0.002037"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.600211" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:15.599997" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.599977" elapsed="0.000359"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.600792" 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-10-11T00:53:15.600548" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.601096" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:15.600897" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.600881" elapsed="0.000284"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:15.601196" 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-10-11T00:53:15.602838" elapsed="0.000111"/>
</kw>
<msg time="2026-10-11T00:53:15.602988" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:15.602304" 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-10-11T00:53:15.603222" elapsed="0.000019"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.603376" elapsed="0.000018"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:53:15.602014" elapsed="0.001454"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:53:15.601521" elapsed="0.001990"/>
</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-10-11T00:53:15.545387" elapsed="0.058208"/>
</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-10-11T00:53:15.604195" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:15.604113" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.604096" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:15.604598" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:15.604401" elapsed="0.000223"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:15.605097" 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-10-11T00:53:15.604786" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:15.653494" 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-10-11T00:53:15.605653" elapsed="0.047896"/>
</kw>
<msg time="2026-10-11T00:53:15.653653" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:15.653693" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:15.605279" elapsed="0.048436"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:15.655685" 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-10-11T00:53:15.654217" elapsed="0.001521"/>
</kw>
<msg time="2026-10-11T00:53:15.655826" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:15.655865" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:15.653881" elapsed="0.002008"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.656158" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:15.655955" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.655937" elapsed="0.000290"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.656666" 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-10-11T00:53:15.656426" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.656967" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:15.656769" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.656753" elapsed="0.000283"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:15.657065" elapsed="0.000024"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:15.658567" elapsed="0.000125"/>
</kw>
<msg time="2026-10-11T00:53:15.658760" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:15.658100" elapsed="0.000717"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.658995" elapsed="0.000020"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.659149" elapsed="0.000018"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:53:15.657831" elapsed="0.001390"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:53:15.657334" elapsed="0.001928"/>
</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-10-11T00:53:15.603913" elapsed="0.055420"/>
</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-10-11T00:53:13.459875" elapsed="2.199508"/>
</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-10-11T00:53:15.660730" elapsed="0.000198"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:53:15.660457" 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-10-11T00:53:15.661902" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:15.661814" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.661795" elapsed="0.000169"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:15.664355" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:15.664274" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.664257" elapsed="0.000176"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.665346" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:15.665022" elapsed="0.000348"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.665819" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:15.665542" elapsed="0.000301"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:15.665882" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:53:15.666008" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:15.664665" elapsed="0.001366"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:15.668708" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:15.668622" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.668604" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:15.669853" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:15.669769" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.669752" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:15.670232" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:15.670067" elapsed="0.000189"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:15.670590" 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-10-11T00:53:15.670437" elapsed="0.000177"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:15.701683" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:53:15.671097" elapsed="0.030680"/>
</kw>
<msg time="2026-10-11T00:53:15.701922" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:15.701963" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:15.670771" elapsed="0.031226"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:15.773703" 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-10-11T00:53:15.702520" elapsed="0.071349"/>
</kw>
<msg time="2026-10-11T00:53:15.774030" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:15.774072" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:15.702163" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.774428" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:15.774181" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.774160" elapsed="0.000344"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.774949" 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-10-11T00:53:15.774705" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.775278" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:15.775079" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.775063" elapsed="0.000285"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:15.775378" 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-10-11T00:53:15.777891" elapsed="0.000258"/>
</kw>
<msg time="2026-10-11T00:53:15.778207" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:15.776820" elapsed="0.001526"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.778690" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.779025" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:53:15.776176" 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-10-11T00:53:15.775701" elapsed="0.003569"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:53:15.669497" elapsed="0.109846"/>
</kw>
<msg time="2026-10-11T00:53:15.779447" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:15.779487" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:15.668920" elapsed="0.110602"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:15.779689" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:53:15.779603" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.779572" elapsed="0.000192"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.780093" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.780399" elapsed="0.000048"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:15.780488" 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-10-11T00:53:15.668303" elapsed="0.112271"/>
</kw>
<msg time="2026-10-11T00:53:15.780673" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:15.780712" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:15.666386" elapsed="0.114362"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.781036" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:15.780814" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.780798" elapsed="0.000307"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:15.666241" elapsed="0.114886"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:15.666088" elapsed="0.115069"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:53:15.663979" elapsed="0.117227"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:53:15.661530" elapsed="0.119760"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:15.661122" elapsed="0.120210"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:53:15.660090" elapsed="0.121292"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.782347" 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-10-11T00:53:15.781692" elapsed="0.000683"/>
</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-10-11T00:53:15.793229" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:15.792929" elapsed="0.000326"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:53:15.794002" 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-10-11T00:53:15.793762" elapsed="0.000319">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-10-11T00:53:15.794164" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:53:15.793428" elapsed="0.000759"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.794715" 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-10-11T00:53:15.794361" elapsed="0.000380"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:53:15.795022" 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-10-11T00:53:15.795180" 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-10-11T00:53:15.794908" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.795652" 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-10-11T00:53:15.795400" 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-10-11T00:53:15.796623" 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-10-11T00:53:15.796358" elapsed="0.000309"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.797260" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:53:15.796841" elapsed="0.000444"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.797940" 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-10-11T00:53:15.797666" elapsed="0.000298"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:15.798688" 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-10-11T00:53:15.798474" elapsed="0.000239"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:15.798757" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:53:15.798882" 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-10-11T00:53:15.798137" 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-10-11T00:53:15.799073" elapsed="0.000188"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:53:15.797509" elapsed="0.001821"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.799861" 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-10-11T00:53:15.799593" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:15.800552" 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-10-11T00:53:15.800359" elapsed="0.000229"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:15.800633" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:15.800756" 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-10-11T00:53:15.800053" elapsed="0.000725"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:15.800941" elapsed="0.000166"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-bgp-peer1</var>
<status status="PASS" start="2026-10-11T00:53:15.799448" elapsed="0.001695"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.801685" 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-10-11T00:53:15.801392" elapsed="0.000317"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:15.802363" 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-10-11T00:53:15.802187" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:15.802445" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:53:15.802569" 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-10-11T00:53:15.801878" elapsed="0.000727"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:15.802769" elapsed="0.000164"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:53:15.801241" elapsed="0.001728"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.803480" 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-10-11T00:53:15.803194" elapsed="0.000310"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:15.804168" 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-10-11T00:53:15.803993" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:15.804234" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:15.804358" 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-10-11T00:53:15.803685" elapsed="0.000696"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:15.804557" elapsed="0.000177"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:53:15.803066" elapsed="0.001705"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.805259" 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-10-11T00:53:15.804997" elapsed="0.000286"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:15.805984" 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-10-11T00:53:15.805808" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:15.806050" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:53:15.806173" 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-10-11T00:53:15.805463" elapsed="0.000732"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:15.806358" elapsed="0.000182"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:53:15.804868" elapsed="0.001720"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.807240" 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-10-11T00:53:15.806819" elapsed="0.000445"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:15.807945" 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-10-11T00:53:15.807770" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:15.808011" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:53:15.808132" 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-10-11T00:53:15.807448" elapsed="0.000706"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:15.808316" elapsed="0.000180"/>
</kw>
<var name="${key}">PEER_ROLE</var>
<var name="${value}">rr-client</var>
<status status="PASS" start="2026-10-11T00:53:15.806687" elapsed="0.001847"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.809080" 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-10-11T00:53:15.808815" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:15.809784" 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-10-11T00:53:15.809607" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:15.809850" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:15.809972" 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-10-11T00:53:15.809270" elapsed="0.000724"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:15.810156" elapsed="0.000165"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:53:15.808684" elapsed="0.001673"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.810880" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:53:15.810613" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:15.811564" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:53:15.811374" elapsed="0.000226"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:15.811651" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:53:15.811777" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:53:15.811071" elapsed="0.000728"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:15.811964" elapsed="0.000163"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:53:15.810471" elapsed="0.001692"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.812694" 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-10-11T00:53:15.812390" elapsed="0.000329"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:15.813368" 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-10-11T00:53:15.813194" elapsed="0.000197"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:15.813452" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:53:15.813714" 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-10-11T00:53:15.812887" 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-10-11T00:53:15.813905" elapsed="0.000165"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:53:15.812261" elapsed="0.001845"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.814639" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:53:15.814332" elapsed="0.000331"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:15.815313" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:53:15.815137" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:15.815380" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T00:53:15.815519" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:53:15.814831" elapsed="0.000711"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:15.815721" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:53:15.814204" elapsed="0.001718"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.816428" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:53:15.816148" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:15.817282" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:53:15.817107" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:15.817350" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:15.817490" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:53:15.816651" elapsed="0.000862"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:15.817699" elapsed="0.000165"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:53:15.816019" elapsed="0.001882"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.818453" 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-10-11T00:53:15.818169" elapsed="0.000309"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:15.819147" 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-10-11T00:53:15.818970" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:15.819214" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:53:15.819338" 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-10-11T00:53:15.818664" elapsed="0.000697"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:15.819548" elapsed="0.000183"/>
</kw>
<var name="${key}">RR_CLIENT</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:53:15.818037" elapsed="0.001731"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:53:15.797332" elapsed="0.022467"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:53:15.819836" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:53:15.819968" 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-10-11T00:53:15.796015" elapsed="0.023977"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:15.795755" elapsed="0.024266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.820190" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:15.820043" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.795738" elapsed="0.024521"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.821163" 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-10-11T00:53:15.820433" elapsed="0.000757"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:53:15.821234" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:53:15.792402" elapsed="0.028931"/>
</kw>
<msg time="2026-10-11T00:53:15.821382" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:15.787864" elapsed="0.033577"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:53:15.825813" 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/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-10-11T00:53:15.830093" 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/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-10-11T00:53:15.834360" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.834557" 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-10-11T00:53:15.834760" 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-10-11T00:53:15.835138" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:15.834989" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:53:15.834976" 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-10-11T00:53:15.835365" 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-10-11T00:53:15.835563" 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-10-11T00:53:15.835742" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:53:15.834950" elapsed="0.000840"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:53:15.834859" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.835968" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:53:15.836034" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:53:15.836144" 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-10-11T00:53:15.787248" elapsed="0.048921"/>
</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-10-11T00:53:15.845639" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:15.845305" elapsed="0.000360"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:53:15.846313" 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-10-11T00:53:15.846143" elapsed="0.000228">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-10-11T00:53:15.846471" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:53:15.845825" elapsed="0.000669"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.846989" 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-10-11T00:53:15.846680" elapsed="0.000333"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:53:15.847285" 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-10-11T00:53:15.847420" 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-10-11T00:53:15.847179" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.847872" 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-10-11T00:53:15.847654" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:53:15.848234" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:15.847987" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.848787" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:15.848504" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:15.848339" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.847970" elapsed="0.000895"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.849807" 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-10-11T00:53:15.849025" elapsed="0.000810"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:53:15.849880" 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-10-11T00:53:15.844802" elapsed="0.005179"/>
</kw>
<msg time="2026-10-11T00:53:15.850034" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:15.840113" elapsed="0.009964"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:53:15.854396" 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//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-10-11T00:53:15.858772" 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/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-10-11T00:53:15.863068" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.863248" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.863442" 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-10-11T00:53:15.863797" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:15.863649" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:53:15.863635" 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-10-11T00:53:15.864025" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.864203" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.864365" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:53:15.863609" elapsed="0.000817"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:53:15.863509" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.864616" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:53:15.864716" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:53:15.864838" 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-10-11T00:53:15.839390" elapsed="0.025475"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:53:15.865987" 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-10-11T00:53:15.865798" elapsed="0.000248">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-10-11T00:53:15.866129" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:53:15.865458" elapsed="0.000693"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.866448" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:15.866214" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.867012" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:15.866750" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:15.866523" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.866197" elapsed="0.000891"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.867612" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:15.867250" elapsed="0.000387"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:53:15.867682" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:15.867806" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:53:15.865141" elapsed="0.002688"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.870236" 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-10-11T00:53:15.870013" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.870717" 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-10-11T00:53:15.870487" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.871180" 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-10-11T00:53:15.870963" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.871668" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:15.871425" elapsed="0.000283"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:15.872436" 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-10-11T00:53:15.872252" elapsed="0.000211"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:53:15.872778" 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-10-11T00:53:15.872632" elapsed="0.000170"/>
</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-10-11T00:53:15.872964" elapsed="0.000155"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.873555" 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-10-11T00:53:15.873313" elapsed="0.000339"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:53:15.873692" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:53:15.873821" 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-10-11T00:53:15.871893" elapsed="0.001951"/>
</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-10-11T00:53:15.899216" level="INFO">PUT Request : url=http://10.30.170.173: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.34.2', '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-10-11T00:53:15.899283" level="INFO">PUT Response : url=http://10.30.170.173: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=node0m7skl41s938a19yqv1i6nmu2u13.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Sat, 10-Oct-2026 00:53:15 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T00:53:15.899490" 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-10-11T00:53:15.874140" elapsed="0.025384"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:15.873905" elapsed="0.025662"/>
</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-10-11T00:53:15.899764" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:15.899606" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.873890" elapsed="0.025954"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.901070" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:15.900795" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:15.900534" elapsed="0.000606"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.900516" elapsed="0.000646"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.901755" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:15.901473" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:15.901211" elapsed="0.000615"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.901197" elapsed="0.000651"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.902374" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:15.902027" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.902716" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:15.902482" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.903214" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:15.902954" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:15.902791" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.902464" elapsed="0.000826"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.903836" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:15.903481" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.904134" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:15.903924" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.904675" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:15.904369" elapsed="0.000361"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:15.904208" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.903907" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:15.904931" elapsed="0.000294"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:53:15.905646" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:15.905387" elapsed="0.000284"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:53:15.905826" elapsed="0.000226"/>
</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-10-11T00:53:15.900175" elapsed="0.005933"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:53:15.906249" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:53:15.906167" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.906150" elapsed="0.000176"/>
</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-10-11T00:53:15.906489" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:53:15.906552" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:53:15.906739" 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-10-11T00:53:15.869312" elapsed="0.037451"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:53:15.906818" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:53:15.906937" 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-10-11T00:53:15.783259" elapsed="0.123700"/>
</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-10-11T00:53:15.907245" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:15.907043" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.907028" elapsed="0.000300"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:53:15.907358" elapsed="0.000023"/>
</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-10-11T00:53:15.782666" elapsed="0.124804"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.908295" 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-10-11T00:53:15.907670" elapsed="0.000652"/>
</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-10-11T00:53:15.919362" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:15.919061" elapsed="0.000327"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:53:15.920069" 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-10-11T00:53:15.919899" elapsed="0.000229">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-10-11T00:53:15.920210" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:53:15.919567" elapsed="0.000666"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.920746" 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-10-11T00:53:15.920422" elapsed="0.000383"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:53:15.921084" 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-10-11T00:53:15.921199" 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-10-11T00:53:15.920976" elapsed="0.000247"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.921667" 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-10-11T00:53:15.921433" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.922623" 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-10-11T00:53:15.922358" elapsed="0.000309"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.923090" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:53:15.922844" elapsed="0.000270"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.923737" 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-10-11T00:53:15.923456" elapsed="0.000305"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:15.924430" 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-10-11T00:53:15.924236" elapsed="0.000219"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:15.924500" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T00:53:15.924638" 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-10-11T00:53:15.923929" elapsed="0.000732"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:15.924827" elapsed="0.000166"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:53:15.923310" elapsed="0.001719"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.925545" 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-10-11T00:53:15.925261" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:15.926366" 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-10-11T00:53:15.926188" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:15.926452" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:53:15.926591" 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-10-11T00:53:15.925749" 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-10-11T00:53:15.926782" elapsed="0.000167"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-bgp-peer2</var>
<status status="PASS" start="2026-10-11T00:53:15.925127" elapsed="0.001858"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.927500" 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-10-11T00:53:15.927215" elapsed="0.000309"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:15.928207" 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-10-11T00:53:15.928032" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:15.928275" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:15.928398" 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-10-11T00:53:15.927722" elapsed="0.000715"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:15.928616" elapsed="0.000167"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-10-11T00:53:15.927085" elapsed="0.001735"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.929313" 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-10-11T00:53:15.929048" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:15.930016" 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-10-11T00:53:15.929841" elapsed="0.000240"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:15.930127" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:53:15.930253" 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-10-11T00:53:15.929521" elapsed="0.000754"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:15.930455" elapsed="0.000181"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:53:15.928918" elapsed="0.001756"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.931170" 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-10-11T00:53:15.930905" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:15.931887" 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-10-11T00:53:15.931710" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:15.931955" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:15.932078" 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-10-11T00:53:15.931361" elapsed="0.000739"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:15.932264" elapsed="0.000178"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:53:15.930773" elapsed="0.001706"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.933056" 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-10-11T00:53:15.932790" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:15.933760" 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-10-11T00:53:15.933570" elapsed="0.000214"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:15.933828" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:15.933948" 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-10-11T00:53:15.933248" elapsed="0.000722"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:15.934135" elapsed="0.000162"/>
</kw>
<var name="${key}">PEER_ROLE</var>
<var name="${value}">rr-client</var>
<status status="PASS" start="2026-10-11T00:53:15.932656" elapsed="0.001678"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.934857" 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-10-11T00:53:15.934591" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:15.935818" 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-10-11T00:53:15.935460" elapsed="0.000383"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:15.935888" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:15.936012" 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-10-11T00:53:15.935047" 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-10-11T00:53:15.936200" elapsed="0.000164"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:53:15.934448" elapsed="0.001953"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.936955" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:53:15.936686" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:15.937659" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:53:15.937470" elapsed="0.000213"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:15.937727" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:15.937848" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:53:15.937147" elapsed="0.000724"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:15.938036" elapsed="0.000166"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:53:15.936518" elapsed="0.001720"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.938784" 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-10-11T00:53:15.938482" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:15.939474" 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-10-11T00:53:15.939284" elapsed="0.000214"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:15.939597" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T00:53:15.939726" 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-10-11T00:53:15.938977" 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-10-11T00:53:15.939912" elapsed="0.000164"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:53:15.938336" elapsed="0.001777"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.940639" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:53:15.940342" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:15.941318" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:53:15.941142" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:15.941386" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T00:53:15.941527" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:53:15.940834" elapsed="0.000716"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:15.941792" elapsed="0.000170"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:53:15.940211" elapsed="0.001788"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.942510" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:53:15.942228" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:15.943202" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:53:15.943027" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:15.943269" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:15.943391" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:53:15.942720" elapsed="0.000709"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:15.943607" elapsed="0.000166"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:53:15.942097" elapsed="0.001712"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.944304" 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-10-11T00:53:15.944039" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:15.945018" 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-10-11T00:53:15.944843" elapsed="0.000198"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:15.945085" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:15.945207" 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-10-11T00:53:15.944516" elapsed="0.000713"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:15.945392" elapsed="0.000179"/>
</kw>
<var name="${key}">RR_CLIENT</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:53:15.943909" elapsed="0.001710"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:53:15.923158" elapsed="0.022492"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:53:15.945688" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:53:15.945978" 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-10-11T00:53:15.922019" elapsed="0.023983"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:15.921770" elapsed="0.024261"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.946205" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:15.946053" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.921752" elapsed="0.024522"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.947123" 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-10-11T00:53:15.946446" elapsed="0.000704"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:53:15.947194" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:53:15.918546" elapsed="0.028747"/>
</kw>
<msg time="2026-10-11T00:53:15.947375" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:15.913930" elapsed="0.033507"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:53:15.951805" 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/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-10-11T00:53:15.956136" 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/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-10-11T00:53:15.960459" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.960677" 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-10-11T00:53:15.960862" 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-10-11T00:53:15.961201" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:15.961055" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:53:15.961041" 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-10-11T00:53:15.961442" 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-10-11T00:53:15.961637" 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-10-11T00:53:15.961803" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:53:15.961016" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:53:15.960927" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.962025" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:53:15.962092" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:53:15.962205" 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-10-11T00:53:15.913303" elapsed="0.048928"/>
</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-10-11T00:53:15.971797" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:15.971451" elapsed="0.000373"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:53:15.972514" 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-10-11T00:53:15.972305" elapsed="0.000286">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-10-11T00:53:15.972721" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:53:15.971986" elapsed="0.000758"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.973233" 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-10-11T00:53:15.972920" elapsed="0.000338"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:53:15.973556" 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-10-11T00:53:15.973703" 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-10-11T00:53:15.973441" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.974150" 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-10-11T00:53:15.973930" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:53:15.974544" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:15.974272" elapsed="0.000338"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.975057" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:15.974784" elapsed="0.000299"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:15.974636" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.974253" elapsed="0.000882"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.976071" 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-10-11T00:53:15.975298" elapsed="0.000802"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:53:15.976144" 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-10-11T00:53:15.970930" elapsed="0.005317"/>
</kw>
<msg time="2026-10-11T00:53:15.976300" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:15.966355" elapsed="0.009989"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:53:15.980873" 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/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-10-11T00:53:15.985249" 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/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-10-11T00:53:15.989635" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.989820" 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-10-11T00:53:15.990003" 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-10-11T00:53:15.990348" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:15.990201" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:53:15.990187" 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-10-11T00:53:15.990605" 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-10-11T00:53:15.990787" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.990951" elapsed="0.000017"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:53:15.990160" elapsed="0.000837"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:53:15.990071" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.991172" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:53:15.991237" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:53:15.991356" 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-10-11T00:53:15.965623" elapsed="0.025759"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:53:15.992509" 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-10-11T00:53:15.992309" elapsed="0.000259">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-10-11T00:53:15.992665" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:53:15.991987" elapsed="0.000701"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:15.992973" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:15.992751" elapsed="0.000272"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.993498" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:15.993220" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:15.993046" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.992734" elapsed="0.000863"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.994103" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:15.993765" elapsed="0.000361"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:53:15.994170" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:15.994293" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:53:15.991686" elapsed="0.002629"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.995563" 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-10-11T00:53:15.995326" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.996061" 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-10-11T00:53:15.995848" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.996541" 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-10-11T00:53:15.996306" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.997000" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:15.996786" elapsed="0.000253"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:15.997770" 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-10-11T00:53:15.997602" elapsed="0.000191"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:53:15.998092" 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-10-11T00:53:15.997949" elapsed="0.000166"/>
</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-10-11T00:53:15.998278" elapsed="0.000177"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:15.998887" 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-10-11T00:53:15.998667" elapsed="0.000260"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:53:15.998965" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:53:15.999091" 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-10-11T00:53:15.997219" elapsed="0.001895"/>
</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-10-11T00:53:16.012260" level="INFO">PUT Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.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-10-11T00:53:16.012323" level="INFO">PUT Response : url=http://10.30.170.173: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-10-11T00:53:16.012443" 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-10-11T00:53:15.999421" elapsed="0.013048"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:15.999175" elapsed="0.013335"/>
</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-10-11T00:53:16.012709" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:16.012535" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:15.999160" elapsed="0.013630"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:16.013985" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:16.013681" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:16.013403" elapsed="0.000654"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:16.013386" elapsed="0.000693"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:16.014669" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:16.014366" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:16.014129" elapsed="0.000612"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:16.014114" elapsed="0.000649"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:16.015288" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:16.014943" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:16.015620" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:16.015377" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:16.016117" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:16.015856" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:16.015694" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:16.015360" elapsed="0.000833"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:16.016725" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:16.016367" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:16.017019" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:16.016812" elapsed="0.000258"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:16.017525" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:16.017251" elapsed="0.000297"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:16.017091" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:16.016795" elapsed="0.000816"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:16.017755" elapsed="0.000285"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:53:16.018437" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:16.018200" elapsed="0.000262"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:53:16.018628" elapsed="0.000213"/>
</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-10-11T00:53:16.013116" elapsed="0.005781"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:53:16.019036" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:53:16.018956" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:16.018939" elapsed="0.000175"/>
</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-10-11T00:53:16.019258" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:53:16.019318" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:53:16.019493" 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-10-11T00:53:15.994644" elapsed="0.024874"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:53:16.019589" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:16.019717" 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-10-11T00:53:15.909377" elapsed="0.110363"/>
</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-10-11T00:53:16.020029" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:16.019828" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:16.019811" elapsed="0.000302"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:53:16.020142" elapsed="0.000024"/>
</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-10-11T00:53:15.908624" elapsed="0.111653"/>
</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-10-11T00:53:16.020868" elapsed="0.000227"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:53:16.020556" elapsed="0.000597"/>
</kw>
<doc>Configure two iBGP peers as routing reflector clients.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:53:15.659473" elapsed="0.361718"/>
</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-10-11T00:53:16.022696" elapsed="0.000199"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:53:16.022373" 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-10-11T00:53:16.023868" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:16.023782" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:16.023764" elapsed="0.000167"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:16.026198" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:16.026116" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:16.026099" elapsed="0.000160"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:16.027211" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:16.026892" elapsed="0.000344"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:16.027681" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:16.027389" elapsed="0.000316"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:16.027745" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:53:16.027869" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:16.026483" elapsed="0.001408"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:16.030513" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:16.030427" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:16.030395" 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-10-11T00:53:16.031683" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:16.031597" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:16.031565" elapsed="0.000179"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:16.032058" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:16.031893" elapsed="0.000190"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:16.032389" 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-10-11T00:53:16.032247" elapsed="0.000181"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:16.066597" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:53:16.032939" elapsed="0.033761"/>
</kw>
<msg time="2026-10-11T00:53:16.066855" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:16.066897" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:16.032607" elapsed="0.034325"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:16.094568" 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-10-11T00:53:16.067469" elapsed="0.027208"/>
</kw>
<msg time="2026-10-11T00:53:16.094824" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:16.094864" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:16.067102" elapsed="0.027797"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:16.095217" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:16.095001" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:16.094981" elapsed="0.000307"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:16.095733" 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-10-11T00:53:16.095493" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:16.096053" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:16.095854" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:16.095837" elapsed="0.000286"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:16.096152" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:16.098749" elapsed="0.000115"/>
</kw>
<msg time="2026-10-11T00:53:16.098920" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:16.097539" 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-10-11T00:53:16.099360" elapsed="0.000102"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:16.099738" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:53:16.096936" 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-10-11T00:53:16.096449" 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-10-11T00:53:16.031300" elapsed="0.068757"/>
</kw>
<msg time="2026-10-11T00:53:16.100138" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:16.100176" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:16.030749" elapsed="0.069462"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:16.100364" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:53:16.100279" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:16.100262" elapsed="0.000204"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:16.100805" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:16.101104" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:16.101167" 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-10-11T00:53:16.030131" elapsed="0.071120"/>
</kw>
<msg time="2026-10-11T00:53:16.101334" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:16.101374" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:16.028224" elapsed="0.073257"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:16.101797" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:16.101553" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:16.101536" elapsed="0.000330"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:16.028080" elapsed="0.073808"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:16.027938" elapsed="0.073975"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:53:16.025825" elapsed="0.076136"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:53:16.023512" elapsed="0.078499"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:16.023096" elapsed="0.078956"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:53:16.022032" elapsed="0.080067"/>
</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-10-11T00:53:16.102295" elapsed="0.000105"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:16.105836" 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.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:16.105533" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:16.106274" 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.173 --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-10-11T00:53:16.106060" elapsed="0.000257"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:16.110060" 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.173 --peerport=1790 --debug --logfile bgp_peer1.log &amp;&gt;bgp_peer1.log</msg>
<msg time="2026-10-11T00:53:16.110145" 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.173 --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-10-11T00:53:16.106492" elapsed="0.003678"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:16.110630" 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.173 --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-10-11T00:53:16.110377" 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-10-11T00:53:16.105186" elapsed="0.005538"/>
</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-10-11T00:53:16.118590" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:53:16.118746" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:53:16.118831" 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-10-11T00:53:16.111831" elapsed="0.007024"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:16.119334" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:16.119059" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:16.119931" 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-10-11T00:53:16.119615" elapsed="0.000359"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-11T00:53:16.120567" 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 the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-11T00:53:16.120136" elapsed="0.000505">'{"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-10-11T00:53:16.111443" elapsed="0.009306">'{"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-10-11T00:53:17.131863" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:53:17.132139" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:53:17.132347" 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-10-11T00:53:17.122657" elapsed="0.009746"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:17.133721" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:17.132979" elapsed="0.000836"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:17.135190" 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-10-11T00:53:17.134343" elapsed="0.000945"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:53:17.135731" elapsed="0.001590"/>
</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-10-11T00:53:17.121620" elapsed="0.015870"/>
</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-10-11T00:53:16.110906" elapsed="1.026715"/>
</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-10-11T00:53:17.138931" elapsed="0.000553"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:53:17.138197" elapsed="0.001451"/>
</kw>
<doc>Connect BGP peer</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:53:16.021540" elapsed="1.118199"/>
</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-10-11T00:53:17.142920" elapsed="0.000438"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:53:17.142318" elapsed="0.001191"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:17.145647" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:17.145382" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:17.145337" elapsed="0.000461"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:17.150670" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:17.150403" elapsed="0.000360"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:17.150366" elapsed="0.000440"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:17.152896" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:17.152117" elapsed="0.000835"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:17.153925" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:17.153291" elapsed="0.000687"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:17.154064" elapsed="0.000070"/>
</return>
<msg time="2026-10-11T00:53:17.154353" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:17.151266" elapsed="0.003137"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:17.160937" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:17.160744" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:17.160703" elapsed="0.000377"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:17.163519" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:17.163300" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:17.163263" elapsed="0.000415"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:17.164382" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:17.164006" elapsed="0.000474"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:17.165177" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:17.164872" elapsed="0.000356"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:17.200855" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:53:17.166354" elapsed="0.034642"/>
</kw>
<msg time="2026-10-11T00:53:17.201229" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:17.201287" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:17.165629" elapsed="0.035706"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:17.228147" 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-10-11T00:53:17.202107" elapsed="0.026206"/>
</kw>
<msg time="2026-10-11T00:53:17.228496" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:17.228538" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:17.201621" elapsed="0.026964"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:17.228893" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:17.228662" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:17.228640" elapsed="0.000326"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:17.229398" 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-10-11T00:53:17.229149" elapsed="0.000330"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:17.229760" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:17.229539" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:17.229522" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:17.229861" 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-10-11T00:53:17.232399" elapsed="0.000136"/>
</kw>
<msg time="2026-10-11T00:53:17.232612" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:17.231298" 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-10-11T00:53:17.233058" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:17.233394" 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-10-11T00:53:17.230703" elapsed="0.002937"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:53:17.230182" elapsed="0.003520"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:53:17.162734" elapsed="0.071042"/>
</kw>
<msg time="2026-10-11T00:53:17.233859" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:17.233898" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:17.161451" elapsed="0.072484"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:17.234089" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:53:17.234003" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:17.233986" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:17.234544" 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-10-11T00:53:17.234876" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:17.234940" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:53:17.160032" elapsed="0.074993"/>
</kw>
<msg time="2026-10-11T00:53:17.235109" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:17.235150" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:17.155201" elapsed="0.079985"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:17.235498" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:17.235252" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:17.235236" elapsed="0.000347"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:17.154883" elapsed="0.080726"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:17.154544" elapsed="0.081098"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:53:17.149759" elapsed="0.085970"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:53:17.144812" elapsed="0.090968"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:17.143874" elapsed="0.091947"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:53:17.141489" elapsed="0.094380"/>
</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-10-11T00:53:17.236034" elapsed="0.000098"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:17.239776" 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.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:17.239477" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:17.240211" 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.173 --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-10-11T00:53:17.239996" elapsed="0.000257"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:17.244261" 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.173 --peerport=1790 --debug --logfile bgp_peer2.log &amp;&gt;bgp_peer2.log</msg>
<msg time="2026-10-11T00:53:17.244346" 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.173 --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-10-11T00:53:17.240422" elapsed="0.003949"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:17.244838" 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.173 --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-10-11T00:53:17.244614" elapsed="0.000268"/>
</kw>
<arg>${BGP_PEER2_COMMAND}</arg>
<arg>${BGP_PEER2_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-10-11T00:53:17.239128" elapsed="0.005804"/>
</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-10-11T00:53:17.252434" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:53:17.252582" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:53:17.252671" 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-10-11T00:53:17.246054" elapsed="0.006641"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:17.253178" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:17.252900" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:17.253762" 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-10-11T00:53:17.253426" elapsed="0.000380"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-11T00:53:17.254401" 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 the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-11T00:53:17.253968" elapsed="0.000525">'{"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-10-11T00:53:17.245680" elapsed="0.008933">'{"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-10-11T00:53:18.266806" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:53:18.267097" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:53:18.267314" 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-10-11T00:53:18.256913" elapsed="0.010458"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:18.268673" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:18.267907" elapsed="0.000862"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:18.269994" 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-10-11T00:53:18.269206" elapsed="0.000886"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:53:18.270487" elapsed="0.001003"/>
</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-10-11T00:53:18.255600" elapsed="0.016055"/>
</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-10-11T00:53:17.245109" elapsed="1.026652"/>
</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-10-11T00:53:18.273137" elapsed="0.000577"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:53:18.272361" elapsed="0.001483"/>
</kw>
<doc>Connect BGP peer</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:53:17.140445" elapsed="1.133476"/>
</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-10-11T00:53:18.277208" elapsed="0.000513"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:53:18.276653" elapsed="0.001179"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:18.283327" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:18.283114" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:18.283067" elapsed="0.000445"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:18.288392" elapsed="0.000062"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:18.288206" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:18.288169" elapsed="0.000418"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:18.290715" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:18.289921" elapsed="0.000851"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:18.291757" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:18.291114" elapsed="0.000698"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:18.291903" elapsed="0.000072"/>
</return>
<msg time="2026-10-11T00:53:18.292197" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:18.289057" elapsed="0.003190"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:18.298210" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:18.298023" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:18.297983" elapsed="0.000368"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:18.300837" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:18.300649" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:18.300608" elapsed="0.000459"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:18.301844" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:18.301401" elapsed="0.000498"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:18.302644" 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-10-11T00:53:18.302264" elapsed="0.000434"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:18.340113" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:53:18.303848" elapsed="0.036405"/>
</kw>
<msg time="2026-10-11T00:53:18.340498" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:18.340558" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:18.303051" elapsed="0.037584"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:18.381938" 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-10-11T00:53:18.341343" elapsed="0.040706"/>
</kw>
<msg time="2026-10-11T00:53:18.382200" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:18.382240" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:18.340870" elapsed="0.041407"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:18.382611" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:18.382347" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:18.382329" elapsed="0.000356"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:18.383090" 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-10-11T00:53:18.382866" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:18.383435" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:18.383219" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:18.383203" elapsed="0.000303"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:18.383536" 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-10-11T00:53:18.386158" elapsed="0.000115"/>
</kw>
<msg time="2026-10-11T00:53:18.386331" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:18.385071" 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-10-11T00:53:18.386815" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:18.387147" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:53:18.384309" 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-10-11T00:53:18.383848" 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-10-11T00:53:18.300002" elapsed="0.087486"/>
</kw>
<msg time="2026-10-11T00:53:18.387585" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:18.387626" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:18.298754" elapsed="0.088907"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:18.387815" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-11T00:53:18.387729" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:18.387712" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:18.388222" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:18.388645" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:18.388713" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:53:18.297340" elapsed="0.091458"/>
</kw>
<msg time="2026-10-11T00:53:18.388879" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:18.388918" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:18.293050" elapsed="0.095902"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:18.389238" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:18.389018" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:18.389002" elapsed="0.000305"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:18.292728" elapsed="0.096601"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:18.292356" elapsed="0.097002"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:53:18.287529" elapsed="0.101957"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:53:18.282497" elapsed="0.107042"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:18.278163" elapsed="0.111430"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:53:18.275822" elapsed="0.113818"/>
</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-10-11T00:53:18.389801" elapsed="0.000096"/>
</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-10-11T00:53:18.394839" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:18.408896" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:18.408986" 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-10-11T00:53:18.394712" elapsed="0.014297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:18.409463" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:18.409210" elapsed="0.000294"/>
</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-10-11T00:53:18.409673" elapsed="0.000274"/>
</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-10-11T00:53:18.394292" elapsed="0.015710"/>
</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-10-11T00:53:18.390074" elapsed="0.019975"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:18.414403" level="INFO">Executing command 'grep -o 'nlri_prefix_received: 8.2.0.0/28' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:18.461955" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:18.462096" 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-10-11T00:53:18.414283" elapsed="0.047845"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:18.462965" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:18.462463" elapsed="0.000591"/>
</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-10-11T00:53:18.463391" elapsed="0.000652"/>
</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-10-11T00:53:18.413880" elapsed="0.050287"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:18.474110" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:18.518014" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:18.518202" 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-10-11T00:53:18.473841" elapsed="0.044411"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:18.519261" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:18.518755" elapsed="0.000595"/>
</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-10-11T00:53:18.519746" elapsed="0.000594"/>
</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-10-11T00:53:18.472947" elapsed="0.047547"/>
</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-10-11T00:53:18.521861" elapsed="0.000503"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:53:18.521151" elapsed="0.001374"/>
</kw>
<doc>Check incomming updates for new routes</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:53:18.274634" elapsed="0.248047"/>
</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-10-11T00:53:18.525874" elapsed="0.001035"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:53:18.525262" elapsed="0.001760"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:18.529182" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:18.528978" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:18.528935" elapsed="0.000394"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:18.534091" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:18.533908" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:18.533870" elapsed="0.000357"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:18.536335" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:18.535608" elapsed="0.000782"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:18.537379" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:18.536796" elapsed="0.000666"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:18.537554" elapsed="0.000096"/>
</return>
<msg time="2026-10-11T00:53:18.537875" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:18.534746" elapsed="0.003180"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:18.543882" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:18.543693" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:18.543653" elapsed="0.000369"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:18.546456" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:18.546234" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:18.546196" elapsed="0.000426"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:18.547329" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:18.546954" elapsed="0.000429"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:18.548127" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:18.547821" elapsed="0.000358"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:18.584551" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:53:18.549132" elapsed="0.035582"/>
</kw>
<msg time="2026-10-11T00:53:18.584941" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:18.584983" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:18.548588" elapsed="0.036429"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:18.645994" 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-10-11T00:53:18.585544" elapsed="0.060558"/>
</kw>
<msg time="2026-10-11T00:53:18.646251" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:18.646292" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:18.585186" elapsed="0.061141"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:18.646649" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:18.646396" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:18.646378" elapsed="0.000382"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:18.647175" 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-10-11T00:53:18.646946" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:18.647659" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:18.647305" elapsed="0.000406"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:18.647289" elapsed="0.000444"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:18.647763" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:18.650313" elapsed="0.000135"/>
</kw>
<msg time="2026-10-11T00:53:18.650507" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:18.649184" elapsed="0.001481"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:18.650972" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:18.651304" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:53:18.648544" elapsed="0.002966"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:53:18.648057" 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-10-11T00:53:18.545664" elapsed="0.105992"/>
</kw>
<msg time="2026-10-11T00:53:18.651736" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:18.651774" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:18.544357" elapsed="0.107453"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:18.651961" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-11T00:53:18.651877" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:18.651859" elapsed="0.000176"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:18.652357" elapsed="0.000022"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:18.652713" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:18.652777" 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-10-11T00:53:18.543005" elapsed="0.109856"/>
</kw>
<msg time="2026-10-11T00:53:18.652942" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:18.652982" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:18.538750" elapsed="0.114267"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:18.653301" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:18.653082" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:18.653066" elapsed="0.000305"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:18.538342" elapsed="0.115050"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:18.538035" elapsed="0.115412"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:53:18.533177" elapsed="0.120321"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:53:18.528333" elapsed="0.125214"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:18.527362" elapsed="0.126238"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:53:18.524483" elapsed="0.129163"/>
</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-10-11T00:53:18.653840" elapsed="0.000097"/>
</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-10-11T00:53:18.658956" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:18.672152" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:18.672251" 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-10-11T00:53:18.658835" elapsed="0.013439"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:18.672776" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:18.672513" elapsed="0.000304"/>
</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-10-11T00:53:18.672970" elapsed="0.000267"/>
</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-10-11T00:53:18.658431" elapsed="0.014863"/>
</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-10-11T00:53:18.654113" elapsed="0.019231"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:18.677850" level="INFO">Executing command 'grep -o 'nlri_prefix_received: 8.1.0.0/28' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:18.725960" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:18.726082" 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-10-11T00:53:18.677728" elapsed="0.048386"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:18.726761" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:18.726390" elapsed="0.000427"/>
</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-10-11T00:53:18.727027" elapsed="0.000370"/>
</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-10-11T00:53:18.677262" elapsed="0.050234"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:18.733930" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:18.782028" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:18.782121" 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-10-11T00:53:18.733759" elapsed="0.048385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:18.782615" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:18.782347" elapsed="0.000311"/>
</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-10-11T00:53:18.782809" elapsed="0.000265"/>
</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-10-11T00:53:18.733196" elapsed="0.049934"/>
</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-10-11T00:53:18.783703" elapsed="0.000226"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:53:18.783376" elapsed="0.000609"/>
</kw>
<doc>Check incomming updates for new routes</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:53:18.523276" elapsed="0.260742"/>
</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-10-11T00:53:18.785401" elapsed="0.000230"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:53:18.785154" 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-10-11T00:53:18.786607" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:18.786495" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:18.786474" 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-10-11T00:53:18.788795" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:18.788714" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:18.788697" elapsed="0.000160"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:18.789780" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:18.789438" elapsed="0.000367"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:18.790219" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:18.789959" elapsed="0.000284"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:18.790282" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T00:53:18.790476" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:18.789066" elapsed="0.001434"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:18.793263" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:18.793179" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:18.793162" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:18.794428" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:18.794322" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:18.794305" elapsed="0.000188"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:18.794851" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:18.794658" elapsed="0.000217"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:18.795174" 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-10-11T00:53:18.795037" elapsed="0.000160"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:18.829578" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:53:18.795733" elapsed="0.033944"/>
</kw>
<msg time="2026-10-11T00:53:18.829841" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:18.829883" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:18.795351" elapsed="0.034567"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:18.859389" 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-10-11T00:53:18.830441" elapsed="0.029065"/>
</kw>
<msg time="2026-10-11T00:53:18.859669" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:18.859710" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:18.830084" elapsed="0.029661"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:18.860019" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:18.859814" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:18.859795" elapsed="0.000294"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:18.860522" 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-10-11T00:53:18.860275" elapsed="0.000324"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:18.860865" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:18.860659" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:18.860643" elapsed="0.000291"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:18.860963" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:18.863365" elapsed="0.000136"/>
</kw>
<msg time="2026-10-11T00:53:18.863569" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:18.862338" elapsed="0.001368"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:18.864011" elapsed="0.000072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:18.864342" 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-10-11T00:53:18.861759" elapsed="0.002791"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:53:18.861258" elapsed="0.003365"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:53:18.794061" elapsed="0.070636"/>
</kw>
<msg time="2026-10-11T00:53:18.864812" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:18.864852" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:18.793499" elapsed="0.071388"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:18.865040" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:53:18.864955" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:18.864938" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:18.865478" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:18.865800" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:18.865864" 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-10-11T00:53:18.792894" elapsed="0.073056"/>
</kw>
<msg time="2026-10-11T00:53:18.866033" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:18.866073" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:18.790883" elapsed="0.075225"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:18.866396" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:18.866175" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:18.866159" elapsed="0.000332"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:18.790736" elapsed="0.075776"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:18.790551" elapsed="0.075990"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:53:18.788393" elapsed="0.078214"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:53:18.786221" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:18.785827" elapsed="0.080870"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:53:18.784811" elapsed="0.081931"/>
</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-10-11T00:53:18.866902" elapsed="0.000096"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:18.868184" 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-10-11T00:53:18.867891" elapsed="0.000318"/>
</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-10-11T00:53:18.868361" elapsed="0.000392"/>
</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-10-11T00:53:18.867598" elapsed="0.001211"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-10-11T00:53:20.869663" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<msg time="2026-10-11T00:53:20.870009" level="INFO">${output} = [?2004l^C
[?2004h[jenkins@releng-26932-423-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-10-11T00:53:18.868978" elapsed="2.001092"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:20.871468" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:20.870745" elapsed="0.000856"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-10-11T00:53:18.867190" elapsed="2.004544"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:20.879988" level="INFO">Executing command 'cat bgp_peer1.log'.</msg>
<msg time="2026-10-11T00:53:20.893887" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:20.894083" level="INFO">${output_log} = 2026-10-11 00:53:16,231 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:53:16,232 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.1
2026-10-11 00:53:16,232 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-10-11T00:53:20.879729" elapsed="0.014408"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:20.895181" level="INFO">2026-10-11 00:53:16,231 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:53:16,232 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.1
2026-10-11 00:53:16,232 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 00:53:16,232 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 00:53:16,232 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 00:53:16,232 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:53:16,233 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:53:16,234 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:53:16,234 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:53:16,234 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 3
2026-10-11 00:53:16,234 INFO BGP-Thread-1 (job):   Prefix base: 8.1.0.0/28
2026-10-11 00:53:16,234 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 00:53:16,234 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 00:53:16,234 INFO BGP-Thread-1 (job):   My BGP Identifier: 2130706433
2026-10-11 00:53:16,234 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 00:53:16,234 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 00:53:16,234 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 00:53:16,234 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 00:53:16,234 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 00:53:16,234 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 00:53:16,234 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 3
2026-10-11 00:53:16,234 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, 2]
2026-10-11 00:53:16,234 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 00:53:16,235 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 00:53:16,235 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 00:53:16,235 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:16,235 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-10-11 00:53:16,235 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 00:53:16,235 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 00:53:16,235 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-10-11 00:53:16,235 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 00:53:16,235 DEBUG BGP-Thread-1 (job):   BGP Identifier=2130706433 (0x7f000001)
2026-10-11 00:53:16,235 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-10-11 00:53:16,235 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf0
2026-10-11 00:53:16,235 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf000b47f000001100206010400010001020641040000fbf0'
2026-10-11 00:53:16,235 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf000b47f000001100206010400010001020641040000fbf0
2026-10-11 00:53:16,236 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:53:16,237 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:16,237 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:53:16,237 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:53:16,237 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:53:16,237 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:53:16,237 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:16,237 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:53:16,237 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:53:16,237 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:53:16,237 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 00:53:16,237 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 3
2026-10-11 00:53:16,237 DEBUG BGP-Thread-1 (job): ########## Iteration: 0 ##########
2026-10-11 00:53:16,237 DEBUG BGP-Thread-1 (job): Remaining prefixes: 3
2026-10-11 00:53:16,238 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:53:16,238 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:53:16,238 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-10-11 00:53:16,238 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:16,238 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:53:16,238 DEBUG BGP-Thread-1 (job):   Prefix indexes: [0]
2026-10-11 00:53:16,238 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.1.0.0')]
2026-10-11 00:53:16,238 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:53:16,238 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-10-11 00:53:16,238 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:16,238 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:53:16,239 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:53:16,239 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:53:16,239 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:53:16,239 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:16,239 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-10-11 00:53:16,239 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:53:16,239 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:53:16,239 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:53:16,239 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-10-11 00:53:16,239 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-10-11 00:53:16,239 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:53:16,239 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:53:16,239 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:53:16,239 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.1.0.0')]/28 (0x1c08010000)
2026-10-11 00:53:16,239 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08010000
2026-10-11 00:53:16,239 DEBUG BGP-Thread-1 (job): ########## Iteration: 1 ##########
2026-10-11 00:53:16,240 DEBUG BGP-Thread-1 (job): Remaining prefixes: 2
2026-10-11 00:53:16,240 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:53:16,240 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:53:16,240 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-10-11 00:53:16,240 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:16,240 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:53:16,240 DEBUG BGP-Thread-1 (job):   Prefix indexes: [1]
2026-10-11 00:53:16,240 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.1.0.16')]
2026-10-11 00:53:16,240 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:53:16,240 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-10-11 00:53:16,240 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:16,240 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:53:16,241 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:53:16,241 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:53:16,241 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:53:16,241 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:16,241 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-10-11 00:53:16,241 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:53:16,241 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:53:16,241 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:53:16,241 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-10-11 00:53:16,241 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-10-11 00:53:16,241 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:53:16,241 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:53:16,241 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:53:16,245 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.1.0.16')]/28 (0x1c08010010)
2026-10-11 00:53:16,245 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08010010
2026-10-11 00:53:16,245 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 00:53:16,245 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:16,245 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:16,246 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 00:53:16,246 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:16,246 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:16,246 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:16,246 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:16,246 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:16,246 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:16,246 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:16,246 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:16,246 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:16,246 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:16,246 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:16,246 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:16,246 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-10-11 00:53:16,246 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-10-11 00:53:16,247 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:16,247 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:16,247 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:53:16,247 DEBUG BGP-Thread-1 (job): ########## Iteration: 2 ##########
2026-10-11 00:53:16,247 DEBUG BGP-Thread-1 (job): Remaining prefixes: 1
2026-10-11 00:53:16,247 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:53:16,247 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:53:16,247 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-10-11 00:53:16,247 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:16,247 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:53:16,247 DEBUG BGP-Thread-1 (job):   Prefix indexes: [2]
2026-10-11 00:53:16,247 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.1.0.32')]
2026-10-11 00:53:16,248 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:53:16,248 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-10-11 00:53:16,248 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:16,248 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:53:16,248 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:53:16,249 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:53:16,249 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:53:16,250 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:16,250 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-10-11 00:53:16,250 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:53:16,250 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:53:16,250 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:53:16,251 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-10-11 00:53:16,251 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-10-11 00:53:16,251 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:53:16,251 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:53:16,251 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:53:16,251 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.1.0.32')]/28 (0x1c08010020)
2026-10-11 00:53:16,251 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08010020
2026-10-11 00:53:16,251 INFO BGP-Thread-1 (job): All update messages generated.
2026-10-11 00:53:16,251 INFO BGP-Thread-1 (job): Storing performance results.
2026-10-11 00:53:16,251 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-10-11 00:53:16,251 INFO BGP-Thread-1 (job): Number of iterations: 3
2026-10-11 00:53:16,251 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-10-11 00:53:16,251 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-10-11 00:53:16,251 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 3
2026-10-11 00:53:16,251 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.013453483581542969s
2026-10-11 00:53:16,251 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-10-11 00:53:16,251 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-10-11 00:53:16,251 INFO BGP-Thread-1 (job):   
2026-10-11 00:53:16,251 INFO BGP-Thread-1 (job):   
2026-10-11 00:53:16,251 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-10-11 00:53:16,252 INFO BGP-Thread-1 (job):   
2026-10-11 00:53:16,252 INFO BGP-Thread-1 (job):   
2026-10-11 00:53:16,252 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-10-11 00:53:16,252 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:53:16,252 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:16,252 DEBUG BGP-Thread-1 (job):   Length=43 (0x002b)
2026-10-11 00:53:16,252 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:53:16,252 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:53:16,252 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:53:16,252 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=20 (0x0014)
2026-10-11 00:53:16,252 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064)
2026-10-11 00:53:16,252 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:53:16,252 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:53:16,252 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:53:16,252 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-10-11 00:53:16,252 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff002b02000000144001010040020602010000fbf040050400000064
2026-10-11 00:53:17,414 INFO BGP-Thread-1 (job): ... idle for 1.162s
2026-10-11 00:53:17,415 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.162s
2026-10-11 00:53:17,415 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08020000
2026-10-11 00:53:17,415 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:17,415 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:17,415 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-10-11 00:53:17,415 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:17,415 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:17,415 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:17,415 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:17,415 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:17,415 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:17,415 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:17,415 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:17,415 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:17,415 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:17,415 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:17,416 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:17,416 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0033' (51)
2026-10-11 00:53:17,416 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08020000'
2026-10-11 00:53:17,416 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:53:17,416 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:53:17,416 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:53:17,416 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-10-11 00:53:17,416 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:53:17,416 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:53:17,416 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:53:17,416 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:17,416 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:53:17,416 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:17,416 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-10-11 00:53:17,416 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08020000'
2026-10-11 00:53:17,416 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:53:17,416 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:53:17,416 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-10-11 00:53:17,416 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-10-11 00:53:17,416 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-10-11 00:53:17,416 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08020000'
2026-10-11 00:53:17,416 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.2.0.0/28']
2026-10-11 00:53:17,416 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.2.0.0/28
2026-10-11 00:53:17,417 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:17,417 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:17,417 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:53:17,417 INFO BGP-Thread-1 (job): total_received_update_message_counter: 2
2026-10-11 00:53:17,417 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 1
2026-10-11 00:53:17,417 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:53:17,420 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08020010
2026-10-11 00:53:17,420 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:17,420 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:17,420 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-10-11 00:53:17,420 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:17,420 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:17,420 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:17,420 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:17,420 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:17,420 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:17,420 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:17,420 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:17,420 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:17,420 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:17,420 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:17,420 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:17,420 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0033' (51)
2026-10-11 00:53:17,420 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08020010'
2026-10-11 00:53:17,420 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:53:17,420 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:53:17,420 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:53:17,420 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-10-11 00:53:17,420 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:53:17,420 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:53:17,421 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:53:17,421 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:17,421 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:53:17,421 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:17,421 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-10-11 00:53:17,421 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08020010'
2026-10-11 00:53:17,421 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:53:17,421 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:53:17,421 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-10-11 00:53:17,421 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-10-11 00:53:17,421 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-10-11 00:53:17,421 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08020010'
2026-10-11 00:53:17,421 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.2.0.16/28']
2026-10-11 00:53:17,421 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.2.0.16/28
2026-10-11 00:53:17,421 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:17,421 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:17,421 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:53:17,421 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08020020
2026-10-11 00:53:17,421 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:17,421 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:17,421 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-10-11 00:53:17,421 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:17,421 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:17,421 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:17,422 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:17,422 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:17,422 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:17,422 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:17,422 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:17,422 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:17,422 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:17,422 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:17,422 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:17,422 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0033' (51)
2026-10-11 00:53:17,422 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08020020'
2026-10-11 00:53:17,422 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:53:17,422 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:53:17,422 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:53:17,422 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-10-11 00:53:17,422 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:53:17,422 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:53:17,422 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:53:17,422 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:17,422 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:53:17,422 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:17,422 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-10-11 00:53:17,422 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08020020'
2026-10-11 00:53:17,422 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:53:17,422 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:53:17,422 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-10-11 00:53:17,423 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-10-11 00:53:17,423 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-10-11 00:53:17,423 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08020020'
2026-10-11 00:53:17,423 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.2.0.32/28']
2026-10-11 00:53:17,423 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.2.0.32/28
2026-10-11 00:53:17,423 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:17,423 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:17,423 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-10-11T00:53:20.894654" elapsed="0.001333"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T00:53:20.897180" 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-10-11T00:53:20.896471" elapsed="0.000826"/>
</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-10-11T00:53:20.878793" elapsed="0.018660"/>
</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-10-11T00:53:20.898752" elapsed="0.000518"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:53:20.898033" elapsed="0.001364"/>
</kw>
<doc>Stop BGP peer &amp; store logs</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:53:18.784315" elapsed="2.115192"/>
</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-10-11T00:53:20.902690" elapsed="0.000450"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:53:20.902045" elapsed="0.001207"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:20.905400" elapsed="0.000068"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:20.905173" elapsed="0.000364"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:20.905127" elapsed="0.000475"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:20.910478" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:20.910261" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:20.910216" elapsed="0.000468"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:20.912815" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:20.912027" elapsed="0.000844"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:20.913898" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:20.913217" elapsed="0.000735"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:20.914041" elapsed="0.000070"/>
</return>
<msg time="2026-10-11T00:53:20.914332" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:20.911159" elapsed="0.003225"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:20.920852" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:20.920661" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:20.920620" elapsed="0.000373"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:20.923474" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:20.923252" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:20.923213" elapsed="0.000432"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:20.924369" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:20.923982" elapsed="0.000486"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:20.925216" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:20.924901" elapsed="0.000368"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:20.959580" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:53:20.926468" elapsed="0.033269"/>
</kw>
<msg time="2026-10-11T00:53:20.959971" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:20.960032" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:20.925680" elapsed="0.034403"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:20.997852" 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-10-11T00:53:20.960901" elapsed="0.037064"/>
</kw>
<msg time="2026-10-11T00:53:20.998174" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:20.998217" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:20.960345" elapsed="0.037908"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:20.998587" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:20.998328" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:20.998307" elapsed="0.000356"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:20.999080" 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-10-11T00:53:20.998848" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:20.999430" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:20.999212" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:20.999196" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:20.999534" 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-10-11T00:53:21.002086" elapsed="0.000118"/>
</kw>
<msg time="2026-10-11T00:53:21.002264" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:21.000979" 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-10-11T00:53:21.002752" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:21.003091" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:53:21.000346" 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-10-11T00:53:20.999867" elapsed="0.003469"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:53:20.922670" elapsed="0.080764"/>
</kw>
<msg time="2026-10-11T00:53:21.003521" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:21.003578" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:20.921336" elapsed="0.082279"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:21.003771" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:53:21.003685" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:21.003667" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:21.004182" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:21.004577" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:21.004645" 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-10-11T00:53:20.919958" elapsed="0.084774"/>
</kw>
<msg time="2026-10-11T00:53:21.004819" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:21.004861" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:20.915197" elapsed="0.089703"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:21.005189" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:21.004968" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:21.004952" elapsed="0.000307"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:20.914873" elapsed="0.090408"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:20.914526" elapsed="0.090785"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:53:20.909604" elapsed="0.095760"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:53:20.904588" elapsed="0.100938"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:20.903638" elapsed="0.101952"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:53:20.901068" elapsed="0.104572"/>
</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-10-11T00:53:21.005808" elapsed="0.000097"/>
</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-10-11T00:53:21.011066" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:21.024062" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:21.024152" 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-10-11T00:53:21.010939" elapsed="0.013236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:21.024642" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:21.024378" elapsed="0.000306"/>
</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-10-11T00:53:21.024839" elapsed="0.000276"/>
</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-10-11T00:53:21.010540" elapsed="0.014632"/>
</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-10-11T00:53:21.006084" elapsed="0.019136"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:21.029670" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received: 8.1.0.0/28' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:21.074159" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:21.074285" 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-10-11T00:53:21.029537" elapsed="0.044780"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:21.074978" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:21.074654" elapsed="0.000381"/>
</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-10-11T00:53:21.075249" elapsed="0.000408"/>
</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-10-11T00:53:21.029120" elapsed="0.046615"/>
</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-10-11T00:53:21.076500" elapsed="0.000323"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:53:21.076075" elapsed="0.000828"/>
</kw>
<doc>Check incomming updates for withdrawn routes</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:53:20.899968" elapsed="0.176982"/>
</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-10-11T00:53:21.078876" elapsed="0.000274"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:53:21.078510" elapsed="0.000709"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:21.080507" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:21.080364" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:21.080339" 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-10-11T00:53:21.083583" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:21.083452" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:21.083428" elapsed="0.000240"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:21.084942" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:21.084473" elapsed="0.000504"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:21.085590" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:21.085191" elapsed="0.000433"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:21.085679" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:53:21.085855" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:21.083957" elapsed="0.001929"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:21.089847" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:21.089729" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:21.089704" elapsed="0.000232"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:21.091462" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:21.091311" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:21.091287" elapsed="0.000281"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:21.092016" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:21.091777" elapsed="0.000272"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:21.092488" 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-10-11T00:53:21.092276" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:21.128263" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:53:21.093217" elapsed="0.035145"/>
</kw>
<msg time="2026-10-11T00:53:21.128536" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:21.128591" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:21.092759" elapsed="0.035869"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:21.157812" 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-10-11T00:53:21.129131" elapsed="0.028781"/>
</kw>
<msg time="2026-10-11T00:53:21.158060" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:21.158102" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:21.128797" elapsed="0.029340"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:21.158436" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:21.158206" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:21.158188" elapsed="0.000322"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:21.158931" 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-10-11T00:53:21.158708" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:21.159252" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:21.159053" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:21.159037" elapsed="0.000285"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:21.159352" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:21.161792" elapsed="0.000115"/>
</kw>
<msg time="2026-10-11T00:53:21.161964" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:21.160738" elapsed="0.001357"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:21.162442" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:21.162809" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:53:21.160120" elapsed="0.002878"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:53:21.159656" elapsed="0.003402"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:53:21.090950" elapsed="0.072185"/>
</kw>
<msg time="2026-10-11T00:53:21.163220" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:21.163261" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:21.090149" elapsed="0.073148"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:21.163536" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-10-11T00:53:21.163440" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:21.163392" 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-10-11T00:53:21.163976" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:21.164286" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:21.164350" 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-10-11T00:53:21.089225" elapsed="0.075238"/>
</kw>
<msg time="2026-10-11T00:53:21.164563" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:21.164605" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:21.086348" elapsed="0.078293"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:21.164934" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:21.164710" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:21.164693" elapsed="0.000310"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:21.086149" elapsed="0.078876"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:21.085953" elapsed="0.079104"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:53:21.083028" elapsed="0.082078"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:53:21.080011" elapsed="0.085145"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:21.079449" elapsed="0.085748"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:53:21.078008" elapsed="0.087238"/>
</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-10-11T00:53:21.165533" elapsed="0.000116"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:21.166966" 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-10-11T00:53:21.166443" elapsed="0.000549"/>
</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-10-11T00:53:21.167146" elapsed="0.000209"/>
</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-10-11T00:53:21.166149" elapsed="0.001275"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-10-11T00:53:23.168261" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<msg time="2026-10-11T00:53:23.168691" level="INFO">${output} = [?2004l^C
[?2004h[jenkins@releng-26932-423-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-10-11T00:53:21.167609" elapsed="2.001147"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.170085" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:23.169361" elapsed="0.000827"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-10-11T00:53:21.165843" elapsed="2.004473"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:23.178920" level="INFO">Executing command 'cat bgp_peer2.log'.</msg>
<msg time="2026-10-11T00:53:23.193139" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:23.193345" level="INFO">${output_log} = 2026-10-11 00:53:17,344 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:53:17,344 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.2
2026-10-11 00:53:17,344 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-10-11T00:53:23.178656" elapsed="0.014743"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.194466" level="INFO">2026-10-11 00:53:17,344 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:53:17,344 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.2
2026-10-11 00:53:17,344 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 00:53:17,345 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 00:53:17,345 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 00:53:17,345 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:53:17,346 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:53:17,346 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:53:17,346 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:53:17,346 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 3
2026-10-11 00:53:17,346 INFO BGP-Thread-1 (job):   Prefix base: 8.2.0.0/28
2026-10-11 00:53:17,346 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 00:53:17,346 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 00:53:17,347 INFO BGP-Thread-1 (job):   My BGP Identifier: 2130706434
2026-10-11 00:53:17,347 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 00:53:17,347 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 00:53:17,347 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 00:53:17,347 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 00:53:17,347 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 00:53:17,347 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 00:53:17,347 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 3
2026-10-11 00:53:17,347 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, 2]
2026-10-11 00:53:17,347 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 00:53:17,347 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 00:53:17,347 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 00:53:17,347 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:17,347 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-10-11 00:53:17,347 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 00:53:17,347 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 00:53:17,348 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-10-11 00:53:17,348 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 00:53:17,348 DEBUG BGP-Thread-1 (job):   BGP Identifier=2130706434 (0x7f000002)
2026-10-11 00:53:17,348 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-10-11 00:53:17,348 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf0
2026-10-11 00:53:17,348 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf000b47f000002100206010400010001020641040000fbf0'
2026-10-11 00:53:17,348 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf000b47f000002100206010400010001020641040000fbf0
2026-10-11 00:53:17,349 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:53:17,349 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:17,349 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:53:17,349 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:53:17,349 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:53:17,349 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:53:17,349 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:17,349 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:53:17,349 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:53:17,349 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:53:17,349 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 00:53:17,350 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 3
2026-10-11 00:53:17,350 DEBUG BGP-Thread-1 (job): ########## Iteration: 0 ##########
2026-10-11 00:53:17,350 DEBUG BGP-Thread-1 (job): Remaining prefixes: 3
2026-10-11 00:53:17,350 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:53:17,350 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:53:17,350 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-10-11 00:53:17,350 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:17,350 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:53:17,350 DEBUG BGP-Thread-1 (job):   Prefix indexes: [0]
2026-10-11 00:53:17,350 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.2.0.0')]
2026-10-11 00:53:17,350 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:53:17,350 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-10-11 00:53:17,351 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:17,351 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:53:17,351 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:53:17,351 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:53:17,351 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:53:17,352 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:17,352 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-10-11 00:53:17,352 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:53:17,352 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:53:17,352 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:53:17,353 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-10-11 00:53:17,353 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-10-11 00:53:17,353 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:53:17,353 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:53:17,353 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:53:17,353 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.2.0.0')]/28 (0x1c08020000)
2026-10-11 00:53:17,353 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08020000
2026-10-11 00:53:17,355 DEBUG BGP-Thread-1 (job): ########## Iteration: 1 ##########
2026-10-11 00:53:17,355 DEBUG BGP-Thread-1 (job): Remaining prefixes: 2
2026-10-11 00:53:17,355 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:53:17,355 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:53:17,355 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-10-11 00:53:17,355 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:17,355 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:53:17,355 DEBUG BGP-Thread-1 (job):   Prefix indexes: [1]
2026-10-11 00:53:17,356 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.2.0.16')]
2026-10-11 00:53:17,356 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:53:17,356 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-10-11 00:53:17,356 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:17,356 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:53:17,357 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:53:17,357 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:53:17,357 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:53:17,357 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:17,357 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-10-11 00:53:17,357 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:53:17,357 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:53:17,358 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:53:17,358 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-10-11 00:53:17,358 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-10-11 00:53:17,358 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:53:17,358 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:53:17,358 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:53:17,358 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.2.0.16')]/28 (0x1c08020010)
2026-10-11 00:53:17,358 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08020010
2026-10-11 00:53:17,358 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 00:53:17,358 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:17,358 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:17,358 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 00:53:17,358 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:17,358 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:17,359 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:17,359 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:17,359 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:17,359 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:17,359 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:17,359 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:17,359 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:17,359 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:17,359 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:17,359 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:17,359 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-10-11 00:53:17,359 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-10-11 00:53:17,359 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:17,359 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:17,359 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:53:17,359 DEBUG BGP-Thread-1 (job): ########## Iteration: 2 ##########
2026-10-11 00:53:17,359 DEBUG BGP-Thread-1 (job): Remaining prefixes: 1
2026-10-11 00:53:17,359 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:53:17,359 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:53:17,359 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-10-11 00:53:17,359 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:17,359 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:53:17,359 DEBUG BGP-Thread-1 (job):   Prefix indexes: [2]
2026-10-11 00:53:17,359 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.2.0.32')]
2026-10-11 00:53:17,359 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:53:17,359 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-10-11 00:53:17,359 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:17,359 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:53:17,359 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:53:17,359 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:53:17,359 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:53:17,360 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:17,360 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-10-11 00:53:17,360 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:53:17,360 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:53:17,360 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:53:17,360 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-10-11 00:53:17,360 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-10-11 00:53:17,360 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:53:17,360 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:53:17,360 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:53:17,360 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.2.0.32')]/28 (0x1c08020020)
2026-10-11 00:53:17,360 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08020020
2026-10-11 00:53:17,360 INFO BGP-Thread-1 (job): All update messages generated.
2026-10-11 00:53:17,360 INFO BGP-Thread-1 (job): Storing performance results.
2026-10-11 00:53:17,360 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-10-11 00:53:17,360 INFO BGP-Thread-1 (job): Number of iterations: 3
2026-10-11 00:53:17,360 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-10-11 00:53:17,360 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-10-11 00:53:17,360 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 3
2026-10-11 00:53:17,360 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.009964227676391602s
2026-10-11 00:53:17,360 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-10-11 00:53:17,360 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-10-11 00:53:17,360 INFO BGP-Thread-1 (job):   
2026-10-11 00:53:17,360 INFO BGP-Thread-1 (job):   
2026-10-11 00:53:17,360 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-10-11 00:53:17,360 INFO BGP-Thread-1 (job):   
2026-10-11 00:53:17,360 INFO BGP-Thread-1 (job):   
2026-10-11 00:53:17,361 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-10-11 00:53:17,361 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:53:17,361 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:17,361 DEBUG BGP-Thread-1 (job):   Length=43 (0x002b)
2026-10-11 00:53:17,361 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:53:17,361 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:53:17,361 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:53:17,361 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=20 (0x0014)
2026-10-11 00:53:17,361 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064)
2026-10-11 00:53:17,361 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:53:17,361 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:53:17,361 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:53:17,361 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-10-11 00:53:17,361 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff002b02000000144001010040020602010000fbf040050400000064
2026-10-11 00:53:17,411 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08010000
2026-10-11 00:53:17,411 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:17,411 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:17,411 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-10-11 00:53:17,411 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:17,411 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:17,411 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:17,412 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:17,412 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:17,412 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:17,412 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:17,412 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:17,412 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:17,412 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:17,412 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:17,412 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:17,412 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0033' (51)
2026-10-11 00:53:17,413 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08010000'
2026-10-11 00:53:17,413 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:53:17,413 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:53:17,413 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:53:17,413 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-10-11 00:53:17,413 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:53:17,413 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:53:17,423 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:53:17,424 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:17,424 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:53:17,424 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:17,424 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-10-11 00:53:17,424 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08010000'
2026-10-11 00:53:17,424 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:53:17,424 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:53:17,424 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-10-11 00:53:17,424 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-10-11 00:53:17,424 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-10-11 00:53:17,424 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08010000'
2026-10-11 00:53:17,424 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.1.0.0/28']
2026-10-11 00:53:17,424 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.1.0.0/28
2026-10-11 00:53:17,424 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:17,424 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:17,424 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:53:17,424 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08010010
2026-10-11 00:53:17,424 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:17,424 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:17,424 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-10-11 00:53:17,424 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:17,424 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:17,424 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:17,424 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:17,425 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:17,425 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:17,425 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:17,425 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:17,425 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:17,425 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:17,425 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:17,425 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:17,425 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0033' (51)
2026-10-11 00:53:17,425 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08010010'
2026-10-11 00:53:17,425 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:53:17,425 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:53:17,425 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:53:17,425 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-10-11 00:53:17,425 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:53:17,425 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:53:17,425 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:53:17,425 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:17,425 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:53:17,425 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:17,425 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-10-11 00:53:17,425 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08010010'
2026-10-11 00:53:17,425 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:53:17,425 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:53:17,425 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-10-11 00:53:17,426 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-10-11 00:53:17,426 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-10-11 00:53:17,426 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08010010'
2026-10-11 00:53:17,426 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.1.0.16/28']
2026-10-11 00:53:17,426 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.1.0.16/28
2026-10-11 00:53:17,426 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:17,426 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:17,426 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:53:17,426 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08010020
2026-10-11 00:53:17,426 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:17,426 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:17,426 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-10-11 00:53:17,426 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:17,426 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:17,426 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:17,426 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:17,426 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:17,426 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:17,426 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:17,426 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:17,426 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:17,426 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:17,426 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:17,426 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:17,426 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0033' (51)
2026-10-11 00:53:17,426 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08010020'
2026-10-11 00:53:17,427 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:53:17,427 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:53:17,427 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:53:17,427 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-10-11 00:53:17,427 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:53:17,427 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:53:17,427 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:53:17,427 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:17,427 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:53:17,427 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:17,427 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-10-11 00:53:17,427 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08010020'
2026-10-11 00:53:17,427 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:53:17,427 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:53:17,427 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-10-11 00:53:17,427 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-10-11 00:53:17,427 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-10-11 00:53:17,427 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08010020'
2026-10-11 00:53:17,427 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.1.0.32/28']
2026-10-11 00:53:17,427 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.1.0.32/28
2026-10-11 00:53:17,427 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:17,427 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:17,427 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:53:18,908 INFO BGP-Thread-1 (job): ... idle for 1.480s
2026-10-11 00:53:18,908 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.530s
2026-10-11 00:53:18,908 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800f080001011c08010000
2026-10-11 00:53:18,908 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:18,908 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:18,908 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-10-11 00:53:18,908 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:18,908 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:18,909 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:18,909 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:18,909 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:18,909 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:18,909 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:18,909 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:18,909 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:18,909 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:18,909 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:18,909 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:18,909 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002d' (45)
2026-10-11 00:53:18,909 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800f080001011c08010000'
2026-10-11 00:53:18,909 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:53:18,909 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:53:18,909 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:53:18,910 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-10-11 00:53:18,910 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:53:18,910 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:53:18,910 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:53:18,910 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:18,910 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:53:18,910 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:18,910 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-10-11 00:53:18,910 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08010000'
2026-10-11 00:53:18,910 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:53:18,910 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:53:18,910 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08010000'
2026-10-11 00:53:18,910 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.1.0.0/28']
2026-10-11 00:53:18,910 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.1.0.0/28
2026-10-11 00:53:18,911 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:18,911 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:18,911 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:53:18,911 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800f080001011c08010010
2026-10-11 00:53:18,911 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:18,911 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:18,911 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-10-11 00:53:18,911 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:18,911 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:18,911 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:18,911 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:18,911 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:18,911 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:18,911 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:18,911 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:18,912 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:18,912 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:18,912 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:18,912 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:18,912 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002d' (45)
2026-10-11 00:53:18,912 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800f080001011c08010010'
2026-10-11 00:53:18,912 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:53:18,912 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:53:18,912 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:53:18,912 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-10-11 00:53:18,912 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:53:18,912 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:53:18,912 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:53:18,912 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:18,913 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:53:18,913 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:18,913 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-10-11 00:53:18,913 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08010010'
2026-10-11 00:53:18,913 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:53:18,913 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:53:18,913 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08010010'
2026-10-11 00:53:18,913 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.1.0.16/28']
2026-10-11 00:53:18,913 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.1.0.16/28
2026-10-11 00:53:18,913 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:18,913 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:18,913 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:53:18,913 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800f080001011c08010020
2026-10-11 00:53:18,913 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:18,914 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:18,914 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-10-11 00:53:18,914 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:18,914 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:18,914 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:18,914 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:18,914 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:18,914 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:18,914 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:18,914 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:18,914 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:18,914 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:18,914 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:18,914 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:18,914 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002d' (45)
2026-10-11 00:53:18,914 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800f080001011c08010020'
2026-10-11 00:53:18,914 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:53:18,915 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:53:18,915 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:53:18,915 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-10-11 00:53:18,915 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:53:18,915 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:53:18,915 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:53:18,915 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:18,915 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:53:18,915 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:18,915 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-10-11 00:53:18,915 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08010020'
2026-10-11 00:53:18,915 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:53:18,915 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:53:18,915 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08010020'
2026-10-11 00:53:18,915 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.1.0.32/28']
2026-10-11 00:53:18,915 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.1.0.32/28
2026-10-11 00:53:18,916 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:18,916 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:18,916 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:53:18,916 INFO BGP-Thread-1 (job): total_received_update_message_counter: 7
2026-10-11 00:53:18,916 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 3
2026-10-11 00:53:18,916 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-10-11T00:53:23.193917" elapsed="0.001531"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T00:53:23.196651" 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-10-11T00:53:23.195929" elapsed="0.000840"/>
</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-10-11T00:53:23.177699" elapsed="0.019194"/>
</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-10-11T00:53:23.198176" elapsed="0.000595"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:53:23.197485" elapsed="0.001417"/>
</kw>
<doc>Stop BGP peer &amp; store logs</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:53:21.077319" elapsed="2.121661"/>
</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-10-11T00:53:23.202064" elapsed="0.000495"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:53:23.201489" elapsed="0.001185"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:23.204832" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:23.204604" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.204557" elapsed="0.000424"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:23.209928" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:23.209739" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.209700" elapsed="0.000368"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.212163" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:23.211376" elapsed="0.000842"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.213196" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:23.212615" elapsed="0.000634"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:23.213337" elapsed="0.000099"/>
</return>
<msg time="2026-10-11T00:53:23.213693" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:23.210585" elapsed="0.003160"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:23.220143" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:23.219952" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.219911" elapsed="0.000375"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:23.222859" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:23.222667" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.222627" elapsed="0.000373"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:23.223776" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.223333" elapsed="0.000498"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:23.224583" 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-10-11T00:53:23.224201" elapsed="0.000436"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:23.260705" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:53:23.225790" elapsed="0.035080"/>
</kw>
<msg time="2026-10-11T00:53:23.261122" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:23.261181" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:23.224991" elapsed="0.036240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:23.295952" 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-10-11T00:53:23.262083" elapsed="0.034005"/>
</kw>
<msg time="2026-10-11T00:53:23.296263" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:23.296379" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:23.261552" elapsed="0.034888"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.296831" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.296555" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.296511" elapsed="0.000401"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.297381" 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-10-11T00:53:23.297099" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.297751" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.297544" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.297514" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:23.297865" 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-10-11T00:53:23.300632" elapsed="0.000124"/>
</kw>
<msg time="2026-10-11T00:53:23.300815" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:23.299465" 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-10-11T00:53:23.301266" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.301721" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:53:23.298787" elapsed="0.003121"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:53:23.298231" 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-10-11T00:53:23.222014" elapsed="0.080043"/>
</kw>
<msg time="2026-10-11T00:53:23.302147" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:23.302188" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:23.220679" elapsed="0.081548"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:23.302388" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-10-11T00:53:23.302301" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.302283" 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-10-11T00:53:23.302877" 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-10-11T00:53:23.303199" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:23.303267" 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-10-11T00:53:23.219254" elapsed="0.084109"/>
</kw>
<msg time="2026-10-11T00:53:23.303485" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:23.303539" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:23.214519" elapsed="0.089068"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.303894" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.303659" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.303642" elapsed="0.000323"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:23.214170" elapsed="0.089817"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:23.213855" elapsed="0.090164"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:53:23.208967" elapsed="0.095105"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:53:23.203971" elapsed="0.100190"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:23.203009" elapsed="0.101197"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:53:23.200687" elapsed="0.103569"/>
</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-10-11T00:53:23.313993" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:53:23.314139" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:53:23.314241" 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-10-11T00:53:23.305463" elapsed="0.008802"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.314833" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:23.314518" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.315381" 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-10-11T00:53:23.315067" elapsed="0.000374"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if the `container` contains the `item`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.315639" elapsed="0.000410"/>
</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-10-11T00:53:23.305119" elapsed="0.010986"/>
</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-10-11T00:53:23.304563" elapsed="0.011586"/>
</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-10-11T00:53:23.316730" elapsed="0.000229"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:53:23.316404" elapsed="0.000612"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:23.199696" elapsed="0.117360"/>
</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-10-11T00:53:23.318476" elapsed="0.000216"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:53:23.318213" 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-10-11T00:53:23.319658" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:23.319570" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.319551" elapsed="0.000171"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:23.321849" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:23.321759" elapsed="0.000134"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.321742" elapsed="0.000171"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.322843" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:23.322496" elapsed="0.000372"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.323280" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:23.323020" elapsed="0.000283"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:23.323343" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:23.323485" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:23.322124" elapsed="0.001384"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:23.326289" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:23.326204" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.326186" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:23.327513" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:23.327368" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.327350" elapsed="0.000245"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:23.327921" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.327746" elapsed="0.000199"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:23.328251" 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-10-11T00:53:23.328111" elapsed="0.000163"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:23.368234" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:53:23.328802" elapsed="0.039852"/>
</kw>
<msg time="2026-10-11T00:53:23.369105" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:23.369202" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:23.328450" elapsed="0.040833"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:23.426945" 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-10-11T00:53:23.370890" elapsed="0.056210"/>
</kw>
<msg time="2026-10-11T00:53:23.427312" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:23.427369" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:23.369857" elapsed="0.057626"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.427973" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.427631" elapsed="0.000413"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.427594" elapsed="0.000485"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.428731" 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-10-11T00:53:23.428342" elapsed="0.000492"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.429201" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.428918" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.428894" elapsed="0.000406"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:23.429351" elapsed="0.000078"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:23.433153" elapsed="0.000174"/>
</kw>
<msg time="2026-10-11T00:53:23.433427" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:23.431560" elapsed="0.002116"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.434110" elapsed="0.000102"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.434618" elapsed="0.000279"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:53:23.430627" elapsed="0.004443"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:53:23.429889" elapsed="0.005269"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:53:23.327097" elapsed="0.108170"/>
</kw>
<msg time="2026-10-11T00:53:23.435391" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:23.435488" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:23.326521" elapsed="0.109039"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:23.435788" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-10-11T00:53:23.435667" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.435641" 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-10-11T00:53:23.436377" elapsed="0.000070"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.437025" elapsed="0.000041"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:23.437133" 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-10-11T00:53:23.325913" elapsed="0.111318"/>
</kw>
<msg time="2026-10-11T00:53:23.437324" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:23.437367" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:23.323864" elapsed="0.113539"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.437727" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.437490" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.437473" elapsed="0.000324"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:23.323719" elapsed="0.114101"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:23.323570" elapsed="0.114290"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:53:23.321456" elapsed="0.116466"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:53:23.319285" elapsed="0.118695"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:23.318894" elapsed="0.119132"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:53:23.317869" elapsed="0.120213"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.438789" 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-10-11T00:53:23.438284" elapsed="0.000531"/>
</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-10-11T00:53:23.453491" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:23.453166" elapsed="0.000352"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:53:23.454240" 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-10-11T00:53:23.454020" elapsed="0.000301">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-10-11T00:53:23.454423" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:53:23.453696" elapsed="0.000751"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.454953" 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-10-11T00:53:23.454637" elapsed="0.000342"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:53:23.455299" 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-10-11T00:53:23.455470" 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-10-11T00:53:23.455151" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.455949" 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-10-11T00:53:23.455725" elapsed="0.000266"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.457910" 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-10-11T00:53:23.456696" elapsed="0.001257"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.458376" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.458132" elapsed="0.000319"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.459102" 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-10-11T00:53:23.458832" elapsed="0.000294"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:23.459843" 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-10-11T00:53:23.459644" elapsed="0.000223"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:23.459911" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:53:23.460036" 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-10-11T00:53:23.459302" elapsed="0.000757"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.460228" elapsed="0.000226"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:53:23.458692" elapsed="0.001800"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.461002" 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-10-11T00:53:23.460736" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:23.461744" 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-10-11T00:53:23.461558" elapsed="0.000210"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:23.461813" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:23.461937" 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-10-11T00:53:23.461194" elapsed="0.000766"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.462123" elapsed="0.000165"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-bgp-peer1</var>
<status status="PASS" start="2026-10-11T00:53:23.460605" elapsed="0.001719"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.463010" 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-10-11T00:53:23.462587" elapsed="0.000448"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:23.463729" 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-10-11T00:53:23.463546" elapsed="0.000207"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:23.463797" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:23.463922" 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-10-11T00:53:23.463205" elapsed="0.000739"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.464110" elapsed="0.000166"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:53:23.462437" elapsed="0.001877"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.464850" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:53:23.464576" elapsed="0.000298"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:23.465573" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.465358" elapsed="0.000243"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:23.465645" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:23.465768" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:53:23.465043" elapsed="0.000748"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.465957" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:53:23.464427" elapsed="0.001732"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:53:23.458505" elapsed="0.007685"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:53:23.466228" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:53:23.466355" 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-10-11T00:53:23.456313" elapsed="0.010066"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:23.456053" elapsed="0.010385"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.466631" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.466463" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.456035" elapsed="0.010667"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.467456" 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-10-11T00:53:23.466866" elapsed="0.000646"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:53:23.467572" 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-10-11T00:53:23.452618" elapsed="0.015056"/>
</kw>
<msg time="2026-10-11T00:53:23.467724" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:23.447861" elapsed="0.019906"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:53:23.472131" 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/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-10-11T00:53:23.476444" 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/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-10-11T00:53:23.480763" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.480953" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.481134" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.481492" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.481328" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:53:23.481314" 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-10-11T00:53:23.481736" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.481918" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.482082" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:53:23.481289" elapsed="0.000840"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:53:23.481200" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.482305" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:53:23.482373" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:53:23.482498" 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-10-11T00:53:23.447200" elapsed="0.035323"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.483596" 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-10-11T00:53:23.483342" 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-10-11T00:53:23.496206" level="INFO">DELETE Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:53:23.496253" level="INFO">DELETE Response : url=http://10.30.170.173: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-10-11T00:53:23.496336" 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-10-11T00:53:23.483928" elapsed="0.012432"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:23.483700" elapsed="0.012696"/>
</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-10-11T00:53:23.496609" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.496443" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.483683" elapsed="0.013001"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.498091" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:23.497629" elapsed="0.000503"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:23.497347" elapsed="0.000817"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.497330" elapsed="0.000857"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.498778" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:23.498493" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:23.498236" elapsed="0.000615"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.498221" elapsed="0.000653"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.499425" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:23.499056" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.499749" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.499517" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.500261" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:23.499996" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:23.499826" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.499500" elapsed="0.000838"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.500892" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:23.500552" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.501189" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.500980" elapsed="0.000260"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.501723" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:23.501440" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:23.501262" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.500963" elapsed="0.000835"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:23.501943" elapsed="0.000287"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:53:23.502653" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:23.502393" elapsed="0.000285"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.502835" elapsed="0.000218"/>
</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-10-11T00:53:23.497017" elapsed="0.006090"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:53:23.503193" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:53:23.503369" 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-10-11T00:53:23.482812" elapsed="0.020581"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:53:23.503457" elapsed="0.000026"/>
</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-10-11T00:53:23.439028" elapsed="0.064558"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.504205" 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-10-11T00:53:23.503771" elapsed="0.000460"/>
</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-10-11T00:53:23.518152" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:23.517851" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:53:23.518860" 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-10-11T00:53:23.518687" elapsed="0.000234">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-10-11T00:53:23.519004" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:53:23.518337" elapsed="0.000690"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.519525" 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-10-11T00:53:23.519201" elapsed="0.000361"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:53:23.519847" 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-10-11T00:53:23.519965" 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-10-11T00:53:23.519730" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.520469" 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-10-11T00:53:23.520189" elapsed="0.000324"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.521498" 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-10-11T00:53:23.521245" elapsed="0.000314"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.521998" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.521739" elapsed="0.000282"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.522836" 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-10-11T00:53:23.522350" elapsed="0.000510"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:23.523563" 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-10-11T00:53:23.523345" elapsed="0.000243"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:23.523636" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T00:53:23.523772" 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-10-11T00:53:23.523033" elapsed="0.000762"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.523960" elapsed="0.000177"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:53:23.522215" elapsed="0.001960"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.524705" 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-10-11T00:53:23.524420" elapsed="0.000309"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:23.525389" 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-10-11T00:53:23.525212" elapsed="0.000259"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:23.525518" elapsed="0.000064"/>
</return>
<msg time="2026-10-11T00:53:23.525684" 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-10-11T00:53:23.524901" 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-10-11T00:53:23.525869" elapsed="0.000167"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-bgp-peer2</var>
<status status="PASS" start="2026-10-11T00:53:23.524276" elapsed="0.001797"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.526603" 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-10-11T00:53:23.526303" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:23.527274" 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-10-11T00:53:23.527099" elapsed="0.000198"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:23.527340" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:23.527481" 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-10-11T00:53:23.526794" elapsed="0.000710"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.527681" elapsed="0.000163"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-10-11T00:53:23.526172" elapsed="0.001708"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.528375" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:53:23.528111" elapsed="0.000288"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:23.529088" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.528911" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:23.529154" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:53:23.529278" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:53:23.528597" elapsed="0.000703"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.529487" elapsed="0.000178"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:53:23.527980" elapsed="0.001722"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:53:23.522066" elapsed="0.007667"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:53:23.529772" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:53:23.529901" 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-10-11T00:53:23.520886" elapsed="0.009039"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:23.520597" elapsed="0.009356"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.530126" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.529976" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.520576" elapsed="0.009619"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.531024" 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-10-11T00:53:23.530356" elapsed="0.000694"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:53:23.531093" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:53:23.517314" elapsed="0.013883"/>
</kw>
<msg time="2026-10-11T00:53:23.531247" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:23.512766" elapsed="0.018526"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:53:23.535872" 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/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-10-11T00:53:23.540238" 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/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-10-11T00:53:23.544567" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.544749" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.544928" 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-10-11T00:53:23.545263" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.545118" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:53:23.545104" 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-10-11T00:53:23.545505" 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-10-11T00:53:23.545699" 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-10-11T00:53:23.545862" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:53:23.545080" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:53:23.544993" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.546081" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:53:23.546146" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:53:23.546258" 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-10-11T00:53:23.512124" elapsed="0.034159"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.547297" 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-10-11T00:53:23.547074" elapsed="0.000266"/>
</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-10-11T00:53:23.557059" level="INFO">DELETE Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:53:23.557159" level="INFO">DELETE Response : url=http://10.30.170.173: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-10-11T00:53:23.557266" 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-10-11T00:53:23.547676" elapsed="0.009614"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:23.547401" elapsed="0.009926"/>
</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-10-11T00:53:23.557522" elapsed="0.000071"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.557351" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.547384" elapsed="0.010268"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.558880" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:23.558603" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:23.558313" elapsed="0.000638"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.558296" elapsed="0.000677"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.559553" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:23.559258" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:23.559021" elapsed="0.000606"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.559006" elapsed="0.000643"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.560183" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:23.559837" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.560499" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.560270" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.561023" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:23.560761" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:23.560595" elapsed="0.000485"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.560254" elapsed="0.000845"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.561640" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:23.561273" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.561936" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.561727" elapsed="0.000260"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.562450" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:23.562169" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:23.562009" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.561711" elapsed="0.000816"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:23.562686" elapsed="0.000297"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:53:23.563367" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:23.563142" elapsed="0.000249"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.563573" elapsed="0.000217"/>
</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-10-11T00:53:23.557982" elapsed="0.005863"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:53:23.563885" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:23.564057" 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-10-11T00:53:23.546544" elapsed="0.017537"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:53:23.564127" elapsed="0.000025"/>
</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-10-11T00:53:23.504457" elapsed="0.059767"/>
</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-10-11T00:53:23.564819" elapsed="0.000226"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:53:23.564508" elapsed="0.000594"/>
</kw>
<doc>Delete all previously configured BGP peers.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:53:23.317338" elapsed="0.247800"/>
</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-10-11T00:53:23.567315" elapsed="0.000341"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:53:23.566954" elapsed="0.000753"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:23.568668" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:23.568577" elapsed="0.000133"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.568559" elapsed="0.000171"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:23.570862" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:23.570781" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.570764" elapsed="0.000160"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.571843" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:23.571504" elapsed="0.000364"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.572279" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:23.572021" elapsed="0.000282"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:23.572343" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:23.572484" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:23.571132" elapsed="0.001376"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:23.575223" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:23.575140" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.575122" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:23.576439" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:23.576327" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.576309" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:23.576837" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.576667" elapsed="0.000194"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:23.577170" 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-10-11T00:53:23.577027" elapsed="0.000166"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:23.610358" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:53:23.577719" elapsed="0.032755"/>
</kw>
<msg time="2026-10-11T00:53:23.610670" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:23.610712" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:23.577355" elapsed="0.033392"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:23.663356" 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-10-11T00:53:23.611258" elapsed="0.052554"/>
</kw>
<msg time="2026-10-11T00:53:23.664268" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:23.664365" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:23.610917" elapsed="0.053574"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.665325" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.664719" elapsed="0.000760"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.664657" elapsed="0.000898"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.666681" 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-10-11T00:53:23.665975" elapsed="0.000892"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.667502" elapsed="0.000067"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.667004" elapsed="0.000635"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.666967" elapsed="0.000822"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:23.667871" elapsed="0.000075"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:23.673677" elapsed="0.000270"/>
</kw>
<msg time="2026-10-11T00:53:23.674079" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:23.671181" elapsed="0.003200"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.675128" elapsed="0.000163"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.675941" elapsed="0.000163"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:53:23.669790" elapsed="0.006565"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:53:23.668632" elapsed="0.007968"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:53:23.576072" elapsed="0.100697"/>
</kw>
<msg time="2026-10-11T00:53:23.676961" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:23.677051" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:23.575454" elapsed="0.101676"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:23.677593" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-10-11T00:53:23.677282" elapsed="0.000435"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.677243" elapsed="0.000523"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.678643" elapsed="0.000053"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.679322" elapsed="0.000051"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:23.679499" elapsed="0.000057"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:53:23.574853" elapsed="0.104867"/>
</kw>
<msg time="2026-10-11T00:53:23.679914" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:23.680003" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:23.572854" elapsed="0.107229"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.680796" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.680235" elapsed="0.000631"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.680200" elapsed="0.000695"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:23.572707" elapsed="0.108219"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:23.572566" elapsed="0.108407"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:53:23.570467" elapsed="0.110583"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:53:23.568262" elapsed="0.112863"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:23.567863" elapsed="0.113323"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:53:23.566213" elapsed="0.115045"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.682501" 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-10-11T00:53:23.681563" elapsed="0.000989"/>
</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-10-11T00:53:23.698277" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:23.697803" elapsed="0.000511"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:53:23.699313" 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-10-11T00:53:23.699026" elapsed="0.000413">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-10-11T00:53:23.699576" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:53:23.698575" elapsed="0.001034"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.700336" 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-10-11T00:53:23.699880" elapsed="0.000491"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:53:23.700822" 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-10-11T00:53:23.701026" 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-10-11T00:53:23.700653" elapsed="0.000407"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.701705" 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-10-11T00:53:23.701331" elapsed="0.000434"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.703058" 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-10-11T00:53:23.702724" elapsed="0.000395"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.703746" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.703364" elapsed="0.000416"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.704675" 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-10-11T00:53:23.704258" elapsed="0.000451"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:23.705690" 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-10-11T00:53:23.705382" elapsed="0.000342"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:23.705785" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:53:23.705958" 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-10-11T00:53:23.704950" 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-10-11T00:53:23.706219" elapsed="0.000280"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:53:23.704069" elapsed="0.002499"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.707290" 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-10-11T00:53:23.706923" elapsed="0.000391"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:23.708009" 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-10-11T00:53:23.707834" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:23.708076" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:23.708197" 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-10-11T00:53:23.707505" elapsed="0.000714"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.708384" elapsed="0.000377"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-bgp-peer1</var>
<status status="PASS" start="2026-10-11T00:53:23.706707" elapsed="0.002095"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.709305" 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-10-11T00:53:23.709037" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:23.710022" 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-10-11T00:53:23.709847" elapsed="0.000271"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:23.710167" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:53:23.710293" 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-10-11T00:53:23.709519" 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-10-11T00:53:23.710506" elapsed="0.000183"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:53:23.708905" elapsed="0.001821"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.711225" 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-10-11T00:53:23.710958" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:23.711935" 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-10-11T00:53:23.711757" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:23.712002" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:53:23.712126" 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-10-11T00:53:23.711431" elapsed="0.000717"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.712311" elapsed="0.000180"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:53:23.710829" elapsed="0.001728"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.713061" 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-10-11T00:53:23.712793" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:23.713765" 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-10-11T00:53:23.713589" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:23.713832" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:23.713955" 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-10-11T00:53:23.713252" elapsed="0.000725"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.714139" elapsed="0.000173"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:53:23.712662" elapsed="0.001687"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.714881" 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-10-11T00:53:23.714610" elapsed="0.000295"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:23.715588" 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-10-11T00:53:23.715381" elapsed="0.000230"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:23.715654" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:23.715776" 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-10-11T00:53:23.715073" elapsed="0.000725"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.715960" elapsed="0.000164"/>
</kw>
<var name="${key}">PEER_ROLE</var>
<var name="${value}">rr-client</var>
<status status="PASS" start="2026-10-11T00:53:23.714465" elapsed="0.001695"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.716682" 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-10-11T00:53:23.716386" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:23.717386" 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-10-11T00:53:23.717210" elapsed="0.000215"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:23.717469" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:53:23.717606" 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-10-11T00:53:23.716873" elapsed="0.000756"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.717793" elapsed="0.000163"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:53:23.716257" elapsed="0.001735"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.718680" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:53:23.718219" elapsed="0.000485"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:23.719352" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.719179" elapsed="0.000197"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:23.719470" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:53:23.719610" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:53:23.718874" elapsed="0.000759"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.719800" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:53:23.718090" elapsed="0.001910"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.720507" 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-10-11T00:53:23.720225" elapsed="0.000318"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:23.721189" 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-10-11T00:53:23.721016" elapsed="0.000197"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:23.721255" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:53:23.721376" 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-10-11T00:53:23.720711" elapsed="0.000687"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.721589" elapsed="0.000163"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:53:23.720096" elapsed="0.001693"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.722279" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:53:23.722015" elapsed="0.000288"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:23.722982" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.722808" elapsed="0.000197"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:23.723047" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:23.723168" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:53:23.722486" elapsed="0.000704"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.723359" elapsed="0.000213"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:53:23.721886" elapsed="0.001724"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.724113" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:53:23.723846" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:23.724816" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.724640" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:23.724882" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:23.725003" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:53:23.724304" elapsed="0.000721"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.725193" elapsed="0.000175"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:53:23.723708" elapsed="0.001715"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.725955" 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-10-11T00:53:23.725668" elapsed="0.000311"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:23.726670" 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-10-11T00:53:23.726477" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:23.726737" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:53:23.726860" 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-10-11T00:53:23.726153" elapsed="0.000729"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.727047" elapsed="0.000165"/>
</kw>
<var name="${key}">RR_CLIENT</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:53:23.725524" elapsed="0.001727"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:53:23.703846" elapsed="0.023437"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:53:23.727321" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:23.727484" 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-10-11T00:53:23.702209" elapsed="0.025301"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:23.701852" elapsed="0.025736"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.727775" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.727615" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.701827" elapsed="0.026023"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.728785" 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-10-11T00:53:23.728013" elapsed="0.000799"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:53:23.728855" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:53:23.697063" elapsed="0.031891"/>
</kw>
<msg time="2026-10-11T00:53:23.729010" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:23.690594" elapsed="0.038470"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:53:23.735312" 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-10-11T00:53:23.739668" 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/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-10-11T00:53:23.743978" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.744168" 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-10-11T00:53:23.744359" 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-10-11T00:53:23.744740" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.744592" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:53:23.744578" 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-10-11T00:53:23.744973" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.745151" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.745313" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:53:23.744549" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:53:23.744443" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.745580" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:53:23.745650" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:53:23.745761" 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-10-11T00:53:23.689700" elapsed="0.056116"/>
</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-10-11T00:53:23.755246" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:23.754941" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:53:23.755974" 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-10-11T00:53:23.755782" elapsed="0.000264">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-10-11T00:53:23.756130" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:53:23.755446" elapsed="0.000706"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.756685" 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-10-11T00:53:23.756324" elapsed="0.000386"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:53:23.756987" 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-10-11T00:53:23.757127" 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-10-11T00:53:23.756877" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.757597" 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-10-11T00:53:23.757348" 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-10-11T00:53:23.757971" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.757714" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.758472" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:23.758191" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:23.758045" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.757697" elapsed="0.000906"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.759520" 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-10-11T00:53:23.758769" elapsed="0.000791"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:53:23.759604" 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-10-11T00:53:23.754421" elapsed="0.005286"/>
</kw>
<msg time="2026-10-11T00:53:23.759788" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:23.749885" elapsed="0.009948"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:53:23.764308" 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/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-10-11T00:53:23.768701" 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/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-10-11T00:53:23.773072" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.773261" 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-10-11T00:53:23.773471" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.773850" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.773698" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:53:23.773683" 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-10-11T00:53:23.774091" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.774277" 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-10-11T00:53:23.774457" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:53:23.773656" elapsed="0.000849"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:53:23.773557" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.774703" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:53:23.774770" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:53:23.774889" 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-10-11T00:53:23.749070" elapsed="0.025845"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:53:23.776060" 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-10-11T00:53:23.775871" elapsed="0.000249">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-10-11T00:53:23.776203" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:53:23.775524" elapsed="0.000701"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.776574" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.776322" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.777107" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:23.776833" elapsed="0.000298"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:23.776649" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.776304" elapsed="0.000883"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.777754" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:23.777374" elapsed="0.000405"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:53:23.777825" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:23.777950" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:53:23.775198" elapsed="0.002774"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.779222" 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-10-11T00:53:23.779002" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.779704" 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-10-11T00:53:23.779469" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.780159" 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-10-11T00:53:23.779944" elapsed="0.000254"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.780628" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:23.780385" elapsed="0.000283"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:23.781377" 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-10-11T00:53:23.781208" elapsed="0.000193"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:53:23.781730" 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-10-11T00:53:23.781585" elapsed="0.000169"/>
</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-10-11T00:53:23.781914" elapsed="0.000153"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.782495" 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-10-11T00:53:23.782260" elapsed="0.000287"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:53:23.782586" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:23.782713" 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-10-11T00:53:23.780852" elapsed="0.001884"/>
</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-10-11T00:53:23.802780" level="INFO">PUT Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.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-10-11T00:53:23.802945" level="INFO">PUT Response : url=http://10.30.170.173: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-10-11T00:53:23.803096" 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-10-11T00:53:23.783032" elapsed="0.020094"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:23.782797" elapsed="0.020379"/>
</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-10-11T00:53:23.803359" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.803200" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.782781" elapsed="0.020675"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.804661" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:23.804352" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:23.804086" elapsed="0.000646"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.804069" elapsed="0.000686"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.805320" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:23.805054" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:23.804805" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.804790" elapsed="0.000640"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.805980" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:23.805628" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.806283" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.806070" elapsed="0.000265"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.806819" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:23.806554" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:23.806357" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.806053" elapsed="0.000842"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.807434" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:23.807075" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.807746" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.807523" elapsed="0.000276"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.808246" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:23.807986" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:23.807820" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.807506" elapsed="0.000815"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:23.808482" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:53:23.809216" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:23.808987" elapsed="0.000253"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.809396" elapsed="0.000249"/>
</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-10-11T00:53:23.803797" elapsed="0.005904"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:53:23.809842" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:53:23.809760" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.809744" elapsed="0.000175"/>
</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-10-11T00:53:23.810066" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:53:23.810125" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:53:23.810281" 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-10-11T00:53:23.778275" elapsed="0.032029"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:53:23.810403" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T00:53:23.810559" 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-10-11T00:53:23.683789" elapsed="0.126794"/>
</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-10-11T00:53:23.810876" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.810670" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.810654" elapsed="0.000306"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:53:23.810989" elapsed="0.000024"/>
</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-10-11T00:53:23.682916" elapsed="0.128167"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.811949" 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-10-11T00:53:23.811272" 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-10-11T00:53:23.823201" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:23.822894" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:53:23.823934" 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-10-11T00:53:23.823756" elapsed="0.000237">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-10-11T00:53:23.824076" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:53:23.823388" elapsed="0.000711"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.824626" 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-10-11T00:53:23.824283" elapsed="0.000369"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:53:23.824930" 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-10-11T00:53:23.825046" 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-10-11T00:53:23.824821" elapsed="0.000250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.825505" 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-10-11T00:53:23.825269" 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-10-11T00:53:23.826466" 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-10-11T00:53:23.826216" elapsed="0.000294"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.826953" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.826701" elapsed="0.000276"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.827639" 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-10-11T00:53:23.827310" elapsed="0.000353"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:23.828326" 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-10-11T00:53:23.828145" elapsed="0.000206"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:23.828448" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T00:53:23.828592" 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-10-11T00:53:23.827833" 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-10-11T00:53:23.828780" elapsed="0.000176"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:53:23.827178" elapsed="0.001815"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.829514" 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-10-11T00:53:23.829222" elapsed="0.000330"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:23.830212" 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-10-11T00:53:23.830035" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:23.830279" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:53:23.830417" 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-10-11T00:53:23.829724" elapsed="0.000717"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.830622" elapsed="0.000169"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-bgp-peer2</var>
<status status="PASS" start="2026-10-11T00:53:23.829091" elapsed="0.001738"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.831493" 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-10-11T00:53:23.831058" elapsed="0.000460"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:23.832187" 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-10-11T00:53:23.832011" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:23.832254" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:23.832376" 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-10-11T00:53:23.831701" elapsed="0.000698"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.832594" elapsed="0.000166"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-10-11T00:53:23.830928" elapsed="0.001870"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.833295" 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-10-11T00:53:23.833027" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:23.834005" 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-10-11T00:53:23.833830" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:23.834073" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:23.834195" 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-10-11T00:53:23.833505" elapsed="0.000713"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.834383" elapsed="0.000210"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:53:23.832896" elapsed="0.001735"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.835127" 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-10-11T00:53:23.834860" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:23.835843" 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-10-11T00:53:23.835666" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:23.835911" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:23.836033" 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-10-11T00:53:23.835320" elapsed="0.000735"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.836219" elapsed="0.000164"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:53:23.834729" elapsed="0.001705"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.836944" 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-10-11T00:53:23.836679" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:23.837648" 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-10-11T00:53:23.837459" elapsed="0.000213"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:23.837753" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:53:23.837879" 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-10-11T00:53:23.837136" elapsed="0.000765"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.838067" elapsed="0.000164"/>
</kw>
<var name="${key}">PEER_ROLE</var>
<var name="${value}">ibgp</var>
<status status="PASS" start="2026-10-11T00:53:23.836547" elapsed="0.001722"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.838798" 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-10-11T00:53:23.838515" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:23.839493" 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-10-11T00:53:23.839301" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:23.839574" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:23.839699" 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-10-11T00:53:23.838993" elapsed="0.000728"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.839887" elapsed="0.000164"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:53:23.838369" elapsed="0.001719"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.840616" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:53:23.840316" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:23.841468" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.841118" elapsed="0.000374"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:23.841548" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T00:53:23.841685" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:53:23.840811" elapsed="0.000898"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.841875" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:53:23.840187" elapsed="0.001888"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.842613" 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-10-11T00:53:23.842308" elapsed="0.000330"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:23.843287" 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-10-11T00:53:23.843113" elapsed="0.000198"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:23.843354" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:23.843494" 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-10-11T00:53:23.842806" elapsed="0.000711"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.843696" elapsed="0.000166"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:53:23.842178" elapsed="0.001722"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.844394" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:53:23.844128" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:23.845097" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.844924" elapsed="0.000197"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:23.845164" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:23.845285" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:53:23.844617" elapsed="0.000691"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.845487" elapsed="0.000200"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:53:23.843998" elapsed="0.001726"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.846218" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:53:23.845952" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:23.846919" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.846745" elapsed="0.000198"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:23.847019" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:53:23.847146" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:53:23.846423" elapsed="0.000746"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.847333" elapsed="0.000181"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:53:23.845822" elapsed="0.001743"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.848063" 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-10-11T00:53:23.847795" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:23.848767" 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-10-11T00:53:23.848593" elapsed="0.000198"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:23.848839" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:53:23.848964" 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-10-11T00:53:23.848256" elapsed="0.000731"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.849156" elapsed="0.000165"/>
</kw>
<var name="${key}">RR_CLIENT</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:53:23.847664" elapsed="0.001694"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:53:23.827021" elapsed="0.022367"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:53:23.849448" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:23.849596" 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-10-11T00:53:23.825874" elapsed="0.023747"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:23.825623" elapsed="0.024027"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.849825" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.849673" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.825606" elapsed="0.024287"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.850746" 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-10-11T00:53:23.850053" elapsed="0.000720"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:53:23.850817" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:53:23.822335" elapsed="0.028581"/>
</kw>
<msg time="2026-10-11T00:53:23.850965" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:23.817756" elapsed="0.033253"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:53:23.855579" 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/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-10-11T00:53:23.859991" 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/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-10-11T00:53:23.864324" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.864563" 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-10-11T00:53:23.864751" 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-10-11T00:53:23.865091" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.864944" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:53:23.864930" 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-10-11T00:53:23.865324" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.865524" 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-10-11T00:53:23.865707" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:53:23.864905" elapsed="0.000849"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:53:23.864817" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.865932" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:53:23.865998" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:53:23.866108" 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-10-11T00:53:23.817127" elapsed="0.049012"/>
</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-10-11T00:53:23.875745" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:23.875423" elapsed="0.000348"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:53:23.876460" 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-10-11T00:53:23.876253" elapsed="0.000283">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-10-11T00:53:23.876622" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:53:23.875932" elapsed="0.000713"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.877130" 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-10-11T00:53:23.876823" elapsed="0.000331"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:53:23.877451" 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-10-11T00:53:23.877608" 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-10-11T00:53:23.877323" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.878054" 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-10-11T00:53:23.877833" 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-10-11T00:53:23.878499" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.878223" elapsed="0.000358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.879029" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:23.878754" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:23.878605" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.878204" elapsed="0.000904"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.880058" 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-10-11T00:53:23.879271" elapsed="0.000815"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:53:23.880131" 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-10-11T00:53:23.874905" elapsed="0.005331"/>
</kw>
<msg time="2026-10-11T00:53:23.880289" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:23.870217" elapsed="0.010117"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:53:23.884852" 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/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-10-11T00:53:23.889189" 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/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-10-11T00:53:23.893562" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.893745" 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-10-11T00:53:23.893927" 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-10-11T00:53:23.894272" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.894126" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:53:23.894112" 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-10-11T00:53:23.894516" 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-10-11T00:53:23.894710" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.894873" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:53:23.894085" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:53:23.893994" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.895133" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:53:23.895200" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:53:23.895320" 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-10-11T00:53:23.869470" elapsed="0.025877"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:53:23.896494" 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-10-11T00:53:23.896282" elapsed="0.000285">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-10-11T00:53:23.896652" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:53:23.895952" elapsed="0.000722"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.896969" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.896737" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.897499" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:23.897220" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:23.897042" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.896720" elapsed="0.000868"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.898086" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:23.897751" elapsed="0.000359"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:53:23.898154" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:53:23.898277" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:53:23.895650" elapsed="0.002649"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.899557" 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-10-11T00:53:23.899307" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.900007" 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-10-11T00:53:23.899795" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.900485" 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-10-11T00:53:23.900253" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.900961" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:23.900746" elapsed="0.000254"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:23.901787" 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-10-11T00:53:23.901615" elapsed="0.000196"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:53:23.902109" 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-10-11T00:53:23.901965" elapsed="0.000167"/>
</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-10-11T00:53:23.902328" elapsed="0.000185"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.902953" 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-10-11T00:53:23.902723" elapsed="0.000270"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:53:23.903031" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:23.903158" 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-10-11T00:53:23.901184" elapsed="0.001998"/>
</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-10-11T00:53:23.916178" level="INFO">PUT Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.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-10-11T00:53:23.916243" level="INFO">PUT Response : url=http://10.30.170.173: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-10-11T00:53:23.916328" 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-10-11T00:53:23.903491" elapsed="0.012860"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:23.903243" elapsed="0.013149"/>
</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-10-11T00:53:23.916610" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.916437" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.903227" elapsed="0.013464"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.917890" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:23.917613" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:23.917310" elapsed="0.000651"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.917293" elapsed="0.000690"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.918570" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:23.918276" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:23.918032" elapsed="0.000610"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.918017" elapsed="0.000647"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.919187" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:23.918846" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.919502" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.919275" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.920013" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:23.919752" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:23.919588" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.919258" elapsed="0.000830"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.920631" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:23.920263" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.920925" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.920719" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.921476" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:23.921195" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:23.921029" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.920702" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:23.921713" elapsed="0.000291"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:53:23.922390" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:23.922164" elapsed="0.000265"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.922612" elapsed="0.000216"/>
</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-10-11T00:53:23.917021" elapsed="0.005862"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:53:23.923023" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:53:23.922942" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.922925" elapsed="0.000175"/>
</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-10-11T00:53:23.923245" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:53:23.923304" elapsed="0.000017"/>
</return>
<msg time="2026-10-11T00:53:23.923492" 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-10-11T00:53:23.898626" elapsed="0.024892"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:53:23.923587" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:53:23.923712" 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-10-11T00:53:23.812896" elapsed="0.110839"/>
</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-10-11T00:53:23.924027" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.923823" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.923806" elapsed="0.000304"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:53:23.924140" elapsed="0.000024"/>
</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-10-11T00:53:23.812236" elapsed="0.112003"/>
</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-10-11T00:53:23.924841" elapsed="0.000227"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:53:23.924521" elapsed="0.000603"/>
</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-10-11T00:53:23.565625" elapsed="0.359536"/>
</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-10-11T00:53:23.926684" elapsed="0.000202"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:53:23.926355" 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-10-11T00:53:23.927853" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:23.927768" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.927750" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:23.930197" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:23.930115" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.930098" elapsed="0.000160"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.931175" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:23.930853" elapsed="0.000347"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.931691" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:23.931384" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:23.931756" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:23.931881" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:23.930482" elapsed="0.001422"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:23.934611" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:23.934500" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.934483" 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-10-11T00:53:23.935769" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:23.935684" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.935667" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:23.936147" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:23.935979" elapsed="0.000192"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:23.936494" 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-10-11T00:53:23.936335" elapsed="0.000182"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:23.970355" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:53:23.937022" elapsed="0.033450"/>
</kw>
<msg time="2026-10-11T00:53:23.970651" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:23.970695" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:23.936690" elapsed="0.034042"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:23.998427" 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-10-11T00:53:23.971262" elapsed="0.027275"/>
</kw>
<msg time="2026-10-11T00:53:23.998690" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:23.998731" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:23.970907" elapsed="0.027860"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.999051" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.998836" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.998817" elapsed="0.000307"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:23.999580" 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-10-11T00:53:23.999307" elapsed="0.000336"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:23.999904" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:23.999703" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:23.999687" elapsed="0.000288"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:24.000004" 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-10-11T00:53:24.002695" elapsed="0.000118"/>
</kw>
<msg time="2026-10-11T00:53:24.002870" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:24.001386" elapsed="0.001616"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:24.003306" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:24.003691" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:53:24.000806" 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-10-11T00:53:24.000284" elapsed="0.003681"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:53:23.935387" elapsed="0.068654"/>
</kw>
<msg time="2026-10-11T00:53:24.004123" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:24.004163" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:23.934827" elapsed="0.069373"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:24.004354" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:53:24.004268" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:24.004250" 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-10-11T00:53:24.004808" 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-10-11T00:53:24.005108" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:24.005171" 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-10-11T00:53:23.934198" elapsed="0.071057"/>
</kw>
<msg time="2026-10-11T00:53:24.005338" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:24.005377" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:23.932230" elapsed="0.073206"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:24.005739" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:24.005504" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:24.005488" elapsed="0.000321"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:23.932090" elapsed="0.073740"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:23.931950" elapsed="0.073907"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:53:23.929825" elapsed="0.076079"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:53:23.927501" elapsed="0.078452"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:23.927086" elapsed="0.078907"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:53:23.926013" elapsed="0.080027"/>
</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-10-11T00:53:24.006202" elapsed="0.000094"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:24.009764" 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.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:24.009463" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:24.010203" 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.173 --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-10-11T00:53:24.009987" elapsed="0.000258"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:24.014148" 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.173 --peerport=1790 --debug --logfile bgp_peer1.log &amp;&gt;bgp_peer1.log</msg>
<msg time="2026-10-11T00:53:24.014236" 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.173 --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-10-11T00:53:24.010399" elapsed="0.003863"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:24.014713" 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.173 --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-10-11T00:53:24.014477" elapsed="0.000280"/>
</kw>
<arg>${BGP_PEER1_COMMAND}</arg>
<arg>${BGP_PEER1_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-10-11T00:53:24.009110" elapsed="0.005697"/>
</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-10-11T00:53:24.022748" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:53:24.022938" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:53:24.023025" 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-10-11T00:53:24.015916" elapsed="0.007134"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:24.023574" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:24.023252" elapsed="0.000364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:24.024130" 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-10-11T00:53:24.023811" elapsed="0.000361"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-11T00:53:24.024795" 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 the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-11T00:53:24.024338" elapsed="0.000519">'{"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-10-11T00:53:24.015544" elapsed="0.009424">'{"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-10-11T00:53:25.036717" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:53:25.037014" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:53:25.037228" 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-10-11T00:53:25.027035" elapsed="0.010248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:25.038584" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:25.037816" elapsed="0.000867"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:25.039896" 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-10-11T00:53:25.039121" elapsed="0.000873"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:53:25.040363" elapsed="0.000998"/>
</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-10-11T00:53:25.025934" elapsed="0.015613"/>
</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-10-11T00:53:24.014988" elapsed="1.026669"/>
</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-10-11T00:53:25.042963" elapsed="0.001218"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:53:25.042235" elapsed="0.002079"/>
</kw>
<doc>Connect BGP peer</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:53:23.925519" elapsed="1.118873"/>
</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-10-11T00:53:25.047702" elapsed="0.000448"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:53:25.047040" elapsed="0.001222"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:25.050386" elapsed="0.000066"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:25.050176" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:25.050130" elapsed="0.000457"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:25.055347" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:25.055163" elapsed="0.000420"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:25.055125" elapsed="0.000514"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:25.057818" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:25.057027" elapsed="0.000849"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:25.058923" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:25.058227" elapsed="0.000751"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:25.059067" elapsed="0.000072"/>
</return>
<msg time="2026-10-11T00:53:25.059361" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:25.056118" elapsed="0.003338"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:25.068323" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:25.068133" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:25.068094" elapsed="0.000414"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:25.071003" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:25.070816" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:25.070776" elapsed="0.000364"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:25.071913" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:25.071506" elapsed="0.000461"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:25.072708" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:25.072333" elapsed="0.000427"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:25.107861" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:53:25.073918" elapsed="0.034123"/>
</kw>
<msg time="2026-10-11T00:53:25.108329" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:25.108435" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:25.073107" elapsed="0.035401"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:25.134796" 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-10-11T00:53:25.109574" elapsed="0.025325"/>
</kw>
<msg time="2026-10-11T00:53:25.135051" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:25.135092" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:25.108861" elapsed="0.026266"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:25.135447" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:25.135202" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:25.135181" elapsed="0.000372"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:25.135981" 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-10-11T00:53:25.135744" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:25.136305" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:25.136104" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:25.136087" elapsed="0.000290"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:25.136426" 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-10-11T00:53:25.138991" elapsed="0.000120"/>
</kw>
<msg time="2026-10-11T00:53:25.139168" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:25.137878" 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-10-11T00:53:25.139709" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:25.140048" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:53:25.137237" elapsed="0.002996"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:53:25.136760" elapsed="0.003531"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:53:25.070168" elapsed="0.070196"/>
</kw>
<msg time="2026-10-11T00:53:25.140471" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:25.140511" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:25.068874" elapsed="0.071685"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:25.140717" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:53:25.140630" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:25.140612" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:25.141121" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:25.141443" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:25.141508" 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-10-11T00:53:25.067460" elapsed="0.074155"/>
</kw>
<msg time="2026-10-11T00:53:25.141698" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:25.141738" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:25.060240" elapsed="0.081533"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:25.142074" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:25.141843" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:25.141825" elapsed="0.000320"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:25.059919" elapsed="0.082248"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:25.059590" elapsed="0.082608"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:53:25.054498" elapsed="0.087751"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:53:25.049598" elapsed="0.092700"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:25.048653" elapsed="0.093684"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:53:25.046198" elapsed="0.096186"/>
</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-10-11T00:53:25.142655" elapsed="0.000096"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:25.146314" 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.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:25.146034" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:25.146806" 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.173 --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-10-11T00:53:25.146587" elapsed="0.000261"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:25.150608" 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.173 --peerport=1790 --debug --logfile bgp_peer2.log &amp;&gt;bgp_peer2.log</msg>
<msg time="2026-10-11T00:53:25.150696" 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.173 --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-10-11T00:53:25.147002" elapsed="0.003720"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:25.151147" 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.173 --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-10-11T00:53:25.150927" elapsed="0.000297"/>
</kw>
<arg>${BGP_PEER2_COMMAND}</arg>
<arg>${BGP_PEER2_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-10-11T00:53:25.145697" elapsed="0.005578"/>
</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-10-11T00:53:25.159714" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:53:25.159847" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:53:25.159947" 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-10-11T00:53:25.152385" elapsed="0.007586"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:25.160473" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:25.160174" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:25.161043" 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-10-11T00:53:25.160722" elapsed="0.000365"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-11T00:53:25.161718" 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 the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-11T00:53:25.161250" elapsed="0.000543">'{"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-10-11T00:53:25.152017" elapsed="0.009885">'{"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-10-11T00:53:26.173587" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:53:26.173886" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:53:26.174098" 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-10-11T00:53:26.163978" elapsed="0.010177"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:26.175377" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:26.174676" elapsed="0.000829"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:26.176736" 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-10-11T00:53:26.175959" elapsed="0.000877"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:53:26.177202" elapsed="0.000945"/>
</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-10-11T00:53:26.162877" elapsed="0.015406"/>
</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-10-11T00:53:25.151472" elapsed="1.026915"/>
</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-10-11T00:53:26.179839" elapsed="0.000512"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:53:26.179114" elapsed="0.001416"/>
</kw>
<doc>Connect BGP peer</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:53:25.045056" elapsed="1.135552"/>
</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-10-11T00:53:26.184131" elapsed="0.000543"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:53:26.183468" elapsed="0.001318"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:26.186988" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:26.186771" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:26.186722" elapsed="0.000420"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:26.192604" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:26.192348" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:26.192309" elapsed="0.000437"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:26.194949" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:26.194147" elapsed="0.000859"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:26.196040" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:26.195352" elapsed="0.000742"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:26.196186" elapsed="0.000072"/>
</return>
<msg time="2026-10-11T00:53:26.196545" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:26.193216" elapsed="0.003383"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:26.202657" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:26.202444" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:26.202376" elapsed="0.000422"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:26.205239" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:26.205053" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:26.205015" elapsed="0.000360"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:26.206113" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:26.205770" elapsed="0.000377"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:26.206647" 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-10-11T00:53:26.206378" elapsed="0.000302"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:26.242261" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:53:26.207364" elapsed="0.035067"/>
</kw>
<msg time="2026-10-11T00:53:26.242671" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:26.242729" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:26.206901" elapsed="0.035877"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:26.282532" 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-10-11T00:53:26.243537" elapsed="0.039124"/>
</kw>
<msg time="2026-10-11T00:53:26.282824" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:26.282868" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:26.243015" elapsed="0.039890"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:26.283216" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:26.282984" elapsed="0.000344"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:26.282962" elapsed="0.000390"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:26.283846" 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-10-11T00:53:26.283590" elapsed="0.000327"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:26.284180" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:26.283977" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:26.283961" elapsed="0.000290"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:26.284283" 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-10-11T00:53:26.286923" elapsed="0.000286"/>
</kw>
<msg time="2026-10-11T00:53:26.287268" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:26.285804" elapsed="0.001633"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:26.287768" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:26.288103" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:53:26.285128" 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-10-11T00:53:26.284640" elapsed="0.003707"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:53:26.204452" elapsed="0.083996"/>
</kw>
<msg time="2026-10-11T00:53:26.288548" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:26.288590" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:26.203140" elapsed="0.085485"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:26.288780" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:53:26.288694" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:26.288677" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:26.289190" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:26.289545" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:26.289611" 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-10-11T00:53:26.201775" elapsed="0.087920"/>
</kw>
<msg time="2026-10-11T00:53:26.289780" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:26.289821" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:26.197355" elapsed="0.092502"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:26.290152" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:26.289930" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:26.289914" elapsed="0.000309"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:26.197033" elapsed="0.093212"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:26.196712" elapsed="0.093564"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:53:26.191688" elapsed="0.098640"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:53:26.186097" elapsed="0.104282"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:26.185128" elapsed="0.105394"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:53:26.182667" elapsed="0.107908"/>
</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-10-11T00:53:26.290779" elapsed="0.000098"/>
</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-10-11T00:53:26.295993" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:26.309627" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:26.309721" 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-10-11T00:53:26.295862" elapsed="0.013882"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:26.310189" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:26.309950" elapsed="0.000281"/>
</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-10-11T00:53:26.310396" elapsed="0.000326"/>
</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-10-11T00:53:26.295458" elapsed="0.015321"/>
</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-10-11T00:53:26.291063" elapsed="0.019764"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:26.315271" level="INFO">Executing command 'grep -o 'nlri_prefix_received: 8.2.0.0/28' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:26.366656" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:26.366862" 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-10-11T00:53:26.315149" elapsed="0.051771"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:26.367619" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:26.367242" elapsed="0.000434"/>
</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-10-11T00:53:26.367889" elapsed="0.000371"/>
</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-10-11T00:53:26.314730" elapsed="0.053608"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:26.374661" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:26.418785" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:26.418981" 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-10-11T00:53:26.374446" elapsed="0.044585"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:26.420057" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:26.419539" elapsed="0.000608"/>
</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-10-11T00:53:26.420538" elapsed="0.000599"/>
</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-10-11T00:53:26.373906" elapsed="0.047356"/>
</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-10-11T00:53:26.422579" elapsed="0.000493"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:53:26.421875" elapsed="0.001323"/>
</kw>
<doc>Check incomming updates for new routes</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:53:26.181229" elapsed="0.242044"/>
</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-10-11T00:53:26.426394" elapsed="0.000595"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:53:26.425842" elapsed="0.001260"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:26.429890" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:26.429685" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:26.429644" elapsed="0.000390"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:26.434937" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:26.434750" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:26.434712" elapsed="0.000361"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:26.437166" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:26.436388" elapsed="0.000835"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:26.438218" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:26.437634" elapsed="0.000637"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:26.438361" elapsed="0.000094"/>
</return>
<msg time="2026-10-11T00:53:26.438739" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:26.435588" elapsed="0.003276"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:26.444831" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:26.444641" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:26.444602" elapsed="0.000369"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:26.447384" elapsed="0.000064"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:26.447197" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:26.447159" elapsed="0.000420"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:26.448293" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:26.447911" elapsed="0.000436"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:26.449074" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:26.448790" elapsed="0.000317"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:26.483357" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:53:26.449856" elapsed="0.033682"/>
</kw>
<msg time="2026-10-11T00:53:26.483769" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:26.483827" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:26.449327" elapsed="0.034561"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:26.523064" 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-10-11T00:53:26.484571" elapsed="0.038610"/>
</kw>
<msg time="2026-10-11T00:53:26.523334" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:26.523375" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:26.484173" elapsed="0.039264"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:26.523736" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:26.523523" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:26.523492" elapsed="0.000317"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:26.524220" 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-10-11T00:53:26.523992" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:26.524589" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:26.524350" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:26.524333" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:26.524690" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:26.527299" elapsed="0.000133"/>
</kw>
<msg time="2026-10-11T00:53:26.527491" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:26.526193" elapsed="0.001450"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:26.527946" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:26.528281" 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-10-11T00:53:26.525470" elapsed="0.003025"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:53:26.524979" elapsed="0.003589"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:53:26.446625" elapsed="0.082018"/>
</kw>
<msg time="2026-10-11T00:53:26.528760" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:26.528800" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:26.445307" elapsed="0.083529"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:26.528992" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:53:26.528905" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:26.528888" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:26.529389" 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-10-11T00:53:26.529768" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:26.529833" 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-10-11T00:53:26.443954" elapsed="0.085964"/>
</kw>
<msg time="2026-10-11T00:53:26.530001" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:26.530040" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:26.439672" elapsed="0.090403"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:26.530363" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:26.530142" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:26.530126" elapsed="0.000335"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:26.439292" elapsed="0.091191"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:26.438977" elapsed="0.091547"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:53:26.433993" elapsed="0.096581"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:53:26.428440" elapsed="0.102183"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:26.427471" elapsed="0.103192"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:53:26.425025" elapsed="0.105684"/>
</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-10-11T00:53:26.530869" elapsed="0.000096"/>
</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-10-11T00:53:26.536016" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:26.548747" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:26.548841" 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-10-11T00:53:26.535894" elapsed="0.012969"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:26.549299" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:26.549068" elapsed="0.000272"/>
</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-10-11T00:53:26.549528" elapsed="0.000269"/>
</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-10-11T00:53:26.535495" elapsed="0.014357"/>
</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-10-11T00:53:26.531142" elapsed="0.018757"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:26.554264" level="INFO">Executing command 'grep -o 'nlri_prefix_received: 8.1.0.0/28' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:26.597671" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:26.597797" 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-10-11T00:53:26.554144" elapsed="0.043684"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:26.598459" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:26.598111" elapsed="0.000423"/>
</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-10-11T00:53:26.598748" elapsed="0.000373"/>
</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-10-11T00:53:26.553744" elapsed="0.045507"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:26.605372" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:26.649921" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:26.650145" 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-10-11T00:53:26.605205" elapsed="0.044991"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:26.651277" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:26.650742" elapsed="0.000625"/>
</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-10-11T00:53:26.651777" elapsed="0.000596"/>
</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-10-11T00:53:26.604688" elapsed="0.047873"/>
</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-10-11T00:53:26.653852" elapsed="0.000496"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:53:26.653114" elapsed="0.001416"/>
</kw>
<doc>Check incomming updates for new routes</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:53:26.423938" elapsed="0.230670"/>
</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-10-11T00:53:26.657715" elapsed="0.000450"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:53:26.657095" elapsed="0.001188"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:26.661015" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:26.660813" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:26.660769" elapsed="0.000390"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:26.666074" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:26.665889" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:26.665850" elapsed="0.000362"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:26.668306" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:26.667578" elapsed="0.000784"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:26.669348" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:26.668760" elapsed="0.000642"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:26.669547" elapsed="0.000067"/>
</return>
<msg time="2026-10-11T00:53:26.669839" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:26.666730" elapsed="0.003160"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:26.675918" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:26.675730" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:26.675689" elapsed="0.000372"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:26.677949" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:26.677827" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:26.677803" elapsed="0.000233"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:26.678503" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:26.678240" elapsed="0.000313"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:26.678976" 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-10-11T00:53:26.678784" elapsed="0.000225"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:26.715377" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:53:26.679740" elapsed="0.035752"/>
</kw>
<msg time="2026-10-11T00:53:26.715685" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:26.715727" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:26.679227" elapsed="0.036534"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:26.746546" 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-10-11T00:53:26.716327" elapsed="0.030357"/>
</kw>
<msg time="2026-10-11T00:53:26.746866" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:26.746911" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:26.715982" elapsed="0.030965"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:26.747281" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:26.747031" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:26.747006" elapsed="0.000350"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:26.747871" 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-10-11T00:53:26.747605" elapsed="0.000331"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:26.748198" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:26.747996" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:26.747979" elapsed="0.000289"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:26.748300" 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-10-11T00:53:26.751147" elapsed="0.000118"/>
</kw>
<msg time="2026-10-11T00:53:26.751323" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:26.750025" 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-10-11T00:53:26.751804" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:26.752139" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:53:26.749378" elapsed="0.002947"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:53:26.748665" elapsed="0.003720"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:53:26.677450" elapsed="0.075037"/>
</kw>
<msg time="2026-10-11T00:53:26.752601" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:26.752641" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:26.676398" elapsed="0.076281"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:26.752835" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:53:26.752749" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:26.752731" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:26.753251" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:26.753639" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:26.753705" 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-10-11T00:53:26.675008" elapsed="0.078785"/>
</kw>
<msg time="2026-10-11T00:53:26.753876" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:26.753915" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:26.670725" elapsed="0.083228"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:26.754248" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:26.754021" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:26.754004" elapsed="0.000357"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:26.670301" elapsed="0.084086"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:26.669996" elapsed="0.084498"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:53:26.665130" elapsed="0.089434"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:53:26.660185" elapsed="0.094429"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:26.658678" elapsed="0.095978"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:53:26.656260" elapsed="0.098444"/>
</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-10-11T00:53:26.754875" elapsed="0.000098"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:26.756102" 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-10-11T00:53:26.755796" 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-10-11T00:53:26.756283" elapsed="0.000273"/>
</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-10-11T00:53:26.755493" elapsed="0.001118"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-10-11T00:53:28.757581" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<msg time="2026-10-11T00:53:28.757948" level="INFO">${output} = [?2004l^C
[?2004h[jenkins@releng-26932-423-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-10-11T00:53:26.756776" elapsed="2.001239"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:28.759366" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:28.758677" elapsed="0.000840"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-10-11T00:53:26.755167" elapsed="2.004485"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:28.768208" level="INFO">Executing command 'cat bgp_peer1.log'.</msg>
<msg time="2026-10-11T00:53:28.782393" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:28.782667" level="INFO">${output_log} = 2026-10-11 00:53:24,120 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:53:24,120 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.1
2026-10-11 00:53:24,120 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-10-11T00:53:28.767948" elapsed="0.014775"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:28.783777" level="INFO">2026-10-11 00:53:24,120 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:53:24,120 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.1
2026-10-11 00:53:24,120 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 00:53:24,120 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 00:53:24,120 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 00:53:24,121 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:53:24,122 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:53:24,122 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:53:24,122 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:53:24,122 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 3
2026-10-11 00:53:24,122 INFO BGP-Thread-1 (job):   Prefix base: 8.1.0.0/28
2026-10-11 00:53:24,122 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 00:53:24,122 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 00:53:24,122 INFO BGP-Thread-1 (job):   My BGP Identifier: 2130706433
2026-10-11 00:53:24,122 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 00:53:24,122 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 00:53:24,122 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 00:53:24,122 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 00:53:24,122 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 00:53:24,123 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 00:53:24,123 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 3
2026-10-11 00:53:24,123 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, 2]
2026-10-11 00:53:24,123 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 00:53:24,123 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 00:53:24,123 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 00:53:24,123 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:24,123 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-10-11 00:53:24,123 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 00:53:24,123 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 00:53:24,123 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-10-11 00:53:24,123 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 00:53:24,123 DEBUG BGP-Thread-1 (job):   BGP Identifier=2130706433 (0x7f000001)
2026-10-11 00:53:24,123 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-10-11 00:53:24,123 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf0
2026-10-11 00:53:24,124 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf000b47f000001100206010400010001020641040000fbf0'
2026-10-11 00:53:24,124 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf000b47f000001100206010400010001020641040000fbf0
2026-10-11 00:53:24,125 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:53:24,125 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:24,125 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:53:24,125 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:53:24,125 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:53:24,125 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:53:24,125 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:24,125 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:53:24,125 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:53:24,125 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:53:24,125 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 00:53:24,128 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 3
2026-10-11 00:53:24,128 DEBUG BGP-Thread-1 (job): ########## Iteration: 0 ##########
2026-10-11 00:53:24,129 DEBUG BGP-Thread-1 (job): Remaining prefixes: 3
2026-10-11 00:53:24,129 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:53:24,129 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:53:24,129 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-10-11 00:53:24,129 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:24,129 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:53:24,129 DEBUG BGP-Thread-1 (job):   Prefix indexes: [0]
2026-10-11 00:53:24,129 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.1.0.0')]
2026-10-11 00:53:24,129 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:53:24,129 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-10-11 00:53:24,129 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:24,129 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:53:24,129 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:53:24,130 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:53:24,130 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:53:24,131 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:24,131 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-10-11 00:53:24,131 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:53:24,131 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:53:24,131 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:53:24,131 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-10-11 00:53:24,131 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-10-11 00:53:24,131 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:53:24,131 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:53:24,131 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:53:24,132 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.1.0.0')]/28 (0x1c08010000)
2026-10-11 00:53:24,132 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08010000
2026-10-11 00:53:24,132 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 00:53:24,132 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:24,132 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:24,132 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 00:53:24,132 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:24,132 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:24,132 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:24,132 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:24,132 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:24,132 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:24,132 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:24,132 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:24,132 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:24,132 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:24,132 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:24,133 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:24,133 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-10-11 00:53:24,133 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-10-11 00:53:24,133 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:24,133 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:24,133 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:53:24,134 DEBUG BGP-Thread-1 (job): ########## Iteration: 1 ##########
2026-10-11 00:53:24,134 DEBUG BGP-Thread-1 (job): Remaining prefixes: 2
2026-10-11 00:53:24,134 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:53:24,134 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:53:24,134 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-10-11 00:53:24,134 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:24,134 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:53:24,134 DEBUG BGP-Thread-1 (job):   Prefix indexes: [1]
2026-10-11 00:53:24,134 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.1.0.16')]
2026-10-11 00:53:24,134 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:53:24,134 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-10-11 00:53:24,134 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:24,134 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:53:24,134 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:53:24,134 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:53:24,135 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:53:24,135 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:24,135 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-10-11 00:53:24,135 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:53:24,135 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:53:24,135 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:53:24,136 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-10-11 00:53:24,136 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-10-11 00:53:24,136 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:53:24,136 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:53:24,136 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:53:24,136 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.1.0.16')]/28 (0x1c08010010)
2026-10-11 00:53:24,136 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08010010
2026-10-11 00:53:24,136 DEBUG BGP-Thread-1 (job): ########## Iteration: 2 ##########
2026-10-11 00:53:24,136 DEBUG BGP-Thread-1 (job): Remaining prefixes: 1
2026-10-11 00:53:24,136 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:53:24,136 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:53:24,136 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-10-11 00:53:24,136 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:24,136 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:53:24,136 DEBUG BGP-Thread-1 (job):   Prefix indexes: [2]
2026-10-11 00:53:24,136 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.1.0.32')]
2026-10-11 00:53:24,136 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:53:24,137 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-10-11 00:53:24,137 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:24,137 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:53:24,137 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:53:24,137 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:53:24,137 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:53:24,137 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:24,137 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-10-11 00:53:24,137 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:53:24,137 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:53:24,137 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:53:24,137 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-10-11 00:53:24,137 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-10-11 00:53:24,137 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:53:24,137 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:53:24,138 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:53:24,138 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.1.0.32')]/28 (0x1c08010020)
2026-10-11 00:53:24,138 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08010020
2026-10-11 00:53:24,138 INFO BGP-Thread-1 (job): All update messages generated.
2026-10-11 00:53:24,138 INFO BGP-Thread-1 (job): Storing performance results.
2026-10-11 00:53:24,138 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-10-11 00:53:24,138 INFO BGP-Thread-1 (job): Number of iterations: 3
2026-10-11 00:53:24,138 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-10-11 00:53:24,138 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-10-11 00:53:24,138 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 3
2026-10-11 00:53:24,138 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.009073972702026367s
2026-10-11 00:53:24,138 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-10-11 00:53:24,138 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-10-11 00:53:24,138 INFO BGP-Thread-1 (job):   
2026-10-11 00:53:24,138 INFO BGP-Thread-1 (job):   
2026-10-11 00:53:24,138 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-10-11 00:53:24,138 INFO BGP-Thread-1 (job):   
2026-10-11 00:53:24,138 INFO BGP-Thread-1 (job):   
2026-10-11 00:53:24,138 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-10-11 00:53:24,138 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:53:24,138 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:24,139 DEBUG BGP-Thread-1 (job):   Length=43 (0x002b)
2026-10-11 00:53:24,139 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:53:24,139 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:53:24,139 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:53:24,139 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=20 (0x0014)
2026-10-11 00:53:24,139 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064)
2026-10-11 00:53:24,139 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:53:24,139 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:53:24,139 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:53:24,139 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-10-11 00:53:24,139 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff002b02000000144001010040020602010000fbf040050400000064
2026-10-11 00:53:25,273 INFO BGP-Thread-1 (job): ... idle for 1.134s
2026-10-11 00:53:25,273 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.134s
2026-10-11 00:53:25,273 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08020000
2026-10-11 00:53:25,273 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:25,273 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:25,273 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-10-11 00:53:25,273 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:25,273 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:25,273 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:25,273 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:25,273 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:25,274 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:25,274 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:25,274 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:25,274 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:25,274 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:25,274 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:25,274 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:25,274 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0033' (51)
2026-10-11 00:53:25,274 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08020000'
2026-10-11 00:53:25,274 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:53:25,274 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:53:25,274 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:53:25,274 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-10-11 00:53:25,274 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:53:25,274 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:53:25,274 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:53:25,274 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:25,274 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:53:25,274 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:25,274 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-10-11 00:53:25,275 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08020000'
2026-10-11 00:53:25,275 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:53:25,275 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:53:25,275 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-10-11 00:53:25,275 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-10-11 00:53:25,275 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-10-11 00:53:25,275 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08020000'
2026-10-11 00:53:25,275 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.2.0.0/28']
2026-10-11 00:53:25,275 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.2.0.0/28
2026-10-11 00:53:25,275 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:25,275 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:25,275 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:53:25,275 INFO BGP-Thread-1 (job): total_received_update_message_counter: 2
2026-10-11 00:53:25,275 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 1
2026-10-11 00:53:25,275 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:53:25,284 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08020010
2026-10-11 00:53:25,284 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:25,284 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:25,284 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-10-11 00:53:25,284 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:25,284 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:25,284 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:25,284 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:25,284 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:25,284 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:25,284 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:25,284 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:25,284 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:25,284 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:25,284 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:25,284 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:25,284 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0033' (51)
2026-10-11 00:53:25,284 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08020010'
2026-10-11 00:53:25,284 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:53:25,284 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:53:25,284 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:53:25,284 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-10-11 00:53:25,285 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:53:25,285 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:53:25,285 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:53:25,285 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:25,285 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:53:25,285 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:25,285 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-10-11 00:53:25,285 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08020010'
2026-10-11 00:53:25,285 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:53:25,285 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:53:25,285 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-10-11 00:53:25,285 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-10-11 00:53:25,285 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-10-11 00:53:25,285 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08020010'
2026-10-11 00:53:25,285 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.2.0.16/28']
2026-10-11 00:53:25,285 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.2.0.16/28
2026-10-11 00:53:25,285 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:25,285 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:25,285 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:53:25,327 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08020020
2026-10-11 00:53:25,327 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:25,327 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:25,327 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-10-11 00:53:25,328 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:25,328 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:25,328 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:25,328 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:25,328 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:25,328 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:25,328 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:25,328 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:25,328 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:25,328 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:25,328 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:25,328 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:25,328 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0033' (51)
2026-10-11 00:53:25,328 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08020020'
2026-10-11 00:53:25,329 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:53:25,329 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:53:25,329 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:53:25,329 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-10-11 00:53:25,329 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:53:25,329 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:53:25,329 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:53:25,329 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:25,329 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:53:25,329 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:25,329 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-10-11 00:53:25,329 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08020020'
2026-10-11 00:53:25,329 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:53:25,329 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:53:25,330 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-10-11 00:53:25,330 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-10-11 00:53:25,330 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-10-11 00:53:25,330 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08020020'
2026-10-11 00:53:25,330 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.2.0.32/28']
2026-10-11 00:53:25,330 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.2.0.32/28
2026-10-11 00:53:25,330 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:25,330 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:25,330 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-10-11T00:53:28.783183" elapsed="0.001408"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T00:53:28.785780" 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-10-11T00:53:28.785058" elapsed="0.000838"/>
</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-10-11T00:53:28.766979" elapsed="0.019042"/>
</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-10-11T00:53:28.787303" elapsed="0.000575"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:53:28.786637" elapsed="0.001372"/>
</kw>
<doc>Stop BGP peer &amp; store logs</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:53:26.655196" elapsed="2.132889"/>
</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-10-11T00:53:28.791364" elapsed="0.000515"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:53:28.790792" elapsed="0.001202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:28.794964" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:28.794731" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:28.794681" elapsed="0.000439"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:28.800053" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:28.799846" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:28.799807" elapsed="0.000398"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:28.802317" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:28.801583" elapsed="0.000791"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:28.803365" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:28.802776" elapsed="0.000672"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:28.803562" elapsed="0.000070"/>
</return>
<msg time="2026-10-11T00:53:28.803860" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:28.800728" elapsed="0.003182"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:28.809870" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:28.809681" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:28.809640" elapsed="0.000372"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:28.812456" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:28.812236" elapsed="0.000401"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:28.812197" elapsed="0.000485"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:28.813396" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:28.813017" elapsed="0.000474"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:28.814202" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:28.813895" elapsed="0.000360"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:28.851694" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:53:28.815479" elapsed="0.036350"/>
</kw>
<msg time="2026-10-11T00:53:28.852040" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:28.852098" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:28.814670" elapsed="0.037477"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:28.917725" 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-10-11T00:53:28.852901" elapsed="0.064929"/>
</kw>
<msg time="2026-10-11T00:53:28.918018" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:28.918060" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:28.852384" elapsed="0.065711"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:28.918373" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:28.918164" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:28.918146" elapsed="0.000321"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:28.918894" 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-10-11T00:53:28.918667" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:28.919225" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:28.919024" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:28.919008" elapsed="0.000288"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:28.919326" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:28.921941" elapsed="0.000116"/>
</kw>
<msg time="2026-10-11T00:53:28.922115" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:28.920869" elapsed="0.001385"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:28.922593" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:28.922935" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:53:28.920244" 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-10-11T00:53:28.919649" 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-10-11T00:53:28.811666" elapsed="0.111586"/>
</kw>
<msg time="2026-10-11T00:53:28.923332" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:28.923371" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:28.810349" elapsed="0.113076"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:28.923596" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:53:28.923508" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:28.923478" elapsed="0.000194"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:28.924035" 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-10-11T00:53:28.924338" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:28.924400" 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-10-11T00:53:28.808989" elapsed="0.115528"/>
</kw>
<msg time="2026-10-11T00:53:28.924601" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:28.924641" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:28.804723" elapsed="0.119952"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:28.924962" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:28.924741" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:28.924725" elapsed="0.000306"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:28.804338" elapsed="0.120714"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:28.804017" elapsed="0.121065"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:53:28.799100" elapsed="0.126033"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:53:28.794073" elapsed="0.131145"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:28.792335" elapsed="0.132924"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:53:28.789958" elapsed="0.135349"/>
</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-10-11T00:53:28.925594" elapsed="0.000099"/>
</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-10-11T00:53:28.930697" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:28.943265" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:28.943351" 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-10-11T00:53:28.930571" elapsed="0.012802"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:28.943827" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:28.943601" elapsed="0.000267"/>
</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-10-11T00:53:28.944022" elapsed="0.000275"/>
</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-10-11T00:53:28.930155" elapsed="0.014196"/>
</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-10-11T00:53:28.925875" elapsed="0.018522"/>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:28.948785" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received: 8.1.0.0/28' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:28.993576" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:28.993696" 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-10-11T00:53:28.948665" elapsed="0.045062"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:28.994316" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:28.994005" elapsed="0.000366"/>
</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-10-11T00:53:28.994625" elapsed="0.000370"/>
</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-10-11T00:53:28.948235" elapsed="0.046836"/>
</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-10-11T00:53:28.995845" elapsed="0.000304"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:53:28.995403" elapsed="0.000824"/>
</kw>
<doc>Check incomming updates for withdrawn routes</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:53:28.788772" elapsed="0.207501"/>
</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-10-11T00:53:28.998145" elapsed="0.000294"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:53:28.997798" elapsed="0.000724"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:28.999787" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:28.999665" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:28.999639" 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-10-11T00:53:29.003110" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:29.002994" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:29.002969" elapsed="0.000228"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:29.004509" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:29.004023" elapsed="0.000523"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:29.005126" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:29.004762" elapsed="0.000397"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:29.005215" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:53:29.005389" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:29.003519" elapsed="0.001922"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:29.009144" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:29.009026" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:29.009000" elapsed="0.000231"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:29.010729" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:29.010612" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:29.010587" elapsed="0.000228"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:29.011251" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:29.011017" elapsed="0.000267"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:29.011736" 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-10-11T00:53:29.011546" elapsed="0.000222"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:29.048038" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:53:29.012469" elapsed="0.035663"/>
</kw>
<msg time="2026-10-11T00:53:29.048281" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:29.048322" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:29.011988" elapsed="0.036368"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:29.079419" 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-10-11T00:53:29.048890" elapsed="0.030641"/>
</kw>
<msg time="2026-10-11T00:53:29.079681" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:29.079722" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:29.048553" elapsed="0.031203"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:29.080036" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:29.079823" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:29.079806" elapsed="0.000301"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:29.080547" 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-10-11T00:53:29.080287" elapsed="0.000322"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:29.080867" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:29.080668" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:29.080652" elapsed="0.000285"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:29.080966" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:29.083443" elapsed="0.000260"/>
</kw>
<msg time="2026-10-11T00:53:29.083762" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:29.082320" elapsed="0.001574"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:29.084198" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:29.084585" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:53:29.081742" 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-10-11T00:53:29.081251" elapsed="0.003578"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:53:29.010208" elapsed="0.074693"/>
</kw>
<msg time="2026-10-11T00:53:29.084982" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:29.085020" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:29.009464" elapsed="0.075591"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:29.085242" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:53:29.085156" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:29.085138" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:29.085689" 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-10-11T00:53:29.085993" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:29.086056" 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-10-11T00:53:29.008575" elapsed="0.077567"/>
</kw>
<msg time="2026-10-11T00:53:29.086225" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:29.086265" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:29.005920" elapsed="0.080379"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:29.086622" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:29.086366" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:29.086349" elapsed="0.000346"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:29.005720" elapsed="0.080996"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:29.005524" elapsed="0.081219"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:53:29.002583" elapsed="0.084208"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:53:28.999268" elapsed="0.087573"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:28.998731" elapsed="0.088149"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:53:28.997287" elapsed="0.089640"/>
</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-10-11T00:53:29.087088" elapsed="0.000095"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:29.088354" 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-10-11T00:53:29.088056" elapsed="0.000323"/>
</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-10-11T00:53:29.088561" elapsed="0.000174"/>
</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-10-11T00:53:29.087774" elapsed="0.001014"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-10-11T00:53:31.089647" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<msg time="2026-10-11T00:53:31.089996" level="INFO">${output} = [?2004l^C
[?2004h[jenkins@releng-26932-423-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-10-11T00:53:29.088951" elapsed="2.001105"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.091375" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:31.090717" elapsed="0.000811"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-10-11T00:53:29.087373" elapsed="2.004286"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:31.099818" level="INFO">Executing command 'cat bgp_peer2.log'.</msg>
<msg time="2026-10-11T00:53:31.113700" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:31.113896" level="INFO">${output_log} = 2026-10-11 00:53:25,252 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:53:25,252 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.2
2026-10-11 00:53:25,252 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-10-11T00:53:31.099559" elapsed="0.014391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.114975" level="INFO">2026-10-11 00:53:25,252 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:53:25,252 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.2
2026-10-11 00:53:25,252 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 00:53:25,252 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 00:53:25,252 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 00:53:25,252 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:53:25,254 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:53:25,254 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:53:25,254 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:53:25,254 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 3
2026-10-11 00:53:25,254 INFO BGP-Thread-1 (job):   Prefix base: 8.2.0.0/28
2026-10-11 00:53:25,254 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 00:53:25,254 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 00:53:25,254 INFO BGP-Thread-1 (job):   My BGP Identifier: 2130706434
2026-10-11 00:53:25,254 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 00:53:25,254 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 00:53:25,254 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 00:53:25,254 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 00:53:25,254 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 00:53:25,254 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 00:53:25,254 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 3
2026-10-11 00:53:25,254 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, 2]
2026-10-11 00:53:25,255 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 00:53:25,255 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 00:53:25,255 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 00:53:25,255 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:25,255 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-10-11 00:53:25,255 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 00:53:25,255 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 00:53:25,255 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-10-11 00:53:25,255 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 00:53:25,255 DEBUG BGP-Thread-1 (job):   BGP Identifier=2130706434 (0x7f000002)
2026-10-11 00:53:25,255 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-10-11 00:53:25,255 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf0
2026-10-11 00:53:25,255 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf000b47f000002100206010400010001020641040000fbf0'
2026-10-11 00:53:25,255 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf000b47f000002100206010400010001020641040000fbf0
2026-10-11 00:53:25,256 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:53:25,256 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:25,256 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:53:25,256 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:53:25,256 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:53:25,256 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:53:25,256 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:25,256 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:53:25,256 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:53:25,257 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:53:25,257 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 00:53:25,257 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 3
2026-10-11 00:53:25,257 DEBUG BGP-Thread-1 (job): ########## Iteration: 0 ##########
2026-10-11 00:53:25,257 DEBUG BGP-Thread-1 (job): Remaining prefixes: 3
2026-10-11 00:53:25,257 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:53:25,257 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:53:25,257 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-10-11 00:53:25,257 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:25,257 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:53:25,257 DEBUG BGP-Thread-1 (job):   Prefix indexes: [0]
2026-10-11 00:53:25,258 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.2.0.0')]
2026-10-11 00:53:25,258 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:53:25,258 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-10-11 00:53:25,261 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:25,262 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:53:25,264 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:53:25,264 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:53:25,264 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:53:25,264 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:25,264 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-10-11 00:53:25,264 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:53:25,264 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:53:25,264 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:53:25,264 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-10-11 00:53:25,264 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-10-11 00:53:25,264 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:53:25,264 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:53:25,265 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:53:25,265 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.2.0.0')]/28 (0x1c08020000)
2026-10-11 00:53:25,265 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08020000
2026-10-11 00:53:25,265 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 00:53:25,265 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:25,265 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:25,265 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 00:53:25,265 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:25,265 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:25,265 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:25,265 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:25,265 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:25,265 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:25,265 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:25,265 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:25,265 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:25,265 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:25,265 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:25,265 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:25,266 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-10-11 00:53:25,266 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-10-11 00:53:25,266 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:25,266 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:25,266 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:53:25,267 DEBUG BGP-Thread-1 (job): ########## Iteration: 1 ##########
2026-10-11 00:53:25,267 DEBUG BGP-Thread-1 (job): Remaining prefixes: 2
2026-10-11 00:53:25,267 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:53:25,267 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:53:25,267 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-10-11 00:53:25,267 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:25,267 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:53:25,267 DEBUG BGP-Thread-1 (job):   Prefix indexes: [1]
2026-10-11 00:53:25,267 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.2.0.16')]
2026-10-11 00:53:25,267 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:53:25,267 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-10-11 00:53:25,267 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:25,269 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:53:25,269 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:53:25,269 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:53:25,269 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:53:25,269 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:25,269 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-10-11 00:53:25,269 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:53:25,269 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:53:25,269 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:53:25,269 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-10-11 00:53:25,269 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-10-11 00:53:25,269 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:53:25,269 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:53:25,269 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:53:25,269 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.2.0.16')]/28 (0x1c08020010)
2026-10-11 00:53:25,269 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08020010
2026-10-11 00:53:25,269 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08010000
2026-10-11 00:53:25,269 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:25,269 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:25,269 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-10-11 00:53:25,270 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:25,270 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:25,270 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:25,270 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:25,270 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:25,270 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:25,270 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:25,270 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:25,270 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:25,270 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:25,270 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:25,270 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:25,270 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0033' (51)
2026-10-11 00:53:25,270 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08010000'
2026-10-11 00:53:25,270 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:53:25,270 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:53:25,270 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:53:25,270 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-10-11 00:53:25,270 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:53:25,270 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:53:25,270 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:53:25,271 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:25,271 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:53:25,271 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:25,271 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-10-11 00:53:25,271 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08010000'
2026-10-11 00:53:25,271 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:53:25,271 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:53:25,271 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-10-11 00:53:25,271 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-10-11 00:53:25,271 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-10-11 00:53:25,271 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08010000'
2026-10-11 00:53:25,271 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.1.0.0/28']
2026-10-11 00:53:25,271 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.1.0.0/28
2026-10-11 00:53:25,271 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:25,271 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:25,271 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:53:25,271 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08010010
2026-10-11 00:53:25,271 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:25,271 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:25,271 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-10-11 00:53:25,271 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:25,271 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:25,272 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:25,272 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:25,272 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:25,272 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:25,272 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:25,272 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:25,272 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:25,272 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:25,272 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:25,272 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:25,272 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0033' (51)
2026-10-11 00:53:25,272 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08010010'
2026-10-11 00:53:25,272 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:53:25,272 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:53:25,272 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:53:25,272 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-10-11 00:53:25,272 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:53:25,272 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:53:25,274 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:53:25,274 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:25,274 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:53:25,274 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:25,274 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-10-11 00:53:25,274 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08010010'
2026-10-11 00:53:25,274 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:53:25,275 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:53:25,275 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-10-11 00:53:25,275 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-10-11 00:53:25,275 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-10-11 00:53:25,275 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08010010'
2026-10-11 00:53:25,275 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.1.0.16/28']
2026-10-11 00:53:25,275 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.1.0.16/28
2026-10-11 00:53:25,275 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:25,275 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:25,275 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:53:25,275 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08010020
2026-10-11 00:53:25,275 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:25,275 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:25,275 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-10-11 00:53:25,276 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:25,276 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:25,276 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:25,276 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:25,276 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:25,276 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:25,276 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:25,276 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:25,276 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:25,276 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:25,276 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:25,276 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:25,276 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0033' (51)
2026-10-11 00:53:25,276 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800e0e00010104c0000201001c08010020'
2026-10-11 00:53:25,276 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:53:25,276 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:53:25,276 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:53:25,277 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-10-11 00:53:25,277 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:53:25,277 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:53:25,277 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:53:25,277 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:25,277 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:53:25,277 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:25,277 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-10-11 00:53:25,277 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08010020'
2026-10-11 00:53:25,277 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:53:25,277 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:53:25,277 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-10-11 00:53:25,277 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-10-11 00:53:25,277 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-10-11 00:53:25,277 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08010020'
2026-10-11 00:53:25,278 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.1.0.32/28']
2026-10-11 00:53:25,278 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.1.0.32/28
2026-10-11 00:53:25,278 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:25,278 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:25,278 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:53:25,278 DEBUG BGP-Thread-1 (job): ########## Iteration: 2 ##########
2026-10-11 00:53:25,278 DEBUG BGP-Thread-1 (job): Remaining prefixes: 1
2026-10-11 00:53:25,278 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:53:25,278 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:53:25,278 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-10-11 00:53:25,278 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:25,278 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:53:25,278 DEBUG BGP-Thread-1 (job):   Prefix indexes: [2]
2026-10-11 00:53:25,279 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.2.0.32')]
2026-10-11 00:53:25,279 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:53:25,279 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-10-11 00:53:25,279 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:25,279 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:53:25,279 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:53:25,279 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:53:25,279 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:53:25,279 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:25,279 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-10-11 00:53:25,279 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:53:25,279 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:53:25,279 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:53:25,279 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-10-11 00:53:25,279 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-10-11 00:53:25,280 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:53:25,280 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:53:25,280 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:53:25,280 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.2.0.32')]/28 (0x1c08020020)
2026-10-11 00:53:25,280 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08020020
2026-10-11 00:53:25,282 INFO BGP-Thread-1 (job): All update messages generated.
2026-10-11 00:53:25,282 INFO BGP-Thread-1 (job): Storing performance results.
2026-10-11 00:53:25,282 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-10-11 00:53:25,282 INFO BGP-Thread-1 (job): Number of iterations: 3
2026-10-11 00:53:25,283 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-10-11 00:53:25,283 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-10-11 00:53:25,283 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 3
2026-10-11 00:53:25,283 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.025104045867919922s
2026-10-11 00:53:25,284 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-10-11 00:53:25,284 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-10-11 00:53:25,284 INFO BGP-Thread-1 (job):   
2026-10-11 00:53:25,285 INFO BGP-Thread-1 (job):   
2026-10-11 00:53:25,285 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-10-11 00:53:25,285 INFO BGP-Thread-1 (job):   
2026-10-11 00:53:25,285 INFO BGP-Thread-1 (job):   
2026-10-11 00:53:25,285 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-10-11 00:53:25,285 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:53:25,285 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:25,285 DEBUG BGP-Thread-1 (job):   Length=43 (0x002b)
2026-10-11 00:53:25,286 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:53:25,286 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:53:25,286 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:53:25,286 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=20 (0x0014)
2026-10-11 00:53:25,286 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064)
2026-10-11 00:53:25,286 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:53:25,286 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:53:25,286 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:53:25,286 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-10-11 00:53:25,286 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff002b02000000144001010040020602010000fbf040050400000064
2026-10-11 00:53:26,794 INFO BGP-Thread-1 (job): ... idle for 1.507s
2026-10-11 00:53:26,794 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.507s
2026-10-11 00:53:26,794 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800f080001011c08010000
2026-10-11 00:53:26,794 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:26,794 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:26,794 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-10-11 00:53:26,794 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:26,794 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:26,794 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:26,795 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:26,795 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:26,795 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:26,795 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:26,795 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:26,795 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:26,795 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:26,795 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:26,795 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:26,795 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002d' (45)
2026-10-11 00:53:26,795 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800f080001011c08010000'
2026-10-11 00:53:26,795 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:53:26,795 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:53:26,795 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:53:26,795 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-10-11 00:53:26,795 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:53:26,796 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:53:26,796 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:53:26,796 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:26,796 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:53:26,796 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:26,796 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-10-11 00:53:26,796 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08010000'
2026-10-11 00:53:26,796 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:53:26,796 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:53:26,796 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08010000'
2026-10-11 00:53:26,796 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.1.0.0/28']
2026-10-11 00:53:26,796 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.1.0.0/28
2026-10-11 00:53:26,796 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:26,796 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:26,796 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:53:26,797 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800f080001011c08010010
2026-10-11 00:53:26,797 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:26,797 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:26,797 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-10-11 00:53:26,797 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:26,797 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:26,797 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:26,797 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:26,797 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:26,797 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:26,797 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:26,797 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:26,797 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:26,797 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:26,797 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:26,798 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:26,798 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002d' (45)
2026-10-11 00:53:26,798 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800f080001011c08010010'
2026-10-11 00:53:26,798 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:53:26,798 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:53:26,798 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:53:26,798 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-10-11 00:53:26,798 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:53:26,798 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:53:26,798 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:53:26,798 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:26,798 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:53:26,798 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:26,798 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-10-11 00:53:26,798 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08010010'
2026-10-11 00:53:26,798 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:53:26,799 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:53:26,799 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08010010'
2026-10-11 00:53:26,799 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.1.0.16/28']
2026-10-11 00:53:26,799 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.1.0.16/28
2026-10-11 00:53:26,799 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:26,799 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:26,799 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:53:26,799 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800f080001011c08010020
2026-10-11 00:53:26,799 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:26,799 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:26,799 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-10-11 00:53:26,799 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:26,799 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:26,799 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:26,799 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:26,799 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:26,800 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:26,800 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:26,800 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:26,800 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:26,800 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:26,800 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:26,800 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:26,800 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'002d' (45)
2026-10-11 00:53:26,800 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a04c0000202800f080001011c08010020'
2026-10-11 00:53:26,800 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:53:26,800 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:53:26,800 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:53:26,800 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-10-11 00:53:26,800 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:53:26,800 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:53:26,800 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:53:26,800 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:26,801 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:53:26,801 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:53:26,801 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-10-11 00:53:26,801 DEBUG BGP-Thread-1 (job): Attribute value=0xb'0001011c08010020'
2026-10-11 00:53:26,801 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:53:26,801 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:53:26,801 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb'1c08010020'
2026-10-11 00:53:26,801 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: ['8.1.0.32/28']
2026-10-11 00:53:26,801 DEBUG BGP-Thread-1 (job):   withdrawn_prefix_received: 8.1.0.32/28
2026-10-11 00:53:26,801 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:26,801 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:26,801 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:53:26,801 INFO BGP-Thread-1 (job): total_received_update_message_counter: 7
2026-10-11 00:53:26,801 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 3
2026-10-11 00:53:26,801 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-10-11T00:53:31.114394" elapsed="0.001560"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T00:53:31.117140" 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-10-11T00:53:31.116399" elapsed="0.000856"/>
</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-10-11T00:53:31.098629" elapsed="0.018746"/>
</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-10-11T00:53:31.118695" elapsed="0.000520"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:53:31.117985" elapsed="0.001359"/>
</kw>
<doc>Stop BGP peer &amp; store logs</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:53:28.996658" elapsed="2.122791"/>
</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-10-11T00:53:31.122451" elapsed="0.000470"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:53:31.121871" elapsed="0.001161"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:31.125161" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:31.124938" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.124892" elapsed="0.000419"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:31.133461" elapsed="0.000052"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:31.133239" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.133199" elapsed="0.000425"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.135740" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:31.134943" elapsed="0.000854"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.136779" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:31.136137" elapsed="0.000696"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:31.136922" elapsed="0.000067"/>
</return>
<msg time="2026-10-11T00:53:31.137211" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:31.134094" elapsed="0.003167"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:31.143216" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:31.143026" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.142986" elapsed="0.000371"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:31.145833" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:31.145641" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.145602" elapsed="0.000369"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:31.146782" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.146301" elapsed="0.000537"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:31.147578" 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-10-11T00:53:31.147205" elapsed="0.000427"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:31.184787" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:53:31.148805" elapsed="0.036113"/>
</kw>
<msg time="2026-10-11T00:53:31.185129" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:31.185186" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:31.147986" elapsed="0.037249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:31.221222" 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-10-11T00:53:31.185986" elapsed="0.035337"/>
</kw>
<msg time="2026-10-11T00:53:31.221501" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:31.221581" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:31.185513" elapsed="0.036104"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.221894" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.221687" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.221669" elapsed="0.000297"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.222368" 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-10-11T00:53:31.222144" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.222723" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.222524" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.222506" elapsed="0.000288"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:31.222824" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:31.225284" elapsed="0.000265"/>
</kw>
<msg time="2026-10-11T00:53:31.225610" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:31.224203" 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-10-11T00:53:31.226059" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.226394" 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-10-11T00:53:31.223615" 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-10-11T00:53:31.223108" 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-10-11T00:53:31.144986" elapsed="0.081763"/>
</kw>
<msg time="2026-10-11T00:53:31.226829" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:31.226868" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:31.143749" elapsed="0.083154"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:31.227059" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:53:31.226970" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.226953" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.227512" 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-10-11T00:53:31.227813" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:31.227878" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:53:31.142331" elapsed="0.085631"/>
</kw>
<msg time="2026-10-11T00:53:31.228045" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:31.228085" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:31.138053" elapsed="0.090068"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.228427" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.228188" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.228172" elapsed="0.000361"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:31.137729" elapsed="0.090826"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:31.137365" elapsed="0.091218"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:53:31.132570" elapsed="0.096063"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:53:31.124312" elapsed="0.104405"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:31.123366" elapsed="0.105392"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:53:31.121059" elapsed="0.107746"/>
</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-10-11T00:53:31.240096" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:53:31.240240" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:53:31.240341" 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-10-11T00:53:31.229902" elapsed="0.010463"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.240892" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:31.240605" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.241458" 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-10-11T00:53:31.241126" elapsed="0.000385"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if the `container` contains the `item`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.241675" elapsed="0.000404"/>
</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-10-11T00:53:31.229581" elapsed="0.012555"/>
</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-10-11T00:53:31.228987" elapsed="0.013193"/>
</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-10-11T00:53:31.242749" elapsed="0.000222"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:53:31.242440" elapsed="0.000588"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:31.120073" elapsed="0.122988"/>
</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-10-11T00:53:31.244432" elapsed="0.000218"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:53:31.244169" 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-10-11T00:53:31.245619" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:31.245528" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.245509" elapsed="0.000178"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:31.248003" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:31.247919" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.247903" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.248991" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:31.248667" elapsed="0.000350"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.249450" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:31.249172" elapsed="0.000303"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:31.249534" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:53:31.249663" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:31.248281" elapsed="0.001406"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:31.252321" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:31.252236" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.252218" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:31.253471" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:31.253336" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.253319" elapsed="0.000236"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:31.253879" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.253706" elapsed="0.000198"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:31.254203" 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-10-11T00:53:31.254068" elapsed="0.000159"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:31.293188" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:53:31.254747" elapsed="0.038556"/>
</kw>
<msg time="2026-10-11T00:53:31.293504" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:31.293548" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:31.254385" elapsed="0.039200"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:31.352528" 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-10-11T00:53:31.294146" elapsed="0.058657"/>
</kw>
<msg time="2026-10-11T00:53:31.353062" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:31.353106" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:31.293775" elapsed="0.059368"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.353698" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.353284" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.353233" elapsed="0.000554"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.354359" 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-10-11T00:53:31.353982" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.354748" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.354539" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.354520" elapsed="0.000302"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:31.354860" 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-10-11T00:53:31.357692" elapsed="0.000368"/>
</kw>
<msg time="2026-10-11T00:53:31.358120" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:31.356526" 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-10-11T00:53:31.358616" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.358960" 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-10-11T00:53:31.355843" elapsed="0.003307"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:53:31.355250" elapsed="0.003961"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:53:31.253081" elapsed="0.106205"/>
</kw>
<msg time="2026-10-11T00:53:31.359373" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:31.359442" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:31.252560" elapsed="0.106935"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:31.359656" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:53:31.359568" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.359550" elapsed="0.000185"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.360083" 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-10-11T00:53:31.360497" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:31.360563" 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-10-11T00:53:31.251950" elapsed="0.108701"/>
</kw>
<msg time="2026-10-11T00:53:31.360739" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:31.360780" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:31.250022" elapsed="0.110794"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.361110" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.360885" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.360869" elapsed="0.000311"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:31.249876" elapsed="0.111327"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:31.249733" elapsed="0.111504"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:53:31.247626" elapsed="0.113667"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:53:31.245234" elapsed="0.116114"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:31.244847" elapsed="0.116546"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:53:31.243827" elapsed="0.117721"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.362221" 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-10-11T00:53:31.361746" elapsed="0.000502"/>
</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-10-11T00:53:31.376556" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:31.376223" elapsed="0.000360"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:53:31.377288" 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-10-11T00:53:31.377068" elapsed="0.000301">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-10-11T00:53:31.377473" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:53:31.376746" elapsed="0.000781"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.378019" 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-10-11T00:53:31.377705" elapsed="0.000339"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:53:31.378329" 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-10-11T00:53:31.378512" 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-10-11T00:53:31.378216" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.378958" 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-10-11T00:53:31.378739" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.379927" 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-10-11T00:53:31.379693" elapsed="0.000276"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.380392" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.380145" elapsed="0.000319"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.381100" 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-10-11T00:53:31.380828" elapsed="0.000296"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:31.382052" 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-10-11T00:53:31.381852" elapsed="0.000224"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:31.382122" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:53:31.382249" 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-10-11T00:53:31.381308" 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-10-11T00:53:31.382465" elapsed="0.000212"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:53:31.380690" elapsed="0.002026"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.383219" 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-10-11T00:53:31.382948" elapsed="0.000295"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:31.383938" 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-10-11T00:53:31.383760" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:31.384006" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:31.384129" 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-10-11T00:53:31.383429" elapsed="0.000723"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.384317" elapsed="0.000194"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-bgp-peer1</var>
<status status="PASS" start="2026-10-11T00:53:31.382816" elapsed="0.001733"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.385046" 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-10-11T00:53:31.384779" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:31.385754" 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-10-11T00:53:31.385576" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:31.385822" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:53:31.385946" 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-10-11T00:53:31.385238" elapsed="0.000730"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.386132" elapsed="0.000164"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:53:31.384649" elapsed="0.001685"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.386858" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:53:31.386591" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:31.387567" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.387362" elapsed="0.000230"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:31.387635" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:53:31.387756" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:53:31.387050" elapsed="0.000728"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.387944" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:53:31.386447" elapsed="0.001698"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:53:31.380532" elapsed="0.007644"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:53:31.388214" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:53:31.388345" 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-10-11T00:53:31.379317" elapsed="0.009052"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:31.379062" elapsed="0.009335"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.388618" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.388437" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.379044" elapsed="0.009646"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.389463" 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-10-11T00:53:31.388853" elapsed="0.000698"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:53:31.389599" 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-10-11T00:53:31.375718" elapsed="0.013983"/>
</kw>
<msg time="2026-10-11T00:53:31.389751" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:31.371091" elapsed="0.018703"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:53:31.394320" 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/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-10-11T00:53:31.398761" 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/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-10-11T00:53:31.403140" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.403323" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.403534" 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-10-11T00:53:31.403877" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.403729" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:53:31.403716" 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-10-11T00:53:31.404104" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.404282" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.404460" elapsed="0.000032"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:53:31.403690" elapsed="0.000839"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:53:31.403603" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.404708" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:53:31.404774" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:53:31.404884" 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-10-11T00:53:31.370461" elapsed="0.034448"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.405971" 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-10-11T00:53:31.405746" elapsed="0.000268"/>
</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-10-11T00:53:31.419087" level="INFO">DELETE Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:53:31.419133" level="INFO">DELETE Response : url=http://10.30.170.173: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-10-11T00:53:31.419233" 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-10-11T00:53:31.406301" elapsed="0.012957"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:31.406073" elapsed="0.013221"/>
</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-10-11T00:53:31.419506" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.419318" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.406057" elapsed="0.013527"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.420794" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:31.420519" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:31.420246" elapsed="0.000618"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.420229" elapsed="0.000657"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.421454" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:31.421175" elapsed="0.000359"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:31.420935" elapsed="0.000632"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.420920" elapsed="0.000669"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.422120" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:31.421768" elapsed="0.000377"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.422437" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.422208" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.422957" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:31.422695" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:31.422527" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.422191" elapsed="0.000842"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.423581" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:31.423210" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.423879" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.423667" elapsed="0.000263"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.424375" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:31.424115" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:31.423952" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.423651" elapsed="0.000817"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:31.424626" elapsed="0.000290"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:53:31.425303" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:31.425077" elapsed="0.000251"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.425508" elapsed="0.000220"/>
</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-10-11T00:53:31.419915" elapsed="0.005869"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:53:31.425856" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:53:31.426033" 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-10-11T00:53:31.405187" elapsed="0.020870"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:53:31.426103" elapsed="0.000024"/>
</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-10-11T00:53:31.362513" elapsed="0.063685"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.426844" 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-10-11T00:53:31.426379" 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-10-11T00:53:31.441079" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:31.440778" elapsed="0.000327"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:53:31.441782" 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-10-11T00:53:31.441609" elapsed="0.000232">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-10-11T00:53:31.441924" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:53:31.441263" elapsed="0.000683"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.442445" 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-10-11T00:53:31.442122" elapsed="0.000349"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:53:31.442758" 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-10-11T00:53:31.442873" 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-10-11T00:53:31.442650" elapsed="0.000248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.443314" 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-10-11T00:53:31.443095" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.444288" 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-10-11T00:53:31.444055" elapsed="0.000275"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.444781" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.444530" elapsed="0.000275"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.445383" 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-10-11T00:53:31.445116" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:31.446098" 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-10-11T00:53:31.445919" elapsed="0.000203"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:31.446167" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:53:31.446293" 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-10-11T00:53:31.445608" elapsed="0.000707"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.446505" elapsed="0.000169"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:53:31.444985" elapsed="0.001726"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.447209" 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-10-11T00:53:31.446940" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:31.447924" 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-10-11T00:53:31.447746" elapsed="0.000235"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:31.448027" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:53:31.448152" 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-10-11T00:53:31.447401" 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-10-11T00:53:31.448337" elapsed="0.000192"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-bgp-peer2</var>
<status status="PASS" start="2026-10-11T00:53:31.446810" elapsed="0.001757"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.449215" 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-10-11T00:53:31.448796" elapsed="0.000443"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:31.449923" 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-10-11T00:53:31.449744" elapsed="0.000203"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:31.449989" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:53:31.450112" 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-10-11T00:53:31.449422" elapsed="0.000713"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.450298" elapsed="0.000193"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-10-11T00:53:31.448665" elapsed="0.001864"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.451025" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:53:31.450758" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:31.451729" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.451552" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:31.451796" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:53:31.451918" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:53:31.451218" elapsed="0.000722"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.452104" elapsed="0.000163"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:53:31.450628" elapsed="0.001676"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:53:31.444846" elapsed="0.007489"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:53:31.452372" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:53:31.452529" 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-10-11T00:53:31.443713" elapsed="0.008840"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:31.443432" elapsed="0.009150"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.452754" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.452604" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.443399" elapsed="0.009424"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.453532" 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-10-11T00:53:31.452982" elapsed="0.000577"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:53:31.453602" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:53:31.440252" elapsed="0.013448"/>
</kw>
<msg time="2026-10-11T00:53:31.453748" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:31.435677" elapsed="0.018113"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:53:31.458199" 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/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-10-11T00:53:31.462628" 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/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-10-11T00:53:31.466958" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.467140" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.467321" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.467691" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.467545" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:53:31.467531" 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-10-11T00:53:31.467920" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.468099" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.468263" elapsed="0.000017"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:53:31.467500" elapsed="0.000809"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:53:31.467385" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.468522" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:53:31.468591" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:53:31.468702" 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-10-11T00:53:31.435026" elapsed="0.033701"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.469737" 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-10-11T00:53:31.469512" elapsed="0.000269"/>
</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-10-11T00:53:31.477792" level="INFO">DELETE Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:53:31.477836" level="INFO">DELETE Response : url=http://10.30.170.173: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-10-11T00:53:31.477921" 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-10-11T00:53:31.470071" elapsed="0.007874"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:31.469842" elapsed="0.008140"/>
</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-10-11T00:53:31.478160" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.478006" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.469825" elapsed="0.008449"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.479711" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:31.479215" elapsed="0.000536"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:31.478969" elapsed="0.000815"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.478953" elapsed="0.000854"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.480368" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:31.480100" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:31.479857" elapsed="0.000601"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.479842" elapsed="0.000655"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.481022" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:31.480678" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.481329" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.481116" elapsed="0.000265"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.481872" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:31.481606" elapsed="0.000292"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:31.481403" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.481100" elapsed="0.000849"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.482516" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:31.482126" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.482820" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.482606" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.483318" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:31.483054" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:31.482894" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.482589" elapsed="0.000804"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:31.483567" elapsed="0.000292"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:53:31.484253" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:31.484028" elapsed="0.000250"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.484445" elapsed="0.000225"/>
</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-10-11T00:53:31.478635" elapsed="0.006091"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:53:31.484766" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:31.484937" 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-10-11T00:53:31.468960" elapsed="0.016001"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:53:31.485006" elapsed="0.000025"/>
</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-10-11T00:53:31.427082" elapsed="0.058019"/>
</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-10-11T00:53:31.485678" elapsed="0.000225"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:53:31.485355" elapsed="0.000605"/>
</kw>
<doc>Delete all previously configured BGP peers.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:53:31.243312" elapsed="0.242684"/>
</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-10-11T00:53:31.487492" elapsed="0.000201"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:53:31.487214" 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-10-11T00:53:31.488694" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:31.488603" elapsed="0.000134"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.488551" 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-10-11T00:53:31.490999" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:31.490917" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.490900" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.491985" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:31.491662" elapsed="0.000348"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.492439" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:31.492163" elapsed="0.000301"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:31.492517" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:53:31.492644" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:31.491268" elapsed="0.001399"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:31.495268" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:31.495185" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.495167" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:31.496379" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:31.496294" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.496277" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:31.496823" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.496654" elapsed="0.000193"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:31.497156" 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-10-11T00:53:31.497016" elapsed="0.000164"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:31.534556" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:53:31.497700" elapsed="0.036953"/>
</kw>
<msg time="2026-10-11T00:53:31.534853" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:31.534894" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:31.497337" elapsed="0.037591"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:31.573723" 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-10-11T00:53:31.535469" elapsed="0.038360"/>
</kw>
<msg time="2026-10-11T00:53:31.573987" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:31.574031" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:31.535102" elapsed="0.038963"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.574352" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.574136" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.574118" elapsed="0.000334"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.574883" 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-10-11T00:53:31.574648" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.575212" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.575010" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.574993" elapsed="0.000291"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:31.575315" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:31.577808" elapsed="0.000240"/>
</kw>
<msg time="2026-10-11T00:53:31.578106" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:31.576753" elapsed="0.001487"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.578582" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.578920" 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-10-11T00:53:31.576125" elapsed="0.002982"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:53:31.575648" elapsed="0.003519"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:53:31.496037" elapsed="0.083205"/>
</kw>
<msg time="2026-10-11T00:53:31.579324" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:31.579364" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:31.495518" elapsed="0.083882"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:31.579593" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:53:31.579506" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.579487" elapsed="0.000183"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.579990" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.580290" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:31.580355" 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-10-11T00:53:31.494900" elapsed="0.085566"/>
</kw>
<msg time="2026-10-11T00:53:31.580561" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:31.580603" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:31.492992" elapsed="0.087645"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.580926" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.580705" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.580688" elapsed="0.000309"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:31.492849" elapsed="0.088170"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:31.492712" elapsed="0.088335"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:53:31.490624" elapsed="0.090471"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:53:31.488285" elapsed="0.092859"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:31.487892" elapsed="0.093292"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:53:31.486871" elapsed="0.094360"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.582156" 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-10-11T00:53:31.581520" elapsed="0.000664"/>
</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-10-11T00:53:31.592856" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:31.592552" elapsed="0.000362"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:53:31.593610" 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-10-11T00:53:31.593401" elapsed="0.000271">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-10-11T00:53:31.593757" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:53:31.593078" elapsed="0.000702"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.594265" 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-10-11T00:53:31.593955" elapsed="0.000336"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:53:31.594599" 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-10-11T00:53:31.594718" 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-10-11T00:53:31.594475" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.595164" 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-10-11T00:53:31.594941" elapsed="0.000266"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.596303" 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-10-11T00:53:31.595889" elapsed="0.000460"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.596814" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.596557" elapsed="0.000281"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.597458" 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-10-11T00:53:31.597170" elapsed="0.000331"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:31.598169" 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-10-11T00:53:31.597988" elapsed="0.000206"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:31.598238" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:53:31.598365" 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-10-11T00:53:31.597676" elapsed="0.000713"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.598603" elapsed="0.000172"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:53:31.597035" elapsed="0.001776"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.599312" 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-10-11T00:53:31.599041" elapsed="0.000296"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:31.600027" 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-10-11T00:53:31.599849" elapsed="0.000203"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:31.600096" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:31.600219" 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-10-11T00:53:31.599537" elapsed="0.000705"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.600422" elapsed="0.000182"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-bgp-peer1</var>
<status status="PASS" start="2026-10-11T00:53:31.598910" elapsed="0.001731"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.601137" 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-10-11T00:53:31.600870" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:31.601844" 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-10-11T00:53:31.601668" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:31.601953" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:53:31.602082" 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-10-11T00:53:31.601329" 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-10-11T00:53:31.602271" elapsed="0.000183"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:53:31.600740" elapsed="0.001766"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.603007" 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-10-11T00:53:31.602738" elapsed="0.000294"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:31.603724" 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-10-11T00:53:31.603547" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:31.603792" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:31.603916" 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-10-11T00:53:31.603200" elapsed="0.000739"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.604103" elapsed="0.000165"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:53:31.602606" elapsed="0.001698"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.604832" 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-10-11T00:53:31.604565" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:31.605543" 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-10-11T00:53:31.605334" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:31.605612" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:53:31.605735" 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-10-11T00:53:31.605025" elapsed="0.000733"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.605921" elapsed="0.000165"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:53:31.604404" elapsed="0.001718"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.608019" 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-10-11T00:53:31.606351" elapsed="0.001693"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:31.608741" 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-10-11T00:53:31.608562" elapsed="0.000203"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:31.608809" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:53:31.608934" 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-10-11T00:53:31.608218" elapsed="0.000738"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.609119" elapsed="0.000165"/>
</kw>
<var name="${key}">PEER_ROLE</var>
<var name="${value}">ibgp</var>
<status status="PASS" start="2026-10-11T00:53:31.606221" elapsed="0.003100"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.609868" 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-10-11T00:53:31.609598" elapsed="0.000295"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:31.610572" 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-10-11T00:53:31.610367" elapsed="0.000229"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:31.610639" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:53:31.610761" 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-10-11T00:53:31.610062" elapsed="0.000722"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.610946" elapsed="0.000165"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:53:31.609436" elapsed="0.001711"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.611675" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:53:31.611374" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:31.612346" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.612173" elapsed="0.000197"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:31.612428" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:53:31.612567" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:53:31.611867" elapsed="0.000764"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.612798" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:53:31.611244" elapsed="0.001754"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.613526" 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-10-11T00:53:31.613224" elapsed="0.000327"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:31.614199" 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-10-11T00:53:31.614025" elapsed="0.000198"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:31.614266" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:31.614388" 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-10-11T00:53:31.613719" elapsed="0.000706"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.614603" elapsed="0.000166"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:53:31.613095" elapsed="0.001710"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.615299" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:53:31.615033" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:31.616003" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.615828" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:31.616070" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:53:31.616191" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:53:31.615521" elapsed="0.000692"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.616374" elapsed="0.000192"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:53:31.614903" elapsed="0.001700"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.617098" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:53:31.616831" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:31.618001" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.617819" elapsed="0.000206"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:31.618069" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:31.618193" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:53:31.617292" elapsed="0.000924"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.618381" elapsed="0.000197"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:53:31.616701" elapsed="0.001914"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.619108" 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-10-11T00:53:31.618843" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:31.619811" 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-10-11T00:53:31.619636" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:31.619878" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:31.619999" 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-10-11T00:53:31.619301" elapsed="0.000721"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.620184" elapsed="0.000163"/>
</kw>
<var name="${key}">RR_CLIENT</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:53:31.618714" elapsed="0.001668"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:53:31.596882" elapsed="0.023546"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:53:31.620466" elapsed="0.000056"/>
</return>
<msg time="2026-10-11T00:53:31.620630" 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-10-11T00:53:31.595544" elapsed="0.025111"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:31.595268" elapsed="0.025414"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.620852" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.620704" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.595250" elapsed="0.025710"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.621819" 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-10-11T00:53:31.621120" elapsed="0.000726"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:53:31.621891" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:53:31.592019" elapsed="0.029970"/>
</kw>
<msg time="2026-10-11T00:53:31.622036" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:31.587531" elapsed="0.034550"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:53:31.626385" 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//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-10-11T00:53:31.630725" 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/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-10-11T00:53:31.635053" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.635236" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.635431" 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-10-11T00:53:31.635781" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.635635" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:53:31.635622" 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-10-11T00:53:31.636010" 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-10-11T00:53:31.636196" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.636361" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:53:31.635597" elapsed="0.000830"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:53:31.635509" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.636620" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:53:31.636686" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:53:31.636796" 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-10-11T00:53:31.586917" elapsed="0.049904"/>
</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-10-11T00:53:31.646372" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:31.646067" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:53:31.647077" 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-10-11T00:53:31.646907" elapsed="0.000229">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-10-11T00:53:31.647219" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:53:31.646585" elapsed="0.000656"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.647751" 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-10-11T00:53:31.647430" elapsed="0.000346"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:53:31.648050" 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-10-11T00:53:31.648166" 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-10-11T00:53:31.647942" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.648635" 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-10-11T00:53:31.648386" 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-10-11T00:53:31.649001" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.648751" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.649521" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:31.649224" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:31.649077" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.648734" elapsed="0.000867"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.650518" 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-10-11T00:53:31.649764" elapsed="0.000783"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:53:31.650592" 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-10-11T00:53:31.645558" elapsed="0.005136"/>
</kw>
<msg time="2026-10-11T00:53:31.650747" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:31.640816" elapsed="0.010003"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:53:31.655192" 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/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-10-11T00:53:31.659554" 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/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-10-11T00:53:31.663867" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.664050" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.664231" 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-10-11T00:53:31.664620" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.664438" elapsed="0.000234"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:53:31.664423" 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-10-11T00:53:31.664857" 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-10-11T00:53:31.665043" elapsed="0.000017"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.665209" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:53:31.664384" elapsed="0.000871"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:53:31.664296" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.665448" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:53:31.665530" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:53:31.665651" 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-10-11T00:53:31.640089" elapsed="0.025589"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:53:31.666786" 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-10-11T00:53:31.666601" elapsed="0.000244">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-10-11T00:53:31.666927" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:53:31.666248" elapsed="0.000701"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.667265" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.667012" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.667798" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:31.667532" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:31.667340" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.666995" elapsed="0.000879"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.668370" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:31.668035" elapsed="0.000359"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:53:31.668455" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:53:31.668592" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:53:31.665951" elapsed="0.002664"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.670029" 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-10-11T00:53:31.669637" elapsed="0.000436"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.670509" 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-10-11T00:53:31.670267" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.670981" 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-10-11T00:53:31.670759" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.671449" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:31.671216" elapsed="0.000287"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:31.672207" 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-10-11T00:53:31.672048" elapsed="0.000184"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:53:31.672561" 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-10-11T00:53:31.672387" 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-10-11T00:53:31.672749" elapsed="0.000155"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.673319" 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-10-11T00:53:31.673096" elapsed="0.000263"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:53:31.673398" elapsed="0.000044"/>
</return>
<msg time="2026-10-11T00:53:31.673561" 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-10-11T00:53:31.671689" elapsed="0.001896"/>
</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-10-11T00:53:31.690614" level="INFO">PUT Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.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-10-11T00:53:31.690752" level="INFO">PUT Response : url=http://10.30.170.173: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-10-11T00:53:31.690879" 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-10-11T00:53:31.673879" elapsed="0.017033"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:31.673648" elapsed="0.017321"/>
</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-10-11T00:53:31.691244" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.691007" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.673631" elapsed="0.017733"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.692548" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:31.692248" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:31.692010" elapsed="0.000609"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.691993" elapsed="0.000649"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.693197" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:31.692929" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:31.692692" elapsed="0.000577"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.692677" elapsed="0.000614"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.693840" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:31.693494" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.694138" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.693928" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.694669" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:31.694371" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:31.694212" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.693912" elapsed="0.000833"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.695250" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:31.694919" elapsed="0.000356"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.695569" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.695337" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.696060" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:31.695802" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:31.695643" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.695320" elapsed="0.000820"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:31.696282" elapsed="0.000318"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:53:31.696982" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:31.696760" elapsed="0.000246"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.697159" elapsed="0.000210"/>
</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-10-11T00:53:31.691720" elapsed="0.005721"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:53:31.697651" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:53:31.697538" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.697519" 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-10-11T00:53:31.697877" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:53:31.697937" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:53:31.698094" 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-10-11T00:53:31.668911" elapsed="0.029207"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:53:31.698209" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:31.698335" 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-10-11T00:53:31.583054" elapsed="0.115304"/>
</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-10-11T00:53:31.698678" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.698461" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.698444" elapsed="0.000319"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:53:31.698793" elapsed="0.000023"/>
</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-10-11T00:53:31.582458" elapsed="0.116431"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.699742" 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-10-11T00:53:31.699069" 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-10-11T00:53:31.710781" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:31.710435" elapsed="0.000373"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:53:31.711493" 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-10-11T00:53:31.711285" elapsed="0.000269">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-10-11T00:53:31.711640" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:53:31.710969" elapsed="0.000693"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.712146" 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-10-11T00:53:31.711835" elapsed="0.000336"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:53:31.712462" 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-10-11T00:53:31.712647" 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-10-11T00:53:31.712337" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.713084" 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-10-11T00:53:31.712867" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.714040" 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-10-11T00:53:31.713808" elapsed="0.000275"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.714529" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.714256" elapsed="0.000298"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.715140" 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-10-11T00:53:31.714879" elapsed="0.000285"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:31.715858" 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-10-11T00:53:31.715676" elapsed="0.000206"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:31.715962" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T00:53:31.716089" 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-10-11T00:53:31.715332" 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-10-11T00:53:31.716275" elapsed="0.000185"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:53:31.714749" elapsed="0.001761"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.717009" 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-10-11T00:53:31.716740" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:31.717765" 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-10-11T00:53:31.717585" elapsed="0.000205"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:31.717834" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:31.718103" 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-10-11T00:53:31.717204" elapsed="0.000922"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.718292" elapsed="0.000195"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-bgp-peer2</var>
<status status="PASS" start="2026-10-11T00:53:31.716610" elapsed="0.001915"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.719022" 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-10-11T00:53:31.718754" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:31.719748" 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-10-11T00:53:31.719569" elapsed="0.000203"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:31.719815" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:31.719938" 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-10-11T00:53:31.719216" elapsed="0.000744"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.720124" elapsed="0.000164"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-10-11T00:53:31.718624" elapsed="0.001700"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.720851" 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-10-11T00:53:31.720583" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:31.721557" 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-10-11T00:53:31.721350" elapsed="0.000231"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:31.721625" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:31.721748" 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-10-11T00:53:31.721042" elapsed="0.000729"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.721937" elapsed="0.000163"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:53:31.720437" elapsed="0.001699"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.722658" 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-10-11T00:53:31.722362" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:31.723381" 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-10-11T00:53:31.723206" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:31.723466" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:53:31.723603" 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-10-11T00:53:31.722852" 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-10-11T00:53:31.723788" elapsed="0.000163"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:53:31.722232" elapsed="0.001755"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.724510" 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-10-11T00:53:31.724210" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:31.725184" 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-10-11T00:53:31.725010" elapsed="0.000198"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:31.725285" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:53:31.725427" 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-10-11T00:53:31.724704" elapsed="0.000747"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.725629" elapsed="0.000166"/>
</kw>
<var name="${key}">PEER_ROLE</var>
<var name="${value}">ibgp</var>
<status status="PASS" start="2026-10-11T00:53:31.724082" elapsed="0.001750"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.726325" 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-10-11T00:53:31.726058" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:31.727029" 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-10-11T00:53:31.726854" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:31.727097" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:31.727220" 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-10-11T00:53:31.726547" elapsed="0.000695"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.727420" elapsed="0.000179"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:53:31.725929" elapsed="0.001708"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.728292" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:53:31.727865" elapsed="0.000451"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:31.729006" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.728829" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:31.729074" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:31.729196" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:53:31.728517" elapsed="0.000702"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.729385" elapsed="0.000190"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:53:31.727735" elapsed="0.001878"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.730108" 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-10-11T00:53:31.729843" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:31.730863" 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-10-11T00:53:31.730686" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:31.730930" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:31.731053" 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-10-11T00:53:31.730300" 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-10-11T00:53:31.731238" elapsed="0.000163"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:53:31.729713" elapsed="0.001742"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.731962" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:53:31.731697" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:31.732665" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.732487" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:31.732731" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:31.732852" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:53:31.732152" elapsed="0.000722"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.733036" elapsed="0.000163"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:53:31.731567" elapsed="0.001669"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.733761" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:53:31.733492" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:31.734450" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.734260" elapsed="0.000215"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:31.734569" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T00:53:31.734696" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:53:31.733951" 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-10-11T00:53:31.734885" elapsed="0.000168"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:53:31.733333" elapsed="0.001758"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.735628" 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-10-11T00:53:31.735320" elapsed="0.000332"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:53:31.736301" 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-10-11T00:53:31.736126" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:53:31.736369" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:31.736526" 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-10-11T00:53:31.735820" elapsed="0.000729"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.736713" elapsed="0.000164"/>
</kw>
<var name="${key}">RR_CLIENT</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:53:31.735189" elapsed="0.001724"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:53:31.714597" elapsed="0.022347"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:53:31.736982" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:53:31.737113" 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-10-11T00:53:31.713452" elapsed="0.023686"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:31.713186" elapsed="0.023980"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.737337" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.737188" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.713169" elapsed="0.024236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.738245" 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-10-11T00:53:31.737589" elapsed="0.000682"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:53:31.738314" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:53:31.709917" elapsed="0.028511"/>
</kw>
<msg time="2026-10-11T00:53:31.738490" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:31.705323" elapsed="0.033212"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:53:31.743030" 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/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-10-11T00:53:31.747356" 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/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-10-11T00:53:31.751819" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.752036" 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-10-11T00:53:31.752223" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.752605" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.752429" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:53:31.752401" 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-10-11T00:53:31.752836" 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-10-11T00:53:31.753015" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.753178" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:53:31.752376" elapsed="0.000849"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:53:31.752288" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.753399" elapsed="0.000034"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:53:31.753492" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:53:31.753606" 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-10-11T00:53:31.704732" elapsed="0.048899"/>
</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-10-11T00:53:31.762976" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:31.762676" elapsed="0.000326"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:53:31.763695" 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-10-11T00:53:31.763522" elapsed="0.000231">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-10-11T00:53:31.763836" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:53:31.763162" elapsed="0.000697"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.764343" 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-10-11T00:53:31.764038" elapsed="0.000330"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:53:31.764676" 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-10-11T00:53:31.764792" 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-10-11T00:53:31.764567" elapsed="0.000250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.765236" 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-10-11T00:53:31.765013" 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-10-11T00:53:31.765675" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.765391" elapsed="0.000337"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.766162" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:31.765896" elapsed="0.000292"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:31.765750" elapsed="0.000470"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.765373" elapsed="0.000867"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.767155" 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-10-11T00:53:31.766401" elapsed="0.000783"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:53:31.767228" 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-10-11T00:53:31.762139" elapsed="0.005190"/>
</kw>
<msg time="2026-10-11T00:53:31.767381" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:31.757604" elapsed="0.009837"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:53:31.771922" 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/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-10-11T00:53:31.776266" 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/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-10-11T00:53:31.780586" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.780854" 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-10-11T00:53:31.781045" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.781378" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.781235" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:53:31.781221" 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-10-11T00:53:31.781639" 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-10-11T00:53:31.781819" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.781982" elapsed="0.000017"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:53:31.781196" elapsed="0.000832"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:53:31.781109" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.782237" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:53:31.782303" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:53:31.782438" 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-10-11T00:53:31.756877" elapsed="0.025590"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:53:31.783590" 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-10-11T00:53:31.783376" elapsed="0.000274">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-10-11T00:53:31.783733" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:53:31.783053" elapsed="0.000703"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.784040" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.783819" elapsed="0.000272"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.784569" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:31.784278" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:31.784113" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.783802" elapsed="0.000842"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.785138" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:31.784805" elapsed="0.000356"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:53:31.785206" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:31.785329" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:53:31.782751" elapsed="0.002601"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.786609" 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-10-11T00:53:31.786355" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.787054" 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-10-11T00:53:31.786843" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.787539" 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-10-11T00:53:31.787296" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.787998" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:31.787783" elapsed="0.000255"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:31.788756" 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-10-11T00:53:31.788599" elapsed="0.000181"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:53:31.789071" 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-10-11T00:53:31.788932" elapsed="0.000162"/>
</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-10-11T00:53:31.789298" elapsed="0.000173"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.789897" 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-10-11T00:53:31.789677" elapsed="0.000261"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:53:31.789976" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:53:31.790103" 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-10-11T00:53:31.788216" elapsed="0.001910"/>
</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-10-11T00:53:31.806010" level="INFO">PUT Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.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-10-11T00:53:31.806072" level="INFO">PUT Response : url=http://10.30.170.173: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-10-11T00:53:31.806152" 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-10-11T00:53:31.790433" elapsed="0.015742"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:31.790187" elapsed="0.016029"/>
</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-10-11T00:53:31.806393" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.806241" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.790171" elapsed="0.016342"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.807673" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:31.807362" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:31.807121" elapsed="0.000624"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.807104" elapsed="0.000663"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.808317" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:31.808053" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:31.807816" elapsed="0.000573"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.807801" elapsed="0.000626"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.808958" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:31.808619" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.809260" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.809051" elapsed="0.000260"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.809784" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:31.809523" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:31.809333" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.809032" elapsed="0.000828"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.810365" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:31.810033" elapsed="0.000356"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.810697" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.810468" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.811228" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:53:31.810966" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T00:53:31.810801" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.810451" elapsed="0.000853"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:31.811464" elapsed="0.000303"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:53:31.812143" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:53:31.811927" elapsed="0.000240"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.812318" elapsed="0.000236"/>
</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-10-11T00:53:31.806834" elapsed="0.005777"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:53:31.812751" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:53:31.812669" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.812653" elapsed="0.000175"/>
</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-10-11T00:53:31.812970" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:53:31.813029" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:53:31.813185" 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-10-11T00:53:31.785684" elapsed="0.027525"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:53:31.813263" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:53:31.813382" 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-10-11T00:53:31.700636" elapsed="0.112769"/>
</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-10-11T00:53:31.813862" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.813659" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.813641" elapsed="0.000304"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:53:31.813974" elapsed="0.000024"/>
</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-10-11T00:53:31.700026" elapsed="0.114044"/>
</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-10-11T00:53:31.814636" elapsed="0.000225"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:53:31.814314" elapsed="0.000603"/>
</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-10-11T00:53:31.486284" elapsed="0.328667"/>
</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-10-11T00:53:31.816363" elapsed="0.000234"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:53:31.816116" 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-10-11T00:53:31.817555" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:31.817453" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.817434" elapsed="0.000184"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:31.819902" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:31.819821" elapsed="0.000122"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.819804" elapsed="0.000159"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.820873" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:31.820550" elapsed="0.000348"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.821347" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:31.821085" elapsed="0.000286"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:31.821427" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:53:31.821569" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:31.820168" elapsed="0.001424"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:31.824153" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:31.824070" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.824052" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:31.825263" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:31.825179" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.825162" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:31.825678" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:31.825508" elapsed="0.000194"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:31.826004" 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-10-11T00:53:31.825865" elapsed="0.000162"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:31.859590" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:53:31.826548" elapsed="0.033140"/>
</kw>
<msg time="2026-10-11T00:53:31.859843" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:31.859885" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:31.826185" elapsed="0.033735"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:31.886704" 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-10-11T00:53:31.860455" elapsed="0.026349"/>
</kw>
<msg time="2026-10-11T00:53:31.886954" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:31.886995" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:31.860089" elapsed="0.026940"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.887306" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.887098" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.887080" elapsed="0.000297"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.887824" 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-10-11T00:53:31.887600" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.888144" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.887946" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.887929" elapsed="0.000285"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:31.888243" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:31.890813" elapsed="0.000115"/>
</kw>
<msg time="2026-10-11T00:53:31.890986" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:31.889621" 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-10-11T00:53:31.891442" elapsed="0.000089"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.891793" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:53:31.889010" elapsed="0.002967"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:53:31.888547" elapsed="0.003518"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:53:31.824924" elapsed="0.067216"/>
</kw>
<msg time="2026-10-11T00:53:31.892220" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:31.892259" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:31.824366" elapsed="0.067930"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:31.892487" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:53:31.892364" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.892346" 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-10-11T00:53:31.892892" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.893195" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:31.893260" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:53:31.823787" elapsed="0.069556"/>
</kw>
<msg time="2026-10-11T00:53:31.893512" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:31.893554" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:31.821915" elapsed="0.071673"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:31.893877" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:31.893655" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:31.893639" elapsed="0.000308"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:31.821773" elapsed="0.072196"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:31.821637" elapsed="0.072357"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:53:31.819530" elapsed="0.074513"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:53:31.817185" elapsed="0.076907"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:31.816796" elapsed="0.077335"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:53:31.815771" elapsed="0.078407"/>
</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-10-11T00:53:31.894338" elapsed="0.000183"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.897865" 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.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:31.897585" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.898307" 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.173 --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-10-11T00:53:31.898093" elapsed="0.000256"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:31.902215" 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.173 --peerport=1790 --debug --logfile bgp_peer1.log &amp;&gt;bgp_peer1.log</msg>
<msg time="2026-10-11T00:53:31.902304" 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.173 --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-10-11T00:53:31.898537" elapsed="0.003793"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.902787" 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.173 --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-10-11T00:53:31.902565" elapsed="0.000265"/>
</kw>
<arg>${BGP_PEER1_COMMAND}</arg>
<arg>${BGP_PEER1_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-10-11T00:53:31.897230" elapsed="0.005650"/>
</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-10-11T00:53:31.910669" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:53:31.910856" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:53:31.910941" 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-10-11T00:53:31.904011" elapsed="0.006955"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.911461" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:31.911167" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.912024" 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-10-11T00:53:31.911710" elapsed="0.000357"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-11T00:53:31.912677" 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 the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-11T00:53:31.912230" elapsed="0.000507">'{"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-10-11T00:53:31.903643" elapsed="0.009202">'{"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-10-11T00:53:32.923719" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:53:32.923970" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:53:32.924170" 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-10-11T00:53:32.914554" elapsed="0.009670"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:32.925398" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:32.924747" elapsed="0.000813"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:32.926800" 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-10-11T00:53:32.925995" elapsed="0.000903"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:53:32.927259" elapsed="0.000924"/>
</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-10-11T00:53:32.913620" elapsed="0.014690"/>
</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-10-11T00:53:31.903089" elapsed="1.025350"/>
</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-10-11T00:53:32.929769" elapsed="0.003393"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:53:32.929056" elapsed="0.004238"/>
</kw>
<doc>Connect BGP peer</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:53:31.815236" elapsed="1.118133"/>
</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-10-11T00:53:32.936576" elapsed="0.000451"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:53:32.935963" elapsed="0.001176"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:32.939286" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:32.939084" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:32.939042" elapsed="0.000424"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:32.944225" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:32.944042" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:32.944004" elapsed="0.000521"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:32.946635" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:32.945850" elapsed="0.000843"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:32.947672" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:32.947036" elapsed="0.000691"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:32.947816" elapsed="0.000066"/>
</return>
<msg time="2026-10-11T00:53:32.948105" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:32.944994" elapsed="0.003163"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:32.954357" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:32.954169" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:32.954129" elapsed="0.000424"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:32.956952" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:32.956765" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:32.956726" elapsed="0.000362"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:32.957866" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:32.957456" elapsed="0.000465"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:32.958663" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:32.958297" elapsed="0.000418"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:32.995651" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:53:32.959908" elapsed="0.035882"/>
</kw>
<msg time="2026-10-11T00:53:32.996004" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:32.996062" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:32.959073" elapsed="0.037037"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:33.025478" 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-10-11T00:53:32.996872" elapsed="0.028708"/>
</kw>
<msg time="2026-10-11T00:53:33.025729" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:33.025773" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:32.996350" elapsed="0.029461"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:33.026109" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:33.025880" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:33.025862" elapsed="0.000319"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:33.026635" 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-10-11T00:53:33.026376" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:33.026959" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:33.026755" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:33.026738" elapsed="0.000290"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:33.027058" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:33.029542" elapsed="0.000116"/>
</kw>
<msg time="2026-10-11T00:53:33.029715" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:33.028480" elapsed="0.001371"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:33.030193" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:33.030565" 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-10-11T00:53:33.027861" 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-10-11T00:53:33.027365" 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-10-11T00:53:32.956117" elapsed="0.074768"/>
</kw>
<msg time="2026-10-11T00:53:33.030966" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:33.031005" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:32.954895" elapsed="0.076145"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:33.031194" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:53:33.031108" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:33.031090" elapsed="0.000202"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:33.031654" 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-10-11T00:53:33.031957" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:33.032020" 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-10-11T00:53:32.953523" elapsed="0.078582"/>
</kw>
<msg time="2026-10-11T00:53:33.032187" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:33.032226" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:32.948986" elapsed="0.083275"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:33.032640" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:33.032326" elapsed="0.000364"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:33.032310" elapsed="0.000401"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:32.948662" elapsed="0.084070"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:32.948259" elapsed="0.084502"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:53:32.943346" elapsed="0.089464"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:53:32.938514" elapsed="0.094345"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:32.937567" elapsed="0.095331"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:53:32.935141" elapsed="0.097804"/>
</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-10-11T00:53:33.033103" elapsed="0.000095"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:33.036800" 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.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:33.036516" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:33.037242" 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.173 --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-10-11T00:53:33.037023" elapsed="0.000262"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:33.041032" 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.173 --peerport=1790 --debug --logfile bgp_peer2.log &amp;&gt;bgp_peer2.log</msg>
<msg time="2026-10-11T00:53:33.041118" 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.173 --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-10-11T00:53:33.037455" elapsed="0.003689"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:33.041598" 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.173 --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-10-11T00:53:33.041340" elapsed="0.000336"/>
</kw>
<arg>${BGP_PEER2_COMMAND}</arg>
<arg>${BGP_PEER2_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-10-11T00:53:33.036151" elapsed="0.005576"/>
</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-10-11T00:53:33.049715" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:53:33.049829" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:53:33.049926" 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-10-11T00:53:33.042815" elapsed="0.007135"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:33.050457" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:33.050156" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:33.051030" 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-10-11T00:53:33.050709" elapsed="0.000366"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-11T00:53:33.051686" 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 the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-11T00:53:33.051236" elapsed="0.000522">'{"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-10-11T00:53:33.042434" elapsed="0.009428">'{"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-10-11T00:53:34.062543" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:53:34.062797" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:53:34.062998" 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-10-11T00:53:34.053528" elapsed="0.009524"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:34.064221" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:34.063570" elapsed="0.000745"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:34.065582" 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-10-11T00:53:34.064798" elapsed="0.000887"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:53:34.066047" elapsed="0.000959"/>
</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-10-11T00:53:34.052559" elapsed="0.014575"/>
</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-10-11T00:53:33.041907" elapsed="1.025327"/>
</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-10-11T00:53:34.068677" elapsed="0.000509"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:53:34.067959" elapsed="0.001356"/>
</kw>
<doc>Connect BGP peer</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:53:32.934021" elapsed="1.135369"/>
</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-10-11T00:53:34.072584" elapsed="0.000443"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:53:34.071976" elapsed="0.001160"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:34.075277" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:34.075076" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:34.075032" elapsed="0.000422"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:34.080907" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:34.080714" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:34.080675" elapsed="0.000370"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:34.083155" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:34.082367" elapsed="0.000844"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:34.084218" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:34.083622" elapsed="0.000651"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:34.084365" elapsed="0.000142"/>
</return>
<msg time="2026-10-11T00:53:34.084746" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:34.081563" elapsed="0.003233"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:34.090819" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:34.090627" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:34.090586" elapsed="0.000373"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:34.093379" elapsed="0.000064"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:34.093193" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:34.093155" elapsed="0.000423"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:34.094293" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:34.093916" elapsed="0.000432"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:34.095080" 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-10-11T00:53:34.094778" elapsed="0.000353"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:34.131017" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:53:34.096320" elapsed="0.034841"/>
</kw>
<msg time="2026-10-11T00:53:34.131490" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:34.131554" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:34.095579" elapsed="0.036025"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:34.166848" 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-10-11T00:53:34.132345" elapsed="0.034611"/>
</kw>
<msg time="2026-10-11T00:53:34.167110" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:34.167151" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:34.131851" elapsed="0.035336"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:34.167507" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:34.167258" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:34.167240" elapsed="0.000378"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:34.168044" 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-10-11T00:53:34.167814" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:34.168388" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:34.168180" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:34.168161" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:34.168521" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:34.170935" elapsed="0.000240"/>
</kw>
<msg time="2026-10-11T00:53:34.171235" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:34.169913" 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-10-11T00:53:34.171765" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:34.172101" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:53:34.169286" elapsed="0.002999"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:53:34.168821" 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-10-11T00:53:34.092617" elapsed="0.079823"/>
</kw>
<msg time="2026-10-11T00:53:34.172539" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:34.172578" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:34.091301" elapsed="0.081312"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:34.172768" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:53:34.172681" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:34.172663" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:34.173171" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:34.173514" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:34.173580" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:53:34.089921" elapsed="0.083744"/>
</kw>
<msg time="2026-10-11T00:53:34.173748" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:34.173788" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:34.085590" elapsed="0.088233"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:34.174112" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:34.173890" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:34.173874" elapsed="0.000309"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:34.085217" elapsed="0.088988"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:34.084903" elapsed="0.089329"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:53:34.079990" elapsed="0.094292"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:53:34.074503" elapsed="0.099830"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:34.073555" elapsed="0.100818"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:53:34.071157" elapsed="0.103356"/>
</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-10-11T00:53:34.174712" elapsed="0.000098"/>
</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-10-11T00:53:34.174981" elapsed="0.000206"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:34.175657" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:34.175345" elapsed="0.000336"/>
</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-10-11T00:53:34.180670" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:34.193779" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:34.193868" 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-10-11T00:53:34.180542" elapsed="0.013349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:34.194325" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:34.194093" elapsed="0.000271"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:53:34.194865" 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-10-11T00:53:34.194554" elapsed="0.000379">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-10-11T00:53:34.180121" elapsed="0.014913">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:35.205311" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:35.219557" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:35.219797" 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-10-11T00:53:35.205026" elapsed="0.014824"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:35.220958" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:35.220312" elapsed="0.000752"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:53:35.222147" 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-10-11T00:53:35.221444" elapsed="0.000832">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-10-11T00:53:35.204054" elapsed="0.018597">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:36.233571" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:36.247486" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:36.247683" 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-10-11T00:53:36.233237" elapsed="0.014498"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:36.248812" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:36.248191" elapsed="0.000715"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:53:36.249982" 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-10-11T00:53:36.249259" elapsed="0.000855">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-10-11T00:53:36.232278" elapsed="0.018043">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:37.260759" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:37.274357" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:37.274615" 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-10-11T00:53:37.260467" elapsed="0.014202"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:37.275703" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:37.275122" elapsed="0.000675"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:53:37.276854" 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-10-11T00:53:37.276138" elapsed="0.000848">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-10-11T00:53:37.259498" elapsed="0.017697">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:38.287505" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:38.302018" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:38.302217" 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-10-11T00:53:38.287172" elapsed="0.015097"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:38.303319" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:38.302785" elapsed="0.000674"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:53:38.304521" 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-10-11T00:53:38.303807" elapsed="0.000848">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-10-11T00:53:38.286208" elapsed="0.018767">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:39.316154" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:39.330171" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:39.330403" 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-10-11T00:53:39.315843" elapsed="0.014679"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:39.331594" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:39.330986" elapsed="0.000702"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:53:39.332759" 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-10-11T00:53:39.332033" elapsed="0.000867">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-10-11T00:53:39.314792" elapsed="0.018320">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:40.343642" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:40.357486" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:40.357685" 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-10-11T00:53:40.343288" elapsed="0.014450"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:40.358834" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:40.358220" elapsed="0.000709"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:53:40.360014" 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-10-11T00:53:40.359275" elapsed="0.000873">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-10-11T00:53:40.342331" elapsed="0.018027">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:41.371031" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:41.385040" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:41.385240" 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-10-11T00:53:41.370738" elapsed="0.014555"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:41.386531" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:41.385872" elapsed="0.000765"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:53:41.387780" 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-10-11T00:53:41.387021" elapsed="0.000913">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-10-11T00:53:41.369753" elapsed="0.018419">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:42.399642" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:42.413702" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:42.413913" 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-10-11T00:53:42.399277" elapsed="0.014688"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:42.415049" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:42.414481" elapsed="0.000659"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:53:42.416212" 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-10-11T00:53:42.415525" elapsed="0.000832">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-10-11T00:53:42.398193" elapsed="0.018442">1 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:43.427001" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:43.440538" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:43.440738" 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-10-11T00:53:43.426716" elapsed="0.014072"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:43.441840" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:43.441247" elapsed="0.000687"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:53:43.443002" 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-10-11T00:53:43.442275" elapsed="0.000858">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-10-11T00:53:43.425753" elapsed="0.017587">1 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:44.454091" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:44.468482" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:44.468689" 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-10-11T00:53:44.453798" elapsed="0.014941"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:44.469792" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:44.469195" elapsed="0.000689"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:53:44.470948" 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-10-11T00:53:44.470224" elapsed="0.000857">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-10-11T00:53:44.452791" elapsed="0.018495">1 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:45.486628" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:45.500172" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:45.500444" 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-10-11T00:53:45.486159" elapsed="0.014346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:45.501628" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:45.500970" elapsed="0.000754"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:53:45.502859" 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-10-11T00:53:45.502071" elapsed="0.000932">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-10-11T00:53:45.484764" elapsed="0.018458">1 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:46.514287" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:46.527913" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:46.528189" 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-10-11T00:53:46.513964" elapsed="0.014290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:46.529597" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:46.528877" elapsed="0.000817"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:53:46.530837" 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-10-11T00:53:46.530043" elapsed="0.000946">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-10-11T00:53:46.512874" elapsed="0.018339">1 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:47.542014" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:47.555895" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:47.556105" 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-10-11T00:53:47.541700" elapsed="0.014458"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:47.557266" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:47.556688" elapsed="0.000671"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:53:47.558527" 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-10-11T00:53:47.557761" elapsed="0.000918">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-10-11T00:53:47.540635" elapsed="0.018266">1 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:48.569941" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:48.583881" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:48.584082" 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-10-11T00:53:48.569643" elapsed="0.014491"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:48.585190" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:48.584653" elapsed="0.000629"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:53:48.586350" 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-10-11T00:53:48.585677" elapsed="0.000862">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-10-11T00:53:48.568654" elapsed="0.018099">1 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:49.597499" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:49.610993" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:49.611301" 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-10-11T00:53:49.597143" elapsed="0.014246"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:49.612504" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:49.611893" elapsed="0.000706"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:53:49.613678" 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-10-11T00:53:49.612943" elapsed="0.000876">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-10-11T00:53:49.596103" elapsed="0.017934">1 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:50.624529" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:50.638293" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:50.638556" 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-10-11T00:53:50.624179" elapsed="0.014430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:50.639654" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:50.639059" elapsed="0.000687"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:53:50.640822" 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-10-11T00:53:50.640089" elapsed="0.000865">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-10-11T00:53:50.623190" elapsed="0.017975">1 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:51.652010" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:51.665810" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:51.666036" 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-10-11T00:53:51.651703" elapsed="0.014389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:51.667169" level="INFO">1</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:51.666613" elapsed="0.000649"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:53:51.668336" 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-10-11T00:53:51.667669" elapsed="0.000859">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-10-11T00:53:51.650647" elapsed="0.018092">1 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:52.679060" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:52.692267" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:52.692525" 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-10-11T00:53:52.678774" elapsed="0.013810"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:52.693605" level="INFO">2</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:52.693034" elapsed="0.000663"/>
</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-10-11T00:53:52.694035" elapsed="0.000656"/>
</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-10-11T00:53:52.677813" elapsed="0.017003"/>
</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-10-11T00:53:34.175861" elapsed="18.519061"/>
</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-10-11T00:53:52.696205" elapsed="0.000584"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:53:52.695540" elapsed="0.001376"/>
</kw>
<doc>Check for no updates received by iBGP peer No. 1</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:53:34.070012" elapsed="18.626979"/>
</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-10-11T00:53:52.700153" elapsed="0.000515"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:53:52.699592" elapsed="0.001189"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:52.702942" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:52.702715" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:52.702669" elapsed="0.000423"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:52.708287" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:52.708097" elapsed="0.000435"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:52.708058" elapsed="0.000531"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:52.710766" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:52.709953" elapsed="0.000870"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:52.711822" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:52.711171" elapsed="0.000705"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:52.711967" elapsed="0.000067"/>
</return>
<msg time="2026-10-11T00:53:52.712255" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:52.709070" elapsed="0.003237"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:52.718320" elapsed="0.000053"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:52.718131" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:52.718092" elapsed="0.000420"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:52.720934" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:52.720747" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:52.720708" elapsed="0.000362"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:52.721888" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:52.721491" elapsed="0.000451"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:52.722694" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:52.722307" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:52.759021" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:53:52.723955" elapsed="0.035198"/>
</kw>
<msg time="2026-10-11T00:53:52.759379" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:52.759463" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:52.723098" elapsed="0.036416"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:52.786583" 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-10-11T00:53:52.760223" elapsed="0.026455"/>
</kw>
<msg time="2026-10-11T00:53:52.786824" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:52.786864" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:52.759752" elapsed="0.027146"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:52.787176" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:52.786966" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:52.786948" elapsed="0.000299"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:52.787715" 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-10-11T00:53:52.787489" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:52.788037" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:52.787835" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:52.787819" elapsed="0.000288"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:52.788136" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:52.790756" elapsed="0.001101"/>
</kw>
<msg time="2026-10-11T00:53:52.791918" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:52.789552" elapsed="0.002504"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:52.792442" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:52.792776" 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-10-11T00:53:52.788938" elapsed="0.004025"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:53:52.788473" elapsed="0.004549"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:53:52.720110" elapsed="0.072986"/>
</kw>
<msg time="2026-10-11T00:53:52.793178" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:52.793217" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:52.718852" elapsed="0.074399"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:52.793441" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:53:52.793319" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:52.793302" 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-10-11T00:53:52.793848" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:52.794153" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:52.794215" 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-10-11T00:53:52.717492" elapsed="0.076810"/>
</kw>
<msg time="2026-10-11T00:53:52.794504" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:52.794547" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:52.713109" elapsed="0.081473"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:52.794871" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:52.794649" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:52.794633" elapsed="0.000308"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:52.712786" elapsed="0.082176"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:52.712468" elapsed="0.082522"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:53:52.707396" elapsed="0.087643"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:53:52.702075" elapsed="0.093013"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:52.701113" elapsed="0.094014"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:53:52.698763" elapsed="0.096410"/>
</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-10-11T00:53:52.795347" elapsed="0.000153"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:53:52.796605" 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-10-11T00:53:52.796268" 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-10-11T00:53:52.796786" elapsed="0.000172"/>
</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-10-11T00:53:52.795989" elapsed="0.001021"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-10-11T00:53:54.797828" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<msg time="2026-10-11T00:53:54.798052" level="INFO">${output} = [?2004l^C
[?2004h[jenkins@releng-26932-423-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-10-11T00:53:52.797176" elapsed="2.000938"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:54.799198" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:54.798653" elapsed="0.000645"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-10-11T00:53:52.795691" elapsed="2.003784"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:54.807503" level="INFO">Executing command 'cat bgp_peer1.log'.</msg>
<msg time="2026-10-11T00:53:54.821013" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:54.821224" level="INFO">${output_log} = 2026-10-11 00:53:32,002 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:53:32,003 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.1
2026-10-11 00:53:32,003 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-10-11T00:53:54.807200" elapsed="0.014080"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:54.822377" level="INFO">2026-10-11 00:53:32,002 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:53:32,003 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.1
2026-10-11 00:53:32,003 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 00:53:32,003 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 00:53:32,003 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 00:53:32,003 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:53:32,006 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:53:32,006 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:53:32,006 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:53:32,006 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 3
2026-10-11 00:53:32,006 INFO BGP-Thread-1 (job):   Prefix base: 8.1.0.0/28
2026-10-11 00:53:32,006 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 00:53:32,006 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 00:53:32,006 INFO BGP-Thread-1 (job):   My BGP Identifier: 2130706433
2026-10-11 00:53:32,006 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 00:53:32,006 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 00:53:32,006 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 00:53:32,006 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 00:53:32,006 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 00:53:32,007 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 00:53:32,007 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 3
2026-10-11 00:53:32,007 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, 2]
2026-10-11 00:53:32,007 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 00:53:32,007 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 00:53:32,007 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 00:53:32,007 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:32,007 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-10-11 00:53:32,007 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 00:53:32,007 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 00:53:32,007 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-10-11 00:53:32,007 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 00:53:32,007 DEBUG BGP-Thread-1 (job):   BGP Identifier=2130706433 (0x7f000001)
2026-10-11 00:53:32,007 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-10-11 00:53:32,007 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf0
2026-10-11 00:53:32,007 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf000b47f000001100206010400010001020641040000fbf0'
2026-10-11 00:53:32,008 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf000b47f000001100206010400010001020641040000fbf0
2026-10-11 00:53:32,009 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:53:32,009 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:32,009 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:53:32,009 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:53:32,009 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:53:32,009 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:53:32,010 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:32,010 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:53:32,010 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:53:32,010 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:53:32,010 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 00:53:32,010 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 3
2026-10-11 00:53:32,010 DEBUG BGP-Thread-1 (job): ########## Iteration: 0 ##########
2026-10-11 00:53:32,010 DEBUG BGP-Thread-1 (job): Remaining prefixes: 3
2026-10-11 00:53:32,010 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:53:32,010 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:53:32,010 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-10-11 00:53:32,010 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:32,011 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:53:32,011 DEBUG BGP-Thread-1 (job):   Prefix indexes: [0]
2026-10-11 00:53:32,011 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.1.0.0')]
2026-10-11 00:53:32,012 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:53:32,012 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-10-11 00:53:32,013 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:32,013 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:53:32,013 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:53:32,013 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:53:32,013 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:53:32,014 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:32,014 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-10-11 00:53:32,014 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:53:32,014 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:53:32,014 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:53:32,014 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-10-11 00:53:32,014 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-10-11 00:53:32,014 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:53:32,014 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:53:32,014 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:53:32,014 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.1.0.0')]/28 (0x1c08010000)
2026-10-11 00:53:32,014 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08010000
2026-10-11 00:53:32,014 DEBUG BGP-Thread-1 (job): ########## Iteration: 1 ##########
2026-10-11 00:53:32,015 DEBUG BGP-Thread-1 (job): Remaining prefixes: 2
2026-10-11 00:53:32,015 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:53:32,015 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:53:32,015 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-10-11 00:53:32,015 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:32,015 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:53:32,015 DEBUG BGP-Thread-1 (job):   Prefix indexes: [1]
2026-10-11 00:53:32,015 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.1.0.16')]
2026-10-11 00:53:32,015 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:53:32,015 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-10-11 00:53:32,015 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:32,015 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:53:32,016 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:53:32,016 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:53:32,016 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:53:32,016 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:32,016 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-10-11 00:53:32,016 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:53:32,016 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:53:32,016 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:53:32,016 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-10-11 00:53:32,016 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-10-11 00:53:32,016 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:53:32,016 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:53:32,016 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:53:32,017 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.1.0.16')]/28 (0x1c08010010)
2026-10-11 00:53:32,017 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08010010
2026-10-11 00:53:32,017 DEBUG BGP-Thread-1 (job): ########## Iteration: 2 ##########
2026-10-11 00:53:32,017 DEBUG BGP-Thread-1 (job): Remaining prefixes: 1
2026-10-11 00:53:32,017 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:53:32,018 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:53:32,018 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-10-11 00:53:32,018 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:32,018 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:53:32,018 DEBUG BGP-Thread-1 (job):   Prefix indexes: [2]
2026-10-11 00:53:32,018 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.1.0.32')]
2026-10-11 00:53:32,018 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:53:32,019 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-10-11 00:53:32,019 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:32,020 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:53:32,020 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:53:32,020 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:53:32,020 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:53:32,020 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:32,020 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-10-11 00:53:32,020 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:53:32,020 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:53:32,020 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:53:32,020 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-10-11 00:53:32,020 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-10-11 00:53:32,020 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:53:32,020 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:53:32,021 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:53:32,021 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.1.0.32')]/28 (0x1c08010020)
2026-10-11 00:53:32,021 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08010020
2026-10-11 00:53:32,021 INFO BGP-Thread-1 (job): All update messages generated.
2026-10-11 00:53:32,021 INFO BGP-Thread-1 (job): Storing performance results.
2026-10-11 00:53:32,021 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-10-11 00:53:32,021 INFO BGP-Thread-1 (job): Number of iterations: 3
2026-10-11 00:53:32,021 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-10-11 00:53:32,021 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-10-11 00:53:32,021 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 3
2026-10-11 00:53:32,021 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.010469198226928711s
2026-10-11 00:53:32,021 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-10-11 00:53:32,021 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-10-11 00:53:32,022 INFO BGP-Thread-1 (job):   
2026-10-11 00:53:32,022 INFO BGP-Thread-1 (job):   
2026-10-11 00:53:32,022 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-10-11 00:53:32,022 INFO BGP-Thread-1 (job):   
2026-10-11 00:53:32,022 INFO BGP-Thread-1 (job):   
2026-10-11 00:53:32,022 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-10-11 00:53:32,022 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:53:32,022 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:32,022 DEBUG BGP-Thread-1 (job):   Length=43 (0x002b)
2026-10-11 00:53:32,022 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:53:32,022 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:53:32,022 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:53:32,023 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=20 (0x0014)
2026-10-11 00:53:32,023 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064)
2026-10-11 00:53:32,023 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:53:32,023 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:53:32,023 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:53:32,023 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-10-11 00:53:32,023 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff002b02000000144001010040020602010000fbf040050400000064
2026-10-11 00:53:32,023 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 00:53:32,023 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:32,023 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:32,023 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 00:53:32,024 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:32,024 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:32,024 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:32,024 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:32,024 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:32,024 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:32,024 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:32,024 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:32,024 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:32,024 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:32,024 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:32,024 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:32,025 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-10-11 00:53:32,025 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-10-11 00:53:32,025 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:32,025 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:32,025 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:53:42,035 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-10-11 00:53:42,035 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.010s
2026-10-11 00:53:42,036 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:53:42,036 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:53:42,036 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:53:52,046 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-10-11 00:53:52,046 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.020s
2026-10-11 00:53:52,046 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:53:52,046 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:53:52,046 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-10-11T00:53:54.821815" elapsed="0.001080"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T00:53:54.823987" 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-10-11T00:53:54.823353" elapsed="0.000748"/>
</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-10-11T00:53:54.806297" elapsed="0.017924"/>
</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-10-11T00:53:54.825685" elapsed="0.000522"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:53:54.824941" elapsed="0.001430"/>
</kw>
<doc>Stop BGP peer &amp; store logs</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:53:52.697653" elapsed="2.128857"/>
</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-10-11T00:53:54.829720" elapsed="0.000444"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:53:54.829095" elapsed="0.001182"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:54.832481" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:54.832194" elapsed="0.000389"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:54.832153" elapsed="0.000476"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:54.838031" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:54.837841" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:54.837801" elapsed="0.000369"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:53:54.840278" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:53:54.839546" elapsed="0.000808"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:53:54.841338" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:53:54.840729" elapsed="0.000666"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:53:54.841514" elapsed="0.000066"/>
</return>
<msg time="2026-10-11T00:53:54.841805" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:53:54.838696" elapsed="0.003159"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:54.847846" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:54.847655" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:54.847614" elapsed="0.000372"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:53:54.850399" elapsed="0.000062"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:53:54.850189" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:54.850150" elapsed="0.000426"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:53:54.851283" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:53:54.850906" elapsed="0.000455"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:53:54.852071" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:54.851767" elapsed="0.000355"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:53:54.886674" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:53:54.853278" elapsed="0.033537"/>
</kw>
<msg time="2026-10-11T00:53:54.887049" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:53:54.887110" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:54.852539" elapsed="0.034620"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:53:54.923139" 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-10-11T00:53:54.887935" elapsed="0.035305"/>
</kw>
<msg time="2026-10-11T00:53:54.923403" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:53:54.923499" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:54.887442" elapsed="0.036095"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:54.923821" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:54.923607" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:54.923588" elapsed="0.000305"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:54.924307" 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-10-11T00:53:54.924076" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:54.924678" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:54.924474" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:54.924455" elapsed="0.000297"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:53:54.924785" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:53:54.927222" elapsed="0.000271"/>
</kw>
<msg time="2026-10-11T00:53:54.927553" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:53:54.926155" elapsed="0.001535"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:54.927996" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:54.928354" 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-10-11T00:53:54.925570" elapsed="0.002992"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:53:54.925065" elapsed="0.003554"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:53:54.849616" elapsed="0.079078"/>
</kw>
<msg time="2026-10-11T00:53:54.928776" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:54.928815" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:54.848347" elapsed="0.080504"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:53:54.929006" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:53:54.928919" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:54.928902" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:54.929443" 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-10-11T00:53:54.929746" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:53:54.929810" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:53:54.846923" elapsed="0.082971"/>
</kw>
<msg time="2026-10-11T00:53:54.929976" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:53:54.930015" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:54.842634" elapsed="0.087416"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:53:54.930349" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:53:54.930116" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-11T00:53:54.930100" elapsed="0.000359"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:53:54.842263" elapsed="0.088218"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:53:54.841956" elapsed="0.088553"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:53:54.837084" elapsed="0.093473"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:53:54.831627" elapsed="0.099014"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:53:54.830682" elapsed="0.100000"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:53:54.828273" elapsed="0.102454"/>
</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-10-11T00:53:54.930889" elapsed="0.000096"/>
</kw>
<kw name="Convert Time" owner="DateTime">
<msg time="2026-10-11T00:53:54.931440" 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-10-11T00:53:54.931139" elapsed="0.000326"/>
</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-10-11T00:53:54.931641" elapsed="0.000204"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:53:54.932244" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:53:54.932004" elapsed="0.000264"/>
</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-10-11T00:53:54.937393" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:54.950681" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:54.950766" 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-10-11T00:53:54.937253" elapsed="0.013535"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:54.951209" level="INFO">2</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:54.950987" elapsed="0.000263"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:53:54.951744" 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-10-11T00:53:54.951429" elapsed="0.000387">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-10-11T00:53:54.936820" elapsed="0.015097">2 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:55.962258" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:55.975893" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:55.976099" 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-10-11T00:53:55.961969" elapsed="0.014180"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:55.977190" level="INFO">2</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:55.976662" elapsed="0.000619"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:53:55.978394" 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-10-11T00:53:55.977698" elapsed="0.000858">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-10-11T00:53:55.960993" elapsed="0.017769">2 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:56.989777" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:57.003216" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:57.003468" 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-10-11T00:53:56.989483" elapsed="0.014039"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:57.004556" level="INFO">2</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:57.003973" elapsed="0.000675"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:53:57.005712" 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-10-11T00:53:57.004994" elapsed="0.000849">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-10-11T00:53:56.988497" elapsed="0.017551">2 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:58.016702" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:58.030059" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:58.030267" 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-10-11T00:53:58.016371" elapsed="0.013973"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:58.031455" level="INFO">2</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:58.030843" elapsed="0.000710"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:53:58.032642" 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-10-11T00:53:58.031901" elapsed="0.000879">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-10-11T00:53:58.015353" elapsed="0.017637">2 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:53:59.043399" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-10-11T00:53:59.056886" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:53:59.057085" 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-10-11T00:53:59.043095" elapsed="0.014041"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:53:59.058172" level="INFO">2</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:53:59.057645" elapsed="0.000620"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:53:59.059365" 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-10-11T00:53:59.058668" elapsed="0.000857">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-10-11T00:53:59.042142" elapsed="0.017589">2 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:54:00.070802" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-10-11T00:54:00.083999" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:54:00.084202" 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-10-11T00:54:00.070503" elapsed="0.013751"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:00.085400" level="INFO">2</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:00.084812" elapsed="0.000712"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:54:00.086610" 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-10-11T00:54:00.085870" elapsed="0.000880">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-10-11T00:54:00.069481" elapsed="0.017483">2 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:54:01.097610" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-10-11T00:54:01.110873" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:54:01.111074" 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-10-11T00:54:01.097225" elapsed="0.013902"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:01.112177" level="INFO">2</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:01.111646" elapsed="0.000656"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:54:01.113379" 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-10-11T00:54:01.112683" elapsed="0.000860">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-10-11T00:54:01.096256" elapsed="0.017498">2 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:54:02.124699" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-10-11T00:54:02.138528" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:54:02.138750" 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-10-11T00:54:02.124372" elapsed="0.014430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:02.139865" level="INFO">2</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:02.139255" elapsed="0.000704"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:54:02.141054" 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-10-11T00:54:02.140325" elapsed="0.000863">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-10-11T00:54:02.123361" elapsed="0.018089">2 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:54:03.152636" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-10-11T00:54:03.165732" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:54:03.165934" 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-10-11T00:54:03.152314" elapsed="0.013671"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:03.167039" level="INFO">2</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:03.166501" elapsed="0.000630"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:54:03.168222" 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-10-11T00:54:03.167551" elapsed="0.000826">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-10-11T00:54:03.151294" elapsed="0.017322">2 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:54:04.179214" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-10-11T00:54:04.192675" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:54:04.192875" 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-10-11T00:54:04.178928" elapsed="0.014086"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:04.194071" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:04.193541" elapsed="0.000623"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:54:04.195234" 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-10-11T00:54:04.194567" elapsed="0.000827">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-10-11T00:54:04.177962" elapsed="0.017670">3 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:54:05.206153" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-10-11T00:54:05.219573" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:54:05.219770" 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-10-11T00:54:05.205869" elapsed="0.013952"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:05.220867" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:05.220299" elapsed="0.000660"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:54:05.222032" 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-10-11T00:54:05.221341" elapsed="0.000818">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-10-11T00:54:05.204903" elapsed="0.017484">3 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:54:06.233280" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-10-11T00:54:06.246537" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:54:06.246737" 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-10-11T00:54:06.232968" elapsed="0.013819"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:06.247841" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:06.247266" elapsed="0.000667"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:54:06.249030" 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-10-11T00:54:06.248305" elapsed="0.000852">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-10-11T00:54:06.231987" elapsed="0.017397">3 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:54:07.259932" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-10-11T00:54:07.273861" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:54:07.274066" 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-10-11T00:54:07.259647" elapsed="0.014472"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:07.275189" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:07.274636" elapsed="0.000678"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:54:07.276390" 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-10-11T00:54:07.275690" elapsed="0.000861">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-10-11T00:54:07.258670" elapsed="0.018088">3 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:54:08.287234" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-10-11T00:54:08.300637" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:54:08.300836" 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-10-11T00:54:08.286934" elapsed="0.013954"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:08.301959" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:08.301389" elapsed="0.000664"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:54:08.303125" 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-10-11T00:54:08.302455" elapsed="0.000823">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-10-11T00:54:08.285965" elapsed="0.017548">3 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:54:09.314570" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-10-11T00:54:09.328073" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:54:09.328296" 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-10-11T00:54:09.314244" elapsed="0.014108"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:09.329483" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:09.328868" elapsed="0.000711"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:54:09.330766" 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-10-11T00:54:09.330026" elapsed="0.000871">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-10-11T00:54:09.313262" elapsed="0.017840">3 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:54:10.342314" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-10-11T00:54:10.355763" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:54:10.355976" 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-10-11T00:54:10.341981" elapsed="0.014046"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:10.357145" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:10.356575" elapsed="0.000690"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:54:10.358383" 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-10-11T00:54:10.357642" elapsed="0.000915">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-10-11T00:54:10.340722" elapsed="0.018054">3 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:54:11.370402" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-10-11T00:54:11.384291" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:54:11.384616" 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-10-11T00:54:11.370053" elapsed="0.014626"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:11.385905" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:11.385216" elapsed="0.000790"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:54:11.387184" 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-10-11T00:54:11.386438" elapsed="0.000964">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-10-11T00:54:11.368878" elapsed="0.018796">3 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:54:12.399274" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-10-11T00:54:12.412676" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:54:12.412890" 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-10-11T00:54:12.398926" elapsed="0.014017"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:12.414084" level="INFO">3</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:12.413512" elapsed="0.000665"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:54:12.415296" 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-10-11T00:54:12.414576" elapsed="0.000899">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-10-11T00:54:12.397847" elapsed="0.017853">3 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:54:13.426799" level="INFO">Executing command 'grep -o 'total_received_update_message_counter: 1' bgp_peer2.log | wc -l'.</msg>
<msg time="2026-10-11T00:54:13.440025" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:54:13.440284" 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-10-11T00:54:13.426486" elapsed="0.013853"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:13.441471" level="INFO">4</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:13.440846" elapsed="0.000722"/>
</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-10-11T00:54:13.441912" elapsed="0.000667"/>
</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-10-11T00:54:13.425438" elapsed="0.017272"/>
</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-10-11T00:53:54.932546" elapsed="18.510271"/>
</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-10-11T00:54:13.444142" elapsed="0.000587"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:54:13.443472" elapsed="0.001385"/>
</kw>
<doc>Consequent check for no updates received by iBGP peer No. 2</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:53:54.827085" elapsed="18.617848"/>
</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-10-11T00:54:13.448662" elapsed="0.000445"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:54:13.448043" elapsed="0.001201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:13.451462" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:13.451201" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:13.451133" elapsed="0.000480"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:13.456898" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:13.456704" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:13.456664" elapsed="0.000377"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:13.459259" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:13.458468" elapsed="0.000854"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:54:13.460483" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:54:13.459710" elapsed="0.000830"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:54:13.460631" elapsed="0.000069"/>
</return>
<msg time="2026-10-11T00:54:13.460925" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:54:13.457577" elapsed="0.003399"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:13.467142" elapsed="0.000097"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:13.466950" elapsed="0.000375"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:13.466911" elapsed="0.000472"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:13.469904" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:13.469717" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:13.469677" elapsed="0.000366"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:54:13.470839" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:54:13.470449" elapsed="0.000444"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:54:13.471626" 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-10-11T00:54:13.471284" elapsed="0.000395"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:54:13.507578" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:54:13.472844" elapsed="0.034864"/>
</kw>
<msg time="2026-10-11T00:54:13.507924" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:54:13.507982" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:13.472032" elapsed="0.035999"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:54:13.538428" 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-10-11T00:54:13.508890" elapsed="0.029634"/>
</kw>
<msg time="2026-10-11T00:54:13.538671" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:54:13.538712" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:13.508286" elapsed="0.030461"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:13.539023" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:13.538815" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:13.538797" elapsed="0.000297"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:13.539542" 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-10-11T00:54:13.539290" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:13.539864" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:13.539665" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:13.539648" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:54:13.540001" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:54:13.542494" elapsed="0.000238"/>
</kw>
<msg time="2026-10-11T00:54:13.542793" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:13.541435" 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-10-11T00:54:13.543263" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:13.543629" 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-10-11T00:54:13.540809" elapsed="0.003005"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:54:13.540319" elapsed="0.003554"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:54:13.469041" elapsed="0.074906"/>
</kw>
<msg time="2026-10-11T00:54:13.544028" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:54:13.544067" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:13.467796" elapsed="0.076305"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:54:13.544287" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:54:13.544169" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:13.544152" 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-10-11T00:54:13.544724" 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-10-11T00:54:13.545021" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:54:13.545084" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:54:13.466282" elapsed="0.078885"/>
</kw>
<msg time="2026-10-11T00:54:13.545266" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:54:13.545305" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:13.461781" elapsed="0.083558"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:13.545649" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:13.545426" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:13.545389" elapsed="0.000330"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:54:13.461456" elapsed="0.084284"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:54:13.461084" elapsed="0.084686"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:54:13.455923" elapsed="0.089896"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:54:13.450597" elapsed="0.095271"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:13.449614" elapsed="0.096295"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:54:13.447113" elapsed="0.098842"/>
</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-10-11T00:54:13.546115" elapsed="0.000124"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:13.547451" 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-10-11T00:54:13.547112" elapsed="0.000366"/>
</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-10-11T00:54:13.547630" elapsed="0.000171"/>
</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-10-11T00:54:13.546830" elapsed="0.001034"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-10-11T00:54:15.548778" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<msg time="2026-10-11T00:54:15.549110" level="INFO">${output} = [?2004l^C
[?2004h[jenkins@releng-26932-423-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-10-11T00:54:13.548018" elapsed="2.001190"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.550550" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:15.549848" elapsed="0.000807"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-10-11T00:54:13.546531" elapsed="2.004251"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:54:15.559193" level="INFO">Executing command 'cat bgp_peer2.log'.</msg>
<msg time="2026-10-11T00:54:15.572887" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:54:15.573088" level="INFO">${output_log} = 2026-10-11 00:53:33,142 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:53:33,142 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.2
2026-10-11 00:53:33,143 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-10-11T00:54:15.558916" elapsed="0.014227"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.574233" level="INFO">2026-10-11 00:53:33,142 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:53:33,142 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.2
2026-10-11 00:53:33,143 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 00:53:33,143 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 00:53:33,143 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 00:53:33,143 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:53:33,144 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:53:33,144 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:53:33,144 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:53:33,144 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 3
2026-10-11 00:53:33,145 INFO BGP-Thread-1 (job):   Prefix base: 8.2.0.0/28
2026-10-11 00:53:33,145 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 00:53:33,145 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 00:53:33,145 INFO BGP-Thread-1 (job):   My BGP Identifier: 2130706434
2026-10-11 00:53:33,145 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 00:53:33,145 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 00:53:33,145 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 00:53:33,145 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 00:53:33,145 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 00:53:33,145 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 00:53:33,145 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 3
2026-10-11 00:53:33,145 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, 2]
2026-10-11 00:53:33,145 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 00:53:33,145 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 00:53:33,146 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 00:53:33,146 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:33,146 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-10-11 00:53:33,146 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 00:53:33,146 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 00:53:33,146 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-10-11 00:53:33,146 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 00:53:33,146 DEBUG BGP-Thread-1 (job):   BGP Identifier=2130706434 (0x7f000002)
2026-10-11 00:53:33,146 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-10-11 00:53:33,146 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf0
2026-10-11 00:53:33,146 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf000b47f000002100206010400010001020641040000fbf0'
2026-10-11 00:53:33,146 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf000b47f000002100206010400010001020641040000fbf0
2026-10-11 00:53:33,147 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:53:33,147 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:33,147 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:53:33,148 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:53:33,148 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:53:33,148 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:53:33,148 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:33,148 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:53:33,148 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:53:33,148 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:53:33,148 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 00:53:33,148 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 3
2026-10-11 00:53:33,148 DEBUG BGP-Thread-1 (job): ########## Iteration: 0 ##########
2026-10-11 00:53:33,148 DEBUG BGP-Thread-1 (job): Remaining prefixes: 3
2026-10-11 00:53:33,148 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:53:33,148 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:53:33,149 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-10-11 00:53:33,149 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:33,149 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:53:33,149 DEBUG BGP-Thread-1 (job):   Prefix indexes: [0]
2026-10-11 00:53:33,149 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.2.0.0')]
2026-10-11 00:53:33,149 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:53:33,149 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-10-11 00:53:33,149 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:33,149 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:53:33,149 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:53:33,149 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:53:33,153 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:53:33,153 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:33,153 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-10-11 00:53:33,153 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:53:33,153 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:53:33,153 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:53:33,153 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-10-11 00:53:33,154 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-10-11 00:53:33,154 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:53:33,154 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:53:33,154 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:53:33,154 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.2.0.0')]/28 (0x1c08020000)
2026-10-11 00:53:33,154 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08020000
2026-10-11 00:53:33,154 DEBUG BGP-Thread-1 (job): ########## Iteration: 1 ##########
2026-10-11 00:53:33,154 DEBUG BGP-Thread-1 (job): Remaining prefixes: 2
2026-10-11 00:53:33,154 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:53:33,154 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:53:33,154 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-10-11 00:53:33,154 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:33,154 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:53:33,154 DEBUG BGP-Thread-1 (job):   Prefix indexes: [1]
2026-10-11 00:53:33,154 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.2.0.16')]
2026-10-11 00:53:33,154 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:53:33,154 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-10-11 00:53:33,154 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:33,154 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:53:33,154 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:53:33,154 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:53:33,154 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:53:33,154 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:33,154 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-10-11 00:53:33,155 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:53:33,155 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:53:33,155 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:53:33,155 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-10-11 00:53:33,155 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-10-11 00:53:33,155 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:53:33,155 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:53:33,156 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:53:33,156 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.2.0.16')]/28 (0x1c08020010)
2026-10-11 00:53:33,156 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08020010
2026-10-11 00:53:33,156 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 00:53:33,156 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:53:33,156 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:53:33,156 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 00:53:33,156 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:53:33,156 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:53:33,156 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:53:33,156 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:53:33,156 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:53:33,157 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:53:33,157 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:53:33,157 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:53:33,157 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:53:33,157 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:53:33,157 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:53:33,157 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:53:33,158 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-10-11 00:53:33,158 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-10-11 00:53:33,158 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:53:33,158 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:53:33,158 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:53:33,158 DEBUG BGP-Thread-1 (job): ########## Iteration: 2 ##########
2026-10-11 00:53:33,158 DEBUG BGP-Thread-1 (job): Remaining prefixes: 1
2026-10-11 00:53:33,158 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:53:33,158 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:53:33,158 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-10-11 00:53:33,158 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:33,161 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:53:33,161 DEBUG BGP-Thread-1 (job):   Prefix indexes: [2]
2026-10-11 00:53:33,161 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.2.0.32')]
2026-10-11 00:53:33,161 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:53:33,161 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-10-11 00:53:33,161 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:53:33,161 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:53:33,161 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:53:33,161 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:53:33,161 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:53:33,162 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:33,162 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-10-11 00:53:33,162 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:53:33,162 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:53:33,162 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:53:33,162 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-10-11 00:53:33,162 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201)
2026-10-11 00:53:33,162 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:53:33,162 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:53:33,162 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:53:33,162 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.2.0.32')]/28 (0x1c08020020)
2026-10-11 00:53:33,162 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf040050400000064400304c00002011c08020020
2026-10-11 00:53:33,162 INFO BGP-Thread-1 (job): All update messages generated.
2026-10-11 00:53:33,162 INFO BGP-Thread-1 (job): Storing performance results.
2026-10-11 00:53:33,162 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-10-11 00:53:33,163 INFO BGP-Thread-1 (job): Number of iterations: 3
2026-10-11 00:53:33,163 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-10-11 00:53:33,163 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-10-11 00:53:33,163 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 3
2026-10-11 00:53:33,163 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.013870954513549805s
2026-10-11 00:53:33,163 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-10-11 00:53:33,163 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-10-11 00:53:33,163 INFO BGP-Thread-1 (job):   
2026-10-11 00:53:33,163 INFO BGP-Thread-1 (job):   
2026-10-11 00:53:33,163 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-10-11 00:53:33,163 INFO BGP-Thread-1 (job):   
2026-10-11 00:53:33,164 INFO BGP-Thread-1 (job):   
2026-10-11 00:53:33,164 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-10-11 00:53:33,164 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:53:33,164 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:53:33,164 DEBUG BGP-Thread-1 (job):   Length=43 (0x002b)
2026-10-11 00:53:33,164 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:53:33,164 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:53:33,164 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:53:33,164 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=20 (0x0014)
2026-10-11 00:53:33,164 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064)
2026-10-11 00:53:33,164 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:53:33,164 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:53:33,164 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:53:33,164 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-10-11 00:53:33,164 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff002b02000000144001010040020602010000fbf040050400000064
2026-10-11 00:53:43,175 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-10-11 00:53:43,175 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.010s
2026-10-11 00:53:43,176 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:53:43,176 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:53:43,176 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:53:53,186 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-10-11 00:53:53,187 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.020s
2026-10-11 00:53:53,187 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:53:53,187 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:53:53,187 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:54:03,197 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-10-11 00:54:03,197 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 30.030s
2026-10-11 00:54:03,203 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:54:03,203 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:54:03,203 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:54:13,205 INFO BGP-Thread-1 (job): ... idle for 10.002s
2026-10-11 00:54:13,205 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 40.032s
2026-10-11 00:54:13,206 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:54:13,206 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:54:13,206 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-10-11T00:54:15.573680" elapsed="0.001113"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T00:54:15.576094" 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-10-11T00:54:15.575293" elapsed="0.000968"/>
</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-10-11T00:54:15.557968" elapsed="0.018416"/>
</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-10-11T00:54:15.577697" elapsed="0.000541"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:54:15.576978" elapsed="0.001388"/>
</kw>
<doc>Stop BGP peer &amp; store logs</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:54:13.446027" elapsed="2.132444"/>
</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-10-11T00:54:15.581216" elapsed="0.000480"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:54:15.580634" elapsed="0.001173"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:15.583974" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:15.583749" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:15.583703" elapsed="0.000420"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:15.589551" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:15.589326" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:15.589287" elapsed="0.000403"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.591811" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:15.591024" elapsed="0.000843"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.592859" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:54:15.592239" elapsed="0.000673"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:54:15.593001" elapsed="0.000071"/>
</return>
<msg time="2026-10-11T00:54:15.593331" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:54:15.590188" elapsed="0.003194"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:15.599343" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:15.599116" elapsed="0.000355"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:15.599077" elapsed="0.000441"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:15.602096" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:15.601910" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:15.601872" elapsed="0.000398"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:54:15.603017" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:54:15.602637" elapsed="0.000434"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:54:15.603812" 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-10-11T00:54:15.603501" elapsed="0.000362"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:54:15.637962" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:54:15.605014" elapsed="0.033083"/>
</kw>
<msg time="2026-10-11T00:54:15.638373" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:54:15.638461" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:15.604236" elapsed="0.034276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:54:15.672243" 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-10-11T00:54:15.639249" elapsed="0.033096"/>
</kw>
<msg time="2026-10-11T00:54:15.672517" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:54:15.672596" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:15.638750" elapsed="0.033884"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:15.672927" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:15.672704" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:15.672686" elapsed="0.000314"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.673450" 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-10-11T00:54:15.673203" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:15.673780" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:15.673579" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:15.673562" elapsed="0.000289"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:54:15.673880" 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-10-11T00:54:15.676312" elapsed="0.001342"/>
</kw>
<msg time="2026-10-11T00:54:15.677717" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:15.675293" elapsed="0.002561"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:15.678178" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:15.678546" 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-10-11T00:54:15.674676" elapsed="0.004058"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:54:15.674183" elapsed="0.004609"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:54:15.601292" elapsed="0.077572"/>
</kw>
<msg time="2026-10-11T00:54:15.678949" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:54:15.678993" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:15.599859" elapsed="0.079173"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:54:15.679203" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:54:15.679100" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:15.679082" elapsed="0.000197"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:15.679708" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:15.680020" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:54:15.680085" 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-10-11T00:54:15.598477" elapsed="0.081706"/>
</kw>
<msg time="2026-10-11T00:54:15.680267" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:54:15.680306" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:15.594190" elapsed="0.086150"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:15.680649" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:15.680424" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:15.680390" elapsed="0.000330"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:54:15.593844" elapsed="0.086897"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:54:15.593521" elapsed="0.087250"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:54:15.588633" elapsed="0.092187"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:54:15.583101" elapsed="0.097800"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:15.582146" elapsed="0.098796"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:54:15.579815" elapsed="0.101173"/>
</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-10-11T00:54:15.689549" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:54:15.689691" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:54:15.689795" 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-10-11T00:54:15.682072" elapsed="0.007748"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.690341" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:15.690025" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.690917" 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-10-11T00:54:15.690599" elapsed="0.000361"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if the `container` contains the `item`.</doc>
<status status="PASS" start="2026-10-11T00:54:15.691123" elapsed="0.000440"/>
</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-10-11T00:54:15.681751" elapsed="0.009870"/>
</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-10-11T00:54:15.681184" elapsed="0.010481"/>
</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-10-11T00:54:15.692224" elapsed="0.000241"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:54:15.691913" elapsed="0.000610"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:15.578906" elapsed="0.113650"/>
</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-10-11T00:54:15.693937" elapsed="0.000203"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:54:15.693688" 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-10-11T00:54:15.695123" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:15.695035" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:15.695017" elapsed="0.000182"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:15.697541" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:15.697456" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:15.697438" elapsed="0.000165"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.698613" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:15.698200" elapsed="0.000445"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.699069" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:54:15.698807" elapsed="0.000286"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:54:15.699133" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T00:54:15.699275" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:54:15.697810" elapsed="0.001488"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:15.701934" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:15.701849" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:15.701831" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:15.703068" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:15.702954" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:15.702937" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:54:15.703499" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:54:15.703301" elapsed="0.000223"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:54:15.703823" 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-10-11T00:54:15.703688" elapsed="0.000158"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:54:15.744261" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:54:15.704351" elapsed="0.040003"/>
</kw>
<msg time="2026-10-11T00:54:15.744526" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:54:15.744568" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:15.704003" elapsed="0.040600"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:54:15.817785" 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-10-11T00:54:15.745108" elapsed="0.072777"/>
</kw>
<msg time="2026-10-11T00:54:15.818033" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:54:15.818074" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:15.744771" elapsed="0.073338"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:15.818443" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:15.818198" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:15.818177" elapsed="0.000341"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.818927" 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-10-11T00:54:15.818701" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:15.819282" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:15.819053" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:15.819036" elapsed="0.000319"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:54:15.819384" 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-10-11T00:54:15.821824" elapsed="0.000235"/>
</kw>
<msg time="2026-10-11T00:54:15.822118" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:15.820758" elapsed="0.001512"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:15.822599" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:15.822934" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:54:15.820140" 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-10-11T00:54:15.819680" elapsed="0.003516"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:54:15.702698" elapsed="0.120579"/>
</kw>
<msg time="2026-10-11T00:54:15.823359" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:54:15.823398" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:15.702149" elapsed="0.121307"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:54:15.823611" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:54:15.823525" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:15.823508" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:15.824002" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:15.824356" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:54:15.824446" 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-10-11T00:54:15.701562" elapsed="0.122972"/>
</kw>
<msg time="2026-10-11T00:54:15.824618" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:54:15.824657" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:15.699652" elapsed="0.125040"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:15.824981" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:15.824759" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:15.824743" elapsed="0.000309"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:54:15.699507" elapsed="0.125566"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:54:15.699346" elapsed="0.125752"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:54:15.697116" elapsed="0.128029"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:54:15.694781" elapsed="0.130431"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:15.694369" elapsed="0.130883"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:54:15.693329" elapsed="0.131969"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.826036" 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-10-11T00:54:15.825582" elapsed="0.000480"/>
</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-10-11T00:54:15.839964" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:15.839660" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:15.840730" 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-10-11T00:54:15.840505" elapsed="0.000303">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-10-11T00:54:15.840893" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:15.840163" elapsed="0.000753"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.841448" 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-10-11T00:54:15.841089" elapsed="0.000385"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:54:15.841753" 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-10-11T00:54:15.841889" 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-10-11T00:54:15.841643" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.842365" 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-10-11T00:54:15.842131" 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-10-11T00:54:15.843329" 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-10-11T00:54:15.843075" elapsed="0.000296"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.843810" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:54:15.843563" elapsed="0.000302"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.844492" 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-10-11T00:54:15.844202" elapsed="0.000314"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:15.845618" 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-10-11T00:54:15.845418" elapsed="0.000225"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:15.845689" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:54:15.845816" 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-10-11T00:54:15.844688" elapsed="0.001151"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:15.846008" elapsed="0.000381"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:54:15.844054" elapsed="0.002390"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.846948" 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-10-11T00:54:15.846679" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:15.847680" 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-10-11T00:54:15.847499" elapsed="0.000205"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:15.847748" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:15.847873" 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-10-11T00:54:15.847142" elapsed="0.000754"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:15.848059" elapsed="0.000182"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-bgp-peer1</var>
<status status="PASS" start="2026-10-11T00:54:15.846546" elapsed="0.001733"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.848793" 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-10-11T00:54:15.848524" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:15.849510" 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-10-11T00:54:15.849312" elapsed="0.000222"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:15.849577" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:15.849700" 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-10-11T00:54:15.848986" elapsed="0.000736"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:15.849885" elapsed="0.000163"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:54:15.848378" elapsed="0.001706"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.850611" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:54:15.850325" elapsed="0.000310"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:15.851305" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:54:15.851109" elapsed="0.000220"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:15.851372" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:54:15.851511" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:54:15.850802" elapsed="0.000731"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:15.851697" elapsed="0.000163"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:54:15.850195" elapsed="0.001701"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:54:15.843911" elapsed="0.008016"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:54:15.851963" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:54:15.852090" 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-10-11T00:54:15.842737" elapsed="0.009377"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:15.842483" elapsed="0.009660"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:15.852350" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:15.852193" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:15.842466" elapsed="0.009969"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.853169" 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-10-11T00:54:15.852595" elapsed="0.000637"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:54:15.853279" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:15.839128" elapsed="0.014252"/>
</kw>
<msg time="2026-10-11T00:54:15.853445" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:15.834578" elapsed="0.018911"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:15.857961" 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/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-10-11T00:54:15.862307" 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/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-10-11T00:54:15.866810" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:15.866998" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:15.867204" 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-10-11T00:54:15.867565" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:15.867401" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:15.867388" 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-10-11T00:54:15.867791" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:15.867967" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:15.868167" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:54:15.867363" elapsed="0.000853"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:54:15.867275" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:15.868390" elapsed="0.000030"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:15.868470" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:54:15.868581" 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-10-11T00:54:15.833940" elapsed="0.034665"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.869680" 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-10-11T00:54:15.869452" elapsed="0.000272"/>
</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-10-11T00:54:15.881980" level="INFO">DELETE Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:54:15.882025" level="INFO">DELETE Response : url=http://10.30.170.173: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-10-11T00:54:15.882115" 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-10-11T00:54:15.870013" elapsed="0.012127"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:15.869784" elapsed="0.012412"/>
</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-10-11T00:54:15.882382" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:15.882226" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:15.869768" elapsed="0.012713"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.883697" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:15.883422" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:15.883144" elapsed="0.000624"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:15.883127" elapsed="0.000663"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.884354" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:15.884075" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:15.883839" elapsed="0.000603"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:15.883824" elapsed="0.000641"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.884994" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:54:15.884646" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:15.885326" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:15.885082" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.885847" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:15.885583" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:15.885401" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:15.885065" elapsed="0.000858"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.886534" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:54:15.886099" elapsed="0.000465"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:15.886894" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:15.886639" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.887405" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:15.887130" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:15.886968" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:15.886619" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:15.887642" elapsed="0.000288"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:54:15.888353" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:54:15.888091" elapsed="0.000287"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:54:15.888551" elapsed="0.000214"/>
</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-10-11T00:54:15.882814" elapsed="0.006007"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:54:15.888893" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:54:15.889072" 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-10-11T00:54:15.868883" elapsed="0.020213"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:54:15.889143" elapsed="0.000040"/>
</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-10-11T00:54:15.826287" elapsed="0.062970"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.889889" 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-10-11T00:54:15.889454" elapsed="0.000462"/>
</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-10-11T00:54:15.904249" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:15.903933" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:15.904945" 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-10-11T00:54:15.904773" elapsed="0.000233">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-10-11T00:54:15.905088" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:15.904452" elapsed="0.000658"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.905622" 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-10-11T00:54:15.905300" elapsed="0.000347"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:54:15.905919" 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-10-11T00:54:15.906035" 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-10-11T00:54:15.905813" elapsed="0.000247"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.906499" 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-10-11T00:54:15.906267" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.907461" 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-10-11T00:54:15.907214" elapsed="0.000289"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.907937" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:54:15.907693" elapsed="0.000267"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.908580" 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-10-11T00:54:15.908298" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:15.909273" 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-10-11T00:54:15.909080" elapsed="0.000220"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:15.909343" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:15.909483" 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-10-11T00:54:15.908771" elapsed="0.000735"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:15.909669" elapsed="0.000165"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:54:15.908140" elapsed="0.001730"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.910377" 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-10-11T00:54:15.910097" elapsed="0.000304"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:15.911064" 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-10-11T00:54:15.910890" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:15.911186" elapsed="0.000034"/>
</return>
<msg time="2026-10-11T00:54:15.911324" 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-10-11T00:54:15.910584" elapsed="0.000763"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:15.911525" elapsed="0.000168"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-bgp-peer2</var>
<status status="PASS" start="2026-10-11T00:54:15.909968" elapsed="0.001762"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.912384" 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-10-11T00:54:15.911957" elapsed="0.000464"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:15.913072" 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-10-11T00:54:15.912899" elapsed="0.000197"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:15.913139" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:54:15.913275" 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-10-11T00:54:15.912593" elapsed="0.000705"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:15.913477" elapsed="0.000166"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-10-11T00:54:15.911828" elapsed="0.001851"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.914185" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:54:15.913909" elapsed="0.000301"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:15.914873" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:54:15.914699" elapsed="0.000198"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:15.914939" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:15.915061" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:54:15.914379" elapsed="0.000704"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:15.915257" elapsed="0.000183"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:54:15.913778" elapsed="0.001699"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:54:15.908002" elapsed="0.007505"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:54:15.915545" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:54:15.915671" 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-10-11T00:54:15.906850" elapsed="0.008845"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:15.906601" elapsed="0.009122"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:15.915894" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:15.915745" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:15.906584" elapsed="0.009378"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.916673" 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-10-11T00:54:15.916120" elapsed="0.000579"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:54:15.916742" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:15.903427" elapsed="0.013413"/>
</kw>
<msg time="2026-10-11T00:54:15.916887" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:15.898801" elapsed="0.018129"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:15.921313" 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/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-10-11T00:54:15.925653" 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/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-10-11T00:54:15.930071" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:15.930282" 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-10-11T00:54:15.930480" 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-10-11T00:54:15.930819" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:15.930674" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:15.930661" 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-10-11T00:54:15.931046" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:15.931238" 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-10-11T00:54:15.931421" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:54:15.930635" elapsed="0.000835"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:54:15.930548" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:15.931644" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:15.931709" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:54:15.931818" 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-10-11T00:54:15.898149" elapsed="0.033693"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.932925" 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-10-11T00:54:15.932699" elapsed="0.000270"/>
</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-10-11T00:54:15.945835" level="INFO">DELETE Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:54:15.945879" level="INFO">DELETE Response : url=http://10.30.170.173: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-10-11T00:54:15.945966" 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-10-11T00:54:15.933275" elapsed="0.012714"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:15.933029" elapsed="0.012997"/>
</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-10-11T00:54:15.946231" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:15.946050" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:15.933012" elapsed="0.013331"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.947752" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:15.947277" elapsed="0.000516"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:15.947022" elapsed="0.000804"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:15.947005" elapsed="0.000844"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.948439" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:15.948138" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:15.947899" elapsed="0.000615"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:15.947884" elapsed="0.000652"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.949059" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:54:15.948713" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:15.949375" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:15.949146" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.949891" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:15.949628" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:15.949465" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:15.949130" elapsed="0.000837"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.950512" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:54:15.950142" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:15.950807" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:15.950600" elapsed="0.000258"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.951314" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:15.951041" elapsed="0.000297"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:15.950880" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:15.950583" elapsed="0.000806"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:15.951548" elapsed="0.000287"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:54:15.952222" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:54:15.951995" elapsed="0.000251"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:54:15.952397" elapsed="0.000223"/>
</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-10-11T00:54:15.946688" elapsed="0.005987"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:54:15.952716" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:15.952886" 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-10-11T00:54:15.932072" elapsed="0.020838"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:54:15.952956" elapsed="0.000024"/>
</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-10-11T00:54:15.890123" elapsed="0.062926"/>
</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-10-11T00:54:15.953614" elapsed="0.000223"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:54:15.953307" elapsed="0.000586"/>
</kw>
<doc>Delete all previously configured BGP peers.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:54:15.692817" elapsed="0.261110"/>
</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-10-11T00:54:15.955489" elapsed="0.000198"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:54:15.955222" elapsed="0.000514"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:15.956728" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:15.956641" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:15.956624" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:15.958990" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:15.958908" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:15.958892" elapsed="0.000159"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.959961" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:15.959643" elapsed="0.000343"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:54:15.960434" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:54:15.960137" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:54:15.960499" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:15.960624" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:54:15.959271" elapsed="0.001375"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:15.963237" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:15.963127" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:15.963110" elapsed="0.000189"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:15.964344" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:15.964260" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:15.964242" elapsed="0.000186"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:54:15.964746" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:54:15.964578" elapsed="0.000192"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:54:15.965068" 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-10-11T00:54:15.964935" elapsed="0.000156"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:54:15.999251" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:54:15.965641" elapsed="0.033709"/>
</kw>
<msg time="2026-10-11T00:54:15.999525" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:54:15.999566" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:15.965290" elapsed="0.034310"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:54:16.037679" 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-10-11T00:54:16.000102" elapsed="0.037690"/>
</kw>
<msg time="2026-10-11T00:54:16.037941" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:54:16.037982" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:15.999768" elapsed="0.038248"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.038313" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:16.038085" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:16.038067" elapsed="0.000318"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.038815" 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-10-11T00:54:16.038591" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.039144" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:16.038946" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:16.038929" elapsed="0.000302"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:54:16.039260" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:54:16.041871" elapsed="0.000116"/>
</kw>
<msg time="2026-10-11T00:54:16.042043" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:16.040689" elapsed="0.001519"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.042537" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.042869" elapsed="0.000070"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:54:16.040061" elapsed="0.002992"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:54:16.039599" elapsed="0.003514"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:54:15.963987" elapsed="0.079211"/>
</kw>
<msg time="2026-10-11T00:54:16.043281" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:54:16.043319" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:15.963466" elapsed="0.079888"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:54:16.043532" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:54:16.043447" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:16.043428" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.043922" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.044254" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:54:16.044319" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:54:15.962840" elapsed="0.081562"/>
</kw>
<msg time="2026-10-11T00:54:16.044512" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:54:16.044552" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:15.960967" elapsed="0.083619"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.044869" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:16.044652" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:16.044637" elapsed="0.000301"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:54:15.960824" elapsed="0.084135"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:54:15.960691" elapsed="0.084294"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:54:15.958617" elapsed="0.086414"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:54:15.956334" elapsed="0.088745"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:15.955883" elapsed="0.089236"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:54:15.954860" elapsed="0.090327"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.045955" 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-10-11T00:54:16.045366" 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-10-11T00:54:16.056720" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:16.056419" elapsed="0.000327"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:16.057497" 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-10-11T00:54:16.057271" elapsed="0.000287">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-10-11T00:54:16.057644" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:16.056905" elapsed="0.000761"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.058142" 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-10-11T00:54:16.057839" elapsed="0.000340"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:54:16.058468" 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-10-11T00:54:16.058594" 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-10-11T00:54:16.058344" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.059029" 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-10-11T00:54:16.058812" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.060190" 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-10-11T00:54:16.059775" elapsed="0.000459"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.060679" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:54:16.060426" elapsed="0.000278"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.061299" 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-10-11T00:54:16.061019" elapsed="0.000305"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:16.061998" 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-10-11T00:54:16.061818" elapsed="0.000204"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:16.062067" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:16.062214" 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-10-11T00:54:16.061509" elapsed="0.000730"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:16.062417" elapsed="0.000171"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:54:16.060888" elapsed="0.001737"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.063120" 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-10-11T00:54:16.062853" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:16.063835" 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-10-11T00:54:16.063658" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:16.063901" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:16.064023" 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-10-11T00:54:16.063332" elapsed="0.000713"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:16.064236" elapsed="0.000183"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:54:16.062723" elapsed="0.001734"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.064950" 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-10-11T00:54:16.064684" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:16.065650" 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-10-11T00:54:16.065473" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:16.065716" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:16.065838" 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-10-11T00:54:16.065140" elapsed="0.000720"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:16.066023" elapsed="0.000179"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:54:16.064555" elapsed="0.001720"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.066792" 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-10-11T00:54:16.066522" elapsed="0.000294"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:16.067497" 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-10-11T00:54:16.067303" elapsed="0.000218"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:16.067565" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:16.067687" 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-10-11T00:54:16.066984" elapsed="0.000725"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:16.067871" elapsed="0.000164"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:54:16.066375" elapsed="0.001697"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.068597" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:54:16.068313" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:16.069280" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:54:16.069094" elapsed="0.000209"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:16.069347" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:16.069483" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:54:16.068788" elapsed="0.000717"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:16.069668" elapsed="0.000163"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:54:16.068183" elapsed="0.001684"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.070539" 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-10-11T00:54:16.070092" elapsed="0.000471"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:16.071227" 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-10-11T00:54:16.071037" elapsed="0.000213"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:16.071295" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:16.071432" 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-10-11T00:54:16.070730" elapsed="0.000726"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:16.071618" elapsed="0.000195"/>
</kw>
<var name="${key}">RR_CLIENT</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:54:16.069964" elapsed="0.001887"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:54:16.060747" elapsed="0.011134"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:54:16.071919" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:54:16.072047" 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-10-11T00:54:16.059431" elapsed="0.012640"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:16.059131" elapsed="0.012968"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.072281" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:16.072120" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:16.059114" elapsed="0.013236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.073084" 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-10-11T00:54:16.072521" elapsed="0.000595"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:54:16.073171" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:16.055893" elapsed="0.017379"/>
</kw>
<msg time="2026-10-11T00:54:16.073319" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:16.051357" elapsed="0.022005"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:16.077877" 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/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-10-11T00:54:16.082196" 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/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-10-11T00:54:16.086470" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.086651" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.086831" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.087174" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:16.087020" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:16.087007" 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-10-11T00:54:16.087417" 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-10-11T00:54:16.087597" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.087758" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:54:16.086981" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:54:16.086895" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.087975" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:16.088039" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:54:16.088148" 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-10-11T00:54:16.050756" elapsed="0.037429"/>
</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-10-11T00:54:16.098561" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:16.098238" elapsed="0.000349"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:16.099243" 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-10-11T00:54:16.099063" elapsed="0.000239">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-10-11T00:54:16.099434" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:16.098747" elapsed="0.000712"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.099939" 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-10-11T00:54:16.099632" elapsed="0.000332"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:54:16.100249" 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-10-11T00:54:16.100371" 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-10-11T00:54:16.100129" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.100821" 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-10-11T00:54:16.100605" elapsed="0.000271"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:54:16.101219" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:16.100937" elapsed="0.000336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.101720" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:16.101456" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:16.101295" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:16.100920" elapsed="0.000877"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.102626" 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-10-11T00:54:16.101957" elapsed="0.000697"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:54:16.102698" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:16.097722" elapsed="0.005076"/>
</kw>
<msg time="2026-10-11T00:54:16.102851" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:16.092102" elapsed="0.010792"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:16.107845" 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-10-11T00:54:16.112381" 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//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-10-11T00:54:16.116795" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.116989" 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-10-11T00:54:16.117204" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.117577" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:16.117426" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:16.117395" 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-10-11T00:54:16.117808" 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-10-11T00:54:16.117988" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.118173" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:54:16.117367" elapsed="0.000858"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:54:16.117275" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.118418" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:16.118494" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:54:16.118627" 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-10-11T00:54:16.091395" elapsed="0.027259"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:16.119881" 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-10-11T00:54:16.119664" elapsed="0.000280">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-10-11T00:54:16.120028" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:16.119286" 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-10-11T00:54:16.120373" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:16.120114" elapsed="0.000329"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.120911" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:16.120645" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:16.120467" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:16.120097" elapsed="0.000889"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.121579" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:16.121145" elapsed="0.000458"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:54:16.121649" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:16.121773" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:54:16.118934" elapsed="0.002862"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.163827" 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-10-11T00:54:16.122847" elapsed="0.041117"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.164519" 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-10-11T00:54:16.164265" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.165086" 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-10-11T00:54:16.164798" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.165764" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:16.165447" elapsed="0.000378"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:54:16.167039" 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-10-11T00:54:16.166784" elapsed="0.000289"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:54:16.167536" 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-10-11T00:54:16.167299" elapsed="0.000272"/>
</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-10-11T00:54:16.167824" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.168762" 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-10-11T00:54:16.168404" elapsed="0.000419"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:54:16.168885" elapsed="0.000061"/>
</return>
<msg time="2026-10-11T00:54:16.169106" 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-10-11T00:54:16.166167" elapsed="0.002974"/>
</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-10-11T00:54:16.181943" level="INFO">PUT Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.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-10-11T00:54:16.182013" level="INFO">PUT Response : url=http://10.30.170.173: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-10-11T00:54:16.182114" 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-10-11T00:54:16.169686" elapsed="0.012452"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:16.169271" elapsed="0.012939"/>
</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-10-11T00:54:16.182478" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:16.182245" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:16.169242" elapsed="0.013328"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.183859" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:16.183573" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:16.183311" elapsed="0.000619"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:16.183291" elapsed="0.000662"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.184619" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:16.184287" elapsed="0.000374"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:16.184002" elapsed="0.000690"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:16.183987" elapsed="0.000728"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.185369" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:54:16.184920" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.185696" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:16.185477" elapsed="0.000271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.186238" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:16.185940" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:16.185771" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:16.185459" elapsed="0.000876"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.186908" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:54:16.186563" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.187237" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:16.186996" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.187896" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:16.187515" elapsed="0.000406"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:16.187332" elapsed="0.000623"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:16.186979" elapsed="0.000995"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:16.188128" elapsed="0.000374"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:54:16.188906" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:54:16.188667" elapsed="0.000262"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:54:16.189085" elapsed="0.000267"/>
</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-10-11T00:54:16.182977" elapsed="0.006446"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:54:16.189573" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-10-11T00:54:16.189486" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:16.189469" elapsed="0.000184"/>
</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-10-11T00:54:16.189801" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:54:16.189859" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:54:16.190021" 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-10-11T00:54:16.122093" elapsed="0.067953"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:54:16.190105" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:54:16.190269" 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-10-11T00:54:16.046846" elapsed="0.143457"/>
</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-10-11T00:54:16.190659" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:16.190433" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:16.190395" elapsed="0.000387"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:54:16.190815" elapsed="0.000026"/>
</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-10-11T00:54:16.046244" elapsed="0.144674"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.191686" 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-10-11T00:54:16.191106" elapsed="0.000608"/>
</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-10-11T00:54:16.202997" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:16.202697" elapsed="0.000327"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:16.203756" 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-10-11T00:54:16.203538" elapsed="0.000296">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-10-11T00:54:16.203919" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:16.203202" elapsed="0.000740"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.204458" 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-10-11T00:54:16.204114" elapsed="0.000369"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:54:16.204760" 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-10-11T00:54:16.204903" 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-10-11T00:54:16.204650" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.205438" 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-10-11T00:54:16.205145" elapsed="0.000335"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.206383" 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-10-11T00:54:16.206138" elapsed="0.000310"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.207018" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:54:16.206624" elapsed="0.000419"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.207698" 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-10-11T00:54:16.207424" elapsed="0.000298"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:16.208444" 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-10-11T00:54:16.208240" elapsed="0.000229"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:16.208513" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:54:16.208639" 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-10-11T00:54:16.207896" elapsed="0.000765"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:16.208826" elapsed="0.000170"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-10-11T00:54:16.207270" elapsed="0.001762"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.209565" 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-10-11T00:54:16.209281" elapsed="0.000309"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:16.210261" 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-10-11T00:54:16.210069" elapsed="0.000216"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:16.210328" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:16.210509" 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-10-11T00:54:16.209759" 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-10-11T00:54:16.210697" elapsed="0.000166"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:54:16.209135" elapsed="0.001765"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.211437" 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-10-11T00:54:16.211129" elapsed="0.000333"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:16.212114" 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-10-11T00:54:16.211939" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:16.212198" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:16.212326" 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-10-11T00:54:16.211632" elapsed="0.000716"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:16.212526" elapsed="0.000165"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:54:16.210999" elapsed="0.001730"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.213237" 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-10-11T00:54:16.212958" elapsed="0.000303"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:16.213932" 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-10-11T00:54:16.213756" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:16.214001" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:16.214122" 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-10-11T00:54:16.213446" elapsed="0.000699"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:16.214336" elapsed="0.000182"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:54:16.212829" elapsed="0.001727"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.215053" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:54:16.214786" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:16.215769" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:54:16.215592" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:16.215838" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:16.215962" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:54:16.215261" elapsed="0.000723"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:16.216147" elapsed="0.000178"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:54:16.214656" elapsed="0.001707"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.217029" 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-10-11T00:54:16.216610" elapsed="0.000444"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:16.217742" 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-10-11T00:54:16.217566" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:16.217809" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:16.217932" 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-10-11T00:54:16.217242" elapsed="0.000713"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:16.218118" elapsed="0.000181"/>
</kw>
<var name="${key}">RR_CLIENT</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:54:16.216480" elapsed="0.001859"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:54:16.207094" elapsed="0.011276"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:54:16.218431" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:54:16.218563" 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-10-11T00:54:16.205798" elapsed="0.012789"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:16.205542" elapsed="0.013073"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.218786" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:16.218637" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:16.205524" elapsed="0.013366"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.219681" 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-10-11T00:54:16.219050" elapsed="0.000658"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:54:16.219752" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:16.202178" elapsed="0.017673"/>
</kw>
<msg time="2026-10-11T00:54:16.219900" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:16.197456" elapsed="0.022488"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:16.224292" 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-10-11T00:54:16.228779" 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/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-10-11T00:54:16.233174" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.233356" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.233553" 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-10-11T00:54:16.233893" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:16.233746" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:16.233733" 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-10-11T00:54:16.234116" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.234308" 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-10-11T00:54:16.234485" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:54:16.233709" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:54:16.233620" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.234708" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:16.234773" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:54:16.234883" 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-10-11T00:54:16.196784" elapsed="0.038123"/>
</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-10-11T00:54:16.244709" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:16.244393" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:16.245396" 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-10-11T00:54:16.245227" elapsed="0.000244">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-10-11T00:54:16.245554" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:16.244895" elapsed="0.000681"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.246053" 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-10-11T00:54:16.245748" elapsed="0.000330"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:54:16.246365" 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-10-11T00:54:16.246500" 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-10-11T00:54:16.246258" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.246936" 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-10-11T00:54:16.246719" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:54:16.247320" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:16.247055" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.247824" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:16.247560" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:16.247396" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:16.247038" elapsed="0.000862"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.248739" 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-10-11T00:54:16.248061" elapsed="0.000706"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:54:16.248812" 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-10-11T00:54:16.243865" elapsed="0.005047"/>
</kw>
<msg time="2026-10-11T00:54:16.248964" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:16.239020" elapsed="0.009987"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:16.253609" 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/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-10-11T00:54:16.257960" 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/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-10-11T00:54:16.262300" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.262494" 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-10-11T00:54:16.262678" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.263015" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:16.262869" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:16.262856" 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-10-11T00:54:16.263271" 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-10-11T00:54:16.263467" 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-10-11T00:54:16.263632" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:54:16.262830" elapsed="0.000848"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:54:16.262743" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.263855" elapsed="0.000105"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:16.264011" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:54:16.264133" 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-10-11T00:54:16.238301" elapsed="0.025873"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:16.265296" 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-10-11T00:54:16.265096" elapsed="0.000259">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-10-11T00:54:16.265454" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:16.264773" elapsed="0.000705"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.265769" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:16.265542" elapsed="0.000277"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.266287" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:16.266010" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:16.265841" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:16.265525" elapsed="0.000875"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.266921" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:16.266585" elapsed="0.000359"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:54:16.266990" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:16.267113" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:54:16.264467" elapsed="0.002669"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.268567" 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-10-11T00:54:16.268327" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.269018" 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-10-11T00:54:16.268804" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.269517" 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-10-11T00:54:16.269279" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.269987" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:16.269771" elapsed="0.000256"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:54:16.270766" 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-10-11T00:54:16.270607" elapsed="0.000183"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:54:16.271087" 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-10-11T00:54:16.270945" elapsed="0.000166"/>
</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-10-11T00:54:16.271290" elapsed="0.000170"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.271896" 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-10-11T00:54:16.271675" elapsed="0.000261"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:54:16.271974" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:54:16.272101" 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-10-11T00:54:16.270234" elapsed="0.001890"/>
</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-10-11T00:54:16.282323" level="INFO">PUT Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.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-10-11T00:54:16.282385" level="INFO">PUT Response : url=http://10.30.170.173: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-10-11T00:54:16.282537" 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-10-11T00:54:16.272452" elapsed="0.010110"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:16.272200" elapsed="0.010404"/>
</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-10-11T00:54:16.282786" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:16.282627" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:16.272184" elapsed="0.010681"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.284045" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:16.283773" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:16.283518" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:16.283501" elapsed="0.000638"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.284749" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:16.284480" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:16.284202" elapsed="0.000619"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:16.284187" elapsed="0.000655"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.285401" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:54:16.285026" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.285721" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:16.285507" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.286255" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:16.285961" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:16.285795" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:16.285491" elapsed="0.000859"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.286947" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:54:16.286600" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.287288" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:16.287034" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.287809" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:16.287545" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:16.287364" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:16.287018" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:16.288031" elapsed="0.000329"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:54:16.288769" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:54:16.288542" elapsed="0.000251"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:54:16.288951" elapsed="0.000229"/>
</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-10-11T00:54:16.283208" elapsed="0.006032"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:54:16.289383" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-10-11T00:54:16.289300" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:16.289283" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.289625" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:54:16.289685" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:54:16.289844" 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-10-11T00:54:16.267636" elapsed="0.022232"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:54:16.289924" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:54:16.290083" 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-10-11T00:54:16.192632" elapsed="0.097474"/>
</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-10-11T00:54:16.290422" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:16.290205" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:16.290189" elapsed="0.000318"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:54:16.290537" elapsed="0.000024"/>
</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-10-11T00:54:16.191963" elapsed="0.098671"/>
</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-10-11T00:54:16.291355" elapsed="0.000249"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:54:16.290891" elapsed="0.000771"/>
</kw>
<doc>Configure two iBGP peers as routing reflector clients with cluster-id argument.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:54:15.954227" elapsed="0.337473"/>
</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-10-11T00:54:16.293243" elapsed="0.000219"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:54:16.292952" 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-10-11T00:54:16.294587" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:16.294498" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:16.294479" elapsed="0.000171"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:16.296795" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:16.296712" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:16.296695" elapsed="0.000160"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.297786" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:16.297462" elapsed="0.000350"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.298240" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:54:16.297966" elapsed="0.000298"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:54:16.298305" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:16.298447" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:54:16.297062" elapsed="0.001408"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:16.301353" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:16.301257" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:16.301235" 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-10-11T00:54:16.302529" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:16.302444" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:16.302425" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:54:16.302908" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:54:16.302740" elapsed="0.000192"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:54:16.303264" 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-10-11T00:54:16.303098" elapsed="0.000189"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:54:16.336294" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:54:16.303799" elapsed="0.032595"/>
</kw>
<msg time="2026-10-11T00:54:16.336572" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:54:16.336613" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:16.303462" elapsed="0.033229"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:54:16.362722" 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-10-11T00:54:16.337237" elapsed="0.025586"/>
</kw>
<msg time="2026-10-11T00:54:16.362973" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:54:16.363014" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:16.336866" elapsed="0.026184"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.363351" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:16.363120" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:16.363101" elapsed="0.000348"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.363862" 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-10-11T00:54:16.363637" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.364199" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:16.363984" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:16.363968" elapsed="0.000303"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:54:16.364301" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:54:16.366868" elapsed="0.000115"/>
</kw>
<msg time="2026-10-11T00:54:16.367040" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:16.365789" 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-10-11T00:54:16.367541" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.367882" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:54:16.365090" 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-10-11T00:54:16.364620" elapsed="0.003505"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:54:16.302145" elapsed="0.066067"/>
</kw>
<msg time="2026-10-11T00:54:16.368295" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:54:16.368335" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:16.301588" elapsed="0.066783"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:54:16.368549" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:54:16.368464" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:16.368445" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.368951" 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-10-11T00:54:16.369272" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:54:16.369337" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:54:16.300933" elapsed="0.068512"/>
</kw>
<msg time="2026-10-11T00:54:16.369530" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:54:16.369570" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:16.298797" elapsed="0.070811"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:16.369897" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:16.369674" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:16.369658" elapsed="0.000347"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:54:16.298655" elapsed="0.071371"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:54:16.298516" elapsed="0.071537"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:54:16.296405" elapsed="0.073697"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:54:16.294065" elapsed="0.076164"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:16.293670" elapsed="0.076613"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:54:16.292612" elapsed="0.077733"/>
</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-10-11T00:54:16.370626" elapsed="0.000100"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.372853" level="INFO">${peer1_cluster_id} = 127.0.0.4</msg>
<arg>${peer1_cluster_id}</arg>
<arg>127.0.0.4</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:54:16.370923" elapsed="0.001973"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.374968" level="INFO">${default_cluster_id} = 192.0.2.2</msg>
<arg>${default_cluster_id}</arg>
<arg>192.0.2.2</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:54:16.373096" elapsed="0.001915"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.378438" 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.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:16.378132" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.378888" 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.173 --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-10-11T00:54:16.378674" elapsed="0.000257"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:54:16.383708" 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.173 --peerport=1790 --debug --logfile bgp_peer1.log --cluster=127.0.0.4 &amp;&gt;bgp_peer1.log</msg>
<msg time="2026-10-11T00:54:16.383797" 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.173 --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-10-11T00:54:16.379089" elapsed="0.004733"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.384288" 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.173 --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-10-11T00:54:16.384036" elapsed="0.000296"/>
</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-10-11T00:54:16.377732" elapsed="0.006649"/>
</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-10-11T00:54:16.392208" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:54:16.392369" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:54:16.392490" 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-10-11T00:54:16.385532" elapsed="0.006983"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.393000" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:16.392720" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.393648" 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-10-11T00:54:16.393265" elapsed="0.000426"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-11T00:54:16.394304" 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 the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-11T00:54:16.393857" elapsed="0.000510">'{"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-10-11T00:54:16.385121" elapsed="0.009398">'{"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-10-11T00:54:17.405281" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:54:17.405601" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:54:17.405817" 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-10-11T00:54:17.396396" elapsed="0.009478"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:17.407109" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:17.406375" elapsed="0.000858"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:17.408546" 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-10-11T00:54:17.407707" elapsed="0.000939"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:54:17.409021" elapsed="0.000955"/>
</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-10-11T00:54:17.395328" elapsed="0.014779"/>
</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-10-11T00:54:16.384598" elapsed="1.025691"/>
</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-10-11T00:54:17.410719" elapsed="0.000222"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:17.419343" 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.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:17.418643" elapsed="0.000763"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:17.420465" 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.173 --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-10-11T00:54:17.419911" elapsed="0.000654"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:54:17.427366" 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.173 --peerport=1790 --debug --logfile bgp_peer2.log --cluster=127.0.0.2 &amp;&gt;bgp_peer2.log</msg>
<msg time="2026-10-11T00:54:17.427591" 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.173 --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-10-11T00:54:17.420930" elapsed="0.006717"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:17.428697" 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.173 --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-10-11T00:54:17.428125" elapsed="0.000670"/>
</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-10-11T00:54:17.417662" elapsed="0.011245"/>
</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-10-11T00:54:17.440174" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:54:17.440457" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:54:17.440674" 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-10-11T00:54:17.431522" elapsed="0.009291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:17.441980" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:17.441314" elapsed="0.000758"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:17.443358" 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-10-11T00:54:17.442565" elapsed="0.000924"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-11T00:54:17.444857" 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 the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-11T00:54:17.443859" elapsed="0.001147">'{"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-10-11T00:54:17.430639" elapsed="0.014708">'{"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-10-11T00:54:18.456313" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:54:18.456642" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:54:18.456860" 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-10-11T00:54:18.447533" elapsed="0.009382"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.458156" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:18.457444" elapsed="0.000809"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.459584" 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-10-11T00:54:18.458778" elapsed="0.000909"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:54:18.460058" elapsed="0.000977"/>
</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-10-11T00:54:18.446335" elapsed="0.014863"/>
</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-10-11T00:54:17.429360" elapsed="1.031947"/>
</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-10-11T00:54:18.462654" elapsed="0.000547"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:54:18.461915" elapsed="0.001417"/>
</kw>
<doc>Connect BGP peers, each set to send 3 prefixes.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:54:16.292084" elapsed="2.171350"/>
</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-10-11T00:54:18.467307" elapsed="0.000482"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:54:18.466721" elapsed="0.001181"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:18.470087" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:18.469869" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:18.469819" elapsed="0.000685"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:18.476058" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:18.475868" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:18.475830" elapsed="0.000392"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.478340" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:18.477577" elapsed="0.000820"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.479390" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:54:18.478778" elapsed="0.000694"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:54:18.479564" elapsed="0.000074"/>
</return>
<msg time="2026-10-11T00:54:18.479862" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:54:18.476721" elapsed="0.003191"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:18.486008" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:18.485818" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:18.485779" elapsed="0.000395"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:18.488651" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:18.488460" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:18.488377" elapsed="0.000412"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:54:18.489574" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:54:18.489153" elapsed="0.000477"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:54:18.490335" 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-10-11T00:54:18.489996" elapsed="0.000392"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:54:18.525083" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:54:18.491604" elapsed="0.033631"/>
</kw>
<msg time="2026-10-11T00:54:18.525483" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:54:18.525544" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:18.490788" elapsed="0.034806"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:54:18.564253" 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-10-11T00:54:18.526377" elapsed="0.037988"/>
</kw>
<msg time="2026-10-11T00:54:18.564545" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:54:18.564588" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:18.525849" elapsed="0.038774"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.564907" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:18.564694" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:18.564675" elapsed="0.000303"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.565421" 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-10-11T00:54:18.565179" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.565756" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:18.565557" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:18.565541" elapsed="0.000285"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:54:18.565855" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:54:18.568433" elapsed="0.000242"/>
</kw>
<msg time="2026-10-11T00:54:18.568735" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:18.567293" elapsed="0.001580"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.569212" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.569730" 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-10-11T00:54:18.566687" elapsed="0.003238"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:54:18.566187" elapsed="0.003797"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:54:18.487816" elapsed="0.082242"/>
</kw>
<msg time="2026-10-11T00:54:18.570166" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:54:18.570208" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:18.486551" elapsed="0.083693"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:54:18.570512" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-11T00:54:18.570313" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:18.570295" elapsed="0.000298"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.570923" 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-10-11T00:54:18.571237" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:54:18.571304" 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-10-11T00:54:18.485127" elapsed="0.086262"/>
</kw>
<msg time="2026-10-11T00:54:18.571490" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:54:18.571530" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:18.480750" elapsed="0.090815"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.571850" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:18.571631" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:18.571615" elapsed="0.000304"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:54:18.480380" elapsed="0.091561"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:54:18.480022" elapsed="0.091948"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:54:18.475165" elapsed="0.096855"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:54:18.469252" elapsed="0.102817"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:18.468280" elapsed="0.103830"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:54:18.465893" elapsed="0.106329"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.572934" 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-10-11T00:54:18.572442" elapsed="0.000519"/>
</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-10-11T00:54:18.589469" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:18.589147" elapsed="0.000349"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:18.590223" 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-10-11T00:54:18.589980" elapsed="0.000353">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-10-11T00:54:18.590436" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:18.589657" elapsed="0.000803"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.590945" 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-10-11T00:54:18.590635" elapsed="0.000335"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:54:18.591263" 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-10-11T00:54:18.591417" 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-10-11T00:54:18.591149" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.591859" 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-10-11T00:54:18.591640" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.594208" 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-10-11T00:54:18.593956" elapsed="0.000294"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.594691" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:54:18.594442" elapsed="0.000273"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.595316" 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-10-11T00:54:18.595034" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:18.596175" 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-10-11T00:54:18.595842" elapsed="0.000358"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:18.596245" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:54:18.596371" 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-10-11T00:54:18.595528" elapsed="0.000871"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:18.596591" elapsed="0.000177"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:54:18.594901" elapsed="0.001903"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.597383" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:54:18.597037" elapsed="0.000388"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:18.598222" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:54:18.597907" elapsed="0.000340"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:18.598293" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:18.598441" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:54:18.597596" elapsed="0.000869"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:18.598631" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:54:18.596905" elapsed="0.001927"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.599360" 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-10-11T00:54:18.599061" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:18.600195" 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-10-11T00:54:18.599886" elapsed="0.000334"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:18.600265" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:18.600391" 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-10-11T00:54:18.599576" elapsed="0.000860"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:18.600603" elapsed="0.000164"/>
</kw>
<var name="${key}">PEER_NUMBER</var>
<var name="${value}">2</var>
<status status="PASS" start="2026-10-11T00:54:18.598930" elapsed="0.001873"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.601357" 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-10-11T00:54:18.601070" elapsed="0.000311"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:18.602196" 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-10-11T00:54:18.601884" elapsed="0.000337"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:18.602266" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:18.602395" 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-10-11T00:54:18.601576" 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-10-11T00:54:18.602608" elapsed="0.000165"/>
</kw>
<var name="${key}">CLUSTER_ID</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-10-11T00:54:18.600938" elapsed="0.001872"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.603342" 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-10-11T00:54:18.603042" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:18.604182" 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-10-11T00:54:18.603871" elapsed="0.000335"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:18.604251" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:18.604375" 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-10-11T00:54:18.603563" 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-10-11T00:54:18.604586" elapsed="0.000168"/>
</kw>
<var name="${key}">DEFAULT_ID</var>
<var name="${value}">192.0.2.2</var>
<status status="PASS" start="2026-10-11T00:54:18.602910" elapsed="0.001880"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:54:18.594758" elapsed="0.010063"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:54:18.604858" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:54:18.604989" 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-10-11T00:54:18.592249" elapsed="0.012763"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:18.591962" elapsed="0.013078"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.605224" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:18.605062" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:18.591944" elapsed="0.013351"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.606250" 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-10-11T00:54:18.605484" elapsed="0.000793"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:54:18.606321" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:18.588634" elapsed="0.017812"/>
</kw>
<msg time="2026-10-11T00:54:18.606496" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:18.584041" elapsed="0.022498"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:18.610923" 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/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-10-11T00:54:18.615304" 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/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-10-11T00:54:18.619681" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.619865" 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-10-11T00:54:18.620048" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.620421" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:18.620259" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:18.620245" 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-10-11T00:54:18.620652" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.620833" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.620996" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:54:18.620218" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:54:18.620115" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.621247" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:18.621315" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:54:18.621441" 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-10-11T00:54:18.583448" elapsed="0.038019"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:18.622593" 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-10-11T00:54:18.622382" elapsed="0.000271">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-10-11T00:54:18.622735" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:18.622036" elapsed="0.000722"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.623042" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:18.622820" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.623578" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:18.623300" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:18.623115" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:18.622804" elapsed="0.000850"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.624172" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:18.623817" elapsed="0.000380"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:54:18.624243" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:18.624367" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:54:18.621734" elapsed="0.002655"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:18.625525" 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-10-11T00:54:18.625314" elapsed="0.000303">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-10-11T00:54:18.625703" 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-10-11T00:54:18.624960" elapsed="0.000765"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:54:18.625886" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:54:18.625788" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:18.625772" elapsed="0.000190"/>
</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-10-11T00:54:18.626117" elapsed="0.000033"/>
</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-10-11T00:54:18.626313" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:54:18.626371" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:54:18.626512" 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-10-11T00:54:18.624660" elapsed="0.001876"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.627787" 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-10-11T00:54:18.627560" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.628255" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:18.628022" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:54:18.637424" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:54:18.637549" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:54:18.637651" 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-10-11T00:54:18.628770" elapsed="0.008906"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:18.628355" elapsed="0.009361"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.637896" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:18.637740" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:18.628338" elapsed="0.009635"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.639270" 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-10-11T00:54:18.638917" elapsed="0.000402"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:18.638677" elapsed="0.000675"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:18.638659" elapsed="0.000718"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.639958" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:18.639688" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:18.639446" elapsed="0.000614"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:18.639430" elapsed="0.000656"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.640657" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:54:18.640284" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.640959" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:18.640746" elapsed="0.000265"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.641526" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:18.641243" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:18.641033" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:18.640729" elapsed="0.000874"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.642116" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:54:18.641779" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.642441" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:18.642217" elapsed="0.000277"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.642938" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:18.642678" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:18.642516" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:18.642200" elapsed="0.000814"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:18.643194" elapsed="0.000315"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:54:18.643895" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:54:18.643669" elapsed="0.000250"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:54:18.644073" elapsed="0.000231"/>
</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-10-11T00:54:18.638316" elapsed="0.006044"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:18.644530" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:18.644441" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:18.644405" elapsed="0.000187"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:54:18.645815" 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-10-11T00:54:18.644741" elapsed="0.001101"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:54:18.645889" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:18.646017" 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-10-11T00:54:18.626818" elapsed="0.019223"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:54:18.646096" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:54:18.646632" 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-10-11T00:54:18.575656" elapsed="0.071011"/>
</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-10-11T00:54:18.657816" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:18.657514" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:18.658598" 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-10-11T00:54:18.658398" elapsed="0.000259">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-10-11T00:54:18.658742" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:18.658062" elapsed="0.000702"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.659278" 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-10-11T00:54:18.658938" elapsed="0.000365"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:54:18.659607" 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-10-11T00:54:18.659732" 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-10-11T00:54:18.659495" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.660186" 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-10-11T00:54:18.659952" 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-10-11T00:54:18.660573" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:18.660306" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.661061" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:18.660797" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:18.660649" elapsed="0.000468"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:18.660288" elapsed="0.000863"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.662108" 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-10-11T00:54:18.661316" elapsed="0.000832"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:54:18.662193" 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-10-11T00:54:18.656976" elapsed="0.005319"/>
</kw>
<msg time="2026-10-11T00:54:18.662355" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:18.652386" elapsed="0.010014"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:18.666809" 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//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-10-11T00:54:18.671351" 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/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-10-11T00:54:18.675780" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.675964" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.676172" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.676545" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:18.676384" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:18.676370" 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-10-11T00:54:18.676774" 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-10-11T00:54:18.676954" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.677116" elapsed="0.000035"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:54:18.676344" elapsed="0.000837"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:54:18.676252" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.677359" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:18.677440" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:54:18.677564" 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-10-11T00:54:18.651668" elapsed="0.025921"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:18.677757" elapsed="0.000330"/>
</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-10-11T00:54:18.679725" 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-10-11T00:54:18.678755" elapsed="0.000998"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:54:18.680861" 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-10-11T00:54:18.679906" elapsed="0.000982"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:54:18.681111" 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-10-11T00:54:18.678377" elapsed="0.003135"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:18.678171" elapsed="0.003371"/>
</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-10-11T00:54:18.681741" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:18.681565" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:18.678154" elapsed="0.003656"/>
</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-10-11T00:54:18.647691" elapsed="0.034162"/>
</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-10-11T00:54:18.646999" elapsed="0.034919"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:18.646756" elapsed="0.035202"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:18.646732" elapsed="0.035247"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:54:18.682008" elapsed="0.000026"/>
</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-10-11T00:54:18.575016" elapsed="0.107090"/>
</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-10-11T00:54:18.573187" elapsed="0.108987"/>
</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-10-11T00:54:18.682742" elapsed="0.000224"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:54:18.682447" elapsed="0.000576"/>
</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-10-11T00:54:18.464237" elapsed="0.218819"/>
</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-10-11T00:54:18.684604" elapsed="0.000199"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:54:18.684333" elapsed="0.000519"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:18.685760" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:18.685673" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:18.685656" elapsed="0.000166"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:18.688097" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:18.688014" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:18.687996" elapsed="0.000177"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.689077" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:18.688754" elapsed="0.000348"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.689548" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:54:18.689271" elapsed="0.000301"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:54:18.689613" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:18.689738" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:54:18.688380" elapsed="0.001381"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:18.692389" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:18.692305" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:18.692287" elapsed="0.000179"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:18.693526" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:18.693440" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:18.693398" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:54:18.693939" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:54:18.693768" elapsed="0.000196"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:54:18.694300" 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-10-11T00:54:18.694126" elapsed="0.000197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:54:18.727113" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:54:18.694840" elapsed="0.032381"/>
</kw>
<msg time="2026-10-11T00:54:18.727374" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:54:18.727437" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:18.694503" elapsed="0.032970"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:54:18.766824" 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-10-11T00:54:18.727989" elapsed="0.038941"/>
</kw>
<msg time="2026-10-11T00:54:18.767079" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:54:18.767120" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:18.727642" elapsed="0.039528"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.767478" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:18.767241" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:18.767223" elapsed="0.000329"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.767957" 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-10-11T00:54:18.767732" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.768306" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:18.768086" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:18.768068" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:54:18.768421" 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-10-11T00:54:18.770852" elapsed="0.000242"/>
</kw>
<msg time="2026-10-11T00:54:18.771167" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:18.769794" 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-10-11T00:54:18.771630" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.771960" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:54:18.769186" 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-10-11T00:54:18.768699" 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-10-11T00:54:18.693160" elapsed="0.079129"/>
</kw>
<msg time="2026-10-11T00:54:18.772370" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:54:18.772434" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:18.692620" elapsed="0.079850"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:54:18.772625" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:54:18.772539" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:18.772522" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.773023" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.773386" elapsed="0.000047"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:54:18.773477" 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-10-11T00:54:18.691990" elapsed="0.081573"/>
</kw>
<msg time="2026-10-11T00:54:18.773646" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:54:18.773685" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:18.690083" elapsed="0.083635"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.774005" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:18.773785" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:18.773769" elapsed="0.000305"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:54:18.689941" elapsed="0.084155"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:54:18.689806" elapsed="0.084316"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:54:18.687720" elapsed="0.086465"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:54:18.685422" elapsed="0.088814"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:18.685001" elapsed="0.089275"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:54:18.683978" elapsed="0.090344"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.775077" 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-10-11T00:54:18.774604" elapsed="0.000499"/>
</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-10-11T00:54:18.791698" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:18.791370" elapsed="0.000354"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:18.792397" 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-10-11T00:54:18.792216" elapsed="0.000263">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-10-11T00:54:18.792565" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:18.791882" elapsed="0.000705"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.793064" 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-10-11T00:54:18.792758" elapsed="0.000332"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:54:18.793388" 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-10-11T00:54:18.793523" 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-10-11T00:54:18.793274" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.793957" 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-10-11T00:54:18.793741" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.795093" 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-10-11T00:54:18.794683" elapsed="0.000468"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.795638" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:54:18.795365" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.796262" 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-10-11T00:54:18.795978" elapsed="0.000309"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:18.797090" 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-10-11T00:54:18.796789" elapsed="0.000326"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:18.797192" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:54:18.797326" 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-10-11T00:54:18.796480" elapsed="0.000869"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:18.797536" elapsed="0.000172"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-10-11T00:54:18.795846" elapsed="0.001899"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.798265" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:54:18.797974" elapsed="0.000316"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:18.799086" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:54:18.798786" elapsed="0.000325"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:18.799173" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:18.799298" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:54:18.798478" 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-10-11T00:54:18.799513" elapsed="0.000169"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:54:18.797844" elapsed="0.001874"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.800231" 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-10-11T00:54:18.799949" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:18.801047" 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-10-11T00:54:18.800755" elapsed="0.000316"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:18.801116" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T00:54:18.801256" 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-10-11T00:54:18.800447" 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-10-11T00:54:18.801469" elapsed="0.000168"/>
</kw>
<var name="${key}">PEER_NUMBER</var>
<var name="${value}">1</var>
<status status="PASS" start="2026-10-11T00:54:18.799819" elapsed="0.001853"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.802200" 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-10-11T00:54:18.801900" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:18.803157" 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-10-11T00:54:18.802726" elapsed="0.000456"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:18.803227" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:18.803352" 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-10-11T00:54:18.802395" 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-10-11T00:54:18.803563" elapsed="0.000166"/>
</kw>
<var name="${key}">CLUSTER_ID</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:54:18.801771" elapsed="0.001995"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.804276" 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-10-11T00:54:18.803995" elapsed="0.000305"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:18.805101" 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-10-11T00:54:18.804808" elapsed="0.000317"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:18.805184" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:54:18.805309" 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-10-11T00:54:18.804496" 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-10-11T00:54:18.805519" elapsed="0.000168"/>
</kw>
<var name="${key}">DEFAULT_ID</var>
<var name="${value}">127.0.0.4</var>
<status status="PASS" start="2026-10-11T00:54:18.803866" elapsed="0.001896"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:54:18.795705" elapsed="0.010091"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:54:18.805834" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:54:18.806120" 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-10-11T00:54:18.794327" elapsed="0.011838"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:18.794059" elapsed="0.012143"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.806430" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:18.806232" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:18.794041" elapsed="0.012465"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.807261" 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-10-11T00:54:18.806666" elapsed="0.000628"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:54:18.807350" 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//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-10-11T00:54:18.790837" elapsed="0.016647"/>
</kw>
<msg time="2026-10-11T00:54:18.807534" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:18.786256" elapsed="0.021321"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:18.812148" 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//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-10-11T00:54:18.816559" 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/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-10-11T00:54:18.820919" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.821104" 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-10-11T00:54:18.821311" 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-10-11T00:54:18.821672" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:18.821523" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:18.821509" 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-10-11T00:54:18.821901" 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-10-11T00:54:18.822082" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.822264" elapsed="0.000052"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:54:18.821483" elapsed="0.000867"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:54:18.821379" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.822546" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:18.822616" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:54:18.822733" 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-10-11T00:54:18.785636" elapsed="0.037122"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:18.823900" 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-10-11T00:54:18.823705" elapsed="0.000258">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-10-11T00:54:18.824046" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:18.823354" elapsed="0.000716"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.824393" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:18.824164" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.824928" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:18.824662" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:18.824487" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:18.824116" elapsed="0.000889"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.825577" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:18.825204" elapsed="0.000397"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:54:18.825645" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:18.825769" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:54:18.823029" elapsed="0.002763"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:18.826926" 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-10-11T00:54:18.826744" elapsed="0.000240">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-10-11T00:54:18.827068" 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-10-11T00:54:18.826419" elapsed="0.000671"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:54:18.827295" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:54:18.827179" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:18.827156" elapsed="0.000216"/>
</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-10-11T00:54:18.827542" elapsed="0.000020"/>
</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-10-11T00:54:18.827717" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:54:18.827774" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:54:18.827897" 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-10-11T00:54:18.826042" elapsed="0.001878"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.829374" 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-10-11T00:54:18.828949" elapsed="0.000485"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:18.829885" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:18.829663" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:54:18.836981" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:54:18.837105" level="INFO">GET Response : url=http://10.30.170.173: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=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-10-11T00:54:18.837217" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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</msg>
<var>${response}</var>
<arg>${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-10-11T00:54:18.830280" elapsed="0.007575">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</kw>
<status status="FAIL" start="2026-10-11T00:54:18.829986" elapsed="0.007948">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:18.838121" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:18.837965" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-10-11T00:54:18.829969" elapsed="0.008245">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</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-10-11T00:54:18.838580" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:18.838699" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:18.838666" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:18.838651" elapsed="0.000104"/>
</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-10-11T00:54:18.838896" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:54:18.838956" elapsed="0.000013"/>
</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-10-11T00:54:18.828225" elapsed="0.010825">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:18.839114" 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-10-11T00:54:18.777861" elapsed="0.061349">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</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-10-11T00:54:18.839468" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:18.839291" elapsed="0.000242"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:18.839275" elapsed="0.000280"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:18.839583" elapsed="0.000014"/>
</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="FAIL" start="2026-10-11T00:54:18.777111" elapsed="0.062562">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</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-10-11T00:54:19.877497" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:19.876714" elapsed="0.000850"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:19.879277" 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-10-11T00:54:19.878720" elapsed="0.000734">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-10-11T00:54:19.879650" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:19.877932" elapsed="0.001768"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:19.880833" 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-10-11T00:54:19.880089" elapsed="0.000800"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:54:19.881561" 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-10-11T00:54:19.881840" 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-10-11T00:54:19.881280" elapsed="0.000615"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:19.882878" 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-10-11T00:54:19.882357" elapsed="0.000615"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:19.885079" 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-10-11T00:54:19.884557" elapsed="0.000677"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:19.886256" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:54:19.885660" elapsed="0.000649"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:19.887743" 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-10-11T00:54:19.887061" elapsed="0.000735"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:19.889697" 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-10-11T00:54:19.888921" elapsed="0.000832"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:19.889855" elapsed="0.000071"/>
</return>
<msg time="2026-10-11T00:54:19.890167" 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-10-11T00:54:19.888197" elapsed="0.002021"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:19.890621" elapsed="0.000417"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-10-11T00:54:19.886766" elapsed="0.004376"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:19.892324" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:54:19.891700" elapsed="0.000677"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:19.893978" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:54:19.893558" elapsed="0.000456"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:19.894076" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:54:19.894268" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:54:19.892803" 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-10-11T00:54:19.894557" elapsed="0.000233"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:54:19.891367" elapsed="0.003474"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:19.895645" 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-10-11T00:54:19.895246" elapsed="0.000432"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:19.897024" 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-10-11T00:54:19.896384" elapsed="0.000674"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:19.897137" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T00:54:19.897315" 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-10-11T00:54:19.895914" elapsed="0.001431"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:19.897613" elapsed="0.000234"/>
</kw>
<var name="${key}">PEER_NUMBER</var>
<var name="${value}">1</var>
<status status="PASS" start="2026-10-11T00:54:19.895051" elapsed="0.002848"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:19.898693" 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-10-11T00:54:19.898288" elapsed="0.000439"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:19.899846" 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-10-11T00:54:19.899435" elapsed="0.000444"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:19.899940" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:54:19.900109" 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-10-11T00:54:19.898963" 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-10-11T00:54:19.900386" elapsed="0.000267"/>
</kw>
<var name="${key}">CLUSTER_ID</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:54:19.898036" elapsed="0.002668"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:19.901434" 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-10-11T00:54:19.901021" elapsed="0.000448"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:19.902590" 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-10-11T00:54:19.902149" elapsed="0.000475"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:19.902684" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:54:19.902856" 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-10-11T00:54:19.901703" 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-10-11T00:54:19.903163" elapsed="0.000274"/>
</kw>
<var name="${key}">DEFAULT_ID</var>
<var name="${value}">127.0.0.4</var>
<status status="PASS" start="2026-10-11T00:54:19.900841" elapsed="0.002651"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:54:19.886438" elapsed="0.017099"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:54:19.903589" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T00:54:19.903770" 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-10-11T00:54:19.883746" elapsed="0.020058"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:19.883118" elapsed="0.020726"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:19.904087" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:19.903877" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:19.883074" elapsed="0.021126"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:19.905271" 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-10-11T00:54:19.904454" elapsed="0.000854"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:54:19.905369" elapsed="0.000066"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:19.875341" elapsed="0.030200"/>
</kw>
<msg time="2026-10-11T00:54:19.905609" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:19.864326" elapsed="0.041345"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:19.911878" elapsed="0.000079"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:19.919695" 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/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-10-11T00:54:19.925768" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:19.926026" 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-10-11T00:54:19.926297" 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-10-11T00:54:19.926793" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:19.926589" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:19.926570" elapsed="0.000325"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:19.927115" elapsed="0.000044"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:19.927386" elapsed="0.000044"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:19.927636" elapsed="0.000045"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:54:19.926533" elapsed="0.001189"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:54:19.926391" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:19.927967" elapsed="0.000025"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:19.928057" elapsed="0.000020"/>
</return>
<msg time="2026-10-11T00:54:19.928244" 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-10-11T00:54:19.862870" elapsed="0.065411"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:19.929882" 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-10-11T00:54:19.929622" elapsed="0.000344">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-10-11T00:54:19.930082" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:19.929097" elapsed="0.001017"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:19.930556" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:19.930223" elapsed="0.000406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:19.931310" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:19.930904" elapsed="0.000482"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:19.930660" elapsed="0.000793"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:19.930199" elapsed="0.001283"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:19.932211" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:19.931714" elapsed="0.000535"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:54:19.932311" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:54:19.932543" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:54:19.928672" elapsed="0.003912"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:19.933755" 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-10-11T00:54:19.933569" elapsed="0.000244">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-10-11T00:54:19.933897" 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-10-11T00:54:19.933213" elapsed="0.000707"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:54:19.934081" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-11T00:54:19.933983" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:19.933966" elapsed="0.000206"/>
</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-10-11T00:54:19.934330" elapsed="0.000019"/>
</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-10-11T00:54:19.934522" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:54:19.934581" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:54:19.934706" 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-10-11T00:54:19.932895" elapsed="0.001834"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:19.935956" 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-10-11T00:54:19.935735" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:19.936436" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:19.936204" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:54:19.943735" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:54:19.943877" level="INFO">GET Response : url=http://10.30.170.173: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=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-10-11T00:54:19.943978" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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</msg>
<var>${response}</var>
<arg>${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-10-11T00:54:19.936764" elapsed="0.007589">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</kw>
<status status="FAIL" start="2026-10-11T00:54:19.936536" elapsed="0.007966">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:19.944790" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:19.944557" elapsed="0.000313"/>
</branch>
<status status="FAIL" start="2026-10-11T00:54:19.936519" elapsed="0.008380">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</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-10-11T00:54:19.945453" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:19.945621" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:19.945574" elapsed="0.000099"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:19.945553" elapsed="0.000148"/>
</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-10-11T00:54:19.945900" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:54:19.945986" elapsed="0.000019"/>
</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-10-11T00:54:19.935002" elapsed="0.011114">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:19.946222" elapsed="0.000020"/>
</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-10-11T00:54:19.845255" elapsed="0.101085">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</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-10-11T00:54:19.946706" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:19.946479" elapsed="0.000316"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:19.946456" elapsed="0.000369"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:19.946865" elapsed="0.000018"/>
</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="FAIL" start="2026-10-11T00:54:19.843627" elapsed="0.103357">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</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-10-11T00:54:20.984195" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:20.983454" elapsed="0.000808"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:20.985864" 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-10-11T00:54:20.985439" elapsed="0.000569">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-10-11T00:54:20.986222" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:20.984664" elapsed="0.001609"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:20.987445" 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-10-11T00:54:20.986695" elapsed="0.000808"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:54:20.988157" 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-10-11T00:54:20.988483" 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-10-11T00:54:20.987885" elapsed="0.000656"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:20.989665" 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-10-11T00:54:20.989104" elapsed="0.000658"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:20.992399" 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-10-11T00:54:20.991447" elapsed="0.001079"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:20.993573" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:54:20.992932" elapsed="0.000697"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:20.995031" 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-10-11T00:54:20.994394" elapsed="0.000691"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:20.997393" 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-10-11T00:54:20.996469" elapsed="0.001026"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:20.997606" elapsed="0.000074"/>
</return>
<msg time="2026-10-11T00:54:20.997906" 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-10-11T00:54:20.995590" elapsed="0.002367"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:20.998355" elapsed="0.000430"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-10-11T00:54:20.994066" elapsed="0.004803"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:21.000063" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:54:20.999458" elapsed="0.000685"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:21.001847" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:54:21.001305" elapsed="0.000576"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:21.001943" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:54:21.002132" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:54:21.000581" elapsed="0.001584"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:21.002397" elapsed="0.000268"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:54:20.999092" elapsed="0.003625"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:21.003454" 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-10-11T00:54:21.003034" elapsed="0.000455"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:21.004637" 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-10-11T00:54:21.004185" elapsed="0.000487"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:21.004737" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:54:21.004910" 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-10-11T00:54:21.003731" elapsed="0.001210"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:21.005196" elapsed="0.000267"/>
</kw>
<var name="${key}">PEER_NUMBER</var>
<var name="${value}">1</var>
<status status="PASS" start="2026-10-11T00:54:21.002853" elapsed="0.002663"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:21.006234" 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-10-11T00:54:21.005837" elapsed="0.000431"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:21.007455" 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-10-11T00:54:21.006972" elapsed="0.000521"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:21.007555" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:54:21.007728" 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-10-11T00:54:21.006539" elapsed="0.001220"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:21.007989" elapsed="0.000249"/>
</kw>
<var name="${key}">CLUSTER_ID</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:54:21.005654" elapsed="0.002637"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:21.009040" 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-10-11T00:54:21.008667" elapsed="0.000407"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:21.010278" 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-10-11T00:54:21.009845" elapsed="0.000468"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:21.010376" elapsed="0.000068"/>
</return>
<msg time="2026-10-11T00:54:21.010584" 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-10-11T00:54:21.009382" elapsed="0.001234"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:21.010845" elapsed="0.000229"/>
</kw>
<var name="${key}">DEFAULT_ID</var>
<var name="${value}">127.0.0.4</var>
<status status="PASS" start="2026-10-11T00:54:21.008472" elapsed="0.002675"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:54:20.993732" elapsed="0.017461"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:54:21.011251" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T00:54:21.011689" 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-10-11T00:54:20.990577" elapsed="0.021147"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:20.989926" elapsed="0.021839"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:21.012012" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:21.011798" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:20.989879" elapsed="0.022245"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:21.013192" 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-10-11T00:54:21.012354" elapsed="0.000876"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:54:21.013291" 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/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-10-11T00:54:20.982235" elapsed="0.031227"/>
</kw>
<msg time="2026-10-11T00:54:21.013534" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:20.971619" elapsed="0.041978"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:21.019795" 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/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-10-11T00:54:21.026063" 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/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-10-11T00:54:21.031035" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:21.031233" 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-10-11T00:54:21.031431" 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-10-11T00:54:21.031775" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:21.031627" elapsed="0.000231"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:21.031614" 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-10-11T00:54:21.032039" 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-10-11T00:54:21.032235" 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-10-11T00:54:21.032401" elapsed="0.000039"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:54:21.031588" elapsed="0.000882"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:54:21.031500" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:21.032645" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:21.032712" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:54:21.032826" 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-10-11T00:54:20.970188" elapsed="0.062664"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:21.033973" 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-10-11T00:54:21.033787" elapsed="0.000245">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-10-11T00:54:21.034130" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:21.033459" elapsed="0.000695"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:21.034454" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:21.034218" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:21.034971" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:21.034709" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:21.034528" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:21.034200" elapsed="0.000848"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:21.035575" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:21.035220" elapsed="0.000380"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:54:21.035654" elapsed="0.000033"/>
</return>
<msg time="2026-10-11T00:54:21.035790" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:54:21.033135" elapsed="0.002678"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:21.036908" 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-10-11T00:54:21.036722" elapsed="0.000244">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-10-11T00:54:21.037051" 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-10-11T00:54:21.036379" elapsed="0.000694"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:54:21.037256" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:54:21.037157" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:21.037139" elapsed="0.000193"/>
</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-10-11T00:54:21.037502" elapsed="0.000020"/>
</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-10-11T00:54:21.037677" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:54:21.037735" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:54:21.037908" 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-10-11T00:54:21.036065" elapsed="0.001868"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:21.039359" 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-10-11T00:54:21.038954" elapsed="0.000462"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:21.039834" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:21.039614" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:54:21.047278" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:54:21.047448" level="INFO">GET Response : url=http://10.30.170.173: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=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-10-11T00:54:21.047541" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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</msg>
<var>${response}</var>
<arg>${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-10-11T00:54:21.040194" elapsed="0.007726">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</kw>
<status status="FAIL" start="2026-10-11T00:54:21.039935" elapsed="0.008064">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:21.048197" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:21.048029" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-10-11T00:54:21.039918" elapsed="0.008359">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</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-10-11T00:54:21.048640" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:21.048759" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:21.048727" elapsed="0.000069"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:21.048710" elapsed="0.000104"/>
</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-10-11T00:54:21.048957" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:54:21.049018" 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-10-11T00:54:21.038237" elapsed="0.010887">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:21.049191" 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-10-11T00:54:20.952659" elapsed="0.096618">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</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-10-11T00:54:21.049541" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:21.049358" elapsed="0.000282"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:21.049342" elapsed="0.000321"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:21.049694" elapsed="0.000014"/>
</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="FAIL" start="2026-10-11T00:54:20.951060" elapsed="0.098722">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</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-10-11T00:54:22.086534" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:22.085782" elapsed="0.000816"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:22.088183" 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-10-11T00:54:22.087732" elapsed="0.000595">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-10-11T00:54:22.088553" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:22.086960" elapsed="0.001645"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:22.089749" 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-10-11T00:54:22.088995" elapsed="0.000812"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:54:22.090479" 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-10-11T00:54:22.090792" 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-10-11T00:54:22.090203" elapsed="0.000645"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:22.091864" 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-10-11T00:54:22.091339" elapsed="0.000619"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:22.093515" 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-10-11T00:54:22.093169" elapsed="0.000406"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:22.094193" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:54:22.093822" elapsed="0.000405"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:22.095085" 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-10-11T00:54:22.094715" elapsed="0.000419"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:22.096378" 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-10-11T00:54:22.095897" elapsed="0.000544"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:22.096509" elapsed="0.000046"/>
</return>
<msg time="2026-10-11T00:54:22.096697" 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-10-11T00:54:22.095373" elapsed="0.001356"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:22.096960" elapsed="0.000265"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-10-11T00:54:22.094527" elapsed="0.002750"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:22.097999" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:54:22.097619" elapsed="0.000414"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:22.099190" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:54:22.098753" elapsed="0.000524"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:22.099344" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:54:22.099561" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:54:22.098289" elapsed="0.001304"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:22.099821" elapsed="0.000230"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:54:22.097436" elapsed="0.002684"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:22.100837" 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-10-11T00:54:22.100464" elapsed="0.000406"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:22.102241" 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-10-11T00:54:22.101588" elapsed="0.000688"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:22.102339" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:54:22.102554" 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-10-11T00:54:22.101126" elapsed="0.001460"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:22.102816" elapsed="0.000231"/>
</kw>
<var name="${key}">PEER_NUMBER</var>
<var name="${value}">1</var>
<status status="PASS" start="2026-10-11T00:54:22.100262" elapsed="0.002836"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:22.103831" 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-10-11T00:54:22.103457" elapsed="0.000407"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:22.104992" 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-10-11T00:54:22.104580" elapsed="0.000446"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:22.105087" elapsed="0.000059"/>
</return>
<msg time="2026-10-11T00:54:22.105282" 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-10-11T00:54:22.104099" elapsed="0.001215"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:22.105585" elapsed="0.000232"/>
</kw>
<var name="${key}">CLUSTER_ID</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:54:22.103255" elapsed="0.002614"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:22.106600" 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-10-11T00:54:22.106203" elapsed="0.000430"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:22.107969" 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-10-11T00:54:22.107309" elapsed="0.000695"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:22.108067" elapsed="0.000063"/>
</return>
<msg time="2026-10-11T00:54:22.108267" 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-10-11T00:54:22.106867" elapsed="0.001431"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:22.108600" elapsed="0.000240"/>
</kw>
<var name="${key}">DEFAULT_ID</var>
<var name="${value}">127.0.0.4</var>
<status status="PASS" start="2026-10-11T00:54:22.106005" elapsed="0.002886"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:54:22.094291" elapsed="0.014642"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:54:22.108988" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T00:54:22.109186" 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-10-11T00:54:22.092677" elapsed="0.016543"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:22.092098" elapsed="0.017164"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:22.109537" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:22.109295" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:22.092057" elapsed="0.017578"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:22.110688" 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-10-11T00:54:22.109857" elapsed="0.000868"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:54:22.110785" 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//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-10-11T00:54:22.084589" elapsed="0.026333"/>
</kw>
<msg time="2026-10-11T00:54:22.111036" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:22.073843" elapsed="0.037277"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:22.117303" 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//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-10-11T00:54:22.123781" 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/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-10-11T00:54:22.130224" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:22.130505" 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-10-11T00:54:22.130762" 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-10-11T00:54:22.131259" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:22.131032" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:22.131012" 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-10-11T00:54:22.131598" 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-10-11T00:54:22.131848" 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-10-11T00:54:22.132074" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:54:22.130977" elapsed="0.001179"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:54:22.130855" elapsed="0.001333"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:22.132398" elapsed="0.000045"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:22.132510" elapsed="0.000021"/>
</return>
<msg time="2026-10-11T00:54:22.132666" 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-10-11T00:54:22.072440" elapsed="0.060260"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:22.134256" 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-10-11T00:54:22.133976" elapsed="0.000364">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-10-11T00:54:22.134478" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:22.133524" elapsed="0.000986"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:22.134953" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:22.134644" elapsed="0.000380"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:22.135738" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:22.135339" elapsed="0.000433"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:22.135055" elapsed="0.000762"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:22.134618" elapsed="0.001226"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:22.136579" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:22.136069" elapsed="0.000543"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:54:22.136675" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:54:22.136847" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:54:22.133068" elapsed="0.003811"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:22.138445" 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-10-11T00:54:22.138168" elapsed="0.000359">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-10-11T00:54:22.138644" 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-10-11T00:54:22.137701" elapsed="0.000975"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:54:22.138901" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-10-11T00:54:22.138764" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:22.138740" 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-10-11T00:54:22.139237" elapsed="0.000028"/>
</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-10-11T00:54:22.139504" elapsed="0.000027"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:54:22.139587" elapsed="0.000019"/>
</return>
<msg time="2026-10-11T00:54:22.139760" 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-10-11T00:54:22.137258" elapsed="0.002534"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:22.141359" 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-10-11T00:54:22.141135" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:22.141831" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:22.141614" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:54:22.149150" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:54:22.149296" level="INFO">GET Response : url=http://10.30.170.173: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=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-10-11T00:54:22.149389" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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</msg>
<var>${response}</var>
<arg>${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-10-11T00:54:22.142175" elapsed="0.007742">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</kw>
<status status="FAIL" start="2026-10-11T00:54:22.141932" elapsed="0.008064">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:22.150232" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:22.150054" elapsed="0.000237"/>
</branch>
<status status="FAIL" start="2026-10-11T00:54:22.141915" elapsed="0.008398">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</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-10-11T00:54:22.150668" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:22.150786" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:22.150754" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:22.150738" elapsed="0.000105"/>
</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-10-11T00:54:22.150984" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:54:22.151046" elapsed="0.000013"/>
</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-10-11T00:54:22.140200" elapsed="0.010953">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:22.151220" 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-10-11T00:54:22.054925" elapsed="0.096383">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</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-10-11T00:54:22.151574" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:22.151390" elapsed="0.000248"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:22.151374" elapsed="0.000286"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:22.151690" elapsed="0.000013"/>
</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="FAIL" start="2026-10-11T00:54:22.053405" elapsed="0.098371">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</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-10-11T00:54:23.188324" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:23.187601" elapsed="0.000788"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:23.189982" 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-10-11T00:54:23.189559" elapsed="0.000592">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-10-11T00:54:23.190348" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:23.188792" elapsed="0.001606"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:23.191564" 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-10-11T00:54:23.190816" elapsed="0.000805"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:54:23.192259" 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-10-11T00:54:23.192682" 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-10-11T00:54:23.191990" elapsed="0.000749"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:23.193733" 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-10-11T00:54:23.193201" elapsed="0.000630"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:23.196025" 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-10-11T00:54:23.195383" elapsed="0.000702"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:23.196735" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:54:23.196352" elapsed="0.000417"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:23.197650" 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-10-11T00:54:23.197252" elapsed="0.000432"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:23.198850" 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-10-11T00:54:23.198374" elapsed="0.000511"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:23.198951" elapsed="0.000048"/>
</return>
<msg time="2026-10-11T00:54:23.199162" 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-10-11T00:54:23.197923" 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-10-11T00:54:23.199461" elapsed="0.000259"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-10-11T00:54:23.197048" elapsed="0.002723"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:23.200507" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:54:23.200109" elapsed="0.000432"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:23.201676" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:54:23.201218" elapsed="0.000493"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:23.201772" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:54:23.201944" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:54:23.200775" 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-10-11T00:54:23.202222" elapsed="0.000268"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:54:23.199913" elapsed="0.002629"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:23.203247" 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-10-11T00:54:23.202859" elapsed="0.000421"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:23.204550" 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-10-11T00:54:23.204081" elapsed="0.000506"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:23.204650" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:54:23.204825" 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-10-11T00:54:23.203639" elapsed="0.001218"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:23.205084" elapsed="0.000251"/>
</kw>
<var name="${key}">PEER_NUMBER</var>
<var name="${value}">1</var>
<status status="PASS" start="2026-10-11T00:54:23.202678" elapsed="0.002708"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:23.206126" 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-10-11T00:54:23.205740" elapsed="0.000422"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:23.207295" 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-10-11T00:54:23.206862" elapsed="0.000467"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:23.207390" elapsed="0.000070"/>
</return>
<msg time="2026-10-11T00:54:23.207597" 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-10-11T00:54:23.206400" elapsed="0.001228"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:23.207856" elapsed="0.000230"/>
</kw>
<var name="${key}">CLUSTER_ID</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:54:23.205557" elapsed="0.002596"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:23.208939" 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-10-11T00:54:23.208562" elapsed="0.000411"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:23.210131" 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-10-11T00:54:23.209700" elapsed="0.000470"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:23.210232" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:54:23.210405" 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-10-11T00:54:23.209237" elapsed="0.001237"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:23.210705" elapsed="0.000232"/>
</kw>
<var name="${key}">DEFAULT_ID</var>
<var name="${value}">127.0.0.4</var>
<status status="PASS" start="2026-10-11T00:54:23.208344" elapsed="0.002645"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:54:23.196836" elapsed="0.014196"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:54:23.211085" elapsed="0.000260"/>
</return>
<msg time="2026-10-11T00:54:23.211519" 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-10-11T00:54:23.194597" elapsed="0.016957"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:23.193978" elapsed="0.017616"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:23.211837" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:23.211627" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:23.193934" elapsed="0.017999"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:23.213008" 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-10-11T00:54:23.212175" elapsed="0.000870"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:54:23.213123" 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/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-10-11T00:54:23.186397" elapsed="0.026870"/>
</kw>
<msg time="2026-10-11T00:54:23.213336" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:23.175986" elapsed="0.037411"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:23.219580" 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//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-10-11T00:54:23.225884" 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//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-10-11T00:54:23.231923" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:23.232191" 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-10-11T00:54:23.232461" 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-10-11T00:54:23.232991" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:23.232786" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:23.232768" elapsed="0.000323"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:23.233329" 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-10-11T00:54:23.233602" 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-10-11T00:54:23.233833" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:54:23.232732" elapsed="0.001167"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:54:23.232608" elapsed="0.001323"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:23.234158" elapsed="0.000027"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:23.234252" elapsed="0.000021"/>
</return>
<msg time="2026-10-11T00:54:23.234426" 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-10-11T00:54:23.174492" elapsed="0.059970"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:23.236049" 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-10-11T00:54:23.235780" elapsed="0.000370">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-10-11T00:54:23.236269" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:23.235295" 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-10-11T00:54:23.236741" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:23.236389" elapsed="0.000407"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:23.237274" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:23.236997" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:23.236818" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:23.236365" elapsed="0.000984"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:23.237865" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:23.237531" elapsed="0.000357"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:54:23.237932" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:23.238054" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:54:23.234838" elapsed="0.003239"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:23.239180" 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-10-11T00:54:23.238974" elapsed="0.000264">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-10-11T00:54:23.239323" 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-10-11T00:54:23.238656" elapsed="0.000689"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:54:23.239523" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:54:23.239423" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:23.239391" elapsed="0.000211"/>
</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-10-11T00:54:23.239757" elapsed="0.000019"/>
</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-10-11T00:54:23.239975" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:54:23.240035" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:54:23.240176" 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-10-11T00:54:23.238342" elapsed="0.001859"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:23.241610" 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-10-11T00:54:23.241362" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:23.242062" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:23.241845" elapsed="0.000269"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:54:23.249587" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:54:23.249740" level="INFO">GET Response : url=http://10.30.170.173: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=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-10-11T00:54:23.249834" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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</msg>
<var>${response}</var>
<arg>${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-10-11T00:54:23.242405" elapsed="0.007812">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</kw>
<status status="FAIL" start="2026-10-11T00:54:23.242176" elapsed="0.008122">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:23.250504" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:23.250329" elapsed="0.000233"/>
</branch>
<status status="FAIL" start="2026-10-11T00:54:23.242159" elapsed="0.008424">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</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-10-11T00:54:23.250920" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:23.251038" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:23.251006" elapsed="0.000068"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:23.250990" 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-10-11T00:54:23.251254" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:54:23.251315" elapsed="0.000013"/>
</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-10-11T00:54:23.240500" elapsed="0.010923">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:23.251489" elapsed="0.000014"/>
</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-10-11T00:54:23.157030" elapsed="0.094542">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</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-10-11T00:54:23.251850" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:23.251687" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:23.251671" elapsed="0.000264"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:23.251964" elapsed="0.000013"/>
</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="FAIL" start="2026-10-11T00:54:23.155472" elapsed="0.096577">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</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-10-11T00:54:24.292261" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:24.291533" elapsed="0.000795"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:24.294072" 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-10-11T00:54:24.293638" elapsed="0.000609">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-10-11T00:54:24.294469" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:24.292733" elapsed="0.001789"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:24.295668" 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-10-11T00:54:24.294911" elapsed="0.000801"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:54:24.296143" 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-10-11T00:54:24.296337" 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-10-11T00:54:24.295945" elapsed="0.000426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:24.297055" 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-10-11T00:54:24.296714" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:24.298517" 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-10-11T00:54:24.298167" elapsed="0.000410"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:24.299195" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:54:24.298823" elapsed="0.000407"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:24.300111" 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-10-11T00:54:24.299720" elapsed="0.000426"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:24.301319" 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-10-11T00:54:24.300841" elapsed="0.000512"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:24.301449" elapsed="0.000050"/>
</return>
<msg time="2026-10-11T00:54:24.301644" 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-10-11T00:54:24.300385" elapsed="0.001291"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:24.301908" elapsed="0.000270"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-10-11T00:54:24.299532" elapsed="0.002697"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:24.302948" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:54:24.302575" elapsed="0.000406"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:24.304195" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:54:24.303762" elapsed="0.000468"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:24.304293" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:54:24.304508" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:54:24.303296" 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-10-11T00:54:24.304771" elapsed="0.000230"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:54:24.302367" elapsed="0.002687"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:24.305782" 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-10-11T00:54:24.305389" elapsed="0.000426"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:24.306940" 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-10-11T00:54:24.306525" elapsed="0.000450"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:24.307037" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:54:24.307250" 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-10-11T00:54:24.306049" elapsed="0.001232"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:24.307546" elapsed="0.000232"/>
</kw>
<var name="${key}">PEER_NUMBER</var>
<var name="${value}">1</var>
<status status="PASS" start="2026-10-11T00:54:24.305208" elapsed="0.002622"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:24.308774" 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-10-11T00:54:24.308164" elapsed="0.000644"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:24.309941" 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-10-11T00:54:24.309525" elapsed="0.000450"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:24.310038" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:54:24.310245" 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-10-11T00:54:24.309046" elapsed="0.001231"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:24.310551" elapsed="0.000233"/>
</kw>
<var name="${key}">CLUSTER_ID</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:54:24.307966" elapsed="0.002871"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:24.311654" 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-10-11T00:54:24.311244" elapsed="0.000444"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:24.312813" 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-10-11T00:54:24.312368" elapsed="0.000479"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:24.312909" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:54:24.313080" 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-10-11T00:54:24.311925" elapsed="0.001207"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:24.313361" elapsed="0.000267"/>
</kw>
<var name="${key}">DEFAULT_ID</var>
<var name="${value}">127.0.0.4</var>
<status status="PASS" start="2026-10-11T00:54:24.310974" elapsed="0.002706"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:54:24.299298" elapsed="0.014426"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:54:24.313778" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T00:54:24.313956" 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-10-11T00:54:24.297654" elapsed="0.016335"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:24.297234" elapsed="0.016797"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:24.314287" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:24.314064" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:24.297202" elapsed="0.017183"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:24.315484" 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-10-11T00:54:24.314638" elapsed="0.000884"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:54:24.315583" 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//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-10-11T00:54:24.290305" elapsed="0.025415"/>
</kw>
<msg time="2026-10-11T00:54:24.315833" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:24.277050" elapsed="0.038847"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:24.322045" 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/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-10-11T00:54:24.326380" 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//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-10-11T00:54:24.330725" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:24.330908" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:24.331101" 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-10-11T00:54:24.331459" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:24.331299" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:24.331285" 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-10-11T00:54:24.331690" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:24.331870" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:24.332034" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:54:24.331260" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:54:24.331169" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:24.332272" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:24.332338" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:54:24.332463" 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-10-11T00:54:24.275648" elapsed="0.056840"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:24.333595" 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-10-11T00:54:24.333394" elapsed="0.000291">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-10-11T00:54:24.333770" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:24.333055" elapsed="0.000738"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:24.334078" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:24.333855" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:24.334630" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:24.334351" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:24.334167" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:24.333838" elapsed="0.000874"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:24.335228" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:24.334875" elapsed="0.000377"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:54:24.335297" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:24.335436" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:54:24.332755" elapsed="0.002704"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:24.336728" 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-10-11T00:54:24.336542" elapsed="0.000245">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-10-11T00:54:24.336871" 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-10-11T00:54:24.336199" elapsed="0.000695"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:54:24.337055" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:54:24.336957" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:24.336940" elapsed="0.000206"/>
</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-10-11T00:54:24.337301" elapsed="0.000020"/>
</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-10-11T00:54:24.337492" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:54:24.337552" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:54:24.337675" 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-10-11T00:54:24.335710" elapsed="0.001988"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:24.338924" 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-10-11T00:54:24.338702" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:24.339423" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:24.339171" 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-10-11T00:54:24.346721" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:54:24.346867" level="INFO">GET Response : url=http://10.30.170.173: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=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-10-11T00:54:24.346966" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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</msg>
<var>${response}</var>
<arg>${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-10-11T00:54:24.339757" elapsed="0.007589">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</kw>
<status status="FAIL" start="2026-10-11T00:54:24.339524" elapsed="0.007956">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:24.347781" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:24.347523" elapsed="0.000338"/>
</branch>
<status status="FAIL" start="2026-10-11T00:54:24.339507" elapsed="0.008384">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</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-10-11T00:54:24.348376" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:24.348565" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:24.348519" elapsed="0.000097"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:24.348496" elapsed="0.000147"/>
</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-10-11T00:54:24.348839" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:54:24.348924" 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-10-11T00:54:24.337976" elapsed="0.011077">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:24.349162" elapsed="0.000020"/>
</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-10-11T00:54:24.257564" elapsed="0.091715">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</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-10-11T00:54:24.349637" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:24.349392" elapsed="0.000334"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:24.349371" elapsed="0.000385"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:24.349796" elapsed="0.000019"/>
</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="FAIL" start="2026-10-11T00:54:24.255872" elapsed="0.094042">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</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-10-11T00:54:25.388120" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:25.387344" elapsed="0.000842"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:25.389829" 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-10-11T00:54:25.389359" elapsed="0.000615">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-10-11T00:54:25.390186" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:25.388606" elapsed="0.001631"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:25.391527" 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-10-11T00:54:25.390767" elapsed="0.000818"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:54:25.392236" 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-10-11T00:54:25.392577" 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-10-11T00:54:25.391963" elapsed="0.000670"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:25.393643" 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-10-11T00:54:25.393072" elapsed="0.000646"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:25.395019" 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-10-11T00:54:25.394694" elapsed="0.000401"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:25.395731" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:54:25.395349" elapsed="0.000416"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:25.396647" 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-10-11T00:54:25.396248" elapsed="0.000432"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:25.397846" 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-10-11T00:54:25.397377" elapsed="0.000503"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:25.397947" elapsed="0.000047"/>
</return>
<msg time="2026-10-11T00:54:25.398179" 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-10-11T00:54:25.396918" elapsed="0.001294"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:25.398479" elapsed="0.000255"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-10-11T00:54:25.396040" elapsed="0.002745"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:25.399727" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:54:25.399125" elapsed="0.000636"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:25.400899" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:54:25.400480" elapsed="0.000453"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:25.400997" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:54:25.401190" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:54:25.399996" elapsed="0.001226"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:25.401493" elapsed="0.000235"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:54:25.398924" elapsed="0.002856"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:25.402514" 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-10-11T00:54:25.402116" elapsed="0.000431"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:25.403691" 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-10-11T00:54:25.403244" elapsed="0.000481"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:25.403788" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:54:25.403960" 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-10-11T00:54:25.402780" elapsed="0.001211"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:25.404239" elapsed="0.000267"/>
</kw>
<var name="${key}">PEER_NUMBER</var>
<var name="${value}">1</var>
<status status="PASS" start="2026-10-11T00:54:25.401917" elapsed="0.002644"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:25.405273" 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-10-11T00:54:25.404879" elapsed="0.000429"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:25.406466" 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-10-11T00:54:25.406010" elapsed="0.000492"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:25.406613" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T00:54:25.406791" 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-10-11T00:54:25.405574" elapsed="0.001249"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:25.407053" elapsed="0.000257"/>
</kw>
<var name="${key}">CLUSTER_ID</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:54:25.404697" elapsed="0.002665"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:25.408111" 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-10-11T00:54:25.407716" elapsed="0.000431"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:25.409306" 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-10-11T00:54:25.408845" elapsed="0.000496"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:25.409405" elapsed="0.000073"/>
</return>
<msg time="2026-10-11T00:54:25.409616" 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-10-11T00:54:25.408383" elapsed="0.001265"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:25.409877" elapsed="0.000248"/>
</kw>
<var name="${key}">DEFAULT_ID</var>
<var name="${value}">127.0.0.4</var>
<status status="PASS" start="2026-10-11T00:54:25.407532" elapsed="0.002645"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:54:25.395830" elapsed="0.014391"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:54:25.410274" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T00:54:25.410490" 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-10-11T00:54:25.394194" elapsed="0.016331"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:25.393817" elapsed="0.016749"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:25.410811" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:25.410600" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:25.393786" elapsed="0.017123"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:25.411992" 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-10-11T00:54:25.411153" elapsed="0.000877"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:54:25.412109" 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/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-10-11T00:54:25.385986" elapsed="0.026266"/>
</kw>
<msg time="2026-10-11T00:54:25.412320" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:25.374779" elapsed="0.037603"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:25.418856" 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//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-10-11T00:54:25.423674" 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/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-10-11T00:54:25.427980" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:25.428213" 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-10-11T00:54:25.428398" 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-10-11T00:54:25.428757" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:25.428609" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:25.428595" 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-10-11T00:54:25.428986" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:25.429193" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:25.429358" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:54:25.428569" elapsed="0.000849"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:54:25.428480" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:25.429597" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:25.429663" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:54:25.429773" 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-10-11T00:54:25.373338" elapsed="0.056460"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:25.430959" 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-10-11T00:54:25.430773" elapsed="0.000245">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-10-11T00:54:25.431130" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:25.430445" elapsed="0.000709"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:25.431455" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:25.431218" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:25.431978" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:25.431713" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:25.431530" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:25.431201" elapsed="0.000853"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:25.432588" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:25.432232" elapsed="0.000379"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:54:25.432656" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:25.432779" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:54:25.430068" elapsed="0.002734"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:25.433997" 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-10-11T00:54:25.433810" elapsed="0.000245">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-10-11T00:54:25.434185" 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-10-11T00:54:25.433364" elapsed="0.000845"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:54:25.434394" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-10-11T00:54:25.434273" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:25.434256" elapsed="0.000228"/>
</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-10-11T00:54:25.434639" elapsed="0.000020"/>
</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-10-11T00:54:25.434812" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:54:25.434870" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:54:25.434993" 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-10-11T00:54:25.433050" elapsed="0.001966"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:25.436303" 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-10-11T00:54:25.436023" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:25.436767" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:25.436553" elapsed="0.000253"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:54:25.443999" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:54:25.444170" level="INFO">GET Response : url=http://10.30.170.173: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=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-10-11T00:54:25.444265" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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</msg>
<var>${response}</var>
<arg>${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-10-11T00:54:25.437102" elapsed="0.007640">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</kw>
<status status="FAIL" start="2026-10-11T00:54:25.436864" elapsed="0.007993">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:25.445133" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:25.444900" elapsed="0.000314"/>
</branch>
<status status="FAIL" start="2026-10-11T00:54:25.436847" elapsed="0.008397">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</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-10-11T00:54:25.445734" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:25.445899" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:25.445853" elapsed="0.000097"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:25.445831" elapsed="0.000146"/>
</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-10-11T00:54:25.446189" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:54:25.446277" elapsed="0.000019"/>
</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-10-11T00:54:25.435313" elapsed="0.011114">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:25.446576" 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-10-11T00:54:25.355562" elapsed="0.091137">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</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-10-11T00:54:25.447038" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:25.446812" elapsed="0.000335"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:25.446790" elapsed="0.000387"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:25.447219" elapsed="0.000019"/>
</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="FAIL" start="2026-10-11T00:54:25.353972" elapsed="0.093367">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</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-10-11T00:54:26.484638" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:26.483872" elapsed="0.000836"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:26.486392" 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-10-11T00:54:26.485921" elapsed="0.000662">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-10-11T00:54:26.486804" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:26.485112" elapsed="0.001744"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:26.487997" 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-10-11T00:54:26.487270" elapsed="0.000783"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:54:26.488736" 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-10-11T00:54:26.489030" 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-10-11T00:54:26.488480" elapsed="0.000626"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:26.490090" 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-10-11T00:54:26.489574" elapsed="0.000614"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:26.492734" 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-10-11T00:54:26.492170" elapsed="0.000661"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:26.493898" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:54:26.493291" elapsed="0.000661"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:26.495157" 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-10-11T00:54:26.494751" elapsed="0.000442"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:26.496369" 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-10-11T00:54:26.495887" elapsed="0.000517"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:26.496556" elapsed="0.000053"/>
</return>
<msg time="2026-10-11T00:54:26.496756" 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-10-11T00:54:26.495453" elapsed="0.001335"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:26.497026" elapsed="0.000280"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-10-11T00:54:26.494449" elapsed="0.002910"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:26.498097" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:54:26.497707" elapsed="0.000425"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:26.499276" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:54:26.498829" elapsed="0.000481"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:26.499371" elapsed="0.000077"/>
</return>
<msg time="2026-10-11T00:54:26.499588" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:54:26.498366" elapsed="0.001253"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:26.499848" elapsed="0.000251"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:54:26.497523" elapsed="0.002628"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:26.500866" 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-10-11T00:54:26.500493" elapsed="0.000406"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:26.502094" 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-10-11T00:54:26.501667" elapsed="0.000462"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:26.502191" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:54:26.502362" 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-10-11T00:54:26.501208" elapsed="0.001185"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:26.502660" elapsed="0.000231"/>
</kw>
<var name="${key}">PEER_NUMBER</var>
<var name="${value}">1</var>
<status status="PASS" start="2026-10-11T00:54:26.500291" elapsed="0.002652"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:26.503678" 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-10-11T00:54:26.503280" elapsed="0.000432"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:26.504872" 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-10-11T00:54:26.504460" elapsed="0.000446"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:26.504970" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:54:26.505167" 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-10-11T00:54:26.503947" elapsed="0.001251"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:26.505491" elapsed="0.000237"/>
</kw>
<var name="${key}">CLUSTER_ID</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:54:26.503098" elapsed="0.002682"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:26.506520" 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-10-11T00:54:26.506124" elapsed="0.000429"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:26.507691" 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-10-11T00:54:26.507247" elapsed="0.000480"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:26.507788" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:54:26.507959" 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-10-11T00:54:26.506793" elapsed="0.001197"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:26.508237" elapsed="0.000485"/>
</kw>
<var name="${key}">DEFAULT_ID</var>
<var name="${value}">127.0.0.4</var>
<status status="PASS" start="2026-10-11T00:54:26.505918" elapsed="0.002857"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:54:26.494055" elapsed="0.014763"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:54:26.508873" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T00:54:26.509052" 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-10-11T00:54:26.490951" elapsed="0.018153"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:26.490341" elapsed="0.018804"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:26.509386" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:26.509177" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:26.490294" elapsed="0.019264"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:26.510634" 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-10-11T00:54:26.509789" elapsed="0.000883"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:54:26.510734" 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//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-10-11T00:54:26.482691" elapsed="0.028181"/>
</kw>
<msg time="2026-10-11T00:54:26.510941" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:26.472100" elapsed="0.038903"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:26.517136" 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//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-10-11T00:54:26.522623" 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/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-10-11T00:54:26.527020" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:26.527221" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:26.527419" 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-10-11T00:54:26.527764" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:26.527616" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:26.527602" 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-10-11T00:54:26.527992" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:26.528187" 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-10-11T00:54:26.528353" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:54:26.527576" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:54:26.527489" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:26.528599" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:26.528665" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:54:26.528777" 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-10-11T00:54:26.470636" elapsed="0.058193"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:26.529949" 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-10-11T00:54:26.529764" elapsed="0.000244">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-10-11T00:54:26.530105" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:26.529437" elapsed="0.000692"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:26.530430" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:26.530193" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:26.530956" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:26.530692" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:26.530505" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:26.530176" elapsed="0.000855"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:26.531562" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:26.531207" elapsed="0.000379"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:54:26.531631" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:26.531755" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:54:26.529118" elapsed="0.002659"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:26.532872" 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-10-11T00:54:26.532689" elapsed="0.000241">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-10-11T00:54:26.533013" 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-10-11T00:54:26.532352" elapsed="0.000682"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:54:26.533288" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:54:26.533189" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:26.533171" elapsed="0.000194"/>
</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-10-11T00:54:26.533537" 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-10-11T00:54:26.533716" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:54:26.533774" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:54:26.533897" 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-10-11T00:54:26.532030" elapsed="0.001890"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:26.535331" 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-10-11T00:54:26.534923" elapsed="0.000452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:26.535801" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:26.535584" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:54:26.543850" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:54:26.544024" level="INFO">GET Response : url=http://10.30.170.173: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=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-10-11T00:54:26.544131" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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</msg>
<var>${response}</var>
<arg>${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-10-11T00:54:26.536143" elapsed="0.008362">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</kw>
<status status="FAIL" start="2026-10-11T00:54:26.535900" elapsed="0.008688">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:26.544774" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:26.544618" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-10-11T00:54:26.535883" elapsed="0.008973">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</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-10-11T00:54:26.545207" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:26.545325" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:26.545292" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:26.545276" elapsed="0.000105"/>
</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-10-11T00:54:26.545539" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:54:26.545602" elapsed="0.000013"/>
</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-10-11T00:54:26.534215" elapsed="0.011480">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:26.545760" elapsed="0.000014"/>
</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-10-11T00:54:26.452902" elapsed="0.092942">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</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-10-11T00:54:26.546099" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:26.545924" elapsed="0.000239"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:26.545909" elapsed="0.000276"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:26.546215" elapsed="0.000014"/>
</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="FAIL" start="2026-10-11T00:54:26.451269" elapsed="0.095032">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</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-10-11T00:54:27.583672" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:27.582902" elapsed="0.000838"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:27.585570" 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-10-11T00:54:27.585094" elapsed="0.000629">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-10-11T00:54:27.585916" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:27.584272" elapsed="0.001694"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:27.587156" 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-10-11T00:54:27.586389" elapsed="0.000826"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:54:27.587883" 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-10-11T00:54:27.588241" 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-10-11T00:54:27.587627" elapsed="0.000670"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:27.589315" 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-10-11T00:54:27.588775" elapsed="0.000667"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:27.591577" 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-10-11T00:54:27.590998" elapsed="0.000674"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:27.592696" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:54:27.592096" elapsed="0.000652"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:27.594169" 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-10-11T00:54:27.593549" elapsed="0.000674"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:27.596144" 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-10-11T00:54:27.595370" elapsed="0.000833"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:27.596309" elapsed="0.000073"/>
</return>
<msg time="2026-10-11T00:54:27.596658" 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-10-11T00:54:27.594641" elapsed="0.002068"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:27.597111" elapsed="0.000434"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-10-11T00:54:27.593210" elapsed="0.004429"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:27.598395" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:54:27.598004" elapsed="0.000454"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:27.599633" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:54:27.599172" elapsed="0.000497"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:27.599731" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:54:27.599904" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:54:27.598698" elapsed="0.001238"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:27.600186" elapsed="0.000256"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:54:27.597821" elapsed="0.002673"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:27.601205" 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-10-11T00:54:27.600813" elapsed="0.000426"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:27.602604" 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-10-11T00:54:27.601946" elapsed="0.000692"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:27.602701" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:54:27.602873" 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-10-11T00:54:27.601508" 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-10-11T00:54:27.603199" elapsed="0.000270"/>
</kw>
<var name="${key}">PEER_NUMBER</var>
<var name="${value}">1</var>
<status status="PASS" start="2026-10-11T00:54:27.600632" elapsed="0.002891"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:27.604240" 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-10-11T00:54:27.603843" elapsed="0.000430"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:27.605443" 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-10-11T00:54:27.604976" elapsed="0.000503"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:27.605552" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:54:27.605724" 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-10-11T00:54:27.604537" elapsed="0.001218"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:27.605984" elapsed="0.000246"/>
</kw>
<var name="${key}">CLUSTER_ID</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:54:27.603661" elapsed="0.002619"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:27.607007" 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-10-11T00:54:27.606632" elapsed="0.000408"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:27.608185" 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-10-11T00:54:27.607758" elapsed="0.000461"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:27.608280" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:54:27.608490" 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-10-11T00:54:27.607295" elapsed="0.001228"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:27.608759" elapsed="0.000229"/>
</kw>
<var name="${key}">DEFAULT_ID</var>
<var name="${value}">127.0.0.4</var>
<status status="PASS" start="2026-10-11T00:54:27.606448" elapsed="0.002588"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:54:27.592853" elapsed="0.016245"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:54:27.609153" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T00:54:27.609330" 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-10-11T00:54:27.590201" elapsed="0.019162"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:27.589599" elapsed="0.019804"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:27.609669" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:27.609458" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:27.589552" elapsed="0.020212"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:27.610876" 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-10-11T00:54:27.609990" elapsed="0.000923"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:54:27.610974" 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/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-10-11T00:54:27.581701" elapsed="0.029430"/>
</kw>
<msg time="2026-10-11T00:54:27.611201" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:27.570778" elapsed="0.040486"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:27.617445" 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/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-10-11T00:54:27.623354" 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/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-10-11T00:54:27.629112" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:27.629299" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:27.629496" 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-10-11T00:54:27.629845" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:27.629691" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:27.629678" 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-10-11T00:54:27.630089" 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-10-11T00:54:27.630273" 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-10-11T00:54:27.630455" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:54:27.629653" elapsed="0.000851"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:54:27.629565" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:27.630683" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:27.630750" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:54:27.630863" 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-10-11T00:54:27.569295" elapsed="0.061593"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:27.632011" 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-10-11T00:54:27.631815" elapsed="0.000289">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-10-11T00:54:27.632190" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:27.631485" elapsed="0.000728"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:27.632515" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:27.632276" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:27.633038" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:27.632775" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:27.632590" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:27.632258" elapsed="0.000871"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:27.633648" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:27.633291" elapsed="0.000381"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:54:27.633716" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:27.633839" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:54:27.631169" elapsed="0.002692"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:27.635007" 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-10-11T00:54:27.634814" elapsed="0.000266">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-10-11T00:54:27.635164" 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-10-11T00:54:27.634492" elapsed="0.000695"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:54:27.635348" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:54:27.635249" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:27.635233" elapsed="0.000208"/>
</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-10-11T00:54:27.635596" elapsed="0.000020"/>
</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-10-11T00:54:27.635771" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:54:27.635828" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:54:27.635951" 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-10-11T00:54:27.634171" elapsed="0.001804"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:27.637223" 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-10-11T00:54:27.636984" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:27.637717" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:27.637497" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:54:27.644837" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:54:27.644996" level="INFO">GET Response : url=http://10.30.170.173: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=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-10-11T00:54:27.645114" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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</msg>
<var>${response}</var>
<arg>${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-10-11T00:54:27.638046" elapsed="0.007463">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</kw>
<status status="FAIL" start="2026-10-11T00:54:27.637816" elapsed="0.007775">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:27.645782" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:27.645626" elapsed="0.000213"/>
</branch>
<status status="FAIL" start="2026-10-11T00:54:27.637799" elapsed="0.008061">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</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-10-11T00:54:27.646388" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:27.646527" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:27.646493" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:27.646477" elapsed="0.000106"/>
</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-10-11T00:54:27.646726" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:54:27.646818" 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-10-11T00:54:27.636272" elapsed="0.010645">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:27.646981" elapsed="0.000013"/>
</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-10-11T00:54:27.551751" elapsed="0.095327">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</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-10-11T00:54:27.647330" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:27.647161" elapsed="0.000233"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:27.647145" elapsed="0.000286"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:27.647462" elapsed="0.000013"/>
</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="FAIL" start="2026-10-11T00:54:27.550136" elapsed="0.097412">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</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-10-11T00:54:28.684304" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:28.683577" elapsed="0.000794"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:28.685983" 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-10-11T00:54:28.685566" elapsed="0.000689">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-10-11T00:54:28.686508" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:28.684771" elapsed="0.001793"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:28.687747" 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-10-11T00:54:28.686968" elapsed="0.000837"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:54:28.688503" 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-10-11T00:54:28.688797" 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-10-11T00:54:28.688209" elapsed="0.000645"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:28.689853" 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-10-11T00:54:28.689320" elapsed="0.000631"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:28.692113" 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-10-11T00:54:28.691563" elapsed="0.000650"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:28.693238" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:54:28.692644" elapsed="0.000648"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:28.694825" 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-10-11T00:54:28.694178" elapsed="0.000701"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:28.697139" 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-10-11T00:54:28.696365" elapsed="0.000832"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:28.697303" elapsed="0.000070"/>
</return>
<msg time="2026-10-11T00:54:28.697645" 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-10-11T00:54:28.695284" elapsed="0.002413"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:28.698127" elapsed="0.000447"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-10-11T00:54:28.693851" elapsed="0.004809"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:28.699861" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:54:28.699204" elapsed="0.000712"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:28.701811" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:54:28.701101" elapsed="0.000765"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:28.701964" elapsed="0.000063"/>
</return>
<msg time="2026-10-11T00:54:28.702269" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:54:28.700326" elapsed="0.001994"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:28.702731" elapsed="0.000392"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:54:28.698885" elapsed="0.004320"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:28.704391" 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-10-11T00:54:28.703759" elapsed="0.000733"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:28.705738" 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-10-11T00:54:28.705296" elapsed="0.000476"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:28.705834" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:54:28.706007" 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-10-11T00:54:28.704845" 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-10-11T00:54:28.706286" elapsed="0.000263"/>
</kw>
<var name="${key}">PEER_NUMBER</var>
<var name="${value}">1</var>
<status status="PASS" start="2026-10-11T00:54:28.703465" elapsed="0.003137"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:28.707317" 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-10-11T00:54:28.706919" elapsed="0.000433"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:28.708564" 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-10-11T00:54:28.708069" elapsed="0.000532"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:28.708665" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:54:28.708840" 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-10-11T00:54:28.707620" elapsed="0.001252"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:28.709145" elapsed="0.000242"/>
</kw>
<var name="${key}">CLUSTER_ID</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:54:28.706738" elapsed="0.002733"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:28.710188" 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-10-11T00:54:28.709795" elapsed="0.000427"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:28.711368" 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-10-11T00:54:28.710942" elapsed="0.000461"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:28.711498" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:54:28.711673" 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-10-11T00:54:28.710494" elapsed="0.001210"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:28.711933" elapsed="0.000247"/>
</kw>
<var name="${key}">DEFAULT_ID</var>
<var name="${value}">127.0.0.4</var>
<status status="PASS" start="2026-10-11T00:54:28.709612" elapsed="0.002625"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:54:28.693511" elapsed="0.018769"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:54:28.712384" elapsed="0.000069"/>
</return>
<msg time="2026-10-11T00:54:28.712603" 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-10-11T00:54:28.690735" elapsed="0.021902"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:28.690119" elapsed="0.022558"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:28.712922" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:28.712710" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:28.690073" elapsed="0.022946"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:28.714124" 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-10-11T00:54:28.713263" elapsed="0.000898"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:54:28.714224" 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//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-10-11T00:54:28.682352" elapsed="0.032012"/>
</kw>
<msg time="2026-10-11T00:54:28.714471" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:28.671762" elapsed="0.042777"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:28.720995" 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//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-10-11T00:54:28.727176" 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/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-10-11T00:54:28.732391" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:28.732596" 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-10-11T00:54:28.732788" 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-10-11T00:54:28.733174" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:28.732994" elapsed="0.000234"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:28.732979" 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-10-11T00:54:28.733426" 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-10-11T00:54:28.733611" 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-10-11T00:54:28.733778" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:54:28.732950" elapsed="0.000875"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:54:28.732859" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:28.734040" elapsed="0.000032"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:28.734122" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:54:28.734241" 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-10-11T00:54:28.670348" elapsed="0.063918"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:28.735454" 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-10-11T00:54:28.735220" elapsed="0.000308">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-10-11T00:54:28.735613" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:28.734864" 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-10-11T00:54:28.735929" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:28.735704" elapsed="0.000276"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:28.736480" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:28.736199" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:28.736001" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:28.735687" elapsed="0.000869"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:28.737068" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:28.736717" elapsed="0.000377"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:54:28.737139" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:28.737263" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:54:28.734555" elapsed="0.002731"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:28.738381" 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-10-11T00:54:28.738196" elapsed="0.000260">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-10-11T00:54:28.738542" 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-10-11T00:54:28.737863" elapsed="0.000701"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:54:28.738725" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:54:28.738627" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:28.738610" elapsed="0.000191"/>
</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-10-11T00:54:28.738958" elapsed="0.000020"/>
</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-10-11T00:54:28.739157" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:54:28.739217" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:54:28.739341" 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-10-11T00:54:28.737560" elapsed="0.001805"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:28.740630" 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-10-11T00:54:28.740387" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:28.741092" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:28.740864" elapsed="0.000268"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:54:28.748824" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:54:28.749037" level="INFO">GET Response : url=http://10.30.170.173: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=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-10-11T00:54:28.749184" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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</msg>
<var>${response}</var>
<arg>${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-10-11T00:54:28.741471" elapsed="0.008232">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</kw>
<status status="FAIL" start="2026-10-11T00:54:28.741193" elapsed="0.008620">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:28.750090" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:28.749855" elapsed="0.000318"/>
</branch>
<status status="FAIL" start="2026-10-11T00:54:28.741175" elapsed="0.009028">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</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-10-11T00:54:28.750698" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:28.750865" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:28.750819" elapsed="0.000097"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:28.750797" elapsed="0.000145"/>
</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-10-11T00:54:28.751157" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:54:28.751244" elapsed="0.000019"/>
</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-10-11T00:54:28.739667" elapsed="0.011709">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:28.751487" 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-10-11T00:54:28.652832" elapsed="0.098777">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</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-10-11T00:54:28.751954" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:28.751724" elapsed="0.000318"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:28.751703" elapsed="0.000384"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:28.752130" elapsed="0.000018"/>
</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="FAIL" start="2026-10-11T00:54:28.651189" elapsed="0.101065">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</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-10-11T00:54:29.789857" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:29.789110" elapsed="0.000818"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:29.791626" 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-10-11T00:54:29.791099" elapsed="0.000684">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-10-11T00:54:29.791975" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:29.790326" elapsed="0.001700"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:29.793181" 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-10-11T00:54:29.792464" elapsed="0.000773"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:54:29.793897" 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-10-11T00:54:29.794250" 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-10-11T00:54:29.793642" elapsed="0.000664"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:29.795295" 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-10-11T00:54:29.794776" elapsed="0.000617"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:29.798109" 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-10-11T00:54:29.797547" elapsed="0.000659"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:29.799238" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:54:29.798640" elapsed="0.000653"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:29.800729" 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-10-11T00:54:29.800095" elapsed="0.000689"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:29.802786" 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-10-11T00:54:29.801919" elapsed="0.000923"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:29.802948" elapsed="0.000073"/>
</return>
<msg time="2026-10-11T00:54:29.803273" 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-10-11T00:54:29.801190" elapsed="0.002134"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:29.803736" elapsed="0.000423"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-10-11T00:54:29.799769" elapsed="0.004474"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:29.805489" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:54:29.804827" elapsed="0.000719"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:29.807369" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:54:29.806677" elapsed="0.000791"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:29.807571" elapsed="0.000063"/>
</return>
<msg time="2026-10-11T00:54:29.807849" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:54:29.805923" elapsed="0.001976"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:29.808283" elapsed="0.000430"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:54:29.804531" elapsed="0.004264"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:29.809924" 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-10-11T00:54:29.809334" elapsed="0.000623"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:29.811227" 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-10-11T00:54:29.810790" elapsed="0.000473"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:29.811327" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:54:29.811534" 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-10-11T00:54:29.810206" elapsed="0.001360"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:29.811796" elapsed="0.000230"/>
</kw>
<var name="${key}">PEER_NUMBER</var>
<var name="${value}">1</var>
<status status="PASS" start="2026-10-11T00:54:29.809011" elapsed="0.003082"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:29.812810" 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-10-11T00:54:29.812431" elapsed="0.000413"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:29.813965" 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-10-11T00:54:29.813550" elapsed="0.000450"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:29.814077" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:54:29.814248" 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-10-11T00:54:29.813095" elapsed="0.001185"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:29.814543" elapsed="0.000230"/>
</kw>
<var name="${key}">CLUSTER_ID</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:54:29.812231" elapsed="0.002594"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:29.815555" 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-10-11T00:54:29.815160" elapsed="0.000428"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:29.816717" 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-10-11T00:54:29.816271" elapsed="0.000481"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:29.816813" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:54:29.816985" 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-10-11T00:54:29.815824" 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-10-11T00:54:29.817261" elapsed="0.000482"/>
</kw>
<var name="${key}">DEFAULT_ID</var>
<var name="${value}">127.0.0.4</var>
<status status="PASS" start="2026-10-11T00:54:29.814962" elapsed="0.002834"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:54:29.799399" elapsed="0.018440"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:54:29.817894" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:54:29.818091" 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-10-11T00:54:29.796214" elapsed="0.021911"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:29.795583" elapsed="0.022584"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:29.818437" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:29.818199" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:29.795533" elapsed="0.023006"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:29.819603" 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-10-11T00:54:29.818762" elapsed="0.000879"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:54:29.819702" 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//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-10-11T00:54:29.787773" elapsed="0.032065"/>
</kw>
<msg time="2026-10-11T00:54:29.819906" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:29.777125" elapsed="0.042843"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:29.826051" 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/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-10-11T00:54:29.832176" 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//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-10-11T00:54:29.837662" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:29.837848" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:29.838029" 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-10-11T00:54:29.838386" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:29.838238" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:29.838225" 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-10-11T00:54:29.838630" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:29.838808" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:29.838969" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:54:29.838200" elapsed="0.000816"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:54:29.838110" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:29.839205" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:29.839270" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:54:29.839380" 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-10-11T00:54:29.775696" elapsed="0.063722"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:29.840528" 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-10-11T00:54:29.840328" elapsed="0.000260">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-10-11T00:54:29.840675" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:29.839988" elapsed="0.000711"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:29.840980" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:29.840761" elapsed="0.000269"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:29.841602" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:29.841247" elapsed="0.000380"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:29.841065" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:29.840744" elapsed="0.000934"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:29.842189" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:29.841838" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:54:29.842286" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:54:29.842429" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:54:29.839690" elapsed="0.002763"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:29.843541" 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-10-11T00:54:29.843338" elapsed="0.000262">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-10-11T00:54:29.843689" 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-10-11T00:54:29.843005" elapsed="0.000706"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:54:29.843872" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:54:29.843774" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:29.843757" elapsed="0.000191"/>
</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-10-11T00:54:29.844116" elapsed="0.000020"/>
</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-10-11T00:54:29.844291" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:54:29.844349" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:54:29.844489" 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-10-11T00:54:29.842707" elapsed="0.001805"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:29.845907" 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-10-11T00:54:29.845513" elapsed="0.000437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:29.846374" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:29.846156" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:54:29.853507" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:54:29.853656" level="INFO">GET Response : url=http://10.30.170.173: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=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-10-11T00:54:29.853745" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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</msg>
<var>${response}</var>
<arg>${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-10-11T00:54:29.846725" elapsed="0.007389">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</kw>
<status status="FAIL" start="2026-10-11T00:54:29.846492" elapsed="0.007698">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:29.854378" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:29.854221" elapsed="0.000231"/>
</branch>
<status status="FAIL" start="2026-10-11T00:54:29.846475" elapsed="0.008000">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</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-10-11T00:54:29.854821" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:29.854972" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:29.854935" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:29.854892" elapsed="0.000140"/>
</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-10-11T00:54:29.855191" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:54:29.855255" 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-10-11T00:54:29.844793" elapsed="0.010556">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:29.855429" 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-10-11T00:54:29.758082" elapsed="0.097434">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</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-10-11T00:54:29.855762" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:29.855599" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:29.855583" elapsed="0.000265"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:29.855878" elapsed="0.000013"/>
</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="FAIL" start="2026-10-11T00:54:29.756437" elapsed="0.099527">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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>
</kw>
<msg time="2026-10-11T00:54:29.856067" 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.173: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</msg>
<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="FAIL" start="2026-10-11T00:54:18.775326" elapsed="11.080831">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.173: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>
</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-10-11T00:54:29.857473" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:54:29.857174" elapsed="0.000340"/>
</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-10-11T00:54:29.856778" elapsed="0.000783"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:54:29.856473" elapsed="0.001140"/>
</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="FAIL" start="2026-10-11T00:54:18.683332" elapsed="11.174316">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.173: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>
</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-10-11T00:54:29.859111" elapsed="0.000202"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:54:29.858847" elapsed="0.000516"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:29.860281" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:29.860195" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:29.860178" elapsed="0.000166"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:29.862697" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:29.862584" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:29.862567" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:29.863686" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:29.863345" elapsed="0.000366"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:54:29.864142" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:54:29.863864" elapsed="0.000303"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:54:29.864207" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:29.864333" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:54:29.862973" elapsed="0.001383"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:29.866972" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:29.866887" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:29.866870" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:29.868094" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:29.867996" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:29.867979" elapsed="0.000177"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:54:29.868496" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:54:29.868304" elapsed="0.000216"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:54:29.868828" 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-10-11T00:54:29.868685" elapsed="0.000166"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:54:29.903902" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:54:29.869354" elapsed="0.034645"/>
</kw>
<msg time="2026-10-11T00:54:29.904168" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:54:29.904212" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:29.869008" elapsed="0.035239"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:54:29.933911" 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-10-11T00:54:29.904801" elapsed="0.029207"/>
</kw>
<msg time="2026-10-11T00:54:29.934170" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:54:29.934210" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:29.904459" elapsed="0.029785"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:29.934545" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:29.934312" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:29.934295" elapsed="0.000322"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:29.935022" 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-10-11T00:54:29.934798" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:29.935358" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:29.935158" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:29.935142" elapsed="0.000303"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:54:29.935475" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:54:29.938014" elapsed="0.000132"/>
</kw>
<msg time="2026-10-11T00:54:29.938204" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:29.936837" 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-10-11T00:54:29.938715" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:29.939065" 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-10-11T00:54:29.936240" elapsed="0.003012"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:54:29.935763" elapsed="0.003547"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:54:29.867741" elapsed="0.071643"/>
</kw>
<msg time="2026-10-11T00:54:29.939491" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:54:29.939530" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:29.867199" elapsed="0.072366"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:54:29.939719" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:54:29.939634" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:29.939616" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:29.940129" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:29.940450" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:54:29.940515" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:54:29.866603" elapsed="0.073995"/>
</kw>
<msg time="2026-10-11T00:54:29.940681" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:54:29.940720" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:29.864704" elapsed="0.076050"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:29.941051" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:29.940820" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:29.940804" elapsed="0.000319"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:54:29.864562" elapsed="0.076626"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:54:29.864402" elapsed="0.076816"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:54:29.862272" elapsed="0.078995"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:54:29.859930" elapsed="0.081392"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:29.859535" elapsed="0.081828"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:54:29.858504" elapsed="0.083009"/>
</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-10-11T00:54:29.941679" elapsed="0.000097"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:29.942869" 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-10-11T00:54:29.942574" elapsed="0.000321"/>
</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-10-11T00:54:29.943062" elapsed="0.000179"/>
</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-10-11T00:54:29.942279" elapsed="0.001025"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-10-11T00:54:31.944066" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<msg time="2026-10-11T00:54:31.944453" level="INFO">${output} = [?2004l^C
[?2004h[jenkins@releng-26932-423-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-10-11T00:54:29.943474" elapsed="2.001044"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:31.945808" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:31.945130" elapsed="0.000778"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-10-11T00:54:29.941965" elapsed="2.004092"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:54:31.954466" level="INFO">Executing command 'cat bgp_peer1.log'.</msg>
<msg time="2026-10-11T00:54:31.968495" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:54:31.968699" level="INFO">${output_log} = 2026-10-11 00:54:16,483 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:54:16,483 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.1
2026-10-11 00:54:16,483 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-10-11T00:54:31.953992" elapsed="0.014761"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:31.969795" level="INFO">2026-10-11 00:54:16,483 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:54:16,483 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.1
2026-10-11 00:54:16,483 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 00:54:16,483 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 00:54:16,483 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 00:54:16,484 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:54:16,486 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:54:16,486 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:54:16,486 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:54:16,486 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 3
2026-10-11 00:54:16,486 INFO BGP-Thread-1 (job):   Prefix base: 8.1.0.0/28
2026-10-11 00:54:16,486 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 00:54:16,486 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 00:54:16,486 INFO BGP-Thread-1 (job):   My BGP Identifier: 2130706433
2026-10-11 00:54:16,486 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 00:54:16,486 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 00:54:16,486 INFO BGP-Thread-1 (job):   Cluster list: 127.0.0.4
2026-10-11 00:54:16,486 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 00:54:16,486 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 00:54:16,486 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 00:54:16,487 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 3
2026-10-11 00:54:16,487 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, 2]
2026-10-11 00:54:16,487 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 00:54:16,487 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 00:54:16,487 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 00:54:16,487 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:54:16,487 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-10-11 00:54:16,487 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 00:54:16,487 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 00:54:16,487 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-10-11 00:54:16,487 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 00:54:16,487 DEBUG BGP-Thread-1 (job):   BGP Identifier=2130706433 (0x7f000001)
2026-10-11 00:54:16,487 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-10-11 00:54:16,487 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf0
2026-10-11 00:54:16,487 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf000b47f000001100206010400010001020641040000fbf0'
2026-10-11 00:54:16,488 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf000b47f000001100206010400010001020641040000fbf0
2026-10-11 00:54:16,489 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:54:16,489 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:54:16,489 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:54:16,489 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:54:16,489 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:54:16,489 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:54:16,489 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:54:16,489 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:54:16,489 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:54:16,489 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:54:16,490 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 00:54:16,490 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 3
2026-10-11 00:54:16,490 DEBUG BGP-Thread-1 (job): ########## Iteration: 0 ##########
2026-10-11 00:54:16,490 DEBUG BGP-Thread-1 (job): Remaining prefixes: 3
2026-10-11 00:54:16,490 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:54:16,490 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:54:16,490 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-10-11 00:54:16,490 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:54:16,490 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:54:16,490 DEBUG BGP-Thread-1 (job):   Prefix indexes: [0]
2026-10-11 00:54:16,490 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.1.0.0')]
2026-10-11 00:54:16,490 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:54:16,490 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-10-11 00:54:16,491 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:54:16,491 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:54:16,491 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:54:16,491 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:54:16,491 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:54:16,491 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:54:16,491 DEBUG BGP-Thread-1 (job):   Length=62 (0x003e)
2026-10-11 00:54:16,491 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:54:16,491 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:54:16,491 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:54:16,491 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=34 (0x0022)
2026-10-11 00:54:16,491 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201800a047f000004)
2026-10-11 00:54:16,491 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:54:16,491 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:54:16,491 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:54:16,492 DEBUG BGP-Thread-1 (job):     Cluster list=127.0.0.4
2026-10-11 00:54:16,492 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.1.0.0')]/28 (0x1c08010000)
2026-10-11 00:54:16,492 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff003e02000000224001010040020602010000fbf040050400000064400304c0000201800a047f0000041c08010000
2026-10-11 00:54:16,493 DEBUG BGP-Thread-1 (job): ########## Iteration: 1 ##########
2026-10-11 00:54:16,494 DEBUG BGP-Thread-1 (job): Remaining prefixes: 2
2026-10-11 00:54:16,494 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:54:16,494 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:54:16,494 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-10-11 00:54:16,494 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:54:16,494 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:54:16,494 DEBUG BGP-Thread-1 (job):   Prefix indexes: [1]
2026-10-11 00:54:16,494 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.1.0.16')]
2026-10-11 00:54:16,494 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:54:16,494 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-10-11 00:54:16,496 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:54:16,497 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:54:16,497 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:54:16,497 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:54:16,497 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:54:16,497 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:54:16,497 DEBUG BGP-Thread-1 (job):   Length=62 (0x003e)
2026-10-11 00:54:16,497 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:54:16,497 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:54:16,497 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:54:16,497 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=34 (0x0022)
2026-10-11 00:54:16,497 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201800a047f000004)
2026-10-11 00:54:16,497 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:54:16,497 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:54:16,498 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:54:16,498 DEBUG BGP-Thread-1 (job):     Cluster list=127.0.0.4
2026-10-11 00:54:16,498 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.1.0.16')]/28 (0x1c08010010)
2026-10-11 00:54:16,498 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff003e02000000224001010040020602010000fbf040050400000064400304c0000201800a047f0000041c08010010
2026-10-11 00:54:16,498 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 00:54:16,498 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:54:16,498 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:54:16,498 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 00:54:16,498 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:54:16,498 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:54:16,498 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:54:16,498 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:54:16,498 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:54:16,499 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:54:16,499 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:54:16,499 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:54:16,499 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:54:16,499 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:54:16,499 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:54:16,499 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:54:16,499 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-10-11 00:54:16,499 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-10-11 00:54:16,499 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:54:16,500 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:54:16,500 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:54:16,500 DEBUG BGP-Thread-1 (job): ########## Iteration: 2 ##########
2026-10-11 00:54:16,500 DEBUG BGP-Thread-1 (job): Remaining prefixes: 1
2026-10-11 00:54:16,500 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:54:16,500 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:54:16,500 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-10-11 00:54:16,500 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:54:16,500 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:54:16,500 DEBUG BGP-Thread-1 (job):   Prefix indexes: [2]
2026-10-11 00:54:16,501 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.1.0.32')]
2026-10-11 00:54:16,501 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:54:16,501 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-10-11 00:54:16,501 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:54:16,501 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:54:16,501 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:54:16,501 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:54:16,501 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:54:16,501 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:54:16,501 DEBUG BGP-Thread-1 (job):   Length=62 (0x003e)
2026-10-11 00:54:16,501 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:54:16,501 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:54:16,501 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:54:16,501 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=34 (0x0022)
2026-10-11 00:54:16,502 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201800a047f000004)
2026-10-11 00:54:16,502 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:54:16,502 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:54:16,502 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:54:16,502 DEBUG BGP-Thread-1 (job):     Cluster list=127.0.0.4
2026-10-11 00:54:16,502 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.1.0.32')]/28 (0x1c08010020)
2026-10-11 00:54:16,502 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff003e02000000224001010040020602010000fbf040050400000064400304c0000201800a047f0000041c08010020
2026-10-11 00:54:16,502 INFO BGP-Thread-1 (job): All update messages generated.
2026-10-11 00:54:16,502 INFO BGP-Thread-1 (job): Storing performance results.
2026-10-11 00:54:16,502 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-10-11 00:54:16,502 INFO BGP-Thread-1 (job): Number of iterations: 3
2026-10-11 00:54:16,503 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-10-11 00:54:16,503 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-10-11 00:54:16,503 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 3
2026-10-11 00:54:16,503 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.01225900650024414s
2026-10-11 00:54:16,503 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-10-11 00:54:16,503 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-10-11 00:54:16,503 INFO BGP-Thread-1 (job):   
2026-10-11 00:54:16,503 INFO BGP-Thread-1 (job):   
2026-10-11 00:54:16,504 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-10-11 00:54:16,504 INFO BGP-Thread-1 (job):   
2026-10-11 00:54:16,504 INFO BGP-Thread-1 (job):   
2026-10-11 00:54:16,504 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-10-11 00:54:16,504 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:54:16,504 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:54:16,504 DEBUG BGP-Thread-1 (job):   Length=43 (0x002b)
2026-10-11 00:54:16,504 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:54:16,504 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:54:16,504 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:54:16,505 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=20 (0x0014)
2026-10-11 00:54:16,505 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064)
2026-10-11 00:54:16,505 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:54:16,505 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:54:16,505 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:54:16,505 DEBUG BGP-Thread-1 (job):     Cluster list=127.0.0.4
2026-10-11 00:54:16,505 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-10-11 00:54:16,505 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff002b02000000144001010040020602010000fbf040050400000064
2026-10-11 00:54:17,548 INFO BGP-Thread-1 (job): ... idle for 1.043s
2026-10-11 00:54:17,548 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.043s
2026-10-11 00:54:17,549 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004e02000000374001010040020602010000fbf040050400000064800904c0000202800a08c00002027f000002800e0e00010104c0000201001c08020000
2026-10-11 00:54:17,549 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:54:17,549 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:54:17,549 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004e' (78)
2026-10-11 00:54:17,549 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:54:17,549 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:54:17,549 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:54:17,549 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:54:17,549 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:54:17,549 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:54:17,549 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:54:17,549 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:54:17,549 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:54:17,550 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:54:17,550 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:54:17,550 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:54:17,550 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0037' (55)
2026-10-11 00:54:17,550 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a08c00002027f000002800e0e00010104c0000201001c08020000'
2026-10-11 00:54:17,550 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:54:17,550 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:54:17,550 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:54:17,550 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-10-11 00:54:17,550 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:54:17,550 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:54:17,550 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:54:17,550 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:54:17,551 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:54:17,551 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c00002027f000002'
2026-10-11 00:54:17,551 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-10-11 00:54:17,551 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08020000'
2026-10-11 00:54:17,551 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:54:17,551 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:54:17,551 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-10-11 00:54:17,551 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-10-11 00:54:17,551 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-10-11 00:54:17,551 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08020000'
2026-10-11 00:54:17,551 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.2.0.0/28']
2026-10-11 00:54:17,551 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.2.0.0/28
2026-10-11 00:54:17,551 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:54:17,551 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:54:17,552 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:54:17,552 INFO BGP-Thread-1 (job): total_received_update_message_counter: 2
2026-10-11 00:54:17,552 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 1
2026-10-11 00:54:17,552 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:54:17,554 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004e02000000374001010040020602010000fbf040050400000064800904c0000202800a08c00002027f000002800e0e00010104c0000201001c08020010
2026-10-11 00:54:17,554 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:54:17,554 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:54:17,554 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004e' (78)
2026-10-11 00:54:17,554 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:54:17,554 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:54:17,555 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:54:17,555 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:54:17,555 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:54:17,555 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:54:17,555 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:54:17,555 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:54:17,555 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:54:17,555 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:54:17,555 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:54:17,555 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:54:17,555 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0037' (55)
2026-10-11 00:54:17,555 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a08c00002027f000002800e0e00010104c0000201001c08020010'
2026-10-11 00:54:17,555 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:54:17,555 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:54:17,555 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:54:17,555 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-10-11 00:54:17,555 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:54:17,556 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:54:17,556 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:54:17,556 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:54:17,556 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:54:17,556 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c00002027f000002'
2026-10-11 00:54:17,556 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-10-11 00:54:17,556 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08020010'
2026-10-11 00:54:17,556 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:54:17,556 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:54:17,556 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-10-11 00:54:17,556 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-10-11 00:54:17,556 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-10-11 00:54:17,556 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08020010'
2026-10-11 00:54:17,556 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.2.0.16/28']
2026-10-11 00:54:17,557 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.2.0.16/28
2026-10-11 00:54:17,557 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:54:17,557 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:54:17,557 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:54:17,590 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004e02000000374001010040020602010000fbf040050400000064800904c0000202800a08c00002027f000002800e0e00010104c0000201001c08020020
2026-10-11 00:54:17,590 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:54:17,590 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:54:17,591 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004e' (78)
2026-10-11 00:54:17,591 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:54:17,591 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:54:17,591 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:54:17,591 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:54:17,591 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:54:17,591 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:54:17,591 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:54:17,591 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:54:17,591 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:54:17,591 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:54:17,591 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:54:17,591 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:54:17,591 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0037' (55)
2026-10-11 00:54:17,591 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'4001010040020602010000fbf040050400000064800904c0000202800a08c00002027f000002800e0e00010104c0000201001c08020020'
2026-10-11 00:54:17,592 DEBUG BGP-Thread-1 (job): Attribute type=1 (ORIGIN, flags:0xb'40')
2026-10-11 00:54:17,592 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00'
2026-10-11 00:54:17,592 DEBUG BGP-Thread-1 (job): Attribute type=2 (AS_PATH, flags:0xb'40')
2026-10-11 00:54:17,592 DEBUG BGP-Thread-1 (job): Attribute value=0xb'02010000fbf0'
2026-10-11 00:54:17,592 DEBUG BGP-Thread-1 (job): Attribute type=5 (LOCAL_PREF, flags:0xb'40')
2026-10-11 00:54:17,592 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00000064'
2026-10-11 00:54:17,592 DEBUG BGP-Thread-1 (job): Attribute type=9 (ORIGINATOR_ID, flags:0xb'80')
2026-10-11 00:54:17,592 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c0000202'
2026-10-11 00:54:17,592 DEBUG BGP-Thread-1 (job): Attribute type=10 (CLUSTER_LIST, flags:0xb'80')
2026-10-11 00:54:17,592 DEBUG BGP-Thread-1 (job): Attribute value=0xb'c00002027f000002'
2026-10-11 00:54:17,592 DEBUG BGP-Thread-1 (job): Attribute type=14 (MP_REACH_NLRI, flags:0xb'80')
2026-10-11 00:54:17,592 DEBUG BGP-Thread-1 (job): Attribute value=0xb'00010104c0000201001c08020020'
2026-10-11 00:54:17,592 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'0001'
2026-10-11 00:54:17,592 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'01'
2026-10-11 00:54:17,592 DEBUG BGP-Thread-1 (job):   Length of Next Hop Network Address=4 (0xb'04')
2026-10-11 00:54:17,592 DEBUG BGP-Thread-1 (job):   Network Address of Next Hop=192.0.2.1 (0xb'c0000201')
2026-10-11 00:54:17,592 DEBUG BGP-Thread-1 (job):   Reserved=0xb'00'
2026-10-11 00:54:17,593 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=0xb'1c08020020'
2026-10-11 00:54:17,593 DEBUG BGP-Thread-1 (job):   NLRI prefix list: ['8.2.0.32/28']
2026-10-11 00:54:17,593 DEBUG BGP-Thread-1 (job):   nlri_prefix_received: 8.2.0.32/28
2026-10-11 00:54:17,593 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:54:17,593 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:54:17,593 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:54:27,595 INFO BGP-Thread-1 (job): ... idle for 10.002s
2026-10-11 00:54:27,595 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 11.080s
2026-10-11 00:54:27,595 INFO BGP-Thread-1 (job): total_received_update_message_counter: 4
2026-10-11 00:54:27,595 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 3
2026-10-11 00:54:27,595 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-10-11T00:54:31.969229" elapsed="0.001311"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T00:54:31.971755" 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-10-11T00:54:31.970993" elapsed="0.000879"/>
</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-10-11T00:54:31.953073" elapsed="0.018919"/>
</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-10-11T00:54:31.972378" elapsed="0.000251"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:31.975153" 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-10-11T00:54:31.974443" elapsed="0.000768"/>
</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-10-11T00:54:31.975580" elapsed="0.000395"/>
</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-10-11T00:54:31.973774" elapsed="0.002365"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-10-11T00:54:33.977458" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<msg time="2026-10-11T00:54:33.977794" level="INFO">${output} = [?2004l^C
[?2004h[jenkins@releng-26932-423-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-10-11T00:54:31.976516" elapsed="2.001340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:33.979193" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:33.978511" elapsed="0.000784"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-10-11T00:54:31.973076" elapsed="2.006378"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:54:33.988313" level="INFO">Executing command 'cat bgp_peer2.log'.</msg>
<msg time="2026-10-11T00:54:34.002164" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:54:34.002360" level="INFO">${output_log} = 2026-10-11 00:54:17,525 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:54:17,526 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.2
2026-10-11 00:54:17,526 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-10-11T00:54:33.988054" elapsed="0.014402"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.003488" level="INFO">2026-10-11 00:54:17,525 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:54:17,526 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.2
2026-10-11 00:54:17,526 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 00:54:17,526 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 00:54:17,526 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 00:54:17,527 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:54:17,528 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:54:17,528 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:54:17,528 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:54:17,528 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 3
2026-10-11 00:54:17,528 INFO BGP-Thread-1 (job):   Prefix base: 8.2.0.0/28
2026-10-11 00:54:17,528 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 00:54:17,528 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 00:54:17,528 INFO BGP-Thread-1 (job):   My BGP Identifier: 2130706434
2026-10-11 00:54:17,528 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 00:54:17,529 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 00:54:17,529 INFO BGP-Thread-1 (job):   Cluster list: 127.0.0.2
2026-10-11 00:54:17,529 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 00:54:17,529 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 00:54:17,529 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 00:54:17,529 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 3
2026-10-11 00:54:17,529 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, 2]
2026-10-11 00:54:17,529 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 00:54:17,529 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 00:54:17,529 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 00:54:17,529 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:54:17,529 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-10-11 00:54:17,529 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 00:54:17,529 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 00:54:17,530 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-10-11 00:54:17,530 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 00:54:17,530 DEBUG BGP-Thread-1 (job):   BGP Identifier=2130706434 (0x7f000002)
2026-10-11 00:54:17,530 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-10-11 00:54:17,530 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf0
2026-10-11 00:54:17,530 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf000b47f000002100206010400010001020641040000fbf0'
2026-10-11 00:54:17,530 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf000b47f000002100206010400010001020641040000fbf0
2026-10-11 00:54:17,531 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:54:17,532 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:54:17,532 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:54:17,532 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:54:17,532 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:54:17,532 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:54:17,532 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:54:17,532 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:54:17,532 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:54:17,532 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:54:17,532 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 00:54:17,534 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 3
2026-10-11 00:54:17,534 DEBUG BGP-Thread-1 (job): ########## Iteration: 0 ##########
2026-10-11 00:54:17,534 DEBUG BGP-Thread-1 (job): Remaining prefixes: 3
2026-10-11 00:54:17,534 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:54:17,534 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:54:17,534 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-10-11 00:54:17,534 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:54:17,535 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:54:17,535 DEBUG BGP-Thread-1 (job):   Prefix indexes: [0]
2026-10-11 00:54:17,535 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.2.0.0')]
2026-10-11 00:54:17,535 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:54:17,536 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-10-11 00:54:17,536 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:54:17,536 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:54:17,536 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:54:17,536 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:54:17,536 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:54:17,536 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:54:17,536 DEBUG BGP-Thread-1 (job):   Length=62 (0x003e)
2026-10-11 00:54:17,536 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:54:17,536 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:54:17,536 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:54:17,536 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=34 (0x0022)
2026-10-11 00:54:17,536 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201800a047f000002)
2026-10-11 00:54:17,536 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:54:17,536 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:54:17,536 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:54:17,536 DEBUG BGP-Thread-1 (job):     Cluster list=127.0.0.2
2026-10-11 00:54:17,537 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.2.0.0')]/28 (0x1c08020000)
2026-10-11 00:54:17,537 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff003e02000000224001010040020602010000fbf040050400000064400304c0000201800a047f0000021c08020000
2026-10-11 00:54:17,537 DEBUG BGP-Thread-1 (job): ########## Iteration: 1 ##########
2026-10-11 00:54:17,537 DEBUG BGP-Thread-1 (job): Remaining prefixes: 2
2026-10-11 00:54:17,537 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:54:17,537 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:54:17,537 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-10-11 00:54:17,537 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:54:17,537 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:54:17,537 DEBUG BGP-Thread-1 (job):   Prefix indexes: [1]
2026-10-11 00:54:17,537 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.2.0.16')]
2026-10-11 00:54:17,537 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:54:17,537 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-10-11 00:54:17,537 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:54:17,537 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:54:17,537 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:54:17,537 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:54:17,537 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:54:17,537 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:54:17,537 DEBUG BGP-Thread-1 (job):   Length=62 (0x003e)
2026-10-11 00:54:17,537 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:54:17,538 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:54:17,538 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:54:17,538 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=34 (0x0022)
2026-10-11 00:54:17,538 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201800a047f000002)
2026-10-11 00:54:17,538 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:54:17,538 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:54:17,538 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:54:17,538 DEBUG BGP-Thread-1 (job):     Cluster list=127.0.0.2
2026-10-11 00:54:17,538 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.2.0.16')]/28 (0x1c08020010)
2026-10-11 00:54:17,538 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff003e02000000224001010040020602010000fbf040050400000064400304c0000201800a047f0000021c08020010
2026-10-11 00:54:17,538 DEBUG BGP-Thread-1 (job): ########## Iteration: 2 ##########
2026-10-11 00:54:17,538 DEBUG BGP-Thread-1 (job): Remaining prefixes: 1
2026-10-11 00:54:17,538 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:54:17,538 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:54:17,538 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-10-11 00:54:17,538 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:54:17,538 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:54:17,538 DEBUG BGP-Thread-1 (job):   Prefix indexes: [2]
2026-10-11 00:54:17,538 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.2.0.32')]
2026-10-11 00:54:17,538 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:54:17,538 DEBUG BGP-Thread-1 (job):   Prefix slot index: 2
2026-10-11 00:54:17,538 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:54:17,538 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:54:17,539 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:54:17,539 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:54:17,539 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:54:17,539 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:54:17,539 DEBUG BGP-Thread-1 (job):   Length=62 (0x003e)
2026-10-11 00:54:17,539 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:54:17,539 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:54:17,539 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:54:17,539 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=34 (0x0022)
2026-10-11 00:54:17,539 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064400304c0000201800a047f000002)
2026-10-11 00:54:17,539 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:54:17,539 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:54:17,539 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:54:17,539 DEBUG BGP-Thread-1 (job):     Cluster list=127.0.0.2
2026-10-11 00:54:17,540 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.2.0.32')]/28 (0x1c08020020)
2026-10-11 00:54:17,540 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff003e02000000224001010040020602010000fbf040050400000064400304c0000201800a047f0000021c08020020
2026-10-11 00:54:17,540 INFO BGP-Thread-1 (job): All update messages generated.
2026-10-11 00:54:17,540 INFO BGP-Thread-1 (job): Storing performance results.
2026-10-11 00:54:17,540 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-10-11 00:54:17,540 INFO BGP-Thread-1 (job): Number of iterations: 3
2026-10-11 00:54:17,540 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-10-11 00:54:17,540 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-10-11 00:54:17,540 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 3
2026-10-11 00:54:17,540 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.005620718002319336s
2026-10-11 00:54:17,540 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-10-11 00:54:17,540 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-10-11 00:54:17,540 INFO BGP-Thread-1 (job):   
2026-10-11 00:54:17,540 INFO BGP-Thread-1 (job):   
2026-10-11 00:54:17,541 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-10-11 00:54:17,541 INFO BGP-Thread-1 (job):   
2026-10-11 00:54:17,541 INFO BGP-Thread-1 (job):   
2026-10-11 00:54:17,541 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-10-11 00:54:17,541 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:54:17,541 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:54:17,541 DEBUG BGP-Thread-1 (job):   Length=43 (0x002b)
2026-10-11 00:54:17,541 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:54:17,541 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:54:17,541 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:54:17,541 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=20 (0x0014)
2026-10-11 00:54:17,541 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064)
2026-10-11 00:54:17,541 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:54:17,541 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:54:17,541 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:54:17,541 DEBUG BGP-Thread-1 (job):     Cluster list=127.0.0.2
2026-10-11 00:54:17,542 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-10-11 00:54:17,542 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff002b02000000144001010040020602010000fbf040050400000064
2026-10-11 00:54:17,542 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 00:54:17,542 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:54:17,542 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:54:17,542 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 00:54:17,542 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:54:17,542 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:54:17,542 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:54:17,542 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:54:17,542 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:54:17,542 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:54:17,542 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:54:17,542 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:54:17,542 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:54:17,542 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:54:17,542 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:54:17,542 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:54:17,542 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-10-11 00:54:17,542 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-10-11 00:54:17,542 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:54:17,543 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:54:17,543 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:54:27,549 INFO BGP-Thread-1 (job): ... idle for 10.006s
2026-10-11 00:54:27,549 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.006s
2026-10-11 00:54:27,549 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:54:27,550 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:54:27,550 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-10-11T00:54:34.002910" elapsed="0.001126"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T00:54:34.005173" 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-10-11T00:54:34.004521" elapsed="0.000768"/>
</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-10-11T00:54:33.987119" elapsed="0.018323"/>
</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-10-11T00:54:34.006760" elapsed="0.000549"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:54:34.005999" elapsed="0.001471"/>
</kw>
<doc>Stop BGP peer &amp; store logs</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:54:29.857992" elapsed="4.149557"/>
</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-10-11T00:54:34.010727" elapsed="0.000488"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:54:34.010050" 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-10-11T00:54:34.013512" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:34.013253" elapsed="0.000364"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:34.013205" elapsed="0.000459"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:34.018626" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:34.018257" elapsed="0.000466"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:34.018218" elapsed="0.000549"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.021100" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:34.020289" elapsed="0.000869"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.022149" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:54:34.021533" elapsed="0.000669"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:54:34.022292" elapsed="0.000068"/>
</return>
<msg time="2026-10-11T00:54:34.022622" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:54:34.019296" elapsed="0.003376"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:34.028970" elapsed="0.000058"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:34.028780" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:34.028739" elapsed="0.000402"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:34.031641" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:34.031402" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:34.031363" elapsed="0.000415"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:54:34.032553" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:54:34.032131" elapsed="0.000476"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:54:34.033303" 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-10-11T00:54:34.032970" elapsed="0.000385"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:54:34.069440" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:54:34.034558" elapsed="0.035019"/>
</kw>
<msg time="2026-10-11T00:54:34.069816" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:54:34.069873" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:34.033753" elapsed="0.036169"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:54:34.104149" 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-10-11T00:54:34.070676" elapsed="0.033575"/>
</kw>
<msg time="2026-10-11T00:54:34.104400" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:54:34.104520" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:34.070172" elapsed="0.034386"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:34.104839" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:34.104629" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:34.104610" elapsed="0.000301"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.105335" 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-10-11T00:54:34.105108" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:34.105680" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:34.105479" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:34.105461" elapsed="0.000289"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:54:34.105779" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:54:34.108260" elapsed="0.000117"/>
</kw>
<msg time="2026-10-11T00:54:34.108453" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:34.107187" 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-10-11T00:54:34.108897" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:34.109249" 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-10-11T00:54:34.106563" 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-10-11T00:54:34.106074" 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-10-11T00:54:34.030805" elapsed="0.078788"/>
</kw>
<msg time="2026-10-11T00:54:34.109674" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:54:34.109712" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:34.029514" elapsed="0.080234"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:54:34.109900" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:54:34.109815" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:34.109798" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:34.110316" 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-10-11T00:54:34.110660" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:54:34.110724" 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-10-11T00:54:34.028102" elapsed="0.082707"/>
</kw>
<msg time="2026-10-11T00:54:34.110892" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:54:34.110931" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:34.023490" elapsed="0.087478"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:34.111269" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:34.111049" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:34.111032" elapsed="0.000308"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:54:34.023128" elapsed="0.088233"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:54:34.022780" elapsed="0.088611"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:54:34.017573" elapsed="0.093892"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:54:34.012638" elapsed="0.098908"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:34.011695" elapsed="0.099893"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:54:34.009223" elapsed="0.102411"/>
</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-10-11T00:54:34.120752" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:54:34.120918" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:54:34.121027" 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-10-11T00:54:34.112827" elapsed="0.008226"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.121590" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:34.121267" elapsed="0.000364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.122165" 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-10-11T00:54:34.121829" elapsed="0.000387"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if the `container` contains the `item`.</doc>
<status status="PASS" start="2026-10-11T00:54:34.122381" elapsed="0.000477"/>
</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-10-11T00:54:34.112367" elapsed="0.010549"/>
</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-10-11T00:54:34.111817" elapsed="0.011143"/>
</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-10-11T00:54:34.123551" elapsed="0.000226"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:54:34.123229" elapsed="0.000606"/>
</kw>
<doc>Checks for empty topology after</doc>
<status status="PASS" start="2026-10-11T00:54:34.008234" elapsed="0.115634"/>
</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-10-11T00:54:34.125279" elapsed="0.000224"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:54:34.125028" 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-10-11T00:54:34.126489" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:34.126382" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:34.126362" 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-10-11T00:54:34.128692" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:34.128608" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:34.128591" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.129685" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:34.129331" elapsed="0.000380"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.130146" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:54:34.129866" elapsed="0.000307"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:54:34.130217" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:54:34.130344" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:54:34.128958" elapsed="0.001408"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:34.133194" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:34.133108" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:34.133089" elapsed="0.000169"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:34.134367" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:34.134283" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:34.134265" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:54:34.134777" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:54:34.134606" elapsed="0.000196"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:54:34.135125" 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-10-11T00:54:34.134964" elapsed="0.000184"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:54:34.173694" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:54:34.135664" elapsed="0.038129"/>
</kw>
<msg time="2026-10-11T00:54:34.173963" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:54:34.174023" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:34.135311" elapsed="0.038748"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:54:34.232794" 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-10-11T00:54:34.174604" elapsed="0.058288"/>
</kw>
<msg time="2026-10-11T00:54:34.233050" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:54:34.233092" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:34.174237" elapsed="0.058890"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:34.233426" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:34.233196" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:34.233179" elapsed="0.000321"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.233912" 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-10-11T00:54:34.233682" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:34.234251" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:34.234050" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:34.234033" elapsed="0.000289"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:54:34.234351" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:54:34.236780" elapsed="0.000115"/>
</kw>
<msg time="2026-10-11T00:54:34.236950" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:34.235720" 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-10-11T00:54:34.237431" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:34.237766" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:54:34.235122" elapsed="0.002826"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:54:34.234651" elapsed="0.003368"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:54:34.133968" elapsed="0.104125"/>
</kw>
<msg time="2026-10-11T00:54:34.238175" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:54:34.238215" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:34.133429" elapsed="0.104821"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:54:34.238428" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:54:34.238318" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:34.238301" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:34.238830" 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-10-11T00:54:34.239182" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:54:34.239247" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:54:34.132799" elapsed="0.106532"/>
</kw>
<msg time="2026-10-11T00:54:34.239439" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:54:34.239481" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:34.130722" elapsed="0.108794"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:34.239806" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:34.239584" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:34.239567" elapsed="0.000309"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:54:34.130577" elapsed="0.109321"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:54:34.130431" elapsed="0.109494"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:54:34.128298" elapsed="0.111676"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:54:34.126117" elapsed="0.113920"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:34.125703" elapsed="0.114374"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:54:34.124667" elapsed="0.115456"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.240820" 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-10-11T00:54:34.240304" elapsed="0.000542"/>
</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-10-11T00:54:34.255028" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:34.254709" elapsed="0.000346"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:34.255760" 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-10-11T00:54:34.255552" elapsed="0.000287">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-10-11T00:54:34.255924" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:34.255216" elapsed="0.000731"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.256470" 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-10-11T00:54:34.256135" elapsed="0.000360"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:54:34.256774" 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-10-11T00:54:34.256910" 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-10-11T00:54:34.256663" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.257370" 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-10-11T00:54:34.257146" 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-10-11T00:54:34.258336" 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-10-11T00:54:34.258103" elapsed="0.000274"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.258865" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:54:34.258607" elapsed="0.000282"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.259523" 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-10-11T00:54:34.259225" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:34.260236" 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-10-11T00:54:34.260045" elapsed="0.000214"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:34.260303" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:34.260443" 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-10-11T00:54:34.259721" elapsed="0.000746"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:34.260635" elapsed="0.000178"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:54:34.259085" elapsed="0.001764"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.261353" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:54:34.261087" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:34.262065" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:54:34.261874" elapsed="0.000215"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:34.262133" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:34.262256" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:54:34.261561" elapsed="0.000717"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:34.262456" elapsed="0.000167"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:54:34.260946" elapsed="0.001713"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:54:34.258931" elapsed="0.003759"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:54:34.262727" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:54:34.262853" 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-10-11T00:54:34.257750" elapsed="0.005125"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:34.257494" elapsed="0.005411"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:34.263105" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:34.262927" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:34.257477" elapsed="0.005700"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.264066" 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-10-11T00:54:34.263338" elapsed="0.000755"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:54:34.264140" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:34.254187" elapsed="0.010053"/>
</kw>
<msg time="2026-10-11T00:54:34.264288" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:34.249615" elapsed="0.014716"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:34.268691" 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/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-10-11T00:54:34.273058" 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/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-10-11T00:54:34.277747" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:34.277940" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:34.278146" 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-10-11T00:54:34.278573" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:34.278400" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:34.278386" 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-10-11T00:54:34.278810" 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-10-11T00:54:34.278997" 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-10-11T00:54:34.279182" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:54:34.278357" elapsed="0.000873"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:54:34.278214" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:34.279420" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:34.279489" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:54:34.279600" 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-10-11T00:54:34.248971" elapsed="0.030654"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.280643" 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-10-11T00:54:34.280401" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:54:34.291148" level="INFO">DELETE Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:54:34.291193" level="INFO">DELETE Response : url=http://10.30.170.173: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-10-11T00:54:34.291273" 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-10-11T00:54:34.280976" elapsed="0.010320"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:34.280746" elapsed="0.010587"/>
</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-10-11T00:54:34.291529" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:34.291357" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:34.280729" elapsed="0.010877"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.292821" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:34.292545" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:34.292285" elapsed="0.000606"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:34.292268" elapsed="0.000679"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.293543" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:34.293256" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:34.293013" elapsed="0.000602"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:34.292985" elapsed="0.000652"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.294190" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:54:34.293824" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:34.294510" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:34.294278" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.295033" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:34.294754" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:34.294585" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:34.294261" elapsed="0.000850"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.295649" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:54:34.295295" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:34.295945" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:34.295735" elapsed="0.000261"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.296477" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:34.296201" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:34.296033" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:34.295719" elapsed="0.000835"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:34.296698" elapsed="0.000294"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:54:34.297397" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:54:34.297170" elapsed="0.000266"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:54:34.297592" elapsed="0.000213"/>
</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-10-11T00:54:34.291936" elapsed="0.005924"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:54:34.297901" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:34.298088" 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-10-11T00:54:34.279863" elapsed="0.018248"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:54:34.298158" elapsed="0.000024"/>
</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-10-11T00:54:34.241106" elapsed="0.057147"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.298995" 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-10-11T00:54:34.298451" elapsed="0.000590"/>
</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-10-11T00:54:34.313289" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:34.312974" elapsed="0.000341"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:34.313981" 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-10-11T00:54:34.313809" elapsed="0.000247">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-10-11T00:54:34.314141" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:34.313490" elapsed="0.000673"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.314663" 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-10-11T00:54:34.314337" elapsed="0.000384"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:54:34.315022" 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-10-11T00:54:34.315141" 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-10-11T00:54:34.314892" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.315598" 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-10-11T00:54:34.315362" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.316564" 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-10-11T00:54:34.316317" elapsed="0.000288"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.317041" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:54:34.316782" elapsed="0.000284"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.317660" 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-10-11T00:54:34.317377" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:34.318354" 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-10-11T00:54:34.318176" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:34.318438" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T00:54:34.318566" 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-10-11T00:54:34.317853" elapsed="0.000735"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:34.318752" elapsed="0.000166"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-10-11T00:54:34.317245" elapsed="0.001709"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.319488" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:54:34.319204" elapsed="0.000308"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:34.320337" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:54:34.320156" elapsed="0.000205"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:34.320419" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T00:54:34.320547" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:54:34.319679" 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-10-11T00:54:34.320735" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:54:34.319073" elapsed="0.001864"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:54:34.317109" elapsed="0.003859"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:54:34.321019" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:54:34.321156" 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-10-11T00:54:34.315958" elapsed="0.005221"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:34.315702" elapsed="0.005505"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:34.321379" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:34.321229" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:34.315685" elapsed="0.005780"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.322138" 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-10-11T00:54:34.321627" elapsed="0.000538"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:54:34.322208" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:34.312465" elapsed="0.009843"/>
</kw>
<msg time="2026-10-11T00:54:34.322389" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:34.307812" elapsed="0.014639"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:34.326815" 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/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-10-11T00:54:34.331188" 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/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-10-11T00:54:34.335548" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:34.335731" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:34.335913" 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-10-11T00:54:34.336262" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:34.336115" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:34.336102" 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-10-11T00:54:34.336514" 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-10-11T00:54:34.336703" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:34.336871" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:54:34.336077" elapsed="0.000841"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:54:34.335978" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:34.337109" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:34.337178" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:54:34.337287" 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-10-11T00:54:34.307180" elapsed="0.030132"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.338483" 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-10-11T00:54:34.338238" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:54:34.349467" level="INFO">DELETE Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0m7skl41s938a19yqv1i6nmu2u13.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:54:34.349540" level="INFO">DELETE Response : url=http://10.30.170.173: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-10-11T00:54:34.349631" 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-10-11T00:54:34.338819" elapsed="0.010836"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:34.338588" elapsed="0.011105"/>
</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-10-11T00:54:34.349876" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:34.349717" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:34.338571" elapsed="0.011379"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.351178" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:34.350889" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:34.350634" elapsed="0.000615"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:34.350617" elapsed="0.000654"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.351834" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:34.351570" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:34.351319" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:34.351304" elapsed="0.000624"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.352492" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:54:34.352116" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:34.352791" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:34.352580" elapsed="0.000263"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.353313" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:34.353049" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:34.352865" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:34.352563" elapsed="0.000826"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.353927" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:54:34.353586" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:34.354259" elapsed="0.000189"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:34.354045" elapsed="0.000440"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.354954" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:34.354687" elapsed="0.000292"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:34.354511" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:34.353997" elapsed="0.001048"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:34.355193" elapsed="0.000309"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:54:34.355887" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:54:34.355667" elapsed="0.000244"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:54:34.356079" elapsed="0.000213"/>
</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-10-11T00:54:34.350287" elapsed="0.006061"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:54:34.356389" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T00:54:34.356579" 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-10-11T00:54:34.337558" elapsed="0.019045"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:54:34.356650" elapsed="0.000024"/>
</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-10-11T00:54:34.299249" elapsed="0.057496"/>
</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-10-11T00:54:34.357300" elapsed="0.000243"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:54:34.356991" elapsed="0.000610"/>
</kw>
<doc>Delete all previously configured BGP peers.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:54:34.124153" elapsed="0.233517"/>
</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-10-11T00:54:34.359216" level="INFO">Executing command 'ps -elf | egrep python | egrep 'play.py' | egrep -v grep'.</msg>
<msg time="2026-10-11T00:54:34.382662" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-10-11T00:54:34.382754" 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-10-11T00:54:34.359101" elapsed="0.023676"/>
</kw>
<return>
<value>${processes}</value>
<status status="PASS" start="2026-10-11T00:54:34.382823" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T00:54:34.382952" 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-10-11T00:54:34.358795" elapsed="0.024181"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.383451" level="INFO"/>
<arg>${processes}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:34.383194" elapsed="0.000297"/>
</kw>
<kw name="Kill_Remote_Processes" owner="KillPythonTool">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.384246" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:54:34.384315" 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-10-11T00:54:34.383991" elapsed="0.000347"/>
</kw>
<if>
<branch type="IF" condition="${arg_length} == 0">
<return>
<status status="PASS" start="2026-10-11T00:54:34.384506" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:54:34.384401" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:34.384384" elapsed="0.000194"/>
</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-10-11T00:54:34.384762" elapsed="0.000020"/>
</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-10-11T00:54:34.384979" elapsed="0.000018"/>
</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-10-11T00:54:34.385193" elapsed="0.000018"/>
</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-10-11T00:54:34.383715" elapsed="0.001553"/>
</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-10-11T00:54:34.358544" elapsed="0.026770"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-10-11T00:54:34.385531" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects </doc>
<status status="PASS" start="2026-10-11T00:54:34.385463" elapsed="0.000140"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-10-11T00:54:34.385749" elapsed="0.000465"/>
</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-10-11T00:54:34.358277" elapsed="0.027990"/>
</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="FAIL" start="2026-10-11T00:53:13.384813" elapsed="81.001482"/>
</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-10-11T00:54:34.416695" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:54:34.414938" elapsed="0.001800"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-10-11T00:54:34.414706" elapsed="0.002087"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.419240" 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-10-11T00:54:34.417763" elapsed="0.001503"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-10-11T00:54:34.419430" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:34.419336" elapsed="0.000134"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:34.419318" elapsed="0.000172"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.419994" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:54:34.419672" elapsed="0.000384"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.420514" 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-10-11T00:54:34.420221" elapsed="0.000318"/>
</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-10-11T00:54:34.421093" elapsed="0.000260"/>
</kw>
<msg time="2026-10-11T00:54:34.421458" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:54:34.421501" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:34.420702" elapsed="0.000821"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.422046" 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-10-11T00:54:34.421699" elapsed="0.000373"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.422937" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:54:34.422687" elapsed="0.000275"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.423367" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:54:34.423126" elapsed="0.000265"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.423847" 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-10-11T00:54:34.423581" elapsed="0.000290"/>
</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-10-11T00:54:34.424741" elapsed="0.000156"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.425345" level="INFO">${member_ip} = 10.30.170.173</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:34.425067" elapsed="0.000302"/>
</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-10-11T00:54:34.425557" elapsed="0.000168"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.426623" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:34.426187" elapsed="0.000462"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-11T00:54:34.426690" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:54:34.426815" 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-10-11T00:54:34.425902" elapsed="0.000937"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:54:34.427346" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x74344598ff10&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-10-11T00:54:34.427026" elapsed="0.000460"/>
</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-10-11T00:54:34.427829" elapsed="0.000159"/>
</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-10-11T00:54:34.424281" elapsed="0.003775"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:54:34.424109" elapsed="0.003987"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-10-11T00:54:34.423917" elapsed="0.004207"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.428687" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:54:34.428310" elapsed="0.000417"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.429280" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.173'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:54:34.428917" elapsed="0.000401"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.429859" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:54:34.429518" elapsed="0.000380"/>
</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-10-11T00:54:34.422295" elapsed="0.007654"/>
</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-10-11T00:54:34.417454" elapsed="0.012543"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:34.430160" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:34.430072" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:34.430054" elapsed="0.000166"/>
</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-10-11T00:54:34.431442" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:34.431105" elapsed="0.000363"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.431922" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:54:34.431659" elapsed="0.000287"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:54:34.431986" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:54:34.432126" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:54:34.430786" elapsed="0.001363"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:54:34.432988" level="INFO">${member_ip} = 10.30.170.173</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-10-11T00:54:34.432782" elapsed="0.000261"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:54:34.433773" 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-10-11T00:54:34.433864" 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-10-11T00:54:34.433631" elapsed="0.000258"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:34.436737" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:34.436194" elapsed="0.000625"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:34.436175" elapsed="0.000681"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:54:34.437594" 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-10-11T00:54:34.437816" 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-10-11T00:54:34.437113" elapsed="0.000751"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.438956" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.173" 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-10-11T00:54:34.438227" elapsed="0.000865"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:54:34.440224" 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-10-11T00:54:34.439386" elapsed="0.000887"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:54:34.441978" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:54:34.442165" 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-10-11T00:54:34.441659" elapsed="0.000547"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:34.442600" elapsed="0.000427"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:54:34.444351" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:54:35.059223" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 00:54:34 UTC 2026

  System load:  0.0                Processes:             123
  Usage of /:   14.2% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.173
  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.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:53:15 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:54:34.444108" elapsed="0.615256"/>
</kw>
<msg time="2026-10-11T00:54:35.059473" 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-10-11T00:54:34.443624" elapsed="0.616021"/>
</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-10-11T00:54:34.440817" elapsed="0.618996"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:54:35.061071" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-10-11T00:54:35.074333" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-10-11T00:54:35.074588" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T00:54:35.074724" 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-10-11T00:54:35.060346" elapsed="0.014445"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:54:35.075236" elapsed="0.000701"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:35.077671" 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-10-11T00:54:35.076881" elapsed="0.000953"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T00:54:35.078402" elapsed="0.000126"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:35.078086" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:35.078049" 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-10-11T00:54:35.079127" elapsed="0.000129"/>
</return>
<status status="PASS" start="2026-10-11T00:54:35.078803" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:35.078779" elapsed="0.000836"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T00:54:35.079696" elapsed="0.000021"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:35.081370" elapsed="0.000668"/>
</kw>
<kw name="Open 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-10-11T00:54:35.082509" elapsed="0.000376"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:54:35.083270" elapsed="0.000382"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:54:35.080356" elapsed="0.003387"/>
</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-10-11T00:54:34.435536" elapsed="0.648353"/>
</kw>
<msg time="2026-10-11T00:54:35.083956" 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-10-11T00:54:34.434924" elapsed="0.649139"/>
</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-10-11T00:54:34.434540" elapsed="0.649629"/>
</kw>
<msg time="2026-10-11T00:54:35.084220" 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-10-11T00:54:34.434058" elapsed="0.650222"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:35.085191" elapsed="0.000417"/>
</kw>
<kw name="Open 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-10-11T00:54:35.085868" elapsed="0.000207"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:54:35.086276" elapsed="0.000122"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:54:35.084704" elapsed="0.001809"/>
</kw>
<msg time="2026-10-11T00:54:35.086627" 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-10-11T00:54:34.433245" elapsed="0.653416"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:35.087285" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:35.086958" elapsed="0.000379"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-11T00:54:35.087389" elapsed="0.000066"/>
</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-10-11T00:54:34.432471" elapsed="0.655093"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:54:34.432293" elapsed="0.655316"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:54:34.432193" elapsed="0.655461"/>
</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-10-11T00:54:34.430443" elapsed="0.657283"/>
</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-10-11T00:54:35.087938" elapsed="0.000297"/>
</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-10-11T00:54:35.097958" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:35.097871" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:35.097853" elapsed="0.000179"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:54:35.098355" 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-10-11T00:54:35.098462" 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-10-11T00:54:35.098231" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:35.098914" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:35.098680" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:35.099370" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:35.099155" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:54:35.100129" 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-10-11T00:54:35.099938" elapsed="0.000300">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-10-11T00:54:35.100333" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T00:54:35.100374" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:35.099583" elapsed="0.000812"/>
</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-10-11T00:54:35.100697" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:35.100478" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:35.100461" elapsed="0.000326"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:54:35.101475" level="INFO">${ip_address} = 10.30.170.173</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-10-11T00:54:35.101250" elapsed="0.000249"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-10-11T00:54:35.101541" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:35.101663" level="INFO">${odl_ip} = 10.30.170.173</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-10-11T00:54:35.100972" elapsed="0.000713"/>
</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-10-11T00:54:35.101860" elapsed="0.000338"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:54:35.102524" level="INFO">index=4
host=10.30.170.173
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-10-11T00:54:35.102612" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.173
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-10-11T00:54:35.102425" elapsed="0.000211"/>
</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-10-11T00:54:35.102797" elapsed="0.000251"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-10-11T00:54:35.103475" level="INFO">Logging into '10.30.170.173:8101' as 'karaf'.</msg>
<msg time="2026-10-11T00:54:35.308203" 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-10-11T00:54:35.103238" elapsed="0.205066"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:35.309846" elapsed="0.000290"/>
</kw>
<kw name="Open 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-10-11T00:54:35.310325" elapsed="0.000163"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:54:35.310636" elapsed="0.000093"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:54:35.309490" elapsed="0.001342"/>
</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-10-11T00:54:35.308655" elapsed="0.002222"/>
</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-10-11T00:54:35.097636" elapsed="0.213288"/>
</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-10-11T00:54:35.091366" elapsed="0.219602"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:35.088705" elapsed="0.222332"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:54:35.088505" elapsed="0.222570"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-10-11T00:54:35.088305" elapsed="0.222804"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-10-11T00:54:34.417061" elapsed="0.894104"/>
</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-10-11T00:54:35.312053" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:35.311932" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:35.311911" 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-10-11T00:54:35.314289" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:35.314205" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:35.314188" elapsed="0.000165"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:35.315234" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:35.314888" elapsed="0.000371"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:54:35.315695" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:54:35.315430" elapsed="0.000289"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:54:35.315759" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T00:54:35.315889" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:54:35.314578" elapsed="0.001334"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:35.318541" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:35.318455" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:35.318437" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:35.319657" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:35.319572" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:35.319555" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:54:35.320157" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:54:35.319869" elapsed="0.000313"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:54:35.320559" 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-10-11T00:54:35.320349" elapsed="0.000235"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:54:35.360347" 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-10-11T00:54:35.321261" elapsed="0.039233"/>
</kw>
<msg time="2026-10-11T00:54:35.360625" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:54:35.360667" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:35.320743" elapsed="0.039959"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:54:35.437243" 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-10-11T00:54:35.361398" elapsed="0.075993"/>
</kw>
<msg time="2026-10-11T00:54:35.437583" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:54:35.437625" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:35.360878" elapsed="0.076783"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:35.437949" elapsed="0.000071"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:35.437733" elapsed="0.000380"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:35.437713" elapsed="0.000424"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:35.438733" 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-10-11T00:54:35.438323" elapsed="0.000491"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:35.439244" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:35.438876" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:35.438859" elapsed="0.000700"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:54:35.439593" 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">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:35.441462" elapsed="0.000409"/>
</kw>
<kw name="Open 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-10-11T00:54:35.442243" elapsed="0.000282"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:54:35.442846" elapsed="0.000229"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:54:35.440721" elapsed="0.002436"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:54:35.439873" elapsed="0.003409"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:54:35.319345" elapsed="0.124013"/>
</kw>
<msg time="2026-10-11T00:54:35.443465" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:54:35.443506" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:35.318755" elapsed="0.124787"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:54:35.443698" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:54:35.443611" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:35.443594" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:35.444129" 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-10-11T00:54:35.444511" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:54:35.444577" 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-10-11T00:54:35.318208" elapsed="0.126453"/>
</kw>
<msg time="2026-10-11T00:54:35.444744" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:54:35.444784" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:35.316268" elapsed="0.128551"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:35.445168" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:35.444886" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:35.444870" elapsed="0.000385"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:54:35.316122" elapsed="0.129159"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:54:35.315961" elapsed="0.129352"/>
</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-10-11T00:54:35.313962" elapsed="0.131408"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-10-11T00:54:35.311751" elapsed="0.133777"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:35.311320" elapsed="0.134286"/>
</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-10-11T00:54:34.414439" elapsed="1.031218"/>
</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-10-11T00:54:35.445817" elapsed="0.000148"/>
</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-10-11T00:54:35.446164" elapsed="0.000190"/>
</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-10-11T00:54:35.447872" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:54:35.447943" 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-10-11T00:54:35.447614" elapsed="0.000351"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:35.448141" elapsed="0.000299"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:54:35.449219" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:54:35.804106" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 00:54:34 UTC 2026

  System load:  0.0                Processes:             123
  Usage of /:   14.2% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.173
  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.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:54:34 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:54:35.448974" elapsed="0.355251"/>
</kw>
<msg time="2026-10-11T00:54:35.804311" 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-10-11T00:54:35.448607" elapsed="0.355780"/>
</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-10-11T00:54:35.447222" elapsed="0.357297"/>
</kw>
<msg time="2026-10-11T00:54:35.804582" 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-10-11T00:54:35.446842" elapsed="0.357798"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-10-11T00:54:35.446554" elapsed="0.358179"/>
</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-10-11T00:54:35.805031" elapsed="0.000686"/>
</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-10-11T00:54:35.807767" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:54:35.807842" 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-10-11T00:54:35.807510" elapsed="0.000354"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:35.808040" elapsed="0.000293"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:54:35.809131" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:54:36.171244" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 00:54:34 UTC 2026

  System load:  0.0                Processes:             123
  Usage of /:   14.2% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.173
  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.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:54:35 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:54:35.808888" elapsed="0.362482"/>
</kw>
<msg time="2026-10-11T00:54:36.171462" 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-10-11T00:54:35.808516" elapsed="0.363017"/>
</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-10-11T00:54:35.807090" elapsed="0.364542"/>
</kw>
<msg time="2026-10-11T00:54:36.171750" 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-10-11T00:54:35.806471" elapsed="0.365325"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-10-11T00:54:35.806022" elapsed="0.365846"/>
</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-10-11T00:54:36.172132" 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-10-11T00:54:36.174120" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:54:36.174198" 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-10-11T00:54:36.173841" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:36.174377" elapsed="0.000324"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:54:36.175707" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:54:36.545581" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 00:54:34 UTC 2026

  System load:  0.0                Processes:             123
  Usage of /:   14.2% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.173
  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.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:54:36 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:54:36.175258" elapsed="0.370477"/>
</kw>
<msg time="2026-10-11T00:54:36.545832" 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-10-11T00:54:36.174869" elapsed="0.371054"/>
</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-10-11T00:54:36.173452" elapsed="0.372614"/>
</kw>
<msg time="2026-10-11T00:54:36.546134" 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-10-11T00:54:36.173002" elapsed="0.373193"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-10-11T00:54:36.172654" elapsed="0.373635"/>
</kw>
<kw name="Require_Python" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:54:36.548176" level="INFO">Executing command 'python3 --help'.</msg>
<msg time="2026-10-11T00:54:36.561369" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:54:36.561547" 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-10-11T00:54:36.561605" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T00:54:36.561657" 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-10-11T00:54:36.547896" elapsed="0.013791"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:54:36.562868" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T00:54:36.562510" elapsed="0.000417"/>
</kw>
<msg time="2026-10-11T00:54:36.563064" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T00:54:36.563120" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:36.561947" elapsed="0.001200"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:36.563936" 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-10-11T00:54:36.563395" elapsed="0.000575"/>
</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-10-11T00:54:36.564516" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:36.564113" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:36.564078" elapsed="0.000559"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-10-11T00:54:36.564814" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-10-11T00:54:36.564707" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:36.564687" elapsed="0.000245"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-10-11T00:54:36.565064" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:36.565019" elapsed="0.000096"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:36.564998" elapsed="0.000145"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:36.565354" elapsed="0.000026"/>
</kw>
<msg time="2026-10-11T00:54:36.565622" 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-10-11T00:54:36.547351" elapsed="0.018304"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-10-11T00:54:36.565842" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-10-11T00:54:36.565741" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:36.565719" elapsed="0.000223"/>
</if>
<kw name="Fatal Error" owner="BuiltIn">
<arg>Python 3 is not installed!</arg>
<doc>Stops the whole execution.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:36.566217" elapsed="0.000028"/>
</kw>
<doc>Verify current SSH connection leads to machine with python working. Fatal fail otherwise.</doc>
<status status="PASS" start="2026-10-11T00:54:36.546770" elapsed="0.019548"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:54:36.567936" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-10-11T00:54:36.640268" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:54:36.640564" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T00:54:36.640656" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T00:54:36.640736" 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-10-11T00:54:36.567725" elapsed="0.073058"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:54:36.642882" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T00:54:36.642291" elapsed="0.000766"/>
</kw>
<msg time="2026-10-11T00:54:36.643260" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T00:54:36.643347" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:36.641241" elapsed="0.002152"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:36.644839" 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-10-11T00:54:36.643823" elapsed="0.001081"/>
</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-10-11T00:54:36.645803" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:36.645174" elapsed="0.000757"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:36.645129" elapsed="0.000887"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-10-11T00:54:36.646332" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-10-11T00:54:36.646161" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:36.646121" elapsed="0.000424"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-10-11T00:54:36.646729" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:36.646659" elapsed="0.000151"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:36.646626" elapsed="0.000226"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:36.647211" elapsed="0.000044"/>
</kw>
<msg time="2026-10-11T00:54:36.647516" 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-10-11T00:54:36.567197" elapsed="0.080372"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-10-11T00:54:36.647922" elapsed="0.000054"/>
</return>
<status status="PASS" start="2026-10-11T00:54:36.647709" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:36.647673" elapsed="0.000453"/>
</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-10-11T00:54:36.648545" elapsed="0.000045"/>
</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-10-11T00:54:36.566649" elapsed="0.082066"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T00:54:36.687460" level="INFO">[chan 3] Opened sftp connection (server version 3)</msg>
<msg time="2026-10-11T00:54:36.706703" 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-10-11T00:54:36.649119" elapsed="0.057709"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:54:36.707791" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x74344564ca50&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-10-11T00:54:36.707270" elapsed="0.000894"/>
</kw>
<kw name="Create_Default_Session" owner="TemplatedRequests">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:54:36.713185" level="INFO">Creating Session using : alias=default, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x743445820090&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-10-11T00:54:36.712506" elapsed="0.000892"/>
</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-10-11T00:54:36.711625" elapsed="0.002057"/>
</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-10-11T00:54:36.715125" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:36.714908" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:36.714870" elapsed="0.000397"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:54:36.716036" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:54:36.715633" elapsed="0.000459"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:54:36.716800" 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-10-11T00:54:36.716487" elapsed="0.000365"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:54:36.726276" 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-10-11T00:54:36.718045" elapsed="0.008353"/>
</kw>
<msg time="2026-10-11T00:54:36.726627" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:54:36.726716" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:36.717237" elapsed="0.009526"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:54:36.733665" 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-10-11T00:54:36.728010" elapsed="0.005780"/>
</kw>
<msg time="2026-10-11T00:54:36.734016" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:54:36.734108" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:36.727182" elapsed="0.006980"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:36.734798" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:36.734312" elapsed="0.000597"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:36.734273" elapsed="0.000684"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:36.735924" 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-10-11T00:54:36.735394" elapsed="0.000655"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:36.736676" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:36.736182" elapsed="0.000604"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:36.736146" elapsed="0.000688"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:54:36.736900" elapsed="0.000057"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:54:36.740546" elapsed="0.000252"/>
</kw>
<msg time="2026-10-11T00:54:36.740884" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:36.739368" elapsed="0.001665"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:36.741465" elapsed="0.000046"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:36.741817" elapsed="0.000040"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:54:36.738724" 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-10-11T00:54:36.737604" elapsed="0.004564"/>
</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-10-11T00:54:36.714444" elapsed="0.027884"/>
</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-10-11T00:54:36.744172" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:36.743953" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:36.743916" elapsed="0.000396"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:54:36.745062" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:54:36.744670" elapsed="0.000435"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:54:36.745562" 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-10-11T00:54:36.745350" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:54:36.796721" 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-10-11T00:54:36.746354" elapsed="0.050428"/>
</kw>
<msg time="2026-10-11T00:54:36.796882" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:54:36.796924" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:36.745862" elapsed="0.051085"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:54:36.798819" 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-10-11T00:54:36.797521" elapsed="0.001349"/>
</kw>
<msg time="2026-10-11T00:54:36.798956" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:54:36.799009" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:36.797152" elapsed="0.001883"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:36.799311" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:36.799103" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:36.799085" elapsed="0.000297"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:36.799805" 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-10-11T00:54:36.799579" elapsed="0.000271"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:36.800129" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:36.799909" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:36.799892" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:54:36.800228" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:54:36.801750" elapsed="0.000112"/>
</kw>
<msg time="2026-10-11T00:54:36.801900" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:36.801275" elapsed="0.000679"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:36.802148" elapsed="0.000019"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:36.802299" elapsed="0.000018"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:54:36.800997" elapsed="0.001373"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:54:36.800515" elapsed="0.001912"/>
</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-10-11T00:54:36.743501" elapsed="0.058999"/>
</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-10-11T00:54:36.803099" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:36.803016" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:36.802998" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:54:36.803489" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:54:36.803304" elapsed="0.000210"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:54:36.803807" 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-10-11T00:54:36.803674" elapsed="0.000156"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:54:36.853705" 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-10-11T00:54:36.804327" elapsed="0.049440"/>
</kw>
<msg time="2026-10-11T00:54:36.853863" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:54:36.853903" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:36.803999" elapsed="0.049925"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:54:36.855792" 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-10-11T00:54:36.854477" elapsed="0.001366"/>
</kw>
<msg time="2026-10-11T00:54:36.855926" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:54:36.855965" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:36.854113" elapsed="0.001930"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:36.856322" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:36.856115" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:36.856097" elapsed="0.000296"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:36.856818" 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-10-11T00:54:36.856591" elapsed="0.000272"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:36.857140" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:36.856922" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:36.856905" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:54:36.857242" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:54:36.858785" elapsed="0.000291"/>
</kw>
<msg time="2026-10-11T00:54:36.859116" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:36.858303" 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-10-11T00:54:36.859352" elapsed="0.000020"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:36.859529" 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-10-11T00:54:36.858022" elapsed="0.001582"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:54:36.857537" elapsed="0.002107"/>
</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-10-11T00:54:36.802803" elapsed="0.056911"/>
</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-10-11T00:54:34.414171" elapsed="2.445594"/>
</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-10-11T00:54:36.861001" elapsed="0.000200"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:54:36.860739" elapsed="0.000511"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:36.862170" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:36.862083" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:36.862064" elapsed="0.000169"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:36.864534" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:36.864449" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:36.864431" elapsed="0.000164"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:36.865512" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:36.865174" elapsed="0.000364"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:54:36.865951" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:54:36.865692" elapsed="0.000282"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:54:36.866027" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:36.866152" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:54:36.864803" elapsed="0.001371"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:36.868995" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:36.868892" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:36.868874" elapsed="0.000187"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:36.870140" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:36.870056" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:36.870039" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:54:36.870578" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:54:36.870381" elapsed="0.000222"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:54:36.870899" 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-10-11T00:54:36.870765" elapsed="0.000157"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:54:36.910633" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:54:36.871440" elapsed="0.039292"/>
</kw>
<msg time="2026-10-11T00:54:36.910885" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:54:36.910926" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:36.871093" elapsed="0.039868"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:54:36.962898" 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-10-11T00:54:36.911502" elapsed="0.051512"/>
</kw>
<msg time="2026-10-11T00:54:36.963168" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:54:36.963210" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:36.911145" elapsed="0.052099"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:36.963550" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:36.963315" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:36.963297" elapsed="0.000326"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:36.964052" 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-10-11T00:54:36.963809" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:36.964377" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:36.964171" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:36.964155" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:54:36.964495" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:54:36.966950" elapsed="0.000130"/>
</kw>
<msg time="2026-10-11T00:54:36.967136" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:36.965883" 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-10-11T00:54:36.967597" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:36.967935" 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-10-11T00:54:36.965264" elapsed="0.002871"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:54:36.964770" elapsed="0.003424"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:54:36.869787" elapsed="0.098480"/>
</kw>
<msg time="2026-10-11T00:54:36.968347" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:54:36.968387" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:36.869214" elapsed="0.099229"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:54:36.968599" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-11T00:54:36.968513" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:36.968495" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:36.969013" 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-10-11T00:54:36.969313" elapsed="0.000057"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:54:36.969437" 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-10-11T00:54:36.868603" elapsed="0.100925"/>
</kw>
<msg time="2026-10-11T00:54:36.969611" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:54:36.969652" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:36.866544" elapsed="0.103143"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:36.969974" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:36.969754" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:36.969739" elapsed="0.000319"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:54:36.866383" elapsed="0.103697"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:54:36.866231" elapsed="0.103879"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:54:36.864137" elapsed="0.106023"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:54:36.861806" elapsed="0.108403"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:36.861398" elapsed="0.108851"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:54:36.860377" elapsed="0.109919"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:36.971255" 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-10-11T00:54:36.970585" elapsed="0.000698"/>
</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-10-11T00:54:36.982753" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:36.982448" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:36.983505" 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-10-11T00:54:36.983274" elapsed="0.000310">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-10-11T00:54:36.983669" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:36.982940" elapsed="0.000752"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:36.984206" 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-10-11T00:54:36.983865" elapsed="0.000366"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:54:36.984528" 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-10-11T00:54:36.984669" 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-10-11T00:54:36.984398" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:36.985157" 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-10-11T00:54:36.984889" 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-10-11T00:54:36.986172" 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-10-11T00:54:36.985908" elapsed="0.000344"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:36.986698" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:54:36.986447" elapsed="0.000275"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:36.987353" 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-10-11T00:54:36.987079" elapsed="0.000299"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:36.988108" 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-10-11T00:54:36.987884" elapsed="0.000248"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:36.988176" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:54:36.988302" 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-10-11T00:54:36.987569" elapsed="0.000755"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:36.988509" elapsed="0.000185"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:54:36.986917" elapsed="0.001813"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:36.989245" 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-10-11T00:54:36.988959" elapsed="0.000311"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:36.989941" 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-10-11T00:54:36.989765" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:36.990025" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:36.990148" 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-10-11T00:54:36.989456" elapsed="0.000715"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:36.990334" elapsed="0.000179"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-ibgp-peer1</var>
<status status="PASS" start="2026-10-11T00:54:36.988829" elapsed="0.001720"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:36.991215" 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-10-11T00:54:36.990777" elapsed="0.000463"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:36.991911" 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-10-11T00:54:36.991734" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:36.991990" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:54:36.992116" 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-10-11T00:54:36.991423" elapsed="0.000715"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:36.992302" elapsed="0.000182"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:54:36.990647" elapsed="0.001873"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:36.993028" 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-10-11T00:54:36.992748" elapsed="0.000304"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:36.993718" 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-10-11T00:54:36.993542" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:36.993784" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:36.993909" 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-10-11T00:54:36.993221" elapsed="0.000711"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:36.994106" elapsed="0.000168"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:54:36.992618" elapsed="0.001692"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:36.994818" 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-10-11T00:54:36.994551" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:36.995544" 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-10-11T00:54:36.995351" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:36.995611" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:36.995733" 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-10-11T00:54:36.995041" elapsed="0.000714"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:36.995963" elapsed="0.000188"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:54:36.994419" elapsed="0.001769"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:36.996706" 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-10-11T00:54:36.996437" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:36.997512" 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-10-11T00:54:36.997274" elapsed="0.000263"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:36.997581" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:36.997706" 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-10-11T00:54:36.996897" 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-10-11T00:54:36.997892" elapsed="0.000204"/>
</kw>
<var name="${key}">PEER_ROLE</var>
<var name="${value}">ibgp</var>
<status status="PASS" start="2026-10-11T00:54:36.996287" elapsed="0.001854"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:36.998661" 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-10-11T00:54:36.998370" elapsed="0.000315"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:36.999356" 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-10-11T00:54:36.999181" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:36.999439" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:54:36.999563" 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-10-11T00:54:36.998854" elapsed="0.000731"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:36.999747" elapsed="0.000164"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:54:36.998240" elapsed="0.001707"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.000496" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:54:37.000203" elapsed="0.000318"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:37.001349" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.001171" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:37.001435" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:54:37.001561" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:54:37.000690" elapsed="0.000894"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.001747" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:54:37.000073" elapsed="0.001873"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.002472" 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-10-11T00:54:37.002190" elapsed="0.000305"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:37.003158" 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-10-11T00:54:37.002968" elapsed="0.000214"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:37.003225" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:37.003348" 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-10-11T00:54:37.002664" elapsed="0.000707"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.003551" elapsed="0.000163"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:54:37.002058" elapsed="0.001692"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.004268" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:54:37.003999" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:37.004958" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.004784" elapsed="0.000227"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:37.005056" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:37.005179" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:54:37.004479" elapsed="0.000722"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.005365" elapsed="0.000181"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:54:37.003848" elapsed="0.001771"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.006148" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:54:37.005851" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:37.006845" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.006670" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:37.006913" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:37.007048" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:54:37.006342" elapsed="0.000729"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.007234" elapsed="0.000164"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:54:37.005720" elapsed="0.001731"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.007942" 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-10-11T00:54:37.007678" elapsed="0.000288"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:37.008709" 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-10-11T00:54:37.008525" elapsed="0.000208"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:37.008777" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:37.008900" 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-10-11T00:54:37.008203" elapsed="0.000719"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.009104" elapsed="0.000165"/>
</kw>
<var name="${key}">RR_CLIENT</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:54:37.007550" elapsed="0.001755"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:54:36.986765" elapsed="0.022571"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:54:37.009373" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:54:37.009523" 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-10-11T00:54:36.985562" elapsed="0.023986"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:36.985283" elapsed="0.024294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.009749" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:37.009600" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:36.985261" elapsed="0.024556"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.010744" 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-10-11T00:54:37.009998" elapsed="0.000773"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:54:37.010814" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:36.981913" elapsed="0.029000"/>
</kw>
<msg time="2026-10-11T00:54:37.010961" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:36.977134" elapsed="0.033883"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:37.016958" 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/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-10-11T00:54:37.021569" 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/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-10-11T00:54:37.026101" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.026284" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.026479" 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-10-11T00:54:37.026823" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:37.026675" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:37.026662" 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-10-11T00:54:37.027065" 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-10-11T00:54:37.027244" 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-10-11T00:54:37.027421" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:54:37.026636" elapsed="0.000835"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:54:37.026549" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.027647" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:37.027713" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:54:37.027823" 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-10-11T00:54:36.976529" elapsed="0.051319"/>
</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-10-11T00:54:37.037743" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:37.037434" elapsed="0.000335"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:37.038451" 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-10-11T00:54:37.038259" elapsed="0.000256">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-10-11T00:54:37.038601" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:37.037929" elapsed="0.000694"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.039134" 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-10-11T00:54:37.038796" elapsed="0.000364"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:54:37.039453" 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-10-11T00:54:37.039573" 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-10-11T00:54:37.039329" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.040064" 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-10-11T00:54:37.039832" 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-10-11T00:54:37.040447" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:37.040180" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.040936" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:37.040670" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:37.040523" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.040163" elapsed="0.000870"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.041939" 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-10-11T00:54:37.041195" elapsed="0.000773"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:54:37.042027" 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-10-11T00:54:37.036901" elapsed="0.005228"/>
</kw>
<msg time="2026-10-11T00:54:37.042181" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:37.032038" elapsed="0.010186"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:37.046874" 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/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-10-11T00:54:37.051391" 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/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-10-11T00:54:37.056038" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.056224" 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-10-11T00:54:37.056424" 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-10-11T00:54:37.056799" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:37.056652" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:37.056639" 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-10-11T00:54:37.057060" 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-10-11T00:54:37.057250" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.057432" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:54:37.056613" elapsed="0.000868"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:54:37.056522" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.057658" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:37.057724" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:54:37.057844" 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-10-11T00:54:37.031294" elapsed="0.026577"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:37.059001" 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-10-11T00:54:37.058801" elapsed="0.000267">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-10-11T00:54:37.059152" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:37.058476" elapsed="0.000699"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.059480" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:37.059238" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.059996" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:37.059723" elapsed="0.000299"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:37.059554" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.059220" elapsed="0.000853"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.060588" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:37.060234" elapsed="0.000378"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:54:37.060656" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:37.060777" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:54:37.058160" elapsed="0.002639"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.062064" 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-10-11T00:54:37.061821" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.062531" 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-10-11T00:54:37.062300" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.063053" 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-10-11T00:54:37.062821" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.063527" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:37.063285" elapsed="0.000282"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:54:37.064297" 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-10-11T00:54:37.064129" elapsed="0.000192"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:54:37.064643" 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-10-11T00:54:37.064498" elapsed="0.000169"/>
</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-10-11T00:54:37.064828" elapsed="0.000171"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.065533" 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-10-11T00:54:37.065249" elapsed="0.000325"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:54:37.065613" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:37.065740" 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-10-11T00:54:37.063752" elapsed="0.002011"/>
</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-10-11T00:54:37.084343" level="INFO">PUT Request : url=http://10.30.170.173: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.34.2', '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-10-11T00:54:37.084430" level="INFO">PUT Response : url=http://10.30.170.173: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=node01w6r2d988hs1d1ghqiwu23xqwt14.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Sat, 10-Oct-2026 00:54:37 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T00:54:37.084535" 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-10-11T00:54:37.066081" elapsed="0.018478"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:37.065825" elapsed="0.018776"/>
</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-10-11T00:54:37.084782" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:37.084625" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.065809" elapsed="0.019053"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.086038" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:37.085752" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:37.085513" elapsed="0.000596"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.085496" elapsed="0.000635"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.086695" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:37.086429" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:37.086180" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.086165" elapsed="0.000624"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.087328" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:54:37.086963" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.087645" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:37.087431" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.088208" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:37.087920" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:37.087751" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.087399" elapsed="0.000885"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.088813" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:54:37.088475" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.089124" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:37.088901" elapsed="0.000275"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.089636" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:37.089358" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:37.089198" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.088884" elapsed="0.000828"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:37.089857" elapsed="0.000314"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:54:37.090580" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:54:37.090334" elapsed="0.000271"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.090760" elapsed="0.000232"/>
</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-10-11T00:54:37.085203" elapsed="0.005846"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:54:37.091190" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:54:37.091108" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.091091" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.091429" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:54:37.091490" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:54:37.091649" 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-10-11T00:54:37.061133" elapsed="0.030540"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:54:37.091727" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:54:37.091847" 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-10-11T00:54:36.972131" elapsed="0.119738"/>
</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-10-11T00:54:37.092169" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:37.091952" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.091936" elapsed="0.000317"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:54:37.092282" elapsed="0.000024"/>
</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-10-11T00:54:36.971563" elapsed="0.120815"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.093933" 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-10-11T00:54:37.092574" elapsed="0.001388"/>
</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-10-11T00:54:37.105592" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:37.105273" elapsed="0.000350"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:37.106375" 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-10-11T00:54:37.106187" elapsed="0.000265">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-10-11T00:54:37.106537" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:37.105786" elapsed="0.000774"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.107055" 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-10-11T00:54:37.106734" elapsed="0.000346"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:54:37.107354" 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-10-11T00:54:37.107516" 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-10-11T00:54:37.107247" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.107957" 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-10-11T00:54:37.107739" 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-10-11T00:54:37.108941" 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-10-11T00:54:37.108693" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.109446" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.109185" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.110092" 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-10-11T00:54:37.109801" elapsed="0.000316"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:37.110791" 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-10-11T00:54:37.110614" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:37.110858" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:37.110996" 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-10-11T00:54:37.110286" elapsed="0.000737"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.111198" elapsed="0.000167"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:54:37.109669" elapsed="0.001731"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.111907" 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-10-11T00:54:37.111643" elapsed="0.000288"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:37.112607" 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-10-11T00:54:37.112430" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:37.112674" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:37.112795" 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-10-11T00:54:37.112108" elapsed="0.000709"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.112990" elapsed="0.000166"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-ebgp-peer1</var>
<status status="PASS" start="2026-10-11T00:54:37.111514" elapsed="0.001678"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.113844" 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-10-11T00:54:37.113433" elapsed="0.000435"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:37.114597" 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-10-11T00:54:37.114420" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:37.114664" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:37.114786" 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-10-11T00:54:37.114097" elapsed="0.000712"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.114971" elapsed="0.000188"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-10-11T00:54:37.113289" elapsed="0.001907"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.115707" 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-10-11T00:54:37.115439" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:37.116516" 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-10-11T00:54:37.116278" elapsed="0.000263"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:37.116586" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:37.116711" 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-10-11T00:54:37.115898" 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-10-11T00:54:37.116898" elapsed="0.000208"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:54:37.115294" elapsed="0.001860"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.117772" 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-10-11T00:54:37.117451" elapsed="0.000349"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:37.118664" 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-10-11T00:54:37.118427" elapsed="0.000270"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:37.118756" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T00:54:37.118914" 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-10-11T00:54:37.118018" elapsed="0.000923"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.119236" elapsed="0.000228"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:54:37.117274" elapsed="0.002233"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.120123" 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-10-11T00:54:37.119779" elapsed="0.000376"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:37.121054" 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-10-11T00:54:37.120814" elapsed="0.000269"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:37.121135" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:37.121262" 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-10-11T00:54:37.120383" elapsed="0.000906"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.121514" elapsed="0.000208"/>
</kw>
<var name="${key}">PEER_ROLE</var>
<var name="${value}">ebgp</var>
<status status="PASS" start="2026-10-11T00:54:37.119622" elapsed="0.002145"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.122382" 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-10-11T00:54:37.122054" elapsed="0.000372"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:37.123151" 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-10-11T00:54:37.122951" elapsed="0.000224"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:37.123219" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:37.123343" 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-10-11T00:54:37.122618" elapsed="0.000749"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.123589" elapsed="0.000171"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:54:37.121883" elapsed="0.001915"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.124326" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:54:37.124050" elapsed="0.000300"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:37.125247" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.125066" elapsed="0.000206"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:37.125316" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:37.125458" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:54:37.124536" 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-10-11T00:54:37.125646" elapsed="0.000166"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:54:37.123896" elapsed="0.001953"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.126369" 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-10-11T00:54:37.126099" elapsed="0.000295"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:37.127080" 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-10-11T00:54:37.126887" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:37.127148" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:37.127270" 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-10-11T00:54:37.126580" elapsed="0.000712"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.127469" elapsed="0.000165"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:54:37.125948" elapsed="0.001723"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.128180" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:54:37.127898" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:37.128867" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.128692" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:37.128934" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:37.129083" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:54:37.128372" elapsed="0.000734"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.129269" elapsed="0.000186"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:54:37.127768" elapsed="0.001724"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.130015" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:54:37.129719" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:37.130726" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.130540" elapsed="0.000209"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:37.130791" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:37.130916" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:54:37.130212" elapsed="0.000726"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.131116" elapsed="0.000165"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:54:37.129589" elapsed="0.001728"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.131847" 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-10-11T00:54:37.131579" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:37.132556" 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-10-11T00:54:37.132363" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:37.132622" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:37.132746" 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-10-11T00:54:37.132056" elapsed="0.000713"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.132929" elapsed="0.000196"/>
</kw>
<var name="${key}">RR_CLIENT</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:54:37.131446" elapsed="0.001716"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.133679" 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-10-11T00:54:37.133397" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:37.134597" 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-10-11T00:54:37.134220" elapsed="0.000402"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:37.134666" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:37.134791" 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-10-11T00:54:37.133872" 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-10-11T00:54:37.134992" elapsed="0.000177"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">32768</var>
<status status="PASS" start="2026-10-11T00:54:37.133258" elapsed="0.001949"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:54:37.109515" elapsed="0.025723"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:54:37.135277" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:54:37.135429" 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-10-11T00:54:37.108337" elapsed="0.027119"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:37.108090" elapsed="0.027395"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.135665" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:37.135510" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.108072" elapsed="0.027662"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.136647" 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-10-11T00:54:37.135894" elapsed="0.000780"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:54:37.136718" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:37.104758" elapsed="0.032061"/>
</kw>
<msg time="2026-10-11T00:54:37.136869" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:37.099919" elapsed="0.036997"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:37.141564" 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/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-10-11T00:54:37.146112" 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/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-10-11T00:54:37.150608" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.150787" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.150985" 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-10-11T00:54:37.151324" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:37.151180" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:37.151166" 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-10-11T00:54:37.151602" 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-10-11T00:54:37.151784" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.151948" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:54:37.151141" elapsed="0.000885"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:54:37.151053" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.152203" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:37.152270" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:54:37.152382" 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-10-11T00:54:37.099302" elapsed="0.053119"/>
</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-10-11T00:54:37.162265" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:37.161934" elapsed="0.000357"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:37.163003" 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-10-11T00:54:37.162784" elapsed="0.000287">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-10-11T00:54:37.163155" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:37.162466" elapsed="0.000711"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.163673" 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-10-11T00:54:37.163348" elapsed="0.000350"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:54:37.163971" 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-10-11T00:54:37.164139" 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-10-11T00:54:37.163863" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.164605" 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-10-11T00:54:37.164369" 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-10-11T00:54:37.164966" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:37.164719" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.165496" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:37.165212" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:37.165065" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.164702" elapsed="0.000912"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.166558" 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-10-11T00:54:37.165777" elapsed="0.000814"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:54:37.166636" 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-10-11T00:54:37.161430" elapsed="0.005313"/>
</kw>
<msg time="2026-10-11T00:54:37.166796" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:37.156551" elapsed="0.010289"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:37.171691" 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/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-10-11T00:54:37.176350" 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/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-10-11T00:54:37.180856" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.181049" 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-10-11T00:54:37.181231" 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-10-11T00:54:37.181579" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:37.181434" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:37.181420" 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-10-11T00:54:37.181805" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.182002" 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-10-11T00:54:37.182170" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:54:37.181381" elapsed="0.000836"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:54:37.181296" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.182389" elapsed="0.000032"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:37.182470" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:54:37.182588" 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-10-11T00:54:37.155818" elapsed="0.026797"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:37.183776" 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-10-11T00:54:37.183581" elapsed="0.000254">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-10-11T00:54:37.183917" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:37.183239" elapsed="0.000701"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.184238" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:37.184018" elapsed="0.000272"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.184766" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:37.184502" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:37.184311" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.184001" elapsed="0.000842"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.185373" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:37.185031" elapsed="0.000366"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:54:37.185460" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:37.185585" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:54:37.182923" elapsed="0.002685"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.186853" 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-10-11T00:54:37.186632" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.187337" 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-10-11T00:54:37.187116" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.187813" 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-10-11T00:54:37.187597" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.188277" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:37.188061" elapsed="0.000255"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:54:37.189049" 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-10-11T00:54:37.188873" elapsed="0.000200"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:54:37.189372" 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-10-11T00:54:37.189229" elapsed="0.000166"/>
</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-10-11T00:54:37.189573" elapsed="0.000154"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.190157" 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-10-11T00:54:37.189925" elapsed="0.000272"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:54:37.190235" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:37.190360" 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-10-11T00:54:37.188514" elapsed="0.001869"/>
</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-10-11T00:54:37.202180" level="INFO">PUT Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.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-10-11T00:54:37.202242" level="INFO">PUT Response : url=http://10.30.170.173: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-10-11T00:54:37.202324" 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-10-11T00:54:37.190731" elapsed="0.011616"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:37.190499" elapsed="0.011890"/>
</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-10-11T00:54:37.202593" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:37.202434" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.190481" elapsed="0.012192"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.203880" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:37.203610" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:37.203351" elapsed="0.000601"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.203334" elapsed="0.000656"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.204601" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:37.204317" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:37.204056" elapsed="0.000618"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.204037" elapsed="0.000658"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.205238" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:54:37.204873" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.205553" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:37.205325" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.206070" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:37.205794" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:37.205626" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.205309" elapsed="0.000836"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.206668" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:54:37.206318" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.206960" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:37.206753" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.207494" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:37.207221" elapsed="0.000297"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:37.207053" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.206737" elapsed="0.000832"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:37.207712" elapsed="0.000324"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:54:37.208514" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:54:37.208242" 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-10-11T00:54:37.208726" elapsed="0.000212"/>
</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-10-11T00:54:37.203025" elapsed="0.005989"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:54:37.209187" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:54:37.209089" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.209067" elapsed="0.000198"/>
</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-10-11T00:54:37.209425" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:54:37.209487" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:54:37.209652" 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-10-11T00:54:37.185918" elapsed="0.023758"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:54:37.209731" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:54:37.209853" 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-10-11T00:54:37.094996" elapsed="0.114880"/>
</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-10-11T00:54:37.210223" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:37.209963" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.209948" elapsed="0.000359"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:54:37.210337" elapsed="0.000024"/>
</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-10-11T00:54:37.094320" elapsed="0.116131"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.211364" 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-10-11T00:54:37.210634" elapsed="0.000758"/>
</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-10-11T00:54:37.223248" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:37.222932" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:37.223951" 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-10-11T00:54:37.223764" elapsed="0.000259">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-10-11T00:54:37.224111" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:37.223448" elapsed="0.000685"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.224631" 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-10-11T00:54:37.224305" elapsed="0.000350"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:54:37.224931" 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-10-11T00:54:37.225074" 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-10-11T00:54:37.224821" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.225579" 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-10-11T00:54:37.225335" 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-10-11T00:54:37.226548" 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-10-11T00:54:37.226296" elapsed="0.000296"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.227026" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.226767" elapsed="0.000283"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.227665" 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-10-11T00:54:37.227385" elapsed="0.000304"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:37.228376" 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-10-11T00:54:37.228196" elapsed="0.000204"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:37.228461" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:54:37.228587" 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-10-11T00:54:37.227857" elapsed="0.000753"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.228774" elapsed="0.000165"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:54:37.227254" elapsed="0.001737"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.229500" 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-10-11T00:54:37.229219" elapsed="0.000304"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:37.230220" 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-10-11T00:54:37.230034" elapsed="0.000210"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:37.230419" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T00:54:37.230550" 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-10-11T00:54:37.229691" elapsed="0.000883"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.230741" elapsed="0.000173"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-ebgp-peer2</var>
<status status="PASS" start="2026-10-11T00:54:37.229090" elapsed="0.001862"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.231622" 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-10-11T00:54:37.231195" elapsed="0.000451"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:37.232312" 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-10-11T00:54:37.232136" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:37.232380" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T00:54:37.232519" 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-10-11T00:54:37.231814" elapsed="0.000727"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.232712" elapsed="0.000164"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.4</var>
<status status="PASS" start="2026-10-11T00:54:37.231064" elapsed="0.001849"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.233433" 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-10-11T00:54:37.233154" elapsed="0.000304"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:37.234128" 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-10-11T00:54:37.233932" elapsed="0.000220"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:37.234196" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:54:37.234317" 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-10-11T00:54:37.233627" elapsed="0.000712"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.234519" elapsed="0.000165"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:54:37.233023" elapsed="0.001697"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.235262" 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-10-11T00:54:37.234996" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:37.235970" 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-10-11T00:54:37.235795" elapsed="0.000216"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:37.236065" elapsed="0.000033"/>
</return>
<msg time="2026-10-11T00:54:37.236218" 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-10-11T00:54:37.235476" 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-10-11T00:54:37.236473" elapsed="0.000182"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:54:37.234852" elapsed="0.001841"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.237244" 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-10-11T00:54:37.236920" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:37.237952" 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-10-11T00:54:37.237772" elapsed="0.000220"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:37.238046" elapsed="0.000032"/>
</return>
<msg time="2026-10-11T00:54:37.238195" 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-10-11T00:54:37.237454" 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-10-11T00:54:37.238401" elapsed="0.000181"/>
</kw>
<var name="${key}">PEER_ROLE</var>
<var name="${value}">ebgp</var>
<status status="PASS" start="2026-10-11T00:54:37.236790" elapsed="0.001829"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.239134" 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-10-11T00:54:37.238845" elapsed="0.000312"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:37.239841" 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-10-11T00:54:37.239655" elapsed="0.000213"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:37.239913" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:37.240062" 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-10-11T00:54:37.239324" elapsed="0.000765"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.240299" elapsed="0.000184"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:54:37.238716" elapsed="0.001805"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.241074" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:54:37.240754" elapsed="0.000350"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:37.241928" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.241754" elapsed="0.000198"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:37.242018" elapsed="0.000034"/>
</return>
<msg time="2026-10-11T00:54:37.242168" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:54:37.241285" elapsed="0.000906"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.242356" elapsed="0.000180"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:54:37.240618" elapsed="0.001955"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.243084" 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-10-11T00:54:37.242799" elapsed="0.000309"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:37.243777" 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-10-11T00:54:37.243603" elapsed="0.000198"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:37.243844" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:37.243966" 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-10-11T00:54:37.243275" elapsed="0.000730"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.244216" elapsed="0.000183"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:54:37.242670" elapsed="0.001782"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.244996" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:54:37.244680" elapsed="0.000348"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:37.245732" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.245549" elapsed="0.000206"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:37.245799" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:37.245919" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:54:37.245225" elapsed="0.000716"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.246155" elapsed="0.000166"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:54:37.244550" elapsed="0.001808"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.246866" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:54:37.246601" elapsed="0.000288"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:37.247570" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.247380" elapsed="0.000214"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:37.247638" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:37.247759" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:54:37.247073" elapsed="0.000707"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.247950" elapsed="0.000216"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:54:37.246472" elapsed="0.001740"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.248764" 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-10-11T00:54:37.248496" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:37.249523" 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-10-11T00:54:37.249327" elapsed="0.000220"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:37.249591" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:37.249713" 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-10-11T00:54:37.248957" 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-10-11T00:54:37.249897" elapsed="0.000210"/>
</kw>
<var name="${key}">RR_CLIENT</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:54:37.248334" elapsed="0.001819"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.250677" 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-10-11T00:54:37.250393" elapsed="0.000309"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:54:37.252446" 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-10-11T00:54:37.251201" elapsed="0.001271"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:54:37.252519" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:37.252650" 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-10-11T00:54:37.250869" elapsed="0.001804"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.252843" elapsed="0.000190"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">32768</var>
<status status="PASS" start="2026-10-11T00:54:37.250253" elapsed="0.002833"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:54:37.227096" elapsed="0.026028"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:54:37.253166" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:37.253302" 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-10-11T00:54:37.225934" elapsed="0.027396"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:37.225683" elapsed="0.027676"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.253554" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:37.253381" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.225665" elapsed="0.027960"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.254532" 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-10-11T00:54:37.253783" elapsed="0.000776"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:54:37.254635" 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//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-10-11T00:54:37.222429" elapsed="0.032308"/>
</kw>
<msg time="2026-10-11T00:54:37.254786" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:37.217378" elapsed="0.037450"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:37.259389" 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/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-10-11T00:54:37.264059" 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/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-10-11T00:54:37.268717" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.268901" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.269104" 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-10-11T00:54:37.269462" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:37.269299" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:37.269286" 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-10-11T00:54:37.269691" 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-10-11T00:54:37.269871" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.270055" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:54:37.269260" elapsed="0.000843"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:54:37.269173" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.270278" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:37.270344" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:54:37.270469" 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-10-11T00:54:37.216730" elapsed="0.053764"/>
</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-10-11T00:54:37.280636" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:37.280314" elapsed="0.000349"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:37.281330" 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-10-11T00:54:37.281158" elapsed="0.000230">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-10-11T00:54:37.281488" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:37.280822" elapsed="0.000689"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.282003" 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-10-11T00:54:37.281684" elapsed="0.000345"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:54:37.282305" 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-10-11T00:54:37.282438" 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-10-11T00:54:37.282197" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.282879" 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-10-11T00:54:37.282660" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:54:37.283257" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:37.283007" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.283764" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:37.283495" elapsed="0.000295"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:37.283333" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.282988" elapsed="0.000854"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.284787" 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-10-11T00:54:37.284022" elapsed="0.000793"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:54:37.284859" 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//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-10-11T00:54:37.279793" elapsed="0.005168"/>
</kw>
<msg time="2026-10-11T00:54:37.285136" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:37.274708" elapsed="0.010472"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:54:37.289902" 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/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-10-11T00:54:37.294534" 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/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-10-11T00:54:37.299076" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.299260" 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-10-11T00:54:37.299456" 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-10-11T00:54:37.299794" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:37.299649" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:54:37.299635" 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-10-11T00:54:37.300034" 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-10-11T00:54:37.300223" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.300386" elapsed="0.000031"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:54:37.299610" elapsed="0.000837"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:54:37.299523" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.300623" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:54:37.300689" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:54:37.300806" 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-10-11T00:54:37.273957" elapsed="0.026876"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:54:37.301960" 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-10-11T00:54:37.301776" elapsed="0.000258">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-10-11T00:54:37.302117" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:54:37.301446" elapsed="0.000693"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.302438" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:37.302201" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.302944" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:37.302681" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:37.302512" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.302184" elapsed="0.000862"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.303646" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:37.303255" elapsed="0.000415"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:54:37.303747" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:54:37.303876" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:54:37.301130" elapsed="0.002768"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.305142" 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-10-11T00:54:37.304906" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.305605" 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-10-11T00:54:37.305376" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.306077" 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-10-11T00:54:37.305849" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.306537" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:37.306306" elapsed="0.000270"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:54:37.307297" 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-10-11T00:54:37.307139" elapsed="0.000182"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:54:37.307642" 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-10-11T00:54:37.307489" elapsed="0.000176"/>
</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-10-11T00:54:37.307826" elapsed="0.000174"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.308426" 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-10-11T00:54:37.308193" elapsed="0.000276"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:54:37.308506" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:54:37.308633" 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-10-11T00:54:37.306756" elapsed="0.001900"/>
</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-10-11T00:54:37.324203" level="INFO">PUT Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.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-10-11T00:54:37.324265" level="INFO">PUT Response : url=http://10.30.170.173: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-10-11T00:54:37.324356" 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-10-11T00:54:37.308950" elapsed="0.015430"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:37.308717" elapsed="0.015725"/>
</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-10-11T00:54:37.324654" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:37.324494" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.308701" elapsed="0.016033"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.325909" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:37.325640" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:37.325380" elapsed="0.000615"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.325363" elapsed="0.000655"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.326585" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:37.326304" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:37.326067" elapsed="0.000589"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.326052" elapsed="0.000626"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.327221" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:54:37.326868" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.327534" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:37.327308" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.328055" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:37.327771" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:37.327608" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.327292" elapsed="0.000840"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.328659" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:54:37.328307" elapsed="0.000377"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.328956" elapsed="0.000189"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:37.328747" elapsed="0.000433"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.329646" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:54:37.329368" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T00:54:37.329202" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.328730" elapsed="0.000991"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:37.329866" elapsed="0.000302"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:54:37.330565" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:54:37.330330" elapsed="0.000259"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.330742" elapsed="0.000215"/>
</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-10-11T00:54:37.325091" elapsed="0.005937"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:54:37.331168" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:54:37.331087" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.331070" elapsed="0.000175"/>
</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-10-11T00:54:37.331387" elapsed="0.000035"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:54:37.331465" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:54:37.331623" 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-10-11T00:54:37.304214" elapsed="0.027433"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:54:37.331701" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:54:37.331821" 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-10-11T00:54:37.212306" elapsed="0.119538"/>
</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-10-11T00:54:37.332198" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:37.331928" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.331912" elapsed="0.000370"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:54:37.332312" elapsed="0.000024"/>
</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-10-11T00:54:37.211675" elapsed="0.120748"/>
</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-10-11T00:54:37.332997" elapsed="0.000230"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:54:37.332686" elapsed="0.000599"/>
</kw>
<doc>Configure an iBGP and two eBGP peers</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:54:36.859841" elapsed="0.473481"/>
</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-10-11T00:54:37.334790" elapsed="0.000278"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:54:37.334537" 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-10-11T00:54:37.336061" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:37.335958" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.335940" elapsed="0.000184"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:37.338520" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:37.338437" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.338419" elapsed="0.000164"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.339531" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:37.339194" elapsed="0.000361"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.339967" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:54:37.339707" elapsed="0.000312"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:54:37.340059" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:37.340186" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:54:37.338790" elapsed="0.001418"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:37.342876" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:37.342793" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.342775" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:37.344029" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:37.343932" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.343915" elapsed="0.000175"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:54:37.344403" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:54:37.344238" elapsed="0.000214"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:54:37.344759" 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-10-11T00:54:37.344618" elapsed="0.000164"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:54:37.400909" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:54:37.345289" elapsed="0.055762"/>
</kw>
<msg time="2026-10-11T00:54:37.401231" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:54:37.401273" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:37.344938" elapsed="0.056371"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:54:37.427492" 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-10-11T00:54:37.401903" elapsed="0.025698"/>
</kw>
<msg time="2026-10-11T00:54:37.427806" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:54:37.427850" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:37.401524" elapsed="0.026361"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.428218" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:37.427961" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.427941" elapsed="0.000352"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.428743" 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-10-11T00:54:37.428505" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.429086" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:37.428867" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.428848" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:54:37.429190" 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-10-11T00:54:37.431896" elapsed="0.000135"/>
</kw>
<msg time="2026-10-11T00:54:37.432092" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:37.430649" 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-10-11T00:54:37.432559" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.432896" 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-10-11T00:54:37.430017" 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-10-11T00:54:37.429515" elapsed="0.003643"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:54:37.343676" elapsed="0.089554"/>
</kw>
<msg time="2026-10-11T00:54:37.433312" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:54:37.433352" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:37.343111" elapsed="0.090275"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:54:37.433570" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:54:37.433484" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.433466" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.433999" 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-10-11T00:54:37.434313" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:54:37.434377" 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-10-11T00:54:37.342508" elapsed="0.091979"/>
</kw>
<msg time="2026-10-11T00:54:37.434571" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:54:37.434610" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:37.340549" elapsed="0.094096"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:37.434936" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:37.434711" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:37.434696" elapsed="0.000327"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:54:37.340391" elapsed="0.094653"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:54:37.340253" elapsed="0.094821"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:54:37.338129" elapsed="0.096994"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:54:37.335704" elapsed="0.099516"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:37.335277" elapsed="0.099985"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:54:37.334177" elapsed="0.101135"/>
</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-10-11T00:54:37.435580" elapsed="0.000100"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.439272" 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.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:37.438957" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.439740" 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.173 --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-10-11T00:54:37.439519" elapsed="0.000264"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:54:37.443661" 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.173 --peerport=1790 --debug --logfile bgp_peer1.log &amp;&gt;bgp_peer1.log</msg>
<msg time="2026-10-11T00:54:37.443752" 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.173 --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-10-11T00:54:37.439939" elapsed="0.003839"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:37.444210" 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.173 --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-10-11T00:54:37.443989" elapsed="0.000265"/>
</kw>
<arg>${iBGP_PEER1_COMMAND}</arg>
<arg>${iBGP_PEER1_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-10-11T00:54:37.438618" elapsed="0.005687"/>
</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-10-11T00:54:47.446181" 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-10-11T00:54:37.445879" elapsed="10.000976">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-10-11T00:54:47.447201" elapsed="0.000030"/>
</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-10-11T00:54:37.445602" elapsed="10.001740">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-10-11T00:54:37.445224" elapsed="10.002255"/>
</kw>
<msg time="2026-10-11T00:54:47.447580" 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-10-11T00:54:37.444833" elapsed="10.002771"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-10-11T00:54:47.447773" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-10-11T00:54:47.447696" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:47.447669" elapsed="0.000189"/>
</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-10-11T00:54:47.448104" elapsed="0.000025"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:47.448283" elapsed="0.000018"/>
</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-10-11T00:54:37.444558" elapsed="10.003797"/>
</kw>
<kw name="Check_Example_IPv4_Topology_Does_Not_Contain" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:54:47.458312" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:54:47.458480" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node012wkykfzx8pv3ssb3pk6iiyhs15.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Sat, 10-Oct-2026 00:54: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': '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-10-11T00:54:47.458573" 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-10-11T00:54:47.448972" elapsed="0.009626"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:47.459200" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:47.458849" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:47.459796" 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-10-11T00:54:47.459468" elapsed="0.000372"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if the `container` contains the `item`.</doc>
<status status="PASS" start="2026-10-11T00:54:47.460033" elapsed="0.000429"/>
</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-10-11T00:54:47.448572" elapsed="0.011949"/>
</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-10-11T00:54:47.461155" elapsed="0.000245"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:54:47.460779" elapsed="0.000716"/>
</kw>
<doc>Connect BGP peer</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:54:37.333693" elapsed="10.127837"/>
</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-10-11T00:54:47.463190" elapsed="0.000196"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:54:47.462940" elapsed="0.000514"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:47.464366" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:47.464274" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:47.464256" 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-10-11T00:54:47.466704" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:47.466614" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:47.466597" elapsed="0.000169"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:47.467701" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:47.467356" elapsed="0.000370"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:54:47.468153" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:54:47.467880" elapsed="0.000297"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:54:47.468217" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:47.468343" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:54:47.466991" elapsed="0.001375"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:47.471213" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:47.471129" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:47.471111" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:47.472366" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:47.472282" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:47.472266" elapsed="0.000187"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:54:47.472776" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:54:47.472604" elapsed="0.000196"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:54:47.473121" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:54:47.472980" elapsed="0.000164"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:54:47.506725" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:54:47.473648" elapsed="0.033170"/>
</kw>
<msg time="2026-10-11T00:54:47.506986" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:54:47.507028" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:47.473300" elapsed="0.033781"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:54:47.532058" 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-10-11T00:54:47.507612" elapsed="0.024542"/>
</kw>
<msg time="2026-10-11T00:54:47.532337" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:54:47.532379" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:47.507250" elapsed="0.025187"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:47.532722" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:47.532507" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:47.532490" elapsed="0.000303"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:47.533211" 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-10-11T00:54:47.532985" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:47.533548" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:47.533331" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:47.533314" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:54:47.533649" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:54:47.536145" elapsed="0.000117"/>
</kw>
<msg time="2026-10-11T00:54:47.536319" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:47.535074" elapsed="0.001400"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:47.536781" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:47.537132" elapsed="0.000070"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:54:47.534468" 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-10-11T00:54:47.533976" elapsed="0.003396"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:54:47.472027" elapsed="0.065438"/>
</kw>
<msg time="2026-10-11T00:54:47.537548" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:54:47.537587" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:47.471443" elapsed="0.066179"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:54:47.537772" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:54:47.537689" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:47.537672" elapsed="0.000175"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:47.538200" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:47.538521" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:54:47.538585" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:54:47.470824" elapsed="0.067845"/>
</kw>
<msg time="2026-10-11T00:54:47.538752" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:54:47.538796" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:47.468734" elapsed="0.070096"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:47.539136" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:47.538910" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:47.538880" elapsed="0.000326"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:54:47.468584" elapsed="0.070643"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:54:47.468433" elapsed="0.070822"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:54:47.466303" elapsed="0.073000"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:54:47.464018" elapsed="0.075367"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:47.463606" elapsed="0.075905"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:54:47.462580" elapsed="0.076979"/>
</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-10-11T00:54:47.539720" elapsed="0.000097"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:54:47.543516" 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.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T00:54:47.543218" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:47.543965" 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.173 --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-10-11T00:54:47.543736" elapsed="0.000271"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:54:47.548294" 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.173 --peerport=1790 --nexthop 1.1.1.1 --asnumber 32768 --debug --logfile ebgp_peer1.log &amp;&gt;ebgp_peer1.log</msg>
<msg time="2026-10-11T00:54:47.548380" 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.173 --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-10-11T00:54:47.544159" elapsed="0.004244"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:47.548842" 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.173 --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-10-11T00:54:47.548623" elapsed="0.000293"/>
</kw>
<arg>${eBGP_PEER1_COMMAND}</arg>
<arg>${eBGP_PEER1_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-10-11T00:54:47.542869" elapsed="0.006100"/>
</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-10-11T00:54:57.550794" 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-10-11T00:54:47.550527" elapsed="10.000919">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-10-11T00:54:57.551780" 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-10-11T00:54:47.550237" elapsed="10.001701">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-10-11T00:54:47.549860" elapsed="10.002193"/>
</kw>
<msg time="2026-10-11T00:54:57.552155" 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-10-11T00:54:47.549494" elapsed="10.002685"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-10-11T00:54:57.552346" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-10-11T00:54:57.552270" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:57.552242" elapsed="0.000209"/>
</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-10-11T00:54:57.552681" elapsed="0.000026"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:57.552890" 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-10-11T00:54:47.549205" elapsed="10.003763"/>
</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-10-11T00:54:57.553586" elapsed="0.000295"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:54:57.553226" elapsed="0.000714"/>
</kw>
<doc>Connect BGP peer</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:54:47.462104" elapsed="10.091871"/>
</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-10-11T00:54:57.555719" elapsed="0.000221"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:54:57.555465" 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-10-11T00:54:57.558908" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:57.558787" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:57.558769" elapsed="0.000252"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:57.562497" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:57.562395" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:57.562377" elapsed="0.000183"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:54:57.563498" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:54:57.563145" elapsed="0.000378"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:54:57.563970" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:54:57.563677" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:54:57.564035" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:54:57.564161" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:54:57.562773" elapsed="0.001411"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:57.567168" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:57.567082" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:57.567064" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:54:57.568296" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:54:57.568212" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:57.568190" elapsed="0.000167"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:54:57.568702" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:54:57.568526" elapsed="0.000200"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:54:57.569050" 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-10-11T00:54:57.568909" elapsed="0.000164"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:54:57.602991" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:54:57.569579" elapsed="0.033507"/>
</kw>
<msg time="2026-10-11T00:54:57.603239" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:54:57.603281" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:57.569228" elapsed="0.034088"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:54:57.635274" 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-10-11T00:54:57.603886" elapsed="0.031490"/>
</kw>
<msg time="2026-10-11T00:54:57.635551" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:54:57.635592" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:57.603525" elapsed="0.032101"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:57.635921" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:57.635694" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:57.635676" elapsed="0.000317"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:57.636425" 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-10-11T00:54:57.636180" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:57.636754" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:57.636553" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:57.636536" elapsed="0.000364"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:54:57.636930" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:54:57.639373" elapsed="0.000252"/>
</kw>
<msg time="2026-10-11T00:54:57.639714" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:54:57.638307" 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-10-11T00:54:57.640165" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:57.640526" 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-10-11T00:54:57.637718" elapsed="0.002996"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:54:57.637230" 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-10-11T00:54:57.567952" elapsed="0.072911"/>
</kw>
<msg time="2026-10-11T00:54:57.640944" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:54:57.640983" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:57.567383" elapsed="0.073635"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:54:57.641171" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:54:57.641086" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:57.641069" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:57.641599" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:57.641933" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:54:57.641998" 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-10-11T00:54:57.566777" elapsed="0.075307"/>
</kw>
<msg time="2026-10-11T00:54:57.642166" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:54:57.642206" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:57.564548" elapsed="0.077692"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:54:57.642606" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:54:57.642306" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-10-11T00:54:57.642290" elapsed="0.000387"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:54:57.564380" elapsed="0.078318"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:54:57.564235" elapsed="0.078492"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:54:57.562093" elapsed="0.080681"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:54:57.558517" elapsed="0.084323"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:54:57.556154" elapsed="0.086726"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:54:57.555085" elapsed="0.087841"/>
</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-10-11T00:54:57.650509" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node012wkykfzx8pv3ssb3pk6iiyhs15.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:54:57.650666" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:54:57.650754" 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-10-11T00:54:57.644089" elapsed="0.006689"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:57.651282" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:57.651001" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:57.651911" 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-10-11T00:54:57.651570" elapsed="0.000384"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-11T00:54:57.652570" 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 the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-11T00:54:57.652120" elapsed="0.000515">'{"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-10-11T00:54:57.643714" elapsed="0.009020">'{"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-10-11T00:54:58.662659" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node012wkykfzx8pv3ssb3pk6iiyhs15.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:54:58.662930" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:54:58.663128" 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-10-11T00:54:58.654279" elapsed="0.008915"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:58.664390" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:58.663699" elapsed="0.000819"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:58.665737" 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-10-11T00:54:58.664980" elapsed="0.000874"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-11T00:54:58.667209" 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 the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-11T00:54:58.666219" elapsed="0.001124">'{"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-10-11T00:54:58.653365" elapsed="0.014224">'{"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-10-11T00:54:59.678017" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node012wkykfzx8pv3ssb3pk6iiyhs15.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:54:59.678266" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:54:59.678578" 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-10-11T00:54:59.669290" elapsed="0.009347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:59.679918" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:54:59.679125" elapsed="0.000888"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:54:59.681231" 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-10-11T00:54:59.680478" elapsed="0.000849"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-11T00:54:59.682743" 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 the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-11T00:54:59.681766" elapsed="0.001196">'{"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-10-11T00:54:59.668327" elapsed="0.014849">'{"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-10-11T00:55:00.693516" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node012wkykfzx8pv3ssb3pk6iiyhs15.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:55:00.693763" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:55:00.693990" 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-10-11T00:55:00.684951" elapsed="0.009094"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:00.695218" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:00.694534" elapsed="0.000779"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:00.696548" 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-10-11T00:55:00.695802" elapsed="0.000844"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-11T00:55:00.697999" 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 the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-11T00:55:00.697034" elapsed="0.001098">'{"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-10-11T00:55:00.684002" elapsed="0.014339">'{"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-10-11T00:55:01.708571" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node012wkykfzx8pv3ssb3pk6iiyhs15.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:55:01.708846" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:55:01.709048" 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-10-11T00:55:01.700023" elapsed="0.009080"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:01.710276" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:01.709598" elapsed="0.000772"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:01.711607" 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-10-11T00:55:01.710859" elapsed="0.000845"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-11T00:55:01.713096" 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 the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-11T00:55:01.712116" elapsed="0.001115">'{"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-10-11T00:55:01.699103" elapsed="0.014371">'{"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-10-11T00:55:02.724956" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node012wkykfzx8pv3ssb3pk6iiyhs15.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:55:02.725257" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:55:02.725595" 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-10-11T00:55:02.715536" elapsed="0.010116"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:02.726930" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:02.726150" elapsed="0.000874"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:02.728248" 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-10-11T00:55:02.727497" elapsed="0.000847"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-11T00:55:02.730360" 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 the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-11T00:55:02.728739" elapsed="0.001812">'{"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-10-11T00:55:02.714393" elapsed="0.016409">'{"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-10-11T00:55:03.741108" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node012wkykfzx8pv3ssb3pk6iiyhs15.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:55:03.741347" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:55:03.741589" 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-10-11T00:55:03.732502" elapsed="0.009143"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:03.742832" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:03.742126" elapsed="0.000803"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:03.744135" 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-10-11T00:55:03.743364" elapsed="0.000868"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-11T00:55:03.745601" 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 the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-11T00:55:03.744634" elapsed="0.001135">'{"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-10-11T00:55:03.731572" elapsed="0.014410">'{"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-10-11T00:55:04.755723" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node012wkykfzx8pv3ssb3pk6iiyhs15.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:55:04.756012" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:55:04.756217" 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-10-11T00:55:04.747823" elapsed="0.008451"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:04.757506" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:04.756795" elapsed="0.000808"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:04.758837" 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-10-11T00:55:04.758061" elapsed="0.000874"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-11T00:55:04.760339" 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 the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-11T00:55:04.759298" elapsed="0.001306">'{"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-10-11T00:55:04.746822" elapsed="0.014064">'{"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-10-11T00:55:05.771493" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node012wkykfzx8pv3ssb3pk6iiyhs15.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:55:05.771697" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:55:05.771855" 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-10-11T00:55:05.763771" elapsed="0.008122"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:05.772752" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:05.772217" elapsed="0.000601"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:05.773660" 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-10-11T00:55:05.773107" elapsed="0.000635"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-11T00:55:05.774640" 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 the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-11T00:55:05.773988" elapsed="0.000760">'{"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-10-11T00:55:05.763019" elapsed="0.011874">'{"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-10-11T00:55:06.787930" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node012wkykfzx8pv3ssb3pk6iiyhs15.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:55:06.788216" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:55:06.788471" 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-10-11T00:55:06.779976" elapsed="0.008552"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:06.789798" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:06.789035" elapsed="0.000856"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:06.791291" 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-10-11T00:55:06.790351" elapsed="0.001034"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-11T00:55:06.792823" 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 the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-11T00:55:06.791806" elapsed="0.001169">'{"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-10-11T00:55:06.775860" elapsed="0.017344">'{"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-10-11T00:55:07.802500" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node012wkykfzx8pv3ssb3pk6iiyhs15.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:55:07.802883" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:55:07.803087" 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-10-11T00:55:07.794884" elapsed="0.008258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:07.804654" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:07.803952" elapsed="0.000880"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:07.806328" 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-10-11T00:55:07.805274" elapsed="0.001185"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-11T00:55:07.807853" 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 the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-11T00:55:07.806858" elapsed="0.001133">'{"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-10-11T00:55:07.793954" elapsed="0.014251">'{"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-10-11T00:55:07.808384" 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-10-11T00:54:57.643108" elapsed="10.165506">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-10-11T00:55:07.809298" elapsed="0.000055"/>
</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-10-11T00:55:07.812666" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:55:07.812005" elapsed="0.000966"/>
</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-10-11T00:55:07.810961" elapsed="0.002119"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:55:07.810216" elapsed="0.002978"/>
</kw>
<doc>The IPv4 topology shall contain the route announced by the first eBGP</doc>
<status status="FAIL" start="2026-10-11T00:54:57.554320" elapsed="10.258949">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-10-11T00:55:07.817682" elapsed="0.000475"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:55:07.816586" elapsed="0.001683"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:55:07.820391" elapsed="0.000063"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:55:07.820181" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:07.820135" elapsed="0.000436"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:55:07.826003" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:55:07.825816" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:07.825776" elapsed="0.000366"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:55:07.828300" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:55:07.827536" elapsed="0.000820"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:55:07.829354" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:55:07.828763" elapsed="0.000673"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:55:07.829530" elapsed="0.000066"/>
</return>
<msg time="2026-10-11T00:55:07.829849" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:55:07.826636" elapsed="0.003265"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:55:07.836033" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:55:07.835844" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:07.835804" elapsed="0.000367"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:55:07.838667" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:55:07.838473" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:07.838388" elapsed="0.000447"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:55:07.839585" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:55:07.839167" elapsed="0.000473"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:55:07.840332" 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-10-11T00:55:07.840029" elapsed="0.000356"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:55:07.874819" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:55:07.841581" elapsed="0.033370"/>
</kw>
<msg time="2026-10-11T00:55:07.875184" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:55:07.875243" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:55:07.840805" elapsed="0.034486"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:55:07.907996" 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-10-11T00:55:07.876050" elapsed="0.032044"/>
</kw>
<msg time="2026-10-11T00:55:07.908239" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:55:07.908280" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:55:07.875555" elapsed="0.032759"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:55:07.908612" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:55:07.908382" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:07.908364" elapsed="0.000321"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:07.909176" 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-10-11T00:55:07.908951" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:55:07.909518" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:55:07.909303" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:07.909286" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:55:07.909619" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:55:07.912184" elapsed="0.000253"/>
</kw>
<msg time="2026-10-11T00:55:07.912498" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:55:07.911011" elapsed="0.001621"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:55:07.912955" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:55:07.913453" 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-10-11T00:55:07.910386" elapsed="0.003262"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:55:07.909926" elapsed="0.003797"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:55:07.837856" elapsed="0.075942"/>
</kw>
<msg time="2026-10-11T00:55:07.913879" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:55:07.913919" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:55:07.836542" elapsed="0.077444"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:55:07.914143" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:55:07.914057" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:07.914039" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:55:07.914617" 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-10-11T00:55:07.914950" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:55:07.915015" 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-10-11T00:55:07.835144" elapsed="0.079955"/>
</kw>
<msg time="2026-10-11T00:55:07.915181" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:55:07.915220" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:55:07.830788" elapsed="0.084467"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:55:07.915622" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:55:07.915320" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:07.915304" elapsed="0.000388"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:55:07.830440" elapsed="0.085287"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:55:07.830083" elapsed="0.085673"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:55:07.825100" elapsed="0.090705"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:55:07.819574" elapsed="0.096279"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:55:07.818631" elapsed="0.097261"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:55:07.815267" elapsed="0.100671"/>
</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-10-11T00:55:07.916097" elapsed="0.000095"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:55:07.916678" 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-10-11T00:55:07.916360" elapsed="0.000355"/>
</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-10-11T00:55:07.921879" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:55:07.934290" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:55:07.934377" 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-10-11T00:55:07.921752" elapsed="0.012647"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:07.934863" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:07.934620" elapsed="0.000284"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:55:07.935303" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:55:07.935383" 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-10-11T00:55:07.935061" elapsed="0.000397">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-10-11T00:55:07.921324" elapsed="0.014226">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:55:08.946354" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:55:08.959459" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:55:08.959670" 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-10-11T00:55:08.946071" elapsed="0.013697"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:08.960827" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:08.960232" elapsed="0.000688"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:55:08.961843" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:55:08.962012" 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-10-11T00:55:08.961256" elapsed="0.000876">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-10-11T00:55:08.945000" elapsed="0.017332">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:55:09.973580" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:55:09.986761" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:55:09.986955" 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-10-11T00:55:09.973264" elapsed="0.013741"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:09.988042" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:09.987489" elapsed="0.000644"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:55:09.989069" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:55:09.989237" 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-10-11T00:55:09.988503" elapsed="0.000856">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-10-11T00:55:09.972321" elapsed="0.017275">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:55:11.000336" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:55:11.013873" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:55:11.014065" 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-10-11T00:55:11.000058" elapsed="0.014060"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:11.015136" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:11.014597" elapsed="0.000632"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:55:11.016160" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:55:11.016329" 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-10-11T00:55:11.015603" elapsed="0.000881">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-10-11T00:55:10.999121" elapsed="0.017588">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:55:12.028500" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:55:12.042464" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:55:12.042709" 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-10-11T00:55:12.028146" elapsed="0.014618"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:12.043864" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:12.043231" elapsed="0.000726"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:55:12.044886" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:55:12.045084" 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-10-11T00:55:12.044296" elapsed="0.000928">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-10-11T00:55:12.027000" elapsed="0.018470">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:55:13.057377" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:55:13.071349" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:55:13.071614" 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-10-11T00:55:13.057049" elapsed="0.014641"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:13.072829" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:13.072183" elapsed="0.000739"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:55:13.073855" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:55:13.074051" 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-10-11T00:55:13.073264" elapsed="0.000928">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-10-11T00:55:13.055920" elapsed="0.018526">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:55:14.085889" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:55:14.099883" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:55:14.100105" 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-10-11T00:55:14.085500" elapsed="0.014658"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:14.101285" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:14.100699" elapsed="0.000678"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:55:14.102320" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:55:14.102548" 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-10-11T00:55:14.101782" elapsed="0.000931">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-10-11T00:55:14.084327" elapsed="0.018611">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:55:15.114274" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:55:15.128188" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:55:15.128403" 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-10-11T00:55:15.113957" elapsed="0.014553"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:15.129601" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:15.129002" elapsed="0.000718"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:55:15.130721" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:55:15.130923" 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-10-11T00:55:15.130102" elapsed="0.000977">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-10-11T00:55:15.112866" elapsed="0.018435">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:55:16.143374" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:55:16.156971" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:55:16.157170" 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-10-11T00:55:16.143076" elapsed="0.014145"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:16.158315" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:16.157736" elapsed="0.000707"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:55:16.159400" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:55:16.159607" 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-10-11T00:55:16.158837" elapsed="0.000920">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-10-11T00:55:16.142066" elapsed="0.017901">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:55:17.170680" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:55:17.183946" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:55:17.184145" 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-10-11T00:55:17.170329" elapsed="0.013869"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:17.185231" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:17.184707" elapsed="0.000618"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:55:17.186258" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:55:17.186461" 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-10-11T00:55:17.185719" elapsed="0.000870">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-10-11T00:55:17.169402" elapsed="0.017421">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:55:18.197682" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:55:18.211011" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:55:18.211207" 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-10-11T00:55:18.197338" elapsed="0.013921"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:18.212294" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:18.211769" elapsed="0.000617"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:55:18.213346" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:55:18.213546" 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-10-11T00:55:18.212814" elapsed="0.000885">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-10-11T00:55:18.196340" elapsed="0.017565">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:55:19.220786" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:55:19.233750" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:55:19.233880" 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-10-11T00:55:19.220591" elapsed="0.013322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:19.234564" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:19.234199" elapsed="0.000444"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:55:19.235193" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:55:19.235299" 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-10-11T00:55:19.234861" elapsed="0.000516">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-10-11T00:55:19.220010" elapsed="0.015580">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:55:20.246228" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:55:20.260105" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:55:20.260303" 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-10-11T00:55:20.245944" elapsed="0.014411"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:20.261397" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:20.260869" elapsed="0.000655"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:55:20.262461" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:55:20.262653" 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-10-11T00:55:20.261893" elapsed="0.000887">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-10-11T00:55:20.245000" elapsed="0.017984">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:55:21.273640" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:55:21.287322" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:55:21.287554" 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-10-11T00:55:21.273301" elapsed="0.014333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:21.288702" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:21.288101" elapsed="0.000697"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:55:21.289760" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:55:21.289931" 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-10-11T00:55:21.289140" elapsed="0.000928">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-10-11T00:55:21.272357" elapsed="0.017950">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:55:22.301309" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:55:22.314882" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:55:22.315092" 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-10-11T00:55:22.301022" elapsed="0.014131"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:22.316276" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:22.315718" elapsed="0.000655"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:55:22.317306" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:55:22.317507" 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-10-11T00:55:22.316772" elapsed="0.000889">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-10-11T00:55:22.300068" elapsed="0.017802">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:55:23.328718" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:55:23.342181" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:55:23.342383" 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-10-11T00:55:23.328370" elapsed="0.014111"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:23.343541" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:23.342974" elapsed="0.000688"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:55:23.344594" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:55:23.344778" 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-10-11T00:55:23.344003" elapsed="0.000901">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-10-11T00:55:23.327431" elapsed="0.017687">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:55:24.356062" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:55:24.369600" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:55:24.369794" 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-10-11T00:55:24.355774" elapsed="0.014070"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:24.370903" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:24.370291" elapsed="0.000704"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:55:24.371945" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:55:24.372117" 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-10-11T00:55:24.371336" elapsed="0.000906">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-10-11T00:55:24.354816" elapsed="0.017801">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:55:25.383686" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:55:25.397175" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:55:25.397397" 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-10-11T00:55:25.383346" elapsed="0.014137"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:25.398518" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:25.397964" elapsed="0.000672"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:55:25.399578" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:55:25.399752" 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-10-11T00:55:25.398979" elapsed="0.000897">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-10-11T00:55:25.382394" elapsed="0.017687">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:55:26.411124" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:55:26.424666" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:55:26.424862" 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-10-11T00:55:26.410833" elapsed="0.014082"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:26.425965" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:26.425362" elapsed="0.000696"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:55:26.427000" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:55:26.427172" 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-10-11T00:55:26.426405" elapsed="0.000892">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-10-11T00:55:26.409792" elapsed="0.017762">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:55:27.438292" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:55:27.451787" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:55:27.451982" 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-10-11T00:55:27.437995" elapsed="0.014038"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:27.453089" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:27.452563" elapsed="0.000619"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:55:27.454113" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:55:27.454282" 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-10-11T00:55:27.453579" elapsed="0.000824">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-10-11T00:55:27.437007" 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-10-11T00:55:28.466301" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:55:28.479876" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:55:28.480075" 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-10-11T00:55:28.466014" elapsed="0.014113"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:28.481161" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:28.480637" elapsed="0.000616"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:55:28.482176" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:55:28.482371" 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-10-11T00:55:28.481643" elapsed="0.000946">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-10-11T00:55:28.465070" elapsed="0.017743">0 != 2</status>
</kw>
<msg time="2026-10-11T00:55:28.482988" 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-10-11T00:55:07.916900" elapsed="20.566279">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-10-11T00:55:28.492225" elapsed="0.000064"/>
</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-10-11T00:55:28.492731" elapsed="0.000045"/>
</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-10-11T00:55:28.501694" elapsed="0.000126"/>
</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-10-11T00:55:28.502194" elapsed="0.000042"/>
</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-10-11T00:55:28.505244" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:55:28.504620" elapsed="0.000711"/>
</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-10-11T00:55:28.503679" elapsed="0.001787"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:55:28.502897" elapsed="0.002707"/>
</kw>
<doc>Check incomming updates for introduced routes</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-10-11T00:55:07.814132" elapsed="20.691552">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-10-11T00:55:28.509010" elapsed="0.000547"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:55:28.508352" elapsed="0.001318"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:55:28.511817" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:55:28.511588" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:28.511541" elapsed="0.000424"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:55:28.517029" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:55:28.516874" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:28.516851" elapsed="0.000273"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:55:28.518630" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:55:28.518082" elapsed="0.000583"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:55:28.519241" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:55:28.518879" elapsed="0.000395"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:55:28.519329" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T00:55:28.519568" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:55:28.517506" elapsed="0.002097"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:55:28.523604" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:55:28.523469" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:28.523444" 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-10-11T00:55:28.525181" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:55:28.525061" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:28.525037" elapsed="0.000251"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:55:28.525844" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:55:28.525595" elapsed="0.000283"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:55:28.526331" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:55:28.526107" elapsed="0.000264"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:55:28.561500" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:55:28.527133" elapsed="0.034541"/>
</kw>
<msg time="2026-10-11T00:55:28.561948" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:55:28.562028" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:55:28.526661" elapsed="0.035420"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:55:28.587503" 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-10-11T00:55:28.562865" elapsed="0.024747"/>
</kw>
<msg time="2026-10-11T00:55:28.587813" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:55:28.587856" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:55:28.562438" elapsed="0.025455"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:55:28.588179" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:55:28.587965" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:28.587945" elapsed="0.000309"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:28.588719" 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-10-11T00:55:28.588466" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:55:28.589048" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:55:28.588844" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:28.588827" elapsed="0.000293"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:55:28.589150" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:55:28.591795" elapsed="0.000243"/>
</kw>
<msg time="2026-10-11T00:55:28.592108" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:55:28.590583" elapsed="0.001660"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:55:28.592610" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:55:28.592963" 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-10-11T00:55:28.589959" elapsed="0.003253"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:55:28.589470" elapsed="0.003805"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:55:28.524702" elapsed="0.068646"/>
</kw>
<msg time="2026-10-11T00:55:28.593457" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:55:28.593505" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:55:28.523900" elapsed="0.069657"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:55:28.593718" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:55:28.593629" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:28.593610" elapsed="0.000185"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:55:28.594124" 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-10-11T00:55:28.594472" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:55:28.594553" 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-10-11T00:55:28.523049" elapsed="0.071592"/>
</kw>
<msg time="2026-10-11T00:55:28.594725" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:55:28.594765" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:55:28.520086" elapsed="0.074714"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:55:28.595090" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:55:28.594866" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:28.594850" elapsed="0.000310"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:55:28.519883" elapsed="0.075298"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:55:28.519674" elapsed="0.075535"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:55:28.516446" elapsed="0.078813"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:55:28.510952" elapsed="0.084391"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:55:28.510007" elapsed="0.085378"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:55:28.507560" elapsed="0.087902"/>
</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-10-11T00:55:28.595642" elapsed="0.000099"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:55:28.599316" 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.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T00:55:28.599030" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:28.599790" 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.173 --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-10-11T00:55:28.599569" elapsed="0.000264"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:55:28.603790" 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.173 --peerport=1790 --nexthop 2.2.2.2 --asnumber 32768 --debug --logfile ebgp_peer2.log &amp;&gt;ebgp_peer2.log</msg>
<msg time="2026-10-11T00:55:28.603877" 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.173 --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-10-11T00:55:28.599987" elapsed="0.003914"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:28.604331" 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.173 --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-10-11T00:55:28.604108" elapsed="0.000267"/>
</kw>
<arg>${eBGP_PEER2_COMMAND}</arg>
<arg>${eBGP_PEER2_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-10-11T00:55:28.598690" elapsed="0.005754"/>
</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-10-11T00:55:38.606472" 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-10-11T00:55:28.606010" elapsed="10.001154">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-10-11T00:55:38.607544" elapsed="0.000030"/>
</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-10-11T00:55:28.605733" elapsed="10.001954">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-10-11T00:55:28.605346" elapsed="10.002455"/>
</kw>
<msg time="2026-10-11T00:55:38.607903" 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-10-11T00:55:28.604976" elapsed="10.002951"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-10-11T00:55:38.608107" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-10-11T00:55:38.608017" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:38.607991" elapsed="0.000202"/>
</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-10-11T00:55:38.608470" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:55:38.608655" elapsed="0.000018"/>
</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-10-11T00:55:28.604698" elapsed="10.004030"/>
</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-10-11T00:55:38.609330" elapsed="0.000318"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:55:38.608996" elapsed="0.000712"/>
</kw>
<doc>Connect BGP peer and check empty topology</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:55:28.506377" elapsed="10.103366"/>
</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-10-11T00:55:38.612397" elapsed="0.000262"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:55:38.610946" elapsed="0.001765"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:55:38.613676" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:55:38.613573" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:38.613554" elapsed="0.000186"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:55:38.615997" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:55:38.615912" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:38.615895" elapsed="0.000165"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:55:38.617002" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:55:38.616658" elapsed="0.000371"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:55:38.617478" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:55:38.617184" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:55:38.617544" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:55:38.617672" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:55:38.616270" elapsed="0.001426"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:55:38.620353" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:55:38.620268" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:38.620250" elapsed="0.000228"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:55:38.621626" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:55:38.621539" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:38.621521" elapsed="0.000169"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:55:38.622014" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:55:38.621840" elapsed="0.000199"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:55:38.622347" 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-10-11T00:55:38.622205" elapsed="0.000165"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:55:38.659133" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:55:38.622887" elapsed="0.036340"/>
</kw>
<msg time="2026-10-11T00:55:38.659378" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:55:38.659465" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:55:38.622553" elapsed="0.036954"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:55:38.687977" 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-10-11T00:55:38.660015" elapsed="0.028058"/>
</kw>
<msg time="2026-10-11T00:55:38.688222" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:55:38.688263" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:55:38.659675" elapsed="0.028623"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:55:38.688613" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:55:38.688366" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:38.688348" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:38.689234" 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-10-11T00:55:38.688867" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:55:38.689608" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:55:38.689357" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:38.689340" elapsed="0.000340"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:55:38.689710" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:55:38.692152" elapsed="0.000114"/>
</kw>
<msg time="2026-10-11T00:55:38.692323" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:55:38.691088" 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-10-11T00:55:38.692842" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:55:38.693180" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:55:38.690508" 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-10-11T00:55:38.690006" elapsed="0.003468"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:55:38.621178" elapsed="0.072376"/>
</kw>
<msg time="2026-10-11T00:55:38.693636" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:55:38.693675" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:55:38.620633" elapsed="0.073078"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:55:38.693865" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:55:38.693780" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:38.693762" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:55:38.694265" elapsed="0.000022"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:55:38.694660" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:55:38.694725" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:55:38.619977" elapsed="0.074833"/>
</kw>
<msg time="2026-10-11T00:55:38.694892" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:55:38.694931" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:55:38.618047" elapsed="0.076919"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:55:38.695252" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:55:38.695031" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:38.695015" elapsed="0.000306"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:55:38.617888" elapsed="0.077454"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:55:38.617745" elapsed="0.077626"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:55:38.615614" elapsed="0.079836"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:55:38.613272" elapsed="0.082229"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:55:38.612863" elapsed="0.082681"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:55:38.610589" elapsed="0.085001"/>
</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-10-11T00:55:38.695750" elapsed="0.000095"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:55:38.696903" 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-10-11T00:55:38.696613" elapsed="0.000315"/>
</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-10-11T00:55:38.697081" elapsed="0.000174"/>
</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-10-11T00:55:38.696311" elapsed="0.001008"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-10-11T00:55:40.698069" level="INFO">^C
[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<msg time="2026-10-11T00:55:40.698290" level="INFO">${output} = ^C
[?2004h[jenkins@releng-26932-423-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-10-11T00:55:38.697514" elapsed="2.000836"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:40.699465" level="INFO">^C
[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:40.698884" elapsed="0.000686"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-10-11T00:55:38.696013" elapsed="2.003677"/>
</kw>
<kw name="Store_File_To_Workspace">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:55:40.708474" level="INFO">Executing command 'cat ebgp_peer1.log'.</msg>
<msg time="2026-10-11T00:55:40.722035" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:55:40.722230" level="INFO">${output_log} = 2026-10-11 00:54:47,651 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:54:47,651 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.3
2026-10-11 00:54:47,651 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-10-11T00:55:40.708174" elapsed="0.014112"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:40.723310" level="INFO">2026-10-11 00:54:47,651 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:54:47,651 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.3
2026-10-11 00:54:47,651 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 00:54:47,652 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 00:54:47,652 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 00:54:47,652 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:54:47,653 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:54:47,653 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:54:47,653 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:54:47,653 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 2
2026-10-11 00:54:47,653 INFO BGP-Thread-1 (job):   Prefix base: 8.0.0.0/28
2026-10-11 00:54:47,653 INFO BGP-Thread-1 (job):   My Autonomous System number: 32768
2026-10-11 00:54:47,653 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 00:54:47,653 INFO BGP-Thread-1 (job):   My BGP Identifier: 2130706435
2026-10-11 00:54:47,653 INFO BGP-Thread-1 (job):   Next Hop: 1.1.1.1
2026-10-11 00:54:47,654 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 00:54:47,654 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 00:54:47,654 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 00:54:47,654 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 00:54:47,654 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 00:54:47,654 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 2
2026-10-11 00:54:47,654 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, 1]
2026-10-11 00:54:47,654 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 00:54:47,654 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 00:54:47,654 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 00:54:47,654 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:54:47,654 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-10-11 00:54:47,654 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 00:54:47,654 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 00:54:47,654 DEBUG BGP-Thread-1 (job):   My Autonomous System=32768 (0x8000)
2026-10-11 00:54:47,654 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 00:54:47,655 DEBUG BGP-Thread-1 (job):   BGP Identifier=2130706435 (0x7f000003)
2026-10-11 00:54:47,655 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-10-11 00:54:47,655 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x02060104000100010206410400008000
2026-10-11 00:54:47,655 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104800000b47f0000031002060104000100010206410400008000'
2026-10-11 00:54:47,655 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104800000b47f0000031002060104000100010206410400008000
2026-10-11 00:54:47,656 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:54:47,656 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:54:47,656 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:54:47,656 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:54:47,656 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:54:47,656 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:54:47,656 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:54:47,656 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:54:47,656 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:54:47,656 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:54:47,657 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 00:54:47,657 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 2
2026-10-11 00:54:47,657 DEBUG BGP-Thread-1 (job): ########## Iteration: 0 ##########
2026-10-11 00:54:47,657 DEBUG BGP-Thread-1 (job): Remaining prefixes: 2
2026-10-11 00:54:47,657 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:54:47,657 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:54:47,657 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-10-11 00:54:47,657 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:54:47,657 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:54:47,657 DEBUG BGP-Thread-1 (job):   Prefix indexes: [0]
2026-10-11 00:54:47,657 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.0.0.0')]
2026-10-11 00:54:47,658 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:54:47,658 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-10-11 00:54:47,658 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:54:47,658 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:54:47,658 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:54:47,658 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:54:47,659 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:54:47,659 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:54:47,659 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-10-11 00:54:47,659 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:54:47,659 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:54:47,659 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:54:47,659 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-10-11 00:54:47,659 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x400101004002060201000080004005040000006440030401010101)
2026-10-11 00:54:47,659 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:54:47,659 DEBUG BGP-Thread-1 (job):     AS path=32768
2026-10-11 00:54:47,660 DEBUG BGP-Thread-1 (job):     Next hop=1.1.1.1
2026-10-11 00:54:47,660 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.0.0.0')]/28 (0x1c08000000)
2026-10-11 00:54:47,660 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000800040050400000064400304010101011c08000000
2026-10-11 00:54:47,660 DEBUG BGP-Thread-1 (job): ########## Iteration: 1 ##########
2026-10-11 00:54:47,660 DEBUG BGP-Thread-1 (job): Remaining prefixes: 1
2026-10-11 00:54:47,660 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:54:47,660 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:54:47,660 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-10-11 00:54:47,660 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:54:47,660 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:54:47,660 DEBUG BGP-Thread-1 (job):   Prefix indexes: [1]
2026-10-11 00:54:47,660 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.0.0.16')]
2026-10-11 00:54:47,660 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:54:47,660 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-10-11 00:54:47,660 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:54:47,660 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:54:47,660 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:54:47,661 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:54:47,661 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:54:47,661 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:54:47,661 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-10-11 00:54:47,661 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:54:47,661 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:54:47,661 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:54:47,661 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-10-11 00:54:47,661 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x400101004002060201000080004005040000006440030401010101)
2026-10-11 00:54:47,661 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:54:47,661 DEBUG BGP-Thread-1 (job):     AS path=32768
2026-10-11 00:54:47,661 DEBUG BGP-Thread-1 (job):     Next hop=1.1.1.1
2026-10-11 00:54:47,661 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.0.0.16')]/28 (0x1c08000010)
2026-10-11 00:54:47,661 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000800040050400000064400304010101011c08000010
2026-10-11 00:54:47,661 INFO BGP-Thread-1 (job): All update messages generated.
2026-10-11 00:54:47,661 INFO BGP-Thread-1 (job): Storing performance results.
2026-10-11 00:54:47,661 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-10-11 00:54:47,661 INFO BGP-Thread-1 (job): Number of iterations: 2
2026-10-11 00:54:47,661 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-10-11 00:54:47,661 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-10-11 00:54:47,661 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 2
2026-10-11 00:54:47,661 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.003974437713623047s
2026-10-11 00:54:47,661 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-10-11 00:54:47,662 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-10-11 00:54:47,662 INFO BGP-Thread-1 (job):   
2026-10-11 00:54:47,662 INFO BGP-Thread-1 (job):   
2026-10-11 00:54:47,662 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-10-11 00:54:47,662 INFO BGP-Thread-1 (job):   
2026-10-11 00:54:47,662 INFO BGP-Thread-1 (job):   
2026-10-11 00:54:47,662 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-10-11 00:54:47,662 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:54:47,662 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:54:47,662 DEBUG BGP-Thread-1 (job):   Length=43 (0x002b)
2026-10-11 00:54:47,662 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:54:47,662 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:54:47,662 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:54:47,662 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=20 (0x0014)
2026-10-11 00:54:47,662 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000800040050400000064)
2026-10-11 00:54:47,662 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:54:47,662 DEBUG BGP-Thread-1 (job):     AS path=32768
2026-10-11 00:54:47,662 DEBUG BGP-Thread-1 (job):     Next hop=1.1.1.1
2026-10-11 00:54:47,663 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-10-11 00:54:47,663 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff002b02000000144001010040020602010000800040050400000064
2026-10-11 00:54:47,663 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:54:47,663 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:54:47,663 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:54:47,664 INFO BGP-Thread-1 (job): ... idle for 0.002s
2026-10-11 00:54:47,665 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.002s
2026-10-11 00:54:47,665 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 00:54:47,665 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:54:47,665 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:54:47,665 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 00:54:47,665 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:54:47,665 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:54:47,665 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:54:47,665 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:54:47,665 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:54:47,665 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:54:47,665 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:54:47,666 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:54:47,666 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:54:47,666 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:54:47,666 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:54:47,666 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:54:47,666 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-10-11 00:54:47,666 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-10-11 00:54:47,666 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:54:47,666 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:54:47,666 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:54:57,677 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-10-11 00:54:57,677 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.012s
2026-10-11 00:54:57,677 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:54:57,677 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:54:57,677 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:55:07,684 INFO BGP-Thread-1 (job): ... idle for 10.007s
2026-10-11 00:55:07,685 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.019s
2026-10-11 00:55:07,685 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:55:07,685 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:55:07,685 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:55:17,685 INFO BGP-Thread-1 (job): ... idle for 10.000s
2026-10-11 00:55:17,686 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 30.019s
2026-10-11 00:55:17,686 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:55:17,686 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:55:17,686 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:55:27,693 INFO BGP-Thread-1 (job): ... idle for 10.007s
2026-10-11 00:55:27,693 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 40.026s
2026-10-11 00:55:27,693 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:55:27,693 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:55:27,693 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:55:37,695 INFO BGP-Thread-1 (job): ... idle for 10.002s
2026-10-11 00:55:37,695 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 50.028s
2026-10-11 00:55:37,696 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:55:37,696 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:55:37,696 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-10-11T00:55:40.722792" elapsed="0.001028"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T00:55:40.724920" 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-10-11T00:55:40.724250" elapsed="0.000786"/>
</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-10-11T00:55:40.707275" elapsed="0.017884"/>
</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-10-11T00:55:40.726449" elapsed="0.000517"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:55:40.725755" elapsed="0.001341"/>
</kw>
<doc>Stop BGP peer, log topology and store logs</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:55:38.610073" elapsed="2.117099"/>
</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-10-11T00:55:40.730331" elapsed="0.000493"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:55:40.729772" elapsed="0.001167"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:55:40.733052" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:55:40.732850" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:40.732809" elapsed="0.000388"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:55:40.738148" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:55:40.737961" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:40.737923" elapsed="0.000363"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:55:40.740338" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:55:40.739619" elapsed="0.000774"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:55:40.741374" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:55:40.740797" elapsed="0.000672"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:55:40.741564" elapsed="0.000065"/>
</return>
<msg time="2026-10-11T00:55:40.741850" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:55:40.738791" elapsed="0.003109"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:55:40.748184" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:55:40.747992" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:40.747952" elapsed="0.000375"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:55:40.750744" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:55:40.750555" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:40.750517" elapsed="0.000365"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:55:40.751668" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:55:40.751210" elapsed="0.000513"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:55:40.752391" 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-10-11T00:55:40.752090" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:55:40.789188" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:55:40.753625" elapsed="0.035700"/>
</kw>
<msg time="2026-10-11T00:55:40.789597" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:55:40.789657" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:55:40.752845" elapsed="0.036862"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:55:40.823770" 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-10-11T00:55:40.790487" elapsed="0.033383"/>
</kw>
<msg time="2026-10-11T00:55:40.824017" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:55:40.824089" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:55:40.789946" elapsed="0.034181"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:55:40.824442" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:55:40.824197" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:40.824179" elapsed="0.000339"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:40.824930" 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-10-11T00:55:40.824702" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:55:40.825261" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:55:40.825058" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:40.825040" elapsed="0.000291"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:55:40.825361" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:55:40.827826" elapsed="0.000115"/>
</kw>
<msg time="2026-10-11T00:55:40.827998" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:55:40.826783" elapsed="0.001347"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:55:40.828457" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:55:40.828812" 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-10-11T00:55:40.826154" elapsed="0.002843"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:55:40.825692" elapsed="0.003364"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:55:40.749932" elapsed="0.079197"/>
</kw>
<msg time="2026-10-11T00:55:40.829209" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:55:40.829248" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:55:40.748718" elapsed="0.080566"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:55:40.829479" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:55:40.829351" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:40.829334" 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-10-11T00:55:40.829892" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:55:40.830193" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:55:40.830257" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:55:40.747303" elapsed="0.083039"/>
</kw>
<msg time="2026-10-11T00:55:40.830457" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:55:40.830505" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:55:40.742670" elapsed="0.087870"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:55:40.830828" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:55:40.830607" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:40.830591" elapsed="0.000307"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:55:40.742303" elapsed="0.088616"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:55:40.742002" elapsed="0.088946"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:55:40.737269" elapsed="0.093726"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:55:40.732229" elapsed="0.098853"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:55:40.731271" elapsed="0.099853"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:55:40.728952" elapsed="0.102219"/>
</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-10-11T00:55:40.838625" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node012wkykfzx8pv3ssb3pk6iiyhs15.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:55:40.838782" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:55:40.838884" 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-10-11T00:55:40.832289" elapsed="0.006619"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:40.839418" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:40.839112" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:40.839980" 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-10-11T00:55:40.839662" elapsed="0.000361"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-11T00:55:40.840661" 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 the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-11T00:55:40.840186" elapsed="0.000544">'{"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-10-11T00:55:40.831930" elapsed="0.008902">'{"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-10-11T00:55:41.850464" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node012wkykfzx8pv3ssb3pk6iiyhs15.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:55:41.850709" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:55:41.850905" 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-10-11T00:55:41.842405" elapsed="0.008555"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:41.852125" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:41.851474" elapsed="0.000745"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:41.853481" 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-10-11T00:55:41.852717" elapsed="0.000863"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-11T00:55:41.854899" 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 the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-11T00:55:41.853946" elapsed="0.001084">'{"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-10-11T00:55:41.841541" elapsed="0.013699">'{"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-10-11T00:55:42.866024" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node012wkykfzx8pv3ssb3pk6iiyhs15.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:55:42.866337" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:55:42.866590" 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-10-11T00:55:42.856863" elapsed="0.009783"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:42.867815" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:42.867111" elapsed="0.000799"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:42.869116" 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-10-11T00:55:42.868349" elapsed="0.000862"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-11T00:55:42.870588" 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 the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-11T00:55:42.869631" elapsed="0.001088">'{"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-10-11T00:55:42.855946" elapsed="0.014981">'{"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-10-11T00:55:43.881266" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node012wkykfzx8pv3ssb3pk6iiyhs15.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:55:43.881578" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:55:43.881776" 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-10-11T00:55:43.872743" elapsed="0.009087"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:43.882998" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:43.882298" elapsed="0.000794"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:43.884293" 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-10-11T00:55:43.883580" elapsed="0.000860"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-11T00:55:43.886198" 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 the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-11T00:55:43.884811" elapsed="0.001520">'{"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-10-11T00:55:43.871822" elapsed="0.014827">'{"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-10-11T00:55:44.896310" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node012wkykfzx8pv3ssb3pk6iiyhs15.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:55:44.896611" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:55:44.896809" 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-10-11T00:55:44.888249" elapsed="0.008615"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:44.898048" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:44.897324" elapsed="0.000818"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:44.899440" 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-10-11T00:55:44.898638" elapsed="0.000979"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-11T00:55:44.900980" 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 the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-11T00:55:44.899995" elapsed="0.001116">'{"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-10-11T00:55:44.887329" elapsed="0.013991">'{"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-10-11T00:55:45.911109" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node012wkykfzx8pv3ssb3pk6iiyhs15.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:55:45.911376" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:55:45.911623" 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-10-11T00:55:45.903139" elapsed="0.008540"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:45.912857" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:45.912142" elapsed="0.000812"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:45.914179" 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-10-11T00:55:45.913455" elapsed="0.000821"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-11T00:55:45.915667" 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 the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-11T00:55:45.914702" elapsed="0.001095">'{"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-10-11T00:55:45.902223" elapsed="0.013782">'{"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-10-11T00:55:46.925183" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node012wkykfzx8pv3ssb3pk6iiyhs15.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:55:46.925486" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:55:46.925690" 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-10-11T00:55:46.917659" elapsed="0.008086"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:46.926908" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:46.926205" elapsed="0.000798"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:46.928256" 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-10-11T00:55:46.927532" elapsed="0.000844"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-11T00:55:46.929777" 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 the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-11T00:55:46.928774" elapsed="0.001135">'{"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-10-11T00:55:46.916766" elapsed="0.013352">'{"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-10-11T00:55:47.940837" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node012wkykfzx8pv3ssb3pk6iiyhs15.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:55:47.941078" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:55:47.941297" 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-10-11T00:55:47.932232" elapsed="0.009146"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:47.942580" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:47.941876" elapsed="0.000801"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:47.943899" 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-10-11T00:55:47.943119" elapsed="0.000877"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-11T00:55:47.945370" 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 the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-11T00:55:47.944398" elapsed="0.001139">'{"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-10-11T00:55:47.930885" elapsed="0.014866">'{"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-10-11T00:55:48.955476" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node012wkykfzx8pv3ssb3pk6iiyhs15.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:55:48.955724" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:55:48.955925" 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-10-11T00:55:48.947438" elapsed="0.008540"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:48.957149" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:48.956500" elapsed="0.000742"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:48.958515" 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-10-11T00:55:48.957729" elapsed="0.000882"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-11T00:55:48.959945" 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 the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-11T00:55:48.958971" elapsed="0.001104">'{"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-10-11T00:55:48.946525" elapsed="0.013758">'{"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-10-11T00:55:49.969919" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node012wkykfzx8pv3ssb3pk6iiyhs15.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:55:49.970154" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:55:49.970377" 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-10-11T00:55:49.961913" elapsed="0.008618"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:49.971703" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:49.970996" elapsed="0.000813"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:49.973025" 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-10-11T00:55:49.972257" elapsed="0.000861"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-11T00:55:49.974545" 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 the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-11T00:55:49.973531" elapsed="0.001147">'{"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-10-11T00:55:49.961009" elapsed="0.013879">'{"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-10-11T00:55:50.984967" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node012wkykfzx8pv3ssb3pk6iiyhs15.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:55:50.985204" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:55:50.985461" 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-10-11T00:55:50.976594" elapsed="0.008926"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:50.986675" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:50.985977" elapsed="0.000793"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:50.988508" 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-10-11T00:55:50.987203" elapsed="0.001406"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-11T00:55:50.989956" 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 the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-11T00:55:50.988979" elapsed="0.001109">'{"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-10-11T00:55:50.975684" elapsed="0.014639">'{"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-10-11T00:55:50.990538" 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-10-11T00:55:40.831351" elapsed="10.159380">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-10-11T00:55:50.991225" elapsed="0.000052"/>
</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-10-11T00:55:50.994209" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:55:50.993588" elapsed="0.000707"/>
</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-10-11T00:55:50.992694" elapsed="0.001760"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:55:50.991973" elapsed="0.002595"/>
</kw>
<doc>The IPv4 topology shall contain the route announced by the second eBGP now</doc>
<status status="FAIL" start="2026-10-11T00:55:40.727775" elapsed="10.266868">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-10-11T00:55:50.997791" elapsed="0.000440"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:55:50.997172" elapsed="0.001194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:55:51.000532" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:55:51.000262" elapsed="0.000372"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:51.000216" elapsed="0.000463"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:55:51.005704" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:55:51.005518" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:51.005479" elapsed="0.000361"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:55:51.007931" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:55:51.007147" elapsed="0.000839"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:55:51.008964" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:55:51.008350" elapsed="0.000667"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:55:51.009104" elapsed="0.000065"/>
</return>
<msg time="2026-10-11T00:55:51.009441" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:55:51.006321" elapsed="0.003173"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:55:51.015980" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:55:51.015775" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:51.015734" elapsed="0.000386"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:55:51.018606" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:55:51.018382" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:51.018342" elapsed="0.000403"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:55:51.019534" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:55:51.019084" elapsed="0.000506"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:55:51.020272" 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-10-11T00:55:51.019965" elapsed="0.000384"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:55:51.059041" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:55:51.021549" elapsed="0.037629"/>
</kw>
<msg time="2026-10-11T00:55:51.059431" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:55:51.059492" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:55:51.020745" elapsed="0.038796"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:55:51.095205" 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-10-11T00:55:51.060246" elapsed="0.035074"/>
</kw>
<msg time="2026-10-11T00:55:51.095490" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:55:51.095531" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:55:51.059773" elapsed="0.035793"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:55:51.095843" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:55:51.095635" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:51.095616" elapsed="0.000297"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:51.096335" 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-10-11T00:55:51.096096" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:55:51.096710" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:55:51.096509" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:51.096492" elapsed="0.000289"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:55:51.096810" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:55:51.099264" elapsed="0.000133"/>
</kw>
<msg time="2026-10-11T00:55:51.099469" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:55:51.098194" 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-10-11T00:55:51.099908" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:55:51.100243" elapsed="0.000089"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:55:51.097607" 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-10-11T00:55:51.097104" 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-10-11T00:55:51.017778" elapsed="0.082843"/>
</kw>
<msg time="2026-10-11T00:55:51.100703" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:55:51.100747" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:55:51.016511" elapsed="0.084270"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:55:51.100934" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:55:51.100850" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:51.100832" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:55:51.101346" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:55:51.101687" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:55:51.101751" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:55:51.015066" elapsed="0.086769"/>
</kw>
<msg time="2026-10-11T00:55:51.101957" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:55:51.101998" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:55:51.010231" elapsed="0.091804"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:55:51.102344" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:55:51.102103" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-11T00:55:51.102087" elapsed="0.000351"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:55:51.009914" elapsed="0.092546"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:55:51.009602" elapsed="0.092887"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:55:51.004817" elapsed="0.097720"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:55:50.999681" elapsed="0.102904"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:55:50.998734" elapsed="0.103891"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:55:50.996210" elapsed="0.106461"/>
</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-10-11T00:55:51.102830" elapsed="0.000096"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:55:51.103467" 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-10-11T00:55:51.103094" elapsed="0.000399"/>
</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-10-11T00:55:51.108853" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:55:51.121979" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:55:51.122070" 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-10-11T00:55:51.108727" elapsed="0.013366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:51.122559" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:51.122306" elapsed="0.000294"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:55:51.122993" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:55:51.123073" 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-10-11T00:55:51.122754" elapsed="0.000373">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-10-11T00:55:51.108326" elapsed="0.014891">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:55:52.133851" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:55:52.147641" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:55:52.147842" 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-10-11T00:55:52.133564" elapsed="0.014330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:52.148937" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:52.148369" elapsed="0.000661"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:55:52.149957" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:55:52.150126" 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-10-11T00:55:52.149395" elapsed="0.000853">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-10-11T00:55:52.132621" elapsed="0.017886">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:55:53.161216" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:55:53.174978" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:55:53.175174" 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-10-11T00:55:53.160931" elapsed="0.014295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:53.176264" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:53.175740" elapsed="0.000641"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:55:53.177309" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:55:53.177508" 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-10-11T00:55:53.176754" elapsed="0.000880">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-10-11T00:55:53.159987" elapsed="0.017851">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:55:54.188817" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:55:54.202395" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:55:54.202628" 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-10-11T00:55:54.188526" elapsed="0.014154"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:54.203723" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:54.203129" elapsed="0.000688"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:55:54.204757" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:55:54.204925" 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-10-11T00:55:54.204162" elapsed="0.000887">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-10-11T00:55:54.187581" elapsed="0.017672">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:55:55.215986" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:55:55.229826" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:55:55.230022" 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-10-11T00:55:55.215699" elapsed="0.014374"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:55.231119" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:55.230586" elapsed="0.000626"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:55:55.232159" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:55:55.232353" 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-10-11T00:55:55.231620" elapsed="0.000889">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-10-11T00:55:55.214741" elapsed="0.017977">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:55:56.243364" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:55:56.257327" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:55:56.257554" 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-10-11T00:55:56.243055" elapsed="0.014552"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:56.258639" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:56.258053" elapsed="0.000679"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:55:56.259678" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:55:56.259847" 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-10-11T00:55:56.259072" elapsed="0.000900">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-10-11T00:55:56.242072" elapsed="0.018103">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:55:57.271559" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:55:57.285183" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:55:57.285403" 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-10-11T00:55:57.271214" elapsed="0.014281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:57.286524" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:57.285943" elapsed="0.000676"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:55:57.287548" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:55:57.287721" 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-10-11T00:55:57.286962" elapsed="0.000885">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-10-11T00:55:57.270231" elapsed="0.017821">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:55:58.298762" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:55:58.312581" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:55:58.312779" 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-10-11T00:55:58.298474" elapsed="0.014358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:58.313875" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:58.313303" elapsed="0.000665"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:55:58.314901" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:55:58.315071" 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-10-11T00:55:58.314333" elapsed="0.000862">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-10-11T00:55:58.297523" elapsed="0.017935">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:55:59.326271" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:55:59.339887" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:55:59.340091" 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-10-11T00:55:59.325954" elapsed="0.014187"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:55:59.341236" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:55:59.340677" elapsed="0.000655"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:55:59.342253" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:55:59.342467" 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-10-11T00:55:59.341701" elapsed="0.000902">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-10-11T00:55:59.324960" elapsed="0.017850">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:00.355698" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:00.369092" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:00.369302" 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-10-11T00:56:00.355383" elapsed="0.013970"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:00.370371" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:00.369826" elapsed="0.000670"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:00.371387" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:00.371597" 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-10-11T00:56:00.370837" elapsed="0.000884">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-10-11T00:56:00.354461" elapsed="0.017462">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:01.384638" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:01.398175" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:01.398320" 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-10-11T00:56:01.384294" elapsed="0.014051"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:01.398946" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:01.398622" elapsed="0.000368"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:01.399404" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:01.399520" 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-10-11T00:56:01.399150" elapsed="0.000440">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-10-11T00:56:01.383277" elapsed="0.016421">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:02.410284" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:02.423769" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:02.423959" 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-10-11T00:56:02.409977" elapsed="0.014034"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:02.425028" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:02.424510" elapsed="0.000611"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:02.426037" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:02.426239" 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-10-11T00:56:02.425512" elapsed="0.000852">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-10-11T00:56:02.409032" elapsed="0.017563">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:03.493082" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:03.506510" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:03.506724" 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-10-11T00:56:03.492876" elapsed="0.013899"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:03.507671" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:03.507271" elapsed="0.000458"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:03.508355" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:03.508523" 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-10-11T00:56:03.507944" elapsed="0.000670">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-10-11T00:56:03.492055" elapsed="0.016696">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:04.519459" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:04.532790" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:04.532985" 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-10-11T00:56:04.519089" elapsed="0.013947"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:04.534061" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:04.533536" elapsed="0.000617"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:04.535075" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:04.535265" 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-10-11T00:56:04.534544" elapsed="0.000846">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-10-11T00:56:04.518070" elapsed="0.017553">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:05.546279" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:05.559899" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:05.560096" 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-10-11T00:56:05.545976" elapsed="0.014171"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:05.561210" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:05.560661" elapsed="0.000642"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:05.562227" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:05.562395" 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-10-11T00:56:05.561671" elapsed="0.000879">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-10-11T00:56:05.545028" elapsed="0.017727">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:06.573811" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:06.587392" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:06.587625" 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-10-11T00:56:06.573524" elapsed="0.014151"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:06.588698" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:06.588118" elapsed="0.000669"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:06.589715" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:06.589882" 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-10-11T00:56:06.589128" elapsed="0.000876">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-10-11T00:56:06.572586" elapsed="0.017646">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:07.600763" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:07.614264" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:07.614493" 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-10-11T00:56:07.600477" elapsed="0.014074"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:07.615569" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:07.614996" elapsed="0.000667"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:07.616583" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:07.616757" 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-10-11T00:56:07.616000" elapsed="0.000879">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-10-11T00:56:07.599541" elapsed="0.017536">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:08.627874" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:08.641745" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:08.641938" 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-10-11T00:56:08.627590" elapsed="0.014399"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:08.643028" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:08.642500" elapsed="0.000621"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:08.644051" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:08.644245" 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-10-11T00:56:08.643519" elapsed="0.000851">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-10-11T00:56:08.626643" elapsed="0.017964">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:09.655899" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:09.669290" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:09.669547" 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-10-11T00:56:09.655603" elapsed="0.013997"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:09.670688" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:09.670050" elapsed="0.000736"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:09.671791" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:09.671966" 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-10-11T00:56:09.671179" elapsed="0.000913">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-10-11T00:56:09.654630" elapsed="0.017707">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:10.683203" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:10.696997" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:10.697213" 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-10-11T00:56:10.682876" elapsed="0.014389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:10.698294" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:10.697753" elapsed="0.000631"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:10.699307" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:10.699509" 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-10-11T00:56:10.698755" elapsed="0.000880">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-10-11T00:56:10.681721" elapsed="0.018117">0 != 4</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:11.710519" level="INFO">Executing command 'grep -o 'nlri_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:11.724151" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:11.724353" 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-10-11T00:56:11.710196" elapsed="0.014208"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:11.725464" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:11.724888" elapsed="0.000669"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:11.726484" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:11.726655" 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-10-11T00:56:11.725896" elapsed="0.000882">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-10-11T00:56:11.709224" elapsed="0.017755">0 != 4</status>
</kw>
<msg time="2026-10-11T00:56:11.727178" 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-10-11T00:55:51.103673" elapsed="20.623692">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-10-11T00:56:11.736499" elapsed="0.000061"/>
</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-10-11T00:56:11.736951" elapsed="0.000046"/>
</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-10-11T00:56:11.746016" elapsed="0.000057"/>
</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-10-11T00:56:11.746486" elapsed="0.000045"/>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:11.749123" 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-10-11T00:56:11.748199" elapsed="0.000984"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-10-11T00:56:11.749628" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:11.749345" elapsed="0.000378"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:11.749300" elapsed="0.000469"/>
</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-10-11T00:56:11.750171" elapsed="0.000525"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-11T00:56:11.752654" level="FAIL">'4834' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-11T00:56:11.751903" elapsed="0.000873">'4834' does not contain '-'</status>
</kw>
<msg time="2026-10-11T00:56:11.752960" 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-10-11T00:56:11.751050" elapsed="0.001961"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:11.754117" 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-10-11T00:56:11.753455" elapsed="0.000718"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:11.755157" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:11.754562" elapsed="0.000651"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:11.756284" 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-10-11T00:56:11.755648" elapsed="0.000690"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-10-11T00:56:11.757401" 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 of the current test case.</doc>
<status status="PASS" start="2026-10-11T00:56:11.756720" elapsed="0.000810"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:11.758484" 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-10-11T00:56:11.757960" elapsed="0.000613"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-10-11T00:56:11.759911" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=4834'.</msg>
<arg>${bug_url}</arg>
<doc>Adds The given `tags` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-10-11T00:56:11.759210" elapsed="0.000797"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:11.758706" elapsed="0.001369"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:11.758669" elapsed="0.001479"/>
</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-10-11T00:56:11.747351" elapsed="0.012890"/>
</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-10-11T00:55:50.995148" elapsed="20.765254">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-10-11T00:56:11.763720" elapsed="0.000472"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:56:11.763125" elapsed="0.001179"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:11.766445" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:11.766202" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:11.766163" elapsed="0.000377"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:11.769776" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:11.769659" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:11.769634" elapsed="0.000228"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:11.771150" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:56:11.770686" elapsed="0.000500"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:56:11.771781" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:56:11.771400" elapsed="0.000414"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:56:11.771870" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T00:56:11.772049" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:56:11.770170" elapsed="0.001911"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:11.775829" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:11.775712" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:11.775688" elapsed="0.000228"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:11.777439" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:11.777295" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:11.777271" elapsed="0.000256"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:56:11.777970" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:56:11.777734" elapsed="0.000270"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:56:11.778461" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:56:11.778246" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:56:11.811388" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:56:11.779203" elapsed="0.032301"/>
</kw>
<msg time="2026-10-11T00:56:11.811656" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:56:11.811697" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:11.778726" elapsed="0.033026"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:56:11.837283" 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-10-11T00:56:11.812285" elapsed="0.025094"/>
</kw>
<msg time="2026-10-11T00:56:11.837546" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:56:11.837587" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:11.811919" elapsed="0.025702"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:11.837897" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:11.837690" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:11.837672" elapsed="0.000297"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:11.838393" 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-10-11T00:56:11.838163" elapsed="0.000352"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:11.838780" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:11.838578" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:11.838561" elapsed="0.000290"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:56:11.838881" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:56:11.841466" elapsed="0.000116"/>
</kw>
<msg time="2026-10-11T00:56:11.841640" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:11.840272" elapsed="0.001500"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:11.842089" elapsed="0.000088"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:11.842460" 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-10-11T00:56:11.839678" elapsed="0.002968"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:56:11.839188" elapsed="0.003516"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:56:11.776920" elapsed="0.065857"/>
</kw>
<msg time="2026-10-11T00:56:11.842858" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:56:11.842897" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:11.776145" elapsed="0.066787"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:56:11.843085" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-10-11T00:56:11.843000" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:11.842983" elapsed="0.000195"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:11.843529" 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-10-11T00:56:11.843832" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:56:11.843896" 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-10-11T00:56:11.775289" elapsed="0.068693"/>
</kw>
<msg time="2026-10-11T00:56:11.844064" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:56:11.844119" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:11.772589" elapsed="0.071566"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:11.844518" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:11.844222" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:11.844206" elapsed="0.000384"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:56:11.772369" elapsed="0.072242"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:56:11.772169" elapsed="0.072471"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:56:11.769231" elapsed="0.075460"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:56:11.765616" elapsed="0.079124"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:11.764685" elapsed="0.080094"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:56:11.762302" elapsed="0.082524"/>
</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-10-11T00:56:11.844993" elapsed="0.000096"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:11.846234" 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-10-11T00:56:11.845931" 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-10-11T00:56:11.846429" elapsed="0.000212"/>
</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-10-11T00:56:11.845641" elapsed="0.001054"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-10-11T00:56:13.847455" level="INFO">^C
[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<msg time="2026-10-11T00:56:13.847684" level="INFO">${output} = ^C
[?2004h[jenkins@releng-26932-423-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-10-11T00:56:11.846861" elapsed="2.000887"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:13.848855" level="INFO">^C
[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:13.848286" elapsed="0.000673"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-10-11T00:56:11.845273" elapsed="2.003821"/>
</kw>
<kw name="Store_File_To_Workspace">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:13.857291" level="INFO">Executing command 'cat ebgp_peer2.log'.</msg>
<msg time="2026-10-11T00:56:13.871041" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:13.871257" level="INFO">${output_log} = 2026-10-11 00:55:28,703 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:55:28,703 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.4
2026-10-11 00:55:28,703 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-10-11T00:56:13.857019" elapsed="0.014292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:13.872367" level="INFO">2026-10-11 00:55:28,703 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:55:28,703 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.4
2026-10-11 00:55:28,703 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 00:55:28,703 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 00:55:28,703 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 00:55:28,704 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:55:28,705 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:55:28,705 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:55:28,705 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:55:28,705 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 2
2026-10-11 00:55:28,705 INFO BGP-Thread-1 (job):   Prefix base: 8.0.0.0/28
2026-10-11 00:55:28,705 INFO BGP-Thread-1 (job):   My Autonomous System number: 32768
2026-10-11 00:55:28,705 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 00:55:28,705 INFO BGP-Thread-1 (job):   My BGP Identifier: 2130706436
2026-10-11 00:55:28,705 INFO BGP-Thread-1 (job):   Next Hop: 2.2.2.2
2026-10-11 00:55:28,705 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 00:55:28,706 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 00:55:28,706 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 00:55:28,706 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 00:55:28,706 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 00:55:28,706 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 2
2026-10-11 00:55:28,706 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, 1]
2026-10-11 00:55:28,706 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 00:55:28,706 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 00:55:28,706 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 00:55:28,706 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:55:28,706 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-10-11 00:55:28,706 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 00:55:28,706 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 00:55:28,706 DEBUG BGP-Thread-1 (job):   My Autonomous System=32768 (0x8000)
2026-10-11 00:55:28,706 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 00:55:28,706 DEBUG BGP-Thread-1 (job):   BGP Identifier=2130706436 (0x7f000004)
2026-10-11 00:55:28,706 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-10-11 00:55:28,706 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x02060104000100010206410400008000
2026-10-11 00:55:28,707 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104800000b47f0000041002060104000100010206410400008000'
2026-10-11 00:55:28,707 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104800000b47f0000041002060104000100010206410400008000
2026-10-11 00:55:28,708 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:55:28,708 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:55:28,708 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:55:28,708 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:55:28,708 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:55:28,708 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:55:28,708 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:55:28,708 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:55:28,708 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:55:28,708 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:55:28,708 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 00:55:28,708 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 2
2026-10-11 00:55:28,708 DEBUG BGP-Thread-1 (job): ########## Iteration: 0 ##########
2026-10-11 00:55:28,708 DEBUG BGP-Thread-1 (job): Remaining prefixes: 2
2026-10-11 00:55:28,708 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:55:28,708 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:55:28,709 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-10-11 00:55:28,709 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:55:28,709 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:55:28,709 DEBUG BGP-Thread-1 (job):   Prefix indexes: [0]
2026-10-11 00:55:28,709 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.0.0.0')]
2026-10-11 00:55:28,709 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:55:28,709 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-10-11 00:55:28,709 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:55:28,709 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:55:28,709 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:55:28,709 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:55:28,709 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:55:28,709 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:55:28,709 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-10-11 00:55:28,709 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:55:28,709 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:55:28,709 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:55:28,709 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-10-11 00:55:28,709 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x400101004002060201000080004005040000006440030402020202)
2026-10-11 00:55:28,709 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:55:28,709 DEBUG BGP-Thread-1 (job):     AS path=32768
2026-10-11 00:55:28,709 DEBUG BGP-Thread-1 (job):     Next hop=2.2.2.2
2026-10-11 00:55:28,709 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.0.0.0')]/28 (0x1c08000000)
2026-10-11 00:55:28,709 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000800040050400000064400304020202021c08000000
2026-10-11 00:55:28,710 DEBUG BGP-Thread-1 (job): ########## Iteration: 1 ##########
2026-10-11 00:55:28,710 DEBUG BGP-Thread-1 (job): Remaining prefixes: 1
2026-10-11 00:55:28,710 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:55:28,710 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:55:28,710 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-10-11 00:55:28,710 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:55:28,710 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:55:28,710 DEBUG BGP-Thread-1 (job):   Prefix indexes: [1]
2026-10-11 00:55:28,710 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.0.0.16')]
2026-10-11 00:55:28,710 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:55:28,710 DEBUG BGP-Thread-1 (job):   Prefix slot index: 1
2026-10-11 00:55:28,710 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:55:28,710 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:55:28,710 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:55:28,710 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:55:28,710 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:55:28,710 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:55:28,710 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-10-11 00:55:28,710 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:55:28,710 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:55:28,710 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:55:28,710 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-10-11 00:55:28,710 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x400101004002060201000080004005040000006440030402020202)
2026-10-11 00:55:28,710 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:55:28,710 DEBUG BGP-Thread-1 (job):     AS path=32768
2026-10-11 00:55:28,710 DEBUG BGP-Thread-1 (job):     Next hop=2.2.2.2
2026-10-11 00:55:28,710 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.0.0.16')]/28 (0x1c08000010)
2026-10-11 00:55:28,711 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000800040050400000064400304020202021c08000010
2026-10-11 00:55:28,711 INFO BGP-Thread-1 (job): All update messages generated.
2026-10-11 00:55:28,711 INFO BGP-Thread-1 (job): Storing performance results.
2026-10-11 00:55:28,711 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-10-11 00:55:28,711 INFO BGP-Thread-1 (job): Number of iterations: 2
2026-10-11 00:55:28,711 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-10-11 00:55:28,711 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-10-11 00:55:28,711 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 2
2026-10-11 00:55:28,711 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.0020532608032226562s
2026-10-11 00:55:28,711 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-10-11 00:55:28,711 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-10-11 00:55:28,711 INFO BGP-Thread-1 (job):   
2026-10-11 00:55:28,711 INFO BGP-Thread-1 (job):   
2026-10-11 00:55:28,711 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-10-11 00:55:28,711 INFO BGP-Thread-1 (job):   
2026-10-11 00:55:28,711 INFO BGP-Thread-1 (job):   
2026-10-11 00:55:28,711 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-10-11 00:55:28,712 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:55:28,712 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:55:28,712 DEBUG BGP-Thread-1 (job):   Length=43 (0x002b)
2026-10-11 00:55:28,713 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:55:28,713 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:55:28,713 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:55:28,713 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=20 (0x0014)
2026-10-11 00:55:28,713 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000800040050400000064)
2026-10-11 00:55:28,713 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:55:28,713 DEBUG BGP-Thread-1 (job):     AS path=32768
2026-10-11 00:55:28,713 DEBUG BGP-Thread-1 (job):     Next hop=2.2.2.2
2026-10-11 00:55:28,713 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-10-11 00:55:28,713 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff002b02000000144001010040020602010000800040050400000064
2026-10-11 00:55:28,713 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:55:28,713 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:55:28,714 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:55:28,715 INFO BGP-Thread-1 (job): ... idle for 0.001s
2026-10-11 00:55:28,717 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.001s
2026-10-11 00:55:28,717 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 00:55:28,717 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:55:28,718 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:55:28,718 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 00:55:28,718 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:55:28,718 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:55:28,718 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:55:28,718 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:55:28,718 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:55:28,718 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:55:28,718 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:55:28,718 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:55:28,718 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:55:28,718 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:55:28,718 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:55:28,718 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:55:28,718 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-10-11 00:55:28,718 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-10-11 00:55:28,718 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:55:28,718 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:55:28,718 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:55:38,729 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-10-11 00:55:38,730 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.011s
2026-10-11 00:55:38,730 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:55:38,730 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:55:38,730 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:55:48,740 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-10-11 00:55:48,741 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.021s
2026-10-11 00:55:48,741 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:55:48,741 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:55:48,741 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:55:58,751 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-10-11 00:55:58,751 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 30.031s
2026-10-11 00:55:58,751 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:55:58,751 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:55:58,751 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:56:08,757 INFO BGP-Thread-1 (job): ... idle for 10.006s
2026-10-11 00:56:08,758 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 40.037s
2026-10-11 00:56:08,758 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:56:08,758 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:56:08,758 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-10-11T00:56:13.871828" elapsed="0.001043"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T00:56:13.873939" 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-10-11T00:56:13.873317" elapsed="0.000737"/>
</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-10-11T00:56:13.856121" elapsed="0.018081"/>
</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-10-11T00:56:13.875486" elapsed="0.000510"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:56:13.874777" elapsed="0.001384"/>
</kw>
<doc>Stop BGP peer, store logs and wait for empty topology</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:56:11.761147" elapsed="2.115092"/>
</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-10-11T00:56:13.879270" elapsed="0.000477"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:56:13.878690" elapsed="0.001169"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:13.882465" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:13.882228" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:13.882186" 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-10-11T00:56:13.887581" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:13.887365" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:13.887326" elapsed="0.000393"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:13.889861" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:56:13.889097" elapsed="0.000820"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:56:13.890901" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:56:13.890284" elapsed="0.000670"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:56:13.891044" elapsed="0.000086"/>
</return>
<msg time="2026-10-11T00:56:13.891352" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:56:13.888236" elapsed="0.003169"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:13.897448" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:13.897228" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:13.897190" elapsed="0.000402"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:13.900013" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:13.899826" elapsed="0.000355"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:13.899788" elapsed="0.000440"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:56:13.900969" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:56:13.900593" elapsed="0.000431"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:56:13.901757" 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-10-11T00:56:13.901447" elapsed="0.000363"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:56:13.937496" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:56:13.902975" elapsed="0.034652"/>
</kw>
<msg time="2026-10-11T00:56:13.937857" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:56:13.937916" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:13.902184" elapsed="0.035782"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:56:13.965915" 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-10-11T00:56:13.938728" elapsed="0.027288"/>
</kw>
<msg time="2026-10-11T00:56:13.966179" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:56:13.966251" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:13.938219" elapsed="0.028069"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:13.966590" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:13.966357" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:13.966339" elapsed="0.000322"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:13.967065" 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-10-11T00:56:13.966840" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:13.967420" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:13.967204" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:13.967187" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:56:13.967528" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:56:13.970113" elapsed="0.000117"/>
</kw>
<msg time="2026-10-11T00:56:13.970289" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:13.968992" 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-10-11T00:56:13.970763" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:13.971111" 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-10-11T00:56:13.968276" elapsed="0.003021"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:56:13.967801" elapsed="0.003554"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:56:13.899212" elapsed="0.072235"/>
</kw>
<msg time="2026-10-11T00:56:13.971528" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:56:13.971567" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:13.897932" elapsed="0.073670"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:56:13.971753" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:56:13.971669" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:13.971652" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:13.972160" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:13.972511" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:56:13.972581" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:56:13.896570" elapsed="0.076095"/>
</kw>
<msg time="2026-10-11T00:56:13.972748" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:56:13.972787" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:13.892205" elapsed="0.080618"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:13.973124" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:13.972889" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:13.972874" elapsed="0.000322"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:56:13.891852" elapsed="0.081365"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:56:13.891540" elapsed="0.081703"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:56:13.886629" elapsed="0.086660"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:56:13.881152" elapsed="0.092185"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:13.880215" elapsed="0.093267"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:56:13.877873" elapsed="0.095670"/>
</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-10-11T00:56:13.980945" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node012wkykfzx8pv3ssb3pk6iiyhs15.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:56:13.981109" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:56:13.981213" 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-10-11T00:56:13.974613" elapsed="0.006624"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:13.981759" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:13.981467" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:13.982328" 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-10-11T00:56:13.981994" elapsed="0.000381"/>
</kw>
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>${string_to_check}</arg>
<doc>Fails if the `container` contains the `item`.</doc>
<status status="PASS" start="2026-10-11T00:56:13.982555" elapsed="0.000398"/>
</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-10-11T00:56:13.974276" elapsed="0.008733"/>
</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-10-11T00:56:13.973735" elapsed="0.009320"/>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:13.984163" 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-10-11T00:56:13.983787" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-10-11T00:56:13.984363" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-11T00:56:13.984257" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:13.984239" elapsed="0.000216"/>
</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-10-11T00:56:13.984621" elapsed="0.000019"/>
</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-10-11T00:56:13.984794" elapsed="0.000019"/>
</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-10-11T00:56:13.984985" elapsed="0.000018"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:13.985171" elapsed="0.000019"/>
</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-10-11T00:56:13.985359" elapsed="0.000017"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message of the current test case.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:13.985549" elapsed="0.000018"/>
</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-10-11T00:56:13.985766" elapsed="0.000018"/>
</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 The given `tags` for the current test or all tests in a suite.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:13.985998" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:13.985838" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:13.985823" elapsed="0.000243"/>
</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-10-11T00:56:13.983419" elapsed="0.002708"/>
</kw>
<doc>The IPv4 topology shall be empty</doc>
<status status="PASS" start="2026-10-11T00:56:13.876820" elapsed="0.109345"/>
</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-10-11T00:56:13.987573" elapsed="0.000199"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:56:13.987308" elapsed="0.000513"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:13.988987" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:13.988901" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:13.988883" elapsed="0.000166"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:13.991220" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:13.991137" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:13.991121" elapsed="0.000160"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:13.992195" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:56:13.991856" elapsed="0.000365"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:56:13.992649" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:56:13.992374" elapsed="0.000299"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:56:13.992713" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:56:13.992839" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:56:13.991501" elapsed="0.001361"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:13.995503" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:13.995405" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:13.995387" elapsed="0.000179"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:13.996603" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:13.996519" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:13.996502" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:56:13.996978" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:56:13.996811" elapsed="0.000191"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:56:13.997313" 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-10-11T00:56:13.997177" elapsed="0.000160"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:56:14.035217" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:56:13.997850" elapsed="0.037476"/>
</kw>
<msg time="2026-10-11T00:56:14.035499" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:56:14.035540" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:13.997517" elapsed="0.038058"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:56:14.094958" 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-10-11T00:56:14.036100" elapsed="0.058959"/>
</kw>
<msg time="2026-10-11T00:56:14.095220" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:56:14.095260" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:14.035744" elapsed="0.059551"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:14.095594" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:14.095366" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:14.095346" elapsed="0.000319"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:14.096081" 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-10-11T00:56:14.095846" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:14.096421" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:14.096208" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:14.096192" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:56:14.096525" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:56:14.099045" elapsed="0.000125"/>
</kw>
<msg time="2026-10-11T00:56:14.099228" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:14.098040" elapsed="0.001320"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:14.099739" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:14.100084" 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-10-11T00:56:14.097459" elapsed="0.002812"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:56:14.096832" 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-10-11T00:56:13.996242" elapsed="0.104178"/>
</kw>
<msg time="2026-10-11T00:56:14.100506" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:56:14.100544" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:13.995718" elapsed="0.104862"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:56:14.100732" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:56:14.100648" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:14.100630" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:14.101139" 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-10-11T00:56:14.101495" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:56:14.101560" 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-10-11T00:56:13.995117" elapsed="0.106527"/>
</kw>
<msg time="2026-10-11T00:56:14.101726" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:56:14.101765" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:13.993205" elapsed="0.108594"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:14.102131" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:14.101864" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:14.101848" elapsed="0.000355"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:56:13.993047" elapsed="0.109176"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:56:13.992910" elapsed="0.109339"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:56:13.990832" elapsed="0.111463"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:56:13.988644" elapsed="0.113699"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:13.987972" elapsed="0.114411"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:56:13.986901" elapsed="0.115606"/>
</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-10-11T00:56:14.102673" elapsed="0.000095"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:14.103283" 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-10-11T00:56:14.102943" elapsed="0.000364"/>
</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-10-11T00:56:14.108419" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:14.121378" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:14.121479" 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-10-11T00:56:14.108278" elapsed="0.013224"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:14.121927" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:14.121703" elapsed="0.000264"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:14.122432" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:14.122520" 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-10-11T00:56:14.122175" elapsed="0.000412">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-10-11T00:56:14.107860" elapsed="0.014826">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:15.133833" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:15.147284" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:15.147513" 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-10-11T00:56:15.133545" elapsed="0.014026"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:15.148624" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:15.148018" elapsed="0.000699"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:15.149647" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:15.149817" 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-10-11T00:56:15.149087" elapsed="0.000854">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-10-11T00:56:15.132595" elapsed="0.017574">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:16.160780" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:16.174738" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:16.174931" 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-10-11T00:56:16.160494" elapsed="0.014489"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:16.176017" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:16.175495" elapsed="0.000665"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:16.177096" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:16.177266" 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-10-11T00:56:16.176544" elapsed="0.000843">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-10-11T00:56:16.159552" elapsed="0.018078">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:17.188473" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:17.201998" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:17.202211" 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-10-11T00:56:17.188152" elapsed="0.014112"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:17.203294" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:17.202739" elapsed="0.000648"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:17.204339" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:17.204538" 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-10-11T00:56:17.203772" elapsed="0.000890">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-10-11T00:56:17.187116" elapsed="0.017746">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:18.216278" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:18.229879" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:18.230097" 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-10-11T00:56:18.215968" elapsed="0.014184"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:18.231190" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:18.230641" elapsed="0.000643"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:18.232223" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:18.232392" 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-10-11T00:56:18.231662" elapsed="0.000886">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-10-11T00:56:18.215015" elapsed="0.017738">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:19.243505" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:19.256852" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:19.257090" 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-10-11T00:56:19.243190" elapsed="0.013955"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:19.258167" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:19.257621" elapsed="0.000721"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:19.259300" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:19.259508" 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-10-11T00:56:19.258733" elapsed="0.000905">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-10-11T00:56:19.242240" elapsed="0.017602">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:20.270752" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:20.284212" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:20.284445" 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-10-11T00:56:20.270460" elapsed="0.014039"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:20.285542" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:20.284953" elapsed="0.000683"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:20.286557" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:20.286732" 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-10-11T00:56:20.285978" elapsed="0.000881">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-10-11T00:56:20.269489" elapsed="0.017599">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:21.299655" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:21.313144" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:21.313335" 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-10-11T00:56:21.299341" elapsed="0.014044"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:21.314459" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:21.313874" elapsed="0.000680"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:21.315479" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:21.315649" 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-10-11T00:56:21.314894" elapsed="0.000876">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-10-11T00:56:21.298399" elapsed="0.017576">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:22.326636" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:22.339891" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:22.340102" 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-10-11T00:56:22.326322" elapsed="0.013831"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:22.341174" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:22.340635" elapsed="0.000630"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:22.342189" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:22.342356" 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-10-11T00:56:22.341638" elapsed="0.000871">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-10-11T00:56:22.325380" elapsed="0.017337">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:23.353255" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:23.366576" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:23.366773" 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-10-11T00:56:23.352949" elapsed="0.013875"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:23.367859" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:23.367295" elapsed="0.000658"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:23.368883" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:23.369077" 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-10-11T00:56:23.368315" elapsed="0.000888">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-10-11T00:56:23.352038" elapsed="0.017406">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:24.380662" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:24.394058" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:24.394252" 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-10-11T00:56:24.380343" elapsed="0.013960"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:24.395476" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:24.394875" elapsed="0.000695"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:24.396497" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:24.396686" 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-10-11T00:56:24.395914" elapsed="0.000917">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-10-11T00:56:24.379378" elapsed="0.017736">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:25.407695" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:25.420782" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:25.421002" 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-10-11T00:56:25.407383" elapsed="0.013672"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:25.422080" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:25.421540" elapsed="0.000634"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:25.423100" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:25.423270" 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-10-11T00:56:25.422543" elapsed="0.000852">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-10-11T00:56:25.406463" elapsed="0.017170">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:26.434304" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:26.447887" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:26.448105" 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-10-11T00:56:26.434021" elapsed="0.014136"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:26.449197" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:26.448644" elapsed="0.000646"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:26.450219" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:26.450387" 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-10-11T00:56:26.449661" elapsed="0.000881">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-10-11T00:56:26.433078" elapsed="0.017668">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:27.462091" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:27.475498" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:27.475697" 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-10-11T00:56:27.461781" elapsed="0.013969"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:27.476775" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:27.476223" elapsed="0.000647"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:27.477803" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:27.477994" 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-10-11T00:56:27.477235" elapsed="0.000885">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-10-11T00:56:27.460823" elapsed="0.017498">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:28.488914" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:28.502295" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:28.502522" 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-10-11T00:56:28.488627" elapsed="0.013953"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:28.503600" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:28.503052" elapsed="0.000642"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:28.504645" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:28.504813" 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-10-11T00:56:28.504068" elapsed="0.000892">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-10-11T00:56:28.487680" elapsed="0.017483">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:29.515795" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:29.529291" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:29.529518" 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-10-11T00:56:29.515511" elapsed="0.014065"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:29.530821" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:29.530247" elapsed="0.000708"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:29.531864" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:29.532055" 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-10-11T00:56:29.531302" elapsed="0.000877">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-10-11T00:56:29.514570" elapsed="0.017807">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:30.543646" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:30.557571" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:30.557777" 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-10-11T00:56:30.543311" elapsed="0.014516"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:30.558941" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:30.558317" elapsed="0.000721"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:30.559970" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:30.560163" 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-10-11T00:56:30.559379" elapsed="0.000919">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-10-11T00:56:30.542300" elapsed="0.018242">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:31.571173" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:31.584613" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:31.584808" 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-10-11T00:56:31.570861" elapsed="0.013997"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:31.585890" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:31.585330" elapsed="0.000705"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:31.586964" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:31.587135" 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-10-11T00:56:31.586377" elapsed="0.000882">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-10-11T00:56:31.569938" elapsed="0.017551">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:32.598372" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:32.611792" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:32.612009" 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-10-11T00:56:32.598084" elapsed="0.013977"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:32.613102" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:32.612551" elapsed="0.000644"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:32.614118" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:32.614289" 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-10-11T00:56:32.613566" elapsed="0.000876">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-10-11T00:56:32.597129" elapsed="0.017520">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:33.625737" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:33.639329" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:33.639573" 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-10-11T00:56:33.625440" elapsed="0.014185"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:33.640677" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:33.640108" elapsed="0.000660"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:33.641691" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:33.641869" 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-10-11T00:56:33.641127" 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-10-11T00:56:33.624462" elapsed="0.017771">0 != 2</status>
</kw>
<kw name="Check_File_For_Word_Count" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:34.652860" level="INFO">Executing command 'grep -o 'withdrawn_prefix_received:' bgp_peer1.log | wc -l'.</msg>
<msg time="2026-10-11T00:56:34.666284" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:34.666510" 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-10-11T00:56:34.652576" elapsed="0.013991"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:34.667698" level="INFO">0</msg>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:34.667133" elapsed="0.000657"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T00:56:34.668720" level="INFO">Argument types are:
&lt;class 'str'&gt;
&lt;class 'int'&gt;</msg>
<msg time="2026-10-11T00:56:34.668911" 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-10-11T00:56:34.668157" elapsed="0.000879">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-10-11T00:56:34.651626" elapsed="0.017610">0 != 2</status>
</kw>
<msg time="2026-10-11T00:56:34.669437" 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-10-11T00:56:14.103511" elapsed="20.566117">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-10-11T00:56:34.672262" 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-10-11T00:56:34.671349" elapsed="0.000969"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-10-11T00:56:34.672762" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:34.672512" elapsed="0.000344"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:34.672465" elapsed="0.000463"/>
</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-10-11T00:56:34.673313" elapsed="0.000490"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-11T00:56:34.675740" level="FAIL">'4835' does not contain '-'</msg>
<arg>${number}</arg>
<arg>-</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-11T00:56:34.675031" elapsed="0.000830">'4835' does not contain '-'</status>
</kw>
<msg time="2026-10-11T00:56:34.676066" 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-10-11T00:56:34.674173" elapsed="0.001944"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:34.677192" 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-10-11T00:56:34.676533" elapsed="0.000715"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:34.678232" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:34.677634" elapsed="0.000654"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:34.679341" 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-10-11T00:56:34.678697" elapsed="0.000699"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-10-11T00:56:34.680481" 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 of the current test case.</doc>
<status status="PASS" start="2026-10-11T00:56:34.679774" elapsed="0.000807"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:34.681535" 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-10-11T00:56:34.681028" elapsed="0.000599"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-10-11T00:56:34.682982" level="INFO">Set tag 'https://bugs.opendaylight.org/show_bug.cgi?id=4835'.</msg>
<arg>${bug_url}</arg>
<doc>Adds The given `tags` for the current test or all tests in a suite.</doc>
<status status="PASS" start="2026-10-11T00:56:34.682266" elapsed="0.000812"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:34.681760" elapsed="0.001386"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:34.681722" elapsed="0.001474"/>
</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-10-11T00:56:34.670526" elapsed="0.012763"/>
</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-10-11T00:56:13.986418" elapsed="20.696960">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-10-11T00:56:34.687067" elapsed="0.000479"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:56:34.686068" elapsed="0.001591"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:34.689732" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:34.689540" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:34.689500" elapsed="0.000392"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:34.695000" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:34.694762" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:34.694723" elapsed="0.000442"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:34.697331" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:56:34.696579" elapsed="0.000809"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:56:34.698477" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:56:34.697768" elapsed="0.000766"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:56:34.698626" elapsed="0.000065"/>
</return>
<msg time="2026-10-11T00:56:34.698955" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:56:34.695685" elapsed="0.003331"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:34.704659" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:34.704540" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:34.704515" elapsed="0.000232"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:34.706236" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:34.706118" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:34.706094" elapsed="0.000230"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:56:34.706812" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:56:34.706574" elapsed="0.000272"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:56:34.707284" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:56:34.707091" elapsed="0.000225"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:56:34.741295" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:56:34.708045" elapsed="0.033406"/>
</kw>
<msg time="2026-10-11T00:56:34.741661" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:56:34.741719" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:34.707564" elapsed="0.034204"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:56:34.769153" 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-10-11T00:56:34.742545" elapsed="0.026705"/>
</kw>
<msg time="2026-10-11T00:56:34.769396" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:56:34.769458" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:34.742039" elapsed="0.027455"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:34.769771" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:34.769563" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:34.769545" elapsed="0.000297"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:34.770264" 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-10-11T00:56:34.770039" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:34.770605" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:34.770387" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:34.770370" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:56:34.770706" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:56:34.773142" elapsed="0.000114"/>
</kw>
<msg time="2026-10-11T00:56:34.773313" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:34.772084" 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-10-11T00:56:34.773812" elapsed="0.000087"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:34.774166" 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-10-11T00:56:34.771486" 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-10-11T00:56:34.770998" elapsed="0.003429"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:56:34.705745" elapsed="0.068757"/>
</kw>
<msg time="2026-10-11T00:56:34.774582" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:56:34.774622" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:34.704974" elapsed="0.069683"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:56:34.774811" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:56:34.774725" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:34.774708" elapsed="0.000192"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:34.775228" 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-10-11T00:56:34.775587" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:56:34.775652" 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-10-11T00:56:34.704119" elapsed="0.071618"/>
</kw>
<msg time="2026-10-11T00:56:34.775820" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:56:34.775860" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:34.699801" elapsed="0.076106"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:34.776194" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:34.775975" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:34.775959" elapsed="0.000305"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:56:34.699478" elapsed="0.076808"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:56:34.699137" elapsed="0.077178"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:56:34.693994" elapsed="0.082370"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:56:34.688948" elapsed="0.087541"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:34.688018" elapsed="0.088515"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:56:34.685251" elapsed="0.091328"/>
</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-10-11T00:56:34.776744" elapsed="0.000095"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:34.777947" 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-10-11T00:56:34.777627" 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-10-11T00:56:34.778127" elapsed="0.000169"/>
</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-10-11T00:56:34.777323" elapsed="0.001026"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-10-11T00:56:36.779128" level="INFO">^C
[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<msg time="2026-10-11T00:56:36.779355" level="INFO">${output} = ^C
[?2004h[jenkins@releng-26932-423-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-10-11T00:56:34.778532" elapsed="2.000921"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:36.780577" level="INFO">^C
[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt; </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:36.779999" elapsed="0.000679"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-10-11T00:56:34.777026" elapsed="2.003770"/>
</kw>
<kw name="Store_File_To_Workspace">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:56:36.789597" level="INFO">Executing command 'cat bgp_peer1.log'.</msg>
<msg time="2026-10-11T00:56:36.803495" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:56:36.803697" level="INFO">${output_log} = 2026-10-11 00:54:37,543 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:54:37,543 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.1
2026-10-11 00:54:37,543 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-10-11T00:56:36.789232" elapsed="0.014521"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:36.804814" level="INFO">2026-10-11 00:54:37,543 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:54:37,543 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.1
2026-10-11 00:54:37,543 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 00:54:37,543 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 00:54:37,544 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 00:54:37,544 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:54:37,545 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:54:37,545 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:54:37,545 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:54:37,545 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-10-11 00:54:37,545 INFO BGP-Thread-1 (job):   Prefix base: 8.1.0.0/28
2026-10-11 00:54:37,545 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 00:54:37,545 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 00:54:37,545 INFO BGP-Thread-1 (job):   My BGP Identifier: 2130706433
2026-10-11 00:54:37,545 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 00:54:37,545 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 00:54:37,546 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 00:54:37,546 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 00:54:37,546 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 00:54:37,546 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 00:54:37,546 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-10-11 00:54:37,546 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-10-11 00:54:37,546 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 00:54:37,546 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 00:54:37,546 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 00:54:37,546 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:54:37,546 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-10-11 00:54:37,546 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 00:54:37,546 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 00:54:37,546 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-10-11 00:54:37,546 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 00:54:37,546 DEBUG BGP-Thread-1 (job):   BGP Identifier=2130706433 (0x7f000001)
2026-10-11 00:54:37,546 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-10-11 00:54:37,547 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf0
2026-10-11 00:54:37,547 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf000b47f000001100206010400010001020641040000fbf0'
2026-10-11 00:54:37,547 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf000b47f000001100206010400010001020641040000fbf0
2026-10-11 00:54:37,547 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:54:37,548 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:54:37,548 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:54:37,548 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:54:37,548 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:54:37,548 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:54:37,548 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:54:37,548 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:54:37,548 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:54:37,548 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:54:37,548 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 00:54:37,548 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:54:37,548 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:54:37,549 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:54:37,555 INFO BGP-Thread-1 (job): ... idle for 0.006s
2026-10-11 00:54:37,555 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.006s
2026-10-11 00:54:37,555 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 00:54:37,555 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:54:37,555 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:54:37,556 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 00:54:37,556 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:54:37,556 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:54:37,556 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:54:37,556 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:54:37,556 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:54:37,556 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:54:37,556 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:54:37,556 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:54:37,556 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:54:37,556 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:54:37,556 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:54:37,556 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:54:37,556 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-10-11 00:54:37,556 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-10-11 00:54:37,557 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:54:37,557 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:54:37,557 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:54:47,564 INFO BGP-Thread-1 (job): ... idle for 10.007s
2026-10-11 00:54:47,564 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.013s
2026-10-11 00:54:47,564 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:54:47,564 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:54:47,564 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:54:57,574 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-10-11 00:54:57,575 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.023s
2026-10-11 00:54:57,575 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:54:57,575 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:54:57,575 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:55:07,585 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-10-11 00:55:07,585 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 30.033s
2026-10-11 00:55:07,585 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:55:07,585 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:55:07,585 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:55:17,596 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-10-11 00:55:17,596 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 40.043s
2026-10-11 00:55:17,596 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:55:17,596 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:55:17,596 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:55:27,606 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-10-11 00:55:27,606 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 50.053s
2026-10-11 00:55:27,607 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:55:27,607 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:55:27,607 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:55:37,558 INFO BGP-Thread-1 (job): ... idle for 9.951s
2026-10-11 00:55:37,558 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 60.004s
2026-10-11 00:55:37,558 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:55:37,559 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:55:37,559 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:55:37,559 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:55:37,559 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:55:37,559 INFO BGP-Thread-1 (job): KEEP ALIVE is sent.
2026-10-11 00:55:37,559 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:55:37,559 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:55:37,559 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:55:37,560 INFO BGP-Thread-1 (job): KEEP ALIVE message received: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:55:47,565 INFO BGP-Thread-1 (job): ... idle for 10.005s
2026-10-11 00:55:47,565 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 70.010s
2026-10-11 00:55:47,565 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:55:47,565 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:55:47,565 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:55:57,575 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-10-11 00:55:57,576 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 80.020s
2026-10-11 00:55:57,576 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:55:57,576 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:55:57,576 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:56:07,585 INFO BGP-Thread-1 (job): ... idle for 10.009s
2026-10-11 00:56:07,585 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 90.029s
2026-10-11 00:56:07,585 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:56:07,585 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:56:07,586 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:56:17,596 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-10-11 00:56:17,596 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 100.039s
2026-10-11 00:56:17,596 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:56:17,596 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:56:17,596 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:56:27,606 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-10-11 00:56:27,607 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 110.049s
2026-10-11 00:56:27,607 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:56:27,607 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:56:27,607 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-10-11T00:56:36.804271" elapsed="0.000944"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T00:56:36.806285" 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-10-11T00:56:36.805677" elapsed="0.000723"/>
</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-10-11T00:56:36.788311" elapsed="0.018244"/>
</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-10-11T00:56:36.807886" elapsed="0.000511"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:56:36.807162" elapsed="0.001396"/>
</kw>
<doc>Stop BGP peer, log topology and store logs</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:56:34.684104" elapsed="2.124530"/>
</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-10-11T00:56:36.811796" elapsed="0.000546"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:56:36.811201" elapsed="0.001287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:36.814598" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:36.814353" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:36.814310" elapsed="0.000433"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:36.819705" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:36.819518" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:36.819477" elapsed="0.000441"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:36.822026" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:56:36.821235" elapsed="0.000848"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:56:36.823071" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:56:36.822456" elapsed="0.000669"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:56:36.823213" elapsed="0.000065"/>
</return>
<msg time="2026-10-11T00:56:36.823531" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:56:36.820383" elapsed="0.003200"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:36.829998" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:36.829749" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:36.829708" elapsed="0.000432"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:36.832595" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:36.832365" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:36.832326" elapsed="0.000408"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:56:36.833508" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:56:36.833087" elapsed="0.000478"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:56:36.834255" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:56:36.833952" elapsed="0.000355"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:56:36.869042" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:56:36.835516" elapsed="0.033660"/>
</kw>
<msg time="2026-10-11T00:56:36.869386" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:56:36.869472" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:36.834699" elapsed="0.034823"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:56:36.924380" 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-10-11T00:56:36.870266" elapsed="0.054230"/>
</kw>
<msg time="2026-10-11T00:56:36.924646" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:56:36.924721" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:36.869758" elapsed="0.055000"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:36.925054" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:36.924828" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:36.924810" elapsed="0.000316"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:36.925555" 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-10-11T00:56:36.925306" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:36.925893" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:36.925680" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:36.925663" elapsed="0.000302"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:56:36.925994" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:56:36.928449" elapsed="0.000118"/>
</kw>
<msg time="2026-10-11T00:56:36.928625" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:36.927363" elapsed="0.001396"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:36.929110" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:36.929470" 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-10-11T00:56:36.926756" elapsed="0.002900"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:56:36.926273" 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-10-11T00:56:36.831766" elapsed="0.098023"/>
</kw>
<msg time="2026-10-11T00:56:36.929885" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:56:36.929926" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:36.830511" elapsed="0.099451"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:56:36.930115" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:56:36.930030" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:36.930013" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:36.930553" 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-10-11T00:56:36.930866" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:56:36.930931" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:56:36.829073" elapsed="0.101941"/>
</kw>
<msg time="2026-10-11T00:56:36.931097" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:56:36.931135" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:36.824343" elapsed="0.106828"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:36.931477" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:36.931236" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:36.931221" elapsed="0.000328"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:56:36.824022" elapsed="0.107548"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:56:36.823689" elapsed="0.107909"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:56:36.818787" elapsed="0.112858"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:56:36.813759" elapsed="0.117966"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:36.812830" elapsed="0.118938"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:56:36.810372" elapsed="0.121442"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:56:36.932562" 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-10-11T00:56:36.932015" elapsed="0.000574"/>
</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-10-11T00:56:36.947271" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:36.946961" elapsed="0.000336"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:36.948005" 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-10-11T00:56:36.947798" elapsed="0.000279">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-10-11T00:56:36.948161" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:36.947473" elapsed="0.000710"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:36.948679" 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-10-11T00:56:36.948357" elapsed="0.000347"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:56:36.949005" 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-10-11T00:56:36.949133" 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-10-11T00:56:36.948889" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:36.949587" 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-10-11T00:56:36.949353" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:36.950554" 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-10-11T00:56:36.950302" elapsed="0.000294"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:56:36.951051" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:56:36.950771" elapsed="0.000304"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:36.951676" 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-10-11T00:56:36.951390" elapsed="0.000310"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:36.952394" 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-10-11T00:56:36.952204" elapsed="0.000229"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:36.952479" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:56:36.952603" 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-10-11T00:56:36.951888" elapsed="0.000737"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:36.952793" elapsed="0.000197"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:56:36.951255" elapsed="0.001772"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:36.953537" 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-10-11T00:56:36.953255" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:36.954228" 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-10-11T00:56:36.954052" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:36.954295" elapsed="0.000061"/>
</return>
<msg time="2026-10-11T00:56:36.954473" 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-10-11T00:56:36.953730" elapsed="0.000766"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:36.954661" elapsed="0.000167"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-ibgp-peer1</var>
<status status="PASS" start="2026-10-11T00:56:36.953124" elapsed="0.001754"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:36.955542" 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-10-11T00:56:36.955108" elapsed="0.000459"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:36.956284" 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-10-11T00:56:36.956106" elapsed="0.000203"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:36.956353" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:56:36.956492" 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-10-11T00:56:36.955737" 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-10-11T00:56:36.956680" elapsed="0.000180"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:56:36.954978" elapsed="0.001920"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:36.957395" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:56:36.957129" elapsed="0.000305"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:36.958101" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:56:36.957924" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:36.958169" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:56:36.958290" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:56:36.957604" elapsed="0.000708"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:36.958491" elapsed="0.000167"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:56:36.956998" elapsed="0.001697"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:56:36.951117" elapsed="0.007608"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:56:36.958763" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:56:36.958902" 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-10-11T00:56:36.949961" elapsed="0.008966"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:36.949690" elapsed="0.009266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:36.959127" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:36.958977" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:36.949672" elapsed="0.009523"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:36.959943" 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-10-11T00:56:36.959353" elapsed="0.000616"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:56:36.960013" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:36.946402" elapsed="0.013710"/>
</kw>
<msg time="2026-10-11T00:56:36.960160" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:36.941628" elapsed="0.018575"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:36.964770" 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/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-10-11T00:56:36.969302" 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/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-10-11T00:56:36.973849" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:36.974033" 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-10-11T00:56:36.974221" 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-10-11T00:56:36.974583" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:36.974430" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:36.974402" 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-10-11T00:56:36.974818" 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-10-11T00:56:36.975020" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:36.975187" elapsed="0.000017"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:56:36.974377" elapsed="0.000857"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:56:36.974288" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:36.975428" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:36.975496" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:56:36.975606" 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-10-11T00:56:36.940943" elapsed="0.034688"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:36.976663" 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-10-11T00:56:36.976436" elapsed="0.000270"/>
</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-10-11T00:56:36.994092" level="INFO">DELETE Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:56:36.994191" level="INFO">DELETE Response : url=http://10.30.170.173: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-10-11T00:56:36.994361" 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-10-11T00:56:36.977012" elapsed="0.017377"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:36.976766" elapsed="0.017681"/>
</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-10-11T00:56:36.994628" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:36.994473" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:36.976750" elapsed="0.017984"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:36.996178" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:36.995897" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:36.995623" elapsed="0.000629"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:36.995438" elapsed="0.000837"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:36.996881" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:36.996597" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:36.996326" elapsed="0.000630"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:36.996310" elapsed="0.000670"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:36.997559" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:56:36.997189" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:36.997885" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:36.997649" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:36.998397" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:56:36.998129" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:36.997961" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:36.997633" elapsed="0.000858"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:36.999028" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:56:36.998675" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:36.999328" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:36.999116" elapsed="0.000264"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:36.999858" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:56:36.999582" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:36.999401" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:36.999099" elapsed="0.000837"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:37.000090" elapsed="0.000290"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:56:37.000786" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:56:37.000561" elapsed="0.000249"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.000983" elapsed="0.000217"/>
</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-10-11T00:56:36.995100" elapsed="0.006156"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:56:37.001297" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:56:37.001487" 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-10-11T00:56:36.975883" elapsed="0.025629"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:56:37.001558" elapsed="0.000025"/>
</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-10-11T00:56:36.932801" elapsed="0.068853"/>
</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-10-11T00:56:37.001830" elapsed="0.000199"/>
</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-10-11T00:56:37.016285" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:37.015982" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:37.017004" 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-10-11T00:56:37.016801" elapsed="0.000265">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-10-11T00:56:37.017184" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:37.016484" elapsed="0.000723"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.017706" 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-10-11T00:56:37.017383" elapsed="0.000348"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:56:37.018023" 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-10-11T00:56:37.018142" 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-10-11T00:56:37.017913" elapsed="0.000254"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.018595" 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-10-11T00:56:37.018361" elapsed="0.000277"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.020312" 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-10-11T00:56:37.019302" elapsed="0.001054"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.020808" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.020552" elapsed="0.000280"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.021450" 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-10-11T00:56:37.021168" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:37.022150" 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-10-11T00:56:37.021970" elapsed="0.000204"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:37.022218" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:56:37.022343" 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-10-11T00:56:37.021645" elapsed="0.000721"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.022549" elapsed="0.000167"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:56:37.021035" elapsed="0.001718"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.023268" 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-10-11T00:56:37.023000" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:37.023982" 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-10-11T00:56:37.023789" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:37.024050" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:56:37.024174" 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-10-11T00:56:37.023481" elapsed="0.000715"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.024360" elapsed="0.000183"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-ebgp-peer1</var>
<status status="PASS" start="2026-10-11T00:56:37.022866" elapsed="0.001713"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.025094" 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-10-11T00:56:37.024808" elapsed="0.000311"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:37.025791" 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-10-11T00:56:37.025615" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:37.025872" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:56:37.025996" 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-10-11T00:56:37.025287" elapsed="0.000732"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.026181" elapsed="0.000167"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-10-11T00:56:37.024678" elapsed="0.001706"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.026949" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:56:37.026670" elapsed="0.000303"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:37.027643" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.027464" elapsed="0.000204"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:37.027712" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:56:37.027836" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:56:37.027141" elapsed="0.000748"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.028061" elapsed="0.000167"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:56:37.026538" elapsed="0.001728"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:56:37.020892" elapsed="0.007406"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:56:37.028336" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:56:37.028481" 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-10-11T00:56:37.018961" elapsed="0.009545"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:37.018700" elapsed="0.009835"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.028707" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.028557" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.018682" elapsed="0.010093"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.029491" 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-10-11T00:56:37.028947" elapsed="0.000571"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:56:37.029561" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:37.015464" elapsed="0.014195"/>
</kw>
<msg time="2026-10-11T00:56:37.029706" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:37.010745" elapsed="0.019004"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:37.034484" 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/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-10-11T00:56:37.039013" 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/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-10-11T00:56:37.043510" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.043693" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.043900" 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-10-11T00:56:37.044281" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.044134" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:37.044120" 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-10-11T00:56:37.044526" 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-10-11T00:56:37.044711" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.044897" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:56:37.044094" elapsed="0.000852"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:56:37.044003" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.045124" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:37.045191" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:56:37.045302" 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-10-11T00:56:37.010114" elapsed="0.035214"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.046340" 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-10-11T00:56:37.046113" elapsed="0.000271"/>
</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-10-11T00:56:37.053989" level="INFO">DELETE Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:56:37.054033" level="INFO">DELETE Response : url=http://10.30.170.173: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-10-11T00:56:37.054120" 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-10-11T00:56:37.046690" elapsed="0.007453"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:37.046461" elapsed="0.007719"/>
</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-10-11T00:56:37.054354" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.054204" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.046444" elapsed="0.008006"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.055641" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:37.055352" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:37.055114" elapsed="0.000597"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.055098" elapsed="0.000635"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.056301" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:37.056036" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:37.055781" elapsed="0.000592"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.055766" elapsed="0.000629"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.056942" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:56:37.056586" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.057238" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.057028" elapsed="0.000263"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.057795" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:56:37.057531" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:37.057346" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.057012" elapsed="0.000875"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.058397" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:56:37.058063" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.058711" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.058501" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.059221" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:56:37.058960" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:37.058785" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.058485" elapsed="0.000813"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:37.059460" elapsed="0.000292"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:56:37.060142" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:56:37.059923" elapsed="0.000243"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.060319" elapsed="0.000225"/>
</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-10-11T00:56:37.054765" elapsed="0.005836"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:56:37.060642" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:56:37.060814" 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-10-11T00:56:37.045578" elapsed="0.015284"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:56:37.060911" elapsed="0.000025"/>
</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-10-11T00:56:37.002233" elapsed="0.058774"/>
</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-10-11T00:56:37.061173" elapsed="0.000183"/>
</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-10-11T00:56:37.075935" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:37.075612" elapsed="0.000349"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:37.076626" 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-10-11T00:56:37.076454" elapsed="0.000232">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-10-11T00:56:37.076770" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:37.076122" elapsed="0.000671"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.077289" 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-10-11T00:56:37.076984" elapsed="0.000330"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:56:37.077603" 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-10-11T00:56:37.077720" 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-10-11T00:56:37.077494" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.078172" 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-10-11T00:56:37.077954" 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-10-11T00:56:37.079163" 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-10-11T00:56:37.078929" elapsed="0.000276"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.079643" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.079380" elapsed="0.000286"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.080260" 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-10-11T00:56:37.079995" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:37.080971" 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-10-11T00:56:37.080778" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:37.081040" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:56:37.081164" 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-10-11T00:56:37.080469" elapsed="0.000718"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.081351" elapsed="0.000183"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:56:37.079862" elapsed="0.001709"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.082075" 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-10-11T00:56:37.081799" elapsed="0.000301"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:37.082765" 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-10-11T00:56:37.082589" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:37.082832" elapsed="0.000047"/>
</return>
<msg time="2026-10-11T00:56:37.082977" 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-10-11T00:56:37.082268" elapsed="0.000732"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.083163" elapsed="0.000164"/>
</kw>
<var name="${key}">NAME</var>
<var name="${value}">example-ebgp-peer2</var>
<status status="PASS" start="2026-10-11T00:56:37.081669" elapsed="0.001694"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.084050" 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-10-11T00:56:37.083607" elapsed="0.000467"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:37.084748" 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-10-11T00:56:37.084569" elapsed="0.000203"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:37.084815" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T00:56:37.084955" 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-10-11T00:56:37.084243" elapsed="0.000738"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.085146" elapsed="0.000165"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.4</var>
<status status="PASS" start="2026-10-11T00:56:37.083477" elapsed="0.001871"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.085870" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:56:37.085592" elapsed="0.000303"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:37.086560" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.086370" elapsed="0.000214"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:37.086627" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:56:37.086749" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:56:37.086062" elapsed="0.000709"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.086946" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:56:37.085461" elapsed="0.001687"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:56:37.079709" elapsed="0.007470"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:56:37.087216" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:56:37.087342" 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-10-11T00:56:37.078575" elapsed="0.008790"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:37.078307" elapsed="0.009131"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.087616" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.087465" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.078290" elapsed="0.009395"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.088386" 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-10-11T00:56:37.087857" elapsed="0.000570"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:56:37.088471" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:37.075053" elapsed="0.013519"/>
</kw>
<msg time="2026-10-11T00:56:37.088620" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:37.070292" elapsed="0.018371"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:37.093174" 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/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-10-11T00:56:37.097711" 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/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-10-11T00:56:37.102220" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.102400" 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-10-11T00:56:37.102598" 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-10-11T00:56:37.102942" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.102788" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:37.102774" 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-10-11T00:56:37.103169" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.103347" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.103535" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:56:37.102749" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:56:37.102662" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.103757" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:37.103822" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:56:37.103945" 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-10-11T00:56:37.069667" elapsed="0.034336"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.105026" 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-10-11T00:56:37.104787" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:56:37.112444" level="INFO">DELETE Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:56:37.112488" level="INFO">DELETE Response : url=http://10.30.170.173: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-10-11T00:56:37.112582" 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-10-11T00:56:37.105355" elapsed="0.007251"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:37.105130" elapsed="0.007513"/>
</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-10-11T00:56:37.112816" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.112667" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.105113" elapsed="0.007795"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.114297" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:37.113825" elapsed="0.000512"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:37.113571" elapsed="0.000799"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.113554" elapsed="0.000838"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.114994" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:37.114712" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:37.114461" elapsed="0.000610"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.114445" elapsed="0.000648"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.115633" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:56:37.115275" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.115959" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.115722" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.116486" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:56:37.116207" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:37.116040" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.115705" elapsed="0.000858"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.117118" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:56:37.116747" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.117431" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.117205" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.117948" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:56:37.117671" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:37.117506" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.117188" elapsed="0.000836"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:37.118170" elapsed="0.000305"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:56:37.118906" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:56:37.118638" elapsed="0.000292"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.119086" elapsed="0.000209"/>
</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-10-11T00:56:37.113225" elapsed="0.006126"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:56:37.119392" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T00:56:37.119581" 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-10-11T00:56:37.104241" elapsed="0.015364"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:56:37.119652" elapsed="0.000024"/>
</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-10-11T00:56:37.061573" elapsed="0.058175"/>
</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-10-11T00:56:37.120302" elapsed="0.000243"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:56:37.120008" elapsed="0.000595"/>
</kw>
<doc>Delete all previously configured BGP peers.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:56:36.809231" elapsed="0.311407"/>
</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-10-11T00:56:37.121957" elapsed="0.000198"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:56:37.121697" elapsed="0.000507"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:37.123117" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:37.123031" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.123013" elapsed="0.000167"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:37.125503" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:37.125404" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.125388" elapsed="0.000176"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.126488" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:56:37.126149" elapsed="0.000364"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.126942" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:56:37.126666" elapsed="0.000300"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:56:37.127006" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:56:37.127131" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:56:37.125773" elapsed="0.001381"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:37.129810" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:37.129726" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.129709" elapsed="0.000177"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:37.130933" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:37.130849" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.130820" elapsed="0.000175"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:56:37.131309" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.131141" elapsed="0.000192"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:56:37.131657" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:56:37.131517" elapsed="0.000163"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:56:37.176683" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:56:37.132222" elapsed="0.044570"/>
</kw>
<msg time="2026-10-11T00:56:37.176967" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:56:37.177009" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:37.131836" elapsed="0.045248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:56:37.214706" 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-10-11T00:56:37.177652" elapsed="0.037164"/>
</kw>
<msg time="2026-10-11T00:56:37.214986" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:56:37.215028" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:37.177271" elapsed="0.037793"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.215355" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.215136" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.215117" elapsed="0.000333"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.215885" 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-10-11T00:56:37.215636" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.216217" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.216016" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.216000" elapsed="0.000287"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:56:37.216318" 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-10-11T00:56:37.218755" elapsed="0.000270"/>
</kw>
<msg time="2026-10-11T00:56:37.219085" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:37.217734" 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-10-11T00:56:37.219623" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.219983" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:56:37.217120" elapsed="0.003047"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:56:37.216629" 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-10-11T00:56:37.130581" elapsed="0.089718"/>
</kw>
<msg time="2026-10-11T00:56:37.220381" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:56:37.220445" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:37.130037" elapsed="0.090446"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:56:37.220637" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:56:37.220552" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.220535" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.221054" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.221356" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:56:37.221441" 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-10-11T00:56:37.129440" elapsed="0.092087"/>
</kw>
<msg time="2026-10-11T00:56:37.221610" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:56:37.221649" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:37.127493" elapsed="0.094192"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.222015" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.221751" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.221735" elapsed="0.000352"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:56:37.127335" elapsed="0.094774"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:56:37.127199" elapsed="0.094938"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:56:37.125107" elapsed="0.097078"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:56:37.122766" elapsed="0.099468"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:37.122354" elapsed="0.099922"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:56:37.121339" elapsed="0.100985"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.223131" 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-10-11T00:56:37.222636" elapsed="0.000522"/>
</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-10-11T00:56:37.234220" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:37.233919" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:37.234944" 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-10-11T00:56:37.234739" elapsed="0.000273">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-10-11T00:56:37.235096" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:37.234420" elapsed="0.000698"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.235614" 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-10-11T00:56:37.235292" elapsed="0.000347"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:56:37.235929" 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-10-11T00:56:37.236059" 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-10-11T00:56:37.235806" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.236509" 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-10-11T00:56:37.236274" elapsed="0.000277"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.237632" 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-10-11T00:56:37.237215" elapsed="0.000460"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.238115" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.237865" elapsed="0.000273"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.238741" 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-10-11T00:56:37.238472" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:37.239488" 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-10-11T00:56:37.239285" elapsed="0.000227"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:37.239556" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:56:37.239682" 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-10-11T00:56:37.238973" elapsed="0.000732"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.239884" elapsed="0.000177"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:56:37.238325" elapsed="0.001804"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.240646" 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-10-11T00:56:37.240361" elapsed="0.000309"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:37.241341" 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-10-11T00:56:37.241163" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:37.241423" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:56:37.241550" 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-10-11T00:56:37.240852" elapsed="0.000721"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.241736" elapsed="0.000180"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:56:37.240230" elapsed="0.001723"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.242462" 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-10-11T00:56:37.242180" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:37.243159" 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-10-11T00:56:37.242982" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:37.243226" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:56:37.243350" 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-10-11T00:56:37.242654" elapsed="0.000718"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.243550" elapsed="0.000165"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:56:37.242051" elapsed="0.001700"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.244255" 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-10-11T00:56:37.243990" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:37.244956" 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-10-11T00:56:37.244768" elapsed="0.000212"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:37.245023" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:56:37.245144" 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-10-11T00:56:37.244461" elapsed="0.000705"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.245328" elapsed="0.000179"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:56:37.243860" elapsed="0.001684"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.246054" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:56:37.245772" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:37.246744" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.246569" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:37.246810" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:56:37.246945" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:56:37.246246" elapsed="0.000721"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.247129" elapsed="0.000163"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:56:37.245642" elapsed="0.001686"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:56:37.238182" elapsed="0.009176"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:56:37.247395" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:37.247541" 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-10-11T00:56:37.236876" elapsed="0.010689"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:37.236611" elapsed="0.010983"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.247764" elapsed="0.000195"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.247616" elapsed="0.000376"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.236594" elapsed="0.011418"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.248750" 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-10-11T00:56:37.248174" elapsed="0.000639"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:56:37.248873" 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-10-11T00:56:37.233392" elapsed="0.015585"/>
</kw>
<msg time="2026-10-11T00:56:37.249025" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:37.228668" elapsed="0.020400"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:37.253605" 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/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-10-11T00:56:37.258173" 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/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-10-11T00:56:37.262719" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.262912" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.263099" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.263450" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.263289" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:37.263276" 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-10-11T00:56:37.263685" 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-10-11T00:56:37.263894" 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-10-11T00:56:37.264061" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:56:37.263251" elapsed="0.000857"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:56:37.263164" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.264287" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:37.264352" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:56:37.264476" 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-10-11T00:56:37.228065" elapsed="0.036436"/>
</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-10-11T00:56:37.274236" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:37.273931" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:37.274941" 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-10-11T00:56:37.274757" elapsed="0.000243">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-10-11T00:56:37.275084" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:37.274435" elapsed="0.000671"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.275606" 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-10-11T00:56:37.275280" elapsed="0.000352"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:56:37.275924" 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-10-11T00:56:37.276076" 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-10-11T00:56:37.275799" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.276539" 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-10-11T00:56:37.276299" 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-10-11T00:56:37.276917" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.276655" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.277401" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:37.277138" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:37.276993" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.276638" elapsed="0.000856"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.278289" 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-10-11T00:56:37.277654" elapsed="0.000663"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:56:37.278360" 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-10-11T00:56:37.273414" elapsed="0.005063"/>
</kw>
<msg time="2026-10-11T00:56:37.278529" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:37.268656" elapsed="0.009916"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:37.283224" 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/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-10-11T00:56:37.287868" 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/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-10-11T00:56:37.292354" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.292548" 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-10-11T00:56:37.292730" 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-10-11T00:56:37.293078" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.292932" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:37.292919" 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-10-11T00:56:37.293305" 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-10-11T00:56:37.293498" 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-10-11T00:56:37.293662" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:56:37.292893" elapsed="0.000816"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:56:37.292795" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.293910" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:37.293977" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:56:37.294096" 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-10-11T00:56:37.267940" elapsed="0.026183"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:37.295229" 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-10-11T00:56:37.295044" elapsed="0.000244">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-10-11T00:56:37.295370" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:37.294710" elapsed="0.000682"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.295692" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.295472" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.296203" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:56:37.295941" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:37.295764" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.295455" elapsed="0.000823"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.296788" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:56:37.296453" elapsed="0.000358"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:56:37.296897" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:56:37.297024" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:56:37.294395" elapsed="0.002652"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.298262" 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-10-11T00:56:37.298041" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.298726" 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-10-11T00:56:37.298513" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.299200" 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-10-11T00:56:37.298984" elapsed="0.000256"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.299660" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:37.299444" elapsed="0.000256"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:56:37.300426" 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-10-11T00:56:37.300249" elapsed="0.000202"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:56:37.300748" 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-10-11T00:56:37.300606" elapsed="0.000166"/>
</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-10-11T00:56:37.300948" elapsed="0.000153"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.301531" 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-10-11T00:56:37.301295" elapsed="0.000277"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:56:37.301609" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:56:37.301735" 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-10-11T00:56:37.299892" elapsed="0.001867"/>
</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-10-11T00:56:37.316559" level="INFO">PUT Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.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-10-11T00:56:37.316622" level="INFO">PUT Response : url=http://10.30.170.173: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-10-11T00:56:37.316703" 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-10-11T00:56:37.302070" elapsed="0.014656"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:37.301821" elapsed="0.014973"/>
</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-10-11T00:56:37.316992" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.316820" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.301805" elapsed="0.015267"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.318218" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:37.317946" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:37.317696" elapsed="0.000592"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.317679" elapsed="0.000631"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.318888" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:37.318611" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:37.318359" elapsed="0.000601"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.318344" elapsed="0.000637"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.319515" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:56:37.319158" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.319812" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.319602" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.320320" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:56:37.320060" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:37.319898" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.319586" elapsed="0.000809"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.320938" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:56:37.320587" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.321230" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.321024" elapsed="0.000257"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.321739" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:56:37.321481" elapsed="0.000283"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:37.321303" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.321008" elapsed="0.000807"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:37.321973" elapsed="0.000288"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:56:37.322659" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:56:37.322435" elapsed="0.000248"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.322849" elapsed="0.000213"/>
</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-10-11T00:56:37.317393" elapsed="0.005725"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:56:37.323258" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:56:37.323177" elapsed="0.000135"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.323160" elapsed="0.000174"/>
</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-10-11T00:56:37.323493" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:56:37.323555" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:56:37.323713" 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-10-11T00:56:37.297339" elapsed="0.026398"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:56:37.323791" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:56:37.323927" 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-10-11T00:56:37.223986" elapsed="0.099964"/>
</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-10-11T00:56:37.324277" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.324072" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.324055" elapsed="0.000305"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:56:37.324389" elapsed="0.000040"/>
</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-10-11T00:56:37.223401" elapsed="0.101103"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.325252" 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-10-11T00:56:37.324704" elapsed="0.000575"/>
</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-10-11T00:56:37.336495" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:37.336176" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:37.337200" 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-10-11T00:56:37.337015" elapsed="0.000244">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-10-11T00:56:37.337343" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:37.336680" elapsed="0.000685"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.337876" 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-10-11T00:56:37.337555" elapsed="0.000347"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:56:37.338177" 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-10-11T00:56:37.338302" 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-10-11T00:56:37.338069" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.338757" 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-10-11T00:56:37.338539" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.339720" 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-10-11T00:56:37.339489" elapsed="0.000273"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.340202" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.339954" elapsed="0.000271"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.340822" 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-10-11T00:56:37.340557" elapsed="0.000299"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:37.341525" 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-10-11T00:56:37.341332" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:37.341592" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:56:37.341715" 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-10-11T00:56:37.341024" elapsed="0.000713"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.341912" elapsed="0.000166"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-10-11T00:56:37.340425" elapsed="0.001689"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.342660" 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-10-11T00:56:37.342376" elapsed="0.000308"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:37.343349" 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-10-11T00:56:37.343173" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:37.343431" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:56:37.343556" 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-10-11T00:56:37.342865" elapsed="0.000713"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.343742" elapsed="0.000177"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:56:37.342245" elapsed="0.001711"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.345516" 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-10-11T00:56:37.345223" elapsed="0.000317"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:37.346214" 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-10-11T00:56:37.346036" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:37.346283" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:56:37.346421" 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-10-11T00:56:37.345713" elapsed="0.000733"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.346611" elapsed="0.000166"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:56:37.344054" elapsed="0.002761"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.347324" 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-10-11T00:56:37.347056" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:37.348107" 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-10-11T00:56:37.347928" elapsed="0.000203"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:37.348174" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:56:37.348296" 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-10-11T00:56:37.347534" 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-10-11T00:56:37.348496" elapsed="0.000166"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:56:37.346925" elapsed="0.001773"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.349205" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:56:37.348938" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:37.349923" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.349720" elapsed="0.000228"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:37.349990" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:56:37.350112" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:56:37.349397" elapsed="0.000737"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.350296" elapsed="0.000179"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:56:37.348797" elapsed="0.001715"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.351018" 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-10-11T00:56:37.350738" elapsed="0.000304"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:37.351708" 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-10-11T00:56:37.351530" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:37.351775" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:56:37.351911" 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-10-11T00:56:37.351209" elapsed="0.000725"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.352097" elapsed="0.000165"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-10-11T00:56:37.350609" elapsed="0.001689"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.352861" 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-10-11T00:56:37.352579" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:37.353556" 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-10-11T00:56:37.353362" elapsed="0.000218"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:37.353624" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:56:37.353747" 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-10-11T00:56:37.353054" elapsed="0.000715"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.353948" elapsed="0.000166"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64497</var>
<status status="PASS" start="2026-10-11T00:56:37.352446" elapsed="0.001706"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:56:37.340268" elapsed="0.013916"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:56:37.354221" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:56:37.354349" 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-10-11T00:56:37.339135" elapsed="0.015238"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:37.338887" elapsed="0.015514"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.354590" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.354439" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.338869" elapsed="0.015789"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.355421" 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-10-11T00:56:37.354816" elapsed="0.000634"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:56:37.355493" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:37.335661" elapsed="0.019933"/>
</kw>
<msg time="2026-10-11T00:56:37.355641" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:37.330935" elapsed="0.024750"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:37.360529" 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/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-10-11T00:56:37.365078" 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/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-10-11T00:56:37.369643" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.369823" 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-10-11T00:56:37.370019" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.370387" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.370241" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:37.370228" 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-10-11T00:56:37.370646" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.370826" 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-10-11T00:56:37.371006" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:56:37.370202" elapsed="0.000852"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:56:37.370114" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.371229" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:37.371295" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:56:37.371418" 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-10-11T00:56:37.330317" elapsed="0.041128"/>
</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-10-11T00:56:37.381206" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:37.380901" elapsed="0.000379"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:37.381961" 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-10-11T00:56:37.381779" elapsed="0.000240">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-10-11T00:56:37.382102" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:37.381458" elapsed="0.000666"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.382621" 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-10-11T00:56:37.382298" elapsed="0.000349"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:56:37.382950" 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-10-11T00:56:37.383072" 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-10-11T00:56:37.382813" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.383526" 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-10-11T00:56:37.383291" 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-10-11T00:56:37.383904" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.383642" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.384441" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:37.384159" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:37.384010" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.383624" elapsed="0.000895"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.385336" 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-10-11T00:56:37.384681" elapsed="0.000683"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:56:37.385423" 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//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-10-11T00:56:37.380370" elapsed="0.005156"/>
</kw>
<msg time="2026-10-11T00:56:37.385578" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:37.375608" elapsed="0.010013"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:37.390296" 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/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-10-11T00:56:37.394860" 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/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-10-11T00:56:37.399360" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.399553" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.399734" 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-10-11T00:56:37.400082" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.399937" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:37.399924" 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-10-11T00:56:37.400308" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.400502" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.400666" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:56:37.399899" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:56:37.399798" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.400898" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:37.400994" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:56:37.401113" 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-10-11T00:56:37.374887" elapsed="0.026253"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:37.402254" 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-10-11T00:56:37.402063" elapsed="0.000250">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-10-11T00:56:37.402396" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:37.401725" elapsed="0.000709"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.402718" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.402498" elapsed="0.000271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.403237" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:56:37.402971" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:37.402791" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.402482" elapsed="0.000830"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.403825" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:56:37.403489" elapsed="0.000373"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:56:37.403907" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:56:37.404033" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:56:37.401422" elapsed="0.002634"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.405289" 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-10-11T00:56:37.405068" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.405749" 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-10-11T00:56:37.405537" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.406223" 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-10-11T00:56:37.406006" elapsed="0.000256"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.406681" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:37.406464" elapsed="0.000257"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:56:37.407440" 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-10-11T00:56:37.407268" elapsed="0.000198"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:56:37.407760" 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-10-11T00:56:37.407618" elapsed="0.000166"/>
</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-10-11T00:56:37.407959" elapsed="0.000154"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.408541" 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-10-11T00:56:37.408305" elapsed="0.000314"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:56:37.408659" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:56:37.408788" 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-10-11T00:56:37.406913" elapsed="0.001899"/>
</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-10-11T00:56:37.419380" level="INFO">PUT Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.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-10-11T00:56:37.419461" level="INFO">PUT Response : url=http://10.30.170.173: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-10-11T00:56:37.419558" 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-10-11T00:56:37.409120" elapsed="0.010463"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:37.408889" elapsed="0.010735"/>
</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-10-11T00:56:37.419803" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.419648" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.408872" elapsed="0.011039"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.421067" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:37.420777" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:37.420537" elapsed="0.000601"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.420520" elapsed="0.000641"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.421727" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:37.421462" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:37.421210" elapsed="0.000589"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.421195" elapsed="0.000626"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.422373" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:56:37.422033" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.422687" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.422478" elapsed="0.000261"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.423197" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:56:37.422936" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:37.422760" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.422461" elapsed="0.000811"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.423795" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:56:37.423461" elapsed="0.000359"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.424106" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.423895" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.424615" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:56:37.424338" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:37.424178" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.423878" elapsed="0.000848"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:37.424892" elapsed="0.000297"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:56:37.425596" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:56:37.425349" elapsed="0.000271"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.425773" elapsed="0.000224"/>
</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-10-11T00:56:37.420233" elapsed="0.005819"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:56:37.426191" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:56:37.426111" elapsed="0.000135"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.426094" elapsed="0.000174"/>
</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-10-11T00:56:37.426427" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:56:37.426489" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:56:37.426647" 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-10-11T00:56:37.404344" elapsed="0.022328"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:56:37.426727" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:56:37.426881" 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-10-11T00:56:37.326095" elapsed="0.100811"/>
</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-10-11T00:56:37.427190" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.426990" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.426975" elapsed="0.000297"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:56:37.427302" elapsed="0.000023"/>
</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-10-11T00:56:37.325540" elapsed="0.101855"/>
</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-10-11T00:56:37.428551" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.428203" elapsed="0.000405"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.428186" elapsed="0.000444"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:37.428771" elapsed="0.000288"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.431585" 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-10-11T00:56:37.431205" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-10-11T00:56:37.431786" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:56:37.431679" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.431661" elapsed="0.000212"/>
</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-10-11T00:56:37.432038" elapsed="0.000020"/>
</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-10-11T00:56:37.432218" elapsed="0.000019"/>
</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-10-11T00:56:37.432390" elapsed="0.000032"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.432573" elapsed="0.000019"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.432781" elapsed="0.000019"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message of the current test case.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.432964" 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-10-11T00:56:37.433164" 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-10-11T00:56:37.430891" elapsed="0.002343"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:37.428006" elapsed="0.005274"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-10-11T00:56:37.427658" elapsed="0.005658"/>
</kw>
<doc>Configure neighbors. One ibgp and one ebgp neighbor with local-as configured.</doc>
<status status="PASS" start="2026-10-11T00:56:37.120834" elapsed="0.312516"/>
</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-10-11T00:56:37.434814" elapsed="0.000214"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:56:37.434564" elapsed="0.000515"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:37.435999" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:37.435912" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.435894" elapsed="0.000168"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:37.438238" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:37.438155" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.438138" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.439226" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:56:37.438902" elapsed="0.000349"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.439684" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:56:37.439420" elapsed="0.000289"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:56:37.439749" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:56:37.439894" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:56:37.438522" elapsed="0.001396"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:37.442715" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:37.442631" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.442613" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:37.443895" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:37.443774" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.443757" elapsed="0.000202"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:56:37.444277" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:56:37.444108" elapsed="0.000193"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:56:37.444632" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:56:37.444484" elapsed="0.000171"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:56:37.477427" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:56:37.445162" elapsed="0.032366"/>
</kw>
<msg time="2026-10-11T00:56:37.477687" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:56:37.477730" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:37.444813" elapsed="0.032952"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:56:37.515064" 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-10-11T00:56:37.478308" elapsed="0.036896"/>
</kw>
<msg time="2026-10-11T00:56:37.515357" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:56:37.515399" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:37.477952" elapsed="0.037502"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.515736" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.515525" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.515506" elapsed="0.000302"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.516236" 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-10-11T00:56:37.516007" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.516585" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.516366" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.516350" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:56:37.516687" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:56:37.519119" elapsed="0.000116"/>
</kw>
<msg time="2026-10-11T00:56:37.519291" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:37.518059" 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-10-11T00:56:37.519759" elapsed="0.000089"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.520113" 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-10-11T00:56:37.517467" 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-10-11T00:56:37.516979" elapsed="0.003374"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:56:37.443517" elapsed="0.076929"/>
</kw>
<msg time="2026-10-11T00:56:37.520530" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:56:37.520570" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:37.442954" elapsed="0.077651"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:56:37.520757" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:56:37.520673" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.520655" elapsed="0.000192"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.521170" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.521531" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:56:37.521595" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:56:37.442329" elapsed="0.079351"/>
</kw>
<msg time="2026-10-11T00:56:37.521763" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:56:37.521803" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:37.440245" elapsed="0.081605"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:37.522143" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:37.521918" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:37.521901" elapsed="0.000312"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:56:37.440101" elapsed="0.082133"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:56:37.439963" elapsed="0.082297"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:56:37.437832" elapsed="0.084477"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:56:37.435642" elapsed="0.086752"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:37.435230" elapsed="0.087284"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:56:37.434205" elapsed="0.088357"/>
</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-10-11T00:56:37.522732" elapsed="0.000096"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.523390" level="INFO">${speaker_args} = --firstprefix 8.1.0.0 --prefixlen 28 --amount 1 --myip=127.0.0.1 --myport=17900 --peerip=10.30.170.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:37.522999" elapsed="0.000432"/>
</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-10-11T00:56:37.524921" 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.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:37.524580" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.525373" 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.173 --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-10-11T00:56:37.525157" elapsed="0.000273"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:56:37.528583" 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.173 --peerport=1790 --debug &amp;&gt; play.py.out</msg>
<msg time="2026-10-11T00:56:37.528666" 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.173 --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-10-11T00:56:37.525592" elapsed="0.003100"/>
</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-10-11T00:56:37.524088" elapsed="0.004657"/>
</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-10-11T00:56:37.530091" 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-10-11T00:56:37.529809" elapsed="0.000307"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:37.530602" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:37.530276" elapsed="0.000350"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:56:37.535877" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:56:37.536028" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:56:37.536118" level="FAIL">Url: http://10.30.170.173: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-10-11T00:56:37.530785" elapsed="0.005793">Url: http://10.30.170.173: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-10-11T00:56:37.536640" elapsed="0.000018"/>
</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-10-11T00:56:37.529423" elapsed="0.007322">Url: http://10.30.170.173: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-10-11T00:56:39.539146" 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-10-11T00:56:39.538456" elapsed="0.000748"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:39.540359" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:39.539606" elapsed="0.000837"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:56:39.550402" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:56:39.550806" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:56:39.551052" 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-10-11T00:56:39.540796" elapsed="0.010311"/>
</kw>
<return>
<value>${response.content}</value>
<status status="PASS" start="2026-10-11T00:56:39.551215" elapsed="0.000070"/>
</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-10-11T00:56:39.537397" elapsed="0.014211"/>
</kw>
<msg time="2026-10-11T00:56:39.551792" 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-10-11T00:56:37.528945" elapsed="2.022924"/>
</kw>
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:56:39.551987" elapsed="0.000063"/>
</return>
<msg time="2026-10-11T00:56:39.552293" 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-10-11T00:56:37.523637" elapsed="2.028709"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:39.553441" 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-10-11T00:56:39.552899" elapsed="0.000656"/>
</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-10-11T00:56:39.554878" elapsed="0.000505"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:56:39.554126" elapsed="0.001428"/>
</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-10-11T00:56:37.433641" elapsed="2.121988"/>
</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-10-11T00:56:39.558986" elapsed="0.000483"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:56:39.558355" elapsed="0.001228"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:39.561721" elapsed="0.000526"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:39.561516" elapsed="0.000803"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:39.561469" elapsed="0.000898"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:39.567526" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:39.567305" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:39.567267" elapsed="0.000403"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:39.569865" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:56:39.569070" elapsed="0.000852"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:56:39.570936" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:56:39.570276" elapsed="0.000715"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:56:39.571082" elapsed="0.000061"/>
</return>
<msg time="2026-10-11T00:56:39.571363" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:56:39.568156" elapsed="0.003287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:39.577736" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:39.577544" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:39.577503" elapsed="0.000397"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:39.580326" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:39.580140" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:39.580101" elapsed="0.000405"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:56:39.581249" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:56:39.580865" elapsed="0.000438"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:56:39.582050" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:56:39.581714" elapsed="0.000389"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:56:39.617783" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:56:39.583287" elapsed="0.034642"/>
</kw>
<msg time="2026-10-11T00:56:39.618139" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:56:39.618197" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:39.582493" elapsed="0.035752"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:56:39.655633" 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-10-11T00:56:39.619004" elapsed="0.036732"/>
</kw>
<msg time="2026-10-11T00:56:39.655895" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:56:39.655936" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:39.618505" elapsed="0.037465"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:39.656244" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:39.656039" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:39.656021" elapsed="0.000294"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:39.656743" 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-10-11T00:56:39.656518" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:39.657087" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:39.656887" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:39.656870" elapsed="0.000287"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:56:39.657187" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:56:39.659742" elapsed="0.000132"/>
</kw>
<msg time="2026-10-11T00:56:39.659932" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:39.658690" elapsed="0.001378"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:39.660380" elapsed="0.000094"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:39.660738" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:56:39.657968" 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-10-11T00:56:39.657487" 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-10-11T00:56:39.579539" elapsed="0.081533"/>
</kw>
<msg time="2026-10-11T00:56:39.661186" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:56:39.661226" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:39.578242" elapsed="0.083019"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:56:39.661441" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:56:39.661329" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:39.661312" 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-10-11T00:56:39.661862" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:39.662165" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:56:39.662229" 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-10-11T00:56:39.576811" elapsed="0.085504"/>
</kw>
<msg time="2026-10-11T00:56:39.662396" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:56:39.662459" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:39.572296" elapsed="0.090199"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:39.662787" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:39.662563" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:39.662546" elapsed="0.000326"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:56:39.571974" elapsed="0.090920"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:56:39.571621" elapsed="0.091300"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:56:39.566568" elapsed="0.096402"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:56:39.560899" elapsed="0.102121"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:39.559949" elapsed="0.103113"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:56:39.557563" elapsed="0.105545"/>
</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-10-11T00:56:39.663275" elapsed="0.000097"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:39.664039" 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.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:39.663623" elapsed="0.000442"/>
</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-10-11T00:56:39.665336" 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.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:39.665059" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:39.665805" 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.173 --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-10-11T00:56:39.665591" elapsed="0.000272"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:56:39.669540" 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.173 --peerport=1790 --debug &amp;&gt; play.py.out</msg>
<msg time="2026-10-11T00:56:39.669622" 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.173 --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-10-11T00:56:39.666020" elapsed="0.003627"/>
</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-10-11T00:56:39.664722" elapsed="0.004979"/>
</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-10-11T00:56:39.671036" 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-10-11T00:56:39.670753" elapsed="0.000344"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:39.671588" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:39.671261" elapsed="0.000352"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:56:39.679110" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:56:39.679226" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:56:39.679328" level="FAIL">Url: http://10.30.170.173: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-10-11T00:56:39.671769" elapsed="0.007989">Url: http://10.30.170.173: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-10-11T00:56:39.679836" elapsed="0.000019"/>
</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-10-11T00:56:39.670352" elapsed="0.009592">Url: http://10.30.170.173: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-10-11T00:56:41.682528" 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-10-11T00:56:41.681783" elapsed="0.000810"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:41.683750" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:41.682995" elapsed="0.000830"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:56:41.692788" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:56:41.693099" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:56:41.693310" 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-10-11T00:56:41.684177" elapsed="0.009186"/>
</kw>
<return>
<value>${response.content}</value>
<status status="PASS" start="2026-10-11T00:56:41.693508" elapsed="0.000077"/>
</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-10-11T00:56:41.680698" elapsed="0.013219"/>
</kw>
<msg time="2026-10-11T00:56:41.694103" 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-10-11T00:56:39.669899" elapsed="2.024258"/>
</kw>
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:56:41.694269" elapsed="0.000059"/>
</return>
<msg time="2026-10-11T00:56:41.694584" 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-10-11T00:56:39.664269" elapsed="2.030371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:41.696341" 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-10-11T00:56:41.695159" elapsed="0.001553"/>
</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-10-11T00:56:41.698095" elapsed="0.000633"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:56:41.697314" elapsed="0.001606"/>
</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-10-11T00:56:39.556228" elapsed="2.142771"/>
</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-10-11T00:56:41.702711" elapsed="0.000475"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:56:41.702017" elapsed="0.001283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:41.705486" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:41.705245" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:41.705203" elapsed="0.000428"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:41.710914" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:41.710699" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:41.710660" elapsed="0.000392"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:41.713213" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:56:41.712386" elapsed="0.000883"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:56:41.714267" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:56:41.713652" elapsed="0.000669"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:56:41.714440" elapsed="0.000064"/>
</return>
<msg time="2026-10-11T00:56:41.714728" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:56:41.711554" elapsed="0.003225"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:41.721311" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:41.721122" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:41.721081" elapsed="0.000410"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:41.723985" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:41.723737" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:41.723699" elapsed="0.000423"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:56:41.724904" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:56:41.724488" elapsed="0.000470"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:56:41.725706" 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-10-11T00:56:41.725357" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:56:41.762965" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:56:41.726981" elapsed="0.036121"/>
</kw>
<msg time="2026-10-11T00:56:41.763320" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:56:41.763429" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:41.726158" elapsed="0.037324"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:56:41.793501" 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-10-11T00:56:41.764241" elapsed="0.029359"/>
</kw>
<msg time="2026-10-11T00:56:41.793751" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:56:41.793802" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:41.763722" elapsed="0.030116"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:41.794124" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:41.793910" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:41.793891" elapsed="0.000341"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:41.794679" 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-10-11T00:56:41.794446" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:41.795021" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:41.794815" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:41.794788" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:56:41.795128" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:56:41.797604" elapsed="0.000116"/>
</kw>
<msg time="2026-10-11T00:56:41.797777" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:41.796541" 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-10-11T00:56:41.798241" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:41.798596" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:56:41.795935" elapsed="0.002844"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:56:41.795435" elapsed="0.003415"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:56:41.723119" elapsed="0.075806"/>
</kw>
<msg time="2026-10-11T00:56:41.799006" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:56:41.799045" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:41.721861" elapsed="0.077219"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:56:41.799233" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:56:41.799148" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:41.799131" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:41.799677" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:41.799990" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:56:41.800054" 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-10-11T00:56:41.720389" elapsed="0.079750"/>
</kw>
<msg time="2026-10-11T00:56:41.800223" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:56:41.800262" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:41.715651" elapsed="0.084646"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:41.800606" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:41.800363" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:41.800347" elapsed="0.000330"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:56:41.715262" elapsed="0.085436"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:56:41.714910" elapsed="0.085817"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:56:41.709968" elapsed="0.090808"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:56:41.704640" elapsed="0.096214"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:41.703672" elapsed="0.097222"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:56:41.701034" elapsed="0.099906"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:56:41.801908" 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-10-11T00:56:41.801151" elapsed="0.000785"/>
</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-10-11T00:56:41.819035" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:41.818715" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:41.819779" 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-10-11T00:56:41.819560" elapsed="0.000308">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-10-11T00:56:41.819954" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:41.819222" elapsed="0.000755"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:41.820475" 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-10-11T00:56:41.820150" elapsed="0.000349"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:56:41.820779" 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-10-11T00:56:41.820937" 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-10-11T00:56:41.820669" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:41.821372" 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-10-11T00:56:41.821156" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:41.822346" 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-10-11T00:56:41.822113" elapsed="0.000275"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:56:41.822851" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:56:41.822579" elapsed="0.000298"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:41.823483" 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-10-11T00:56:41.823201" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:41.824315" 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-10-11T00:56:41.824005" elapsed="0.000334"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:41.824384" elapsed="0.000046"/>
</return>
<msg time="2026-10-11T00:56:41.824531" 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-10-11T00:56:41.823681" elapsed="0.000873"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:41.824723" elapsed="0.000199"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:56:41.823067" elapsed="0.001892"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:41.826843" 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-10-11T00:56:41.825188" elapsed="0.001681"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:41.827690" 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-10-11T00:56:41.827359" elapsed="0.000356"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:41.827760" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:56:41.828064" 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-10-11T00:56:41.827043" 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-10-11T00:56:41.828286" elapsed="0.000190"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:56:41.825058" elapsed="0.003457"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:41.829033" 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-10-11T00:56:41.828748" elapsed="0.000310"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:41.829868" 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-10-11T00:56:41.829557" elapsed="0.000335"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:41.829938" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:56:41.830063" 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-10-11T00:56:41.829227" 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-10-11T00:56:41.830251" elapsed="0.000187"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:56:41.828616" elapsed="0.001861"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:41.830993" 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-10-11T00:56:41.830709" elapsed="0.000309"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:41.831838" 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-10-11T00:56:41.831528" elapsed="0.000335"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:41.831908" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:56:41.832033" 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-10-11T00:56:41.831186" 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-10-11T00:56:41.832222" elapsed="0.000165"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:56:41.830577" elapsed="0.001866"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:41.832961" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:56:41.832678" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:41.833820" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:56:41.833487" elapsed="0.000359"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:41.833891" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:56:41.834016" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:56:41.833153" 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-10-11T00:56:41.834203" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:56:41.832546" elapsed="0.001858"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:41.834934" 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-10-11T00:56:41.834655" elapsed="0.000303"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:41.835768" 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-10-11T00:56:41.835451" elapsed="0.000352"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:41.835849" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:56:41.835974" 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-10-11T00:56:41.835124" 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-10-11T00:56:41.836160" elapsed="0.000166"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-10-11T00:56:41.834525" elapsed="0.001838"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:41.836907" 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-10-11T00:56:41.836626" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:41.837923" 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-10-11T00:56:41.837429" elapsed="0.000518"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:41.837992" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:56:41.838117" 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-10-11T00:56:41.837101" 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-10-11T00:56:41.838305" elapsed="0.000186"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64497</var>
<status status="PASS" start="2026-10-11T00:56:41.836494" elapsed="0.002090"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:41.839100" 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-10-11T00:56:41.838830" elapsed="0.000294"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:41.839945" 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-10-11T00:56:41.839633" elapsed="0.000336"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:41.840014" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:56:41.840138" 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-10-11T00:56:41.839291" elapsed="0.000869"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:41.840324" elapsed="0.000186"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.0.0.0/28</var>
<status status="PASS" start="2026-10-11T00:56:41.838687" elapsed="0.001860"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:56:41.822920" elapsed="0.017658"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:56:41.840616" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:56:41.840746" 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-10-11T00:56:41.821758" elapsed="0.019013"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:41.821499" elapsed="0.019312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:41.840986" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:41.840834" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:41.821476" elapsed="0.019580"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:41.841871" 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-10-11T00:56:41.841216" elapsed="0.000682"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:56:41.841942" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:41.818198" elapsed="0.023842"/>
</kw>
<msg time="2026-10-11T00:56:41.842088" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:41.813459" elapsed="0.028672"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:41.846646" 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/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-10-11T00:56:41.851142" 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/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-10-11T00:56:41.855643" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:41.855883" 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-10-11T00:56:41.856071" 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-10-11T00:56:41.856426" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:41.856266" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:41.856252" 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-10-11T00:56:41.856656" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:41.856848" 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-10-11T00:56:41.857013" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:56:41.856226" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:56:41.856139" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:41.857234" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:41.857300" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:56:41.857426" 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-10-11T00:56:41.812851" elapsed="0.044601"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:41.858566" 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-10-11T00:56:41.858357" elapsed="0.000271">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-10-11T00:56:41.858710" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:41.858033" elapsed="0.000700"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:41.859038" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:41.858809" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:41.859567" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:56:41.859283" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:41.859116" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:41.858779" elapsed="0.000864"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:41.860168" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:56:41.859830" elapsed="0.000363"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:56:41.860237" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:56:41.860360" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:56:41.857719" elapsed="0.002664"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:41.861678" 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-10-11T00:56:41.861289" elapsed="0.000450">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-10-11T00:56:41.861840" 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-10-11T00:56:41.860965" elapsed="0.000899"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:56:41.862028" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:56:41.861928" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:41.861911" elapsed="0.000193"/>
</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-10-11T00:56:41.862292" 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-10-11T00:56:41.862488" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:56:41.862548" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:56:41.862672" 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-10-11T00:56:41.860649" elapsed="0.002046"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:41.863963" 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-10-11T00:56:41.863724" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:41.864427" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:41.864198" elapsed="0.000270"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:56:41.870665" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:56:41.870811" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:56:41.870914" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:41.864757" elapsed="0.006528">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:41.864528" elapsed="0.006833">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:41.871565" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:41.871393" elapsed="0.000231"/>
</branch>
<status status="FAIL" start="2026-10-11T00:56:41.864512" elapsed="0.007134">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:41.871996" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:41.872122" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:41.872083" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:41.872066" elapsed="0.000113"/>
</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-10-11T00:56:41.872319" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:56:41.872382" 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-10-11T00:56:41.862986" elapsed="0.009506">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:41.872558" elapsed="0.000014"/>
</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-10-11T00:56:41.804776" elapsed="0.067867">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:41.872942" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:41.872764" elapsed="0.000244"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:41.872747" elapsed="0.000282"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:41.873060" elapsed="0.000014"/>
</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-10-11T00:56:41.804172" elapsed="0.068975">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:42.911556" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:42.910826" elapsed="0.000795"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:42.913287" 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-10-11T00:56:42.912852" elapsed="0.000608">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-10-11T00:56:42.913657" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:42.912006" elapsed="0.001703"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:42.914879" 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-10-11T00:56:42.914122" elapsed="0.000816"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:56:42.915593" 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-10-11T00:56:42.915890" 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-10-11T00:56:42.915315" elapsed="0.000631"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:42.916931" 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-10-11T00:56:42.916381" 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-10-11T00:56:42.918440" 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-10-11T00:56:42.918092" elapsed="0.000411"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:56:42.919148" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:56:42.918753" elapsed="0.000430"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:42.920063" 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-10-11T00:56:42.919667" elapsed="0.000431"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:42.921263" 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-10-11T00:56:42.920815" elapsed="0.000483"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:42.921362" elapsed="0.000068"/>
</return>
<msg time="2026-10-11T00:56:42.921575" 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-10-11T00:56:42.920339" elapsed="0.001269"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:42.921858" elapsed="0.000244"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:56:42.919479" elapsed="0.002731"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:42.922972" 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-10-11T00:56:42.922569" elapsed="0.000438"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:42.924159" 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-10-11T00:56:42.923711" elapsed="0.000483"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:42.924257" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:42.924471" 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-10-11T00:56:42.923247" elapsed="0.001259"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:42.924739" elapsed="0.000253"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:56:42.922359" elapsed="0.002686"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:42.926034" 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-10-11T00:56:42.925370" elapsed="0.000699"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:42.927211" 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-10-11T00:56:42.926776" elapsed="0.000470"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:42.927309" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:42.927520" 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-10-11T00:56:42.926312" elapsed="0.001241"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:42.927803" elapsed="0.000234"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:56:42.925187" elapsed="0.002903"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:42.928842" 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-10-11T00:56:42.928431" elapsed="0.000446"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:42.930036" 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-10-11T00:56:42.929578" elapsed="0.000493"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:42.930134" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:42.930308" 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-10-11T00:56:42.929118" elapsed="0.001224"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:42.930609" elapsed="0.000252"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:56:42.928230" elapsed="0.002684"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:42.931650" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:56:42.931238" elapsed="0.000447"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:42.932833" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:56:42.932376" elapsed="0.000493"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:42.932932" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T00:56:42.933109" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:56:42.931939" elapsed="0.001203"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:42.933374" elapsed="0.000269"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:56:42.931055" elapsed="0.002642"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:42.934443" 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-10-11T00:56:42.934040" elapsed="0.000439"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:42.935623" 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-10-11T00:56:42.935179" elapsed="0.000479"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:42.935720" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:42.935912" 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-10-11T00:56:42.934723" elapsed="0.001223"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:42.936178" elapsed="0.000266"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-10-11T00:56:42.933854" elapsed="0.002650"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:42.937286" 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-10-11T00:56:42.936904" elapsed="0.000416"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:42.938488" 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-10-11T00:56:42.938044" elapsed="0.000480"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:42.938588" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:42.938765" 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-10-11T00:56:42.937587" elapsed="0.001229"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:42.939048" elapsed="0.000234"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64497</var>
<status status="PASS" start="2026-10-11T00:56:42.936699" elapsed="0.002637"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:42.940097" 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-10-11T00:56:42.939687" elapsed="0.000446"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:42.941588" 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-10-11T00:56:42.941125" elapsed="0.000500"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:42.941689" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:56:42.941883" 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-10-11T00:56:42.940373" 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-10-11T00:56:42.942149" elapsed="0.000235"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.0.0.0/28</var>
<status status="PASS" start="2026-10-11T00:56:42.939502" elapsed="0.002967"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:56:42.919244" elapsed="0.023276"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:56:42.942577" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T00:56:42.942764" 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-10-11T00:56:42.917592" elapsed="0.025224"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:42.917196" elapsed="0.025662"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:42.943119" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:42.942891" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:42.917148" elapsed="0.026095"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:42.944133" 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-10-11T00:56:42.943506" elapsed="0.000655"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:56:42.944205" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:42.909603" elapsed="0.034703"/>
</kw>
<msg time="2026-10-11T00:56:42.944356" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:42.898697" elapsed="0.045704"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:42.949014" 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/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-10-11T00:56:42.953544" 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/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-10-11T00:56:42.958143" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:42.958330" 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-10-11T00:56:42.958535" 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-10-11T00:56:42.958894" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:42.958733" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:42.958719" 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-10-11T00:56:42.959131" 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-10-11T00:56:42.959314" 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-10-11T00:56:42.959495" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:56:42.958692" elapsed="0.000853"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:56:42.958603" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:42.959723" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:42.959801" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:56:42.959915" 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-10-11T00:56:42.897227" elapsed="0.062714"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:42.961057" 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-10-11T00:56:42.960869" elapsed="0.000249">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-10-11T00:56:42.961201" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:42.960529" elapsed="0.000696"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:42.961526" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:42.961288" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:42.962054" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:56:42.961776" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:42.961600" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:42.961271" elapsed="0.000865"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:42.962660" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:56:42.962299" elapsed="0.000385"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:56:42.962729" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:56:42.962886" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:56:42.960209" elapsed="0.002700"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:42.964002" 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-10-11T00:56:42.963816" elapsed="0.000245">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-10-11T00:56:42.964179" 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-10-11T00:56:42.963479" elapsed="0.000723"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:56:42.964366" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:56:42.964266" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:42.964249" elapsed="0.000210"/>
</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-10-11T00:56:42.964625" elapsed="0.000020"/>
</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-10-11T00:56:42.964814" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:56:42.964875" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:56:42.965000" 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-10-11T00:56:42.963160" elapsed="0.001864"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:42.966473" 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-10-11T00:56:42.966231" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:42.966947" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:42.966712" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:56:42.973481" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:56:42.973664" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:56:42.973827" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:42.967280" elapsed="0.007073">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:42.967049" elapsed="0.007435">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:42.974679" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:42.974521" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-10-11T00:56:42.967032" elapsed="0.007727">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:42.975112" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:42.975233" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:42.975199" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:42.975183" elapsed="0.000107"/>
</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-10-11T00:56:42.975447" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:56:42.975510" 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-10-11T00:56:42.965509" elapsed="0.010097">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:42.975705" 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-10-11T00:56:42.878280" elapsed="0.097529">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:42.976062" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:42.975896" elapsed="0.000231"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:42.975879" elapsed="0.000270"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:42.976179" elapsed="0.000014"/>
</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-10-11T00:56:42.876865" elapsed="0.099402">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:44.014494" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:44.013742" elapsed="0.000819"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:44.016118" 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-10-11T00:56:44.015696" elapsed="0.000559">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-10-11T00:56:44.016475" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:44.014940" elapsed="0.001588"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:44.017673" 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-10-11T00:56:44.016939" elapsed="0.000791"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:56:44.018373" 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-10-11T00:56:44.018690" 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-10-11T00:56:44.018125" elapsed="0.000620"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:44.019739" 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-10-11T00:56:44.019212" elapsed="0.000645"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:44.021964" 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-10-11T00:56:44.021390" elapsed="0.000668"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:56:44.023085" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:56:44.022480" elapsed="0.000667"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:44.024070" 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-10-11T00:56:44.023680" elapsed="0.000424"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:44.025299" 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-10-11T00:56:44.024810" elapsed="0.000524"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:44.025399" elapsed="0.000073"/>
</return>
<msg time="2026-10-11T00:56:44.025615" 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-10-11T00:56:44.024340" elapsed="0.001306"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:44.025897" elapsed="0.000246"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:56:44.023495" elapsed="0.002700"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:44.026949" 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-10-11T00:56:44.026549" elapsed="0.000434"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:44.028107" 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-10-11T00:56:44.027677" elapsed="0.000464"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:44.028203" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:44.028376" 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-10-11T00:56:44.027219" elapsed="0.001221"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:44.028675" elapsed="0.000451"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:56:44.026335" elapsed="0.002844"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:44.029922" 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-10-11T00:56:44.029530" elapsed="0.000425"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:44.031082" 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-10-11T00:56:44.030649" elapsed="0.000468"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:44.031179" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:44.031352" 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-10-11T00:56:44.030191" 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-10-11T00:56:44.031653" elapsed="0.000247"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:56:44.029317" elapsed="0.002635"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:44.032676" 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-10-11T00:56:44.032269" elapsed="0.000440"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:44.033856" 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-10-11T00:56:44.033397" elapsed="0.000493"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:44.033951" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:44.034121" 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-10-11T00:56:44.032965" 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-10-11T00:56:44.034382" elapsed="0.000265"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:56:44.032088" elapsed="0.002610"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:44.035429" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:56:44.035035" elapsed="0.000429"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:44.036602" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:56:44.036161" elapsed="0.000477"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:44.036699" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:56:44.036890" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:56:44.035707" elapsed="0.001216"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:44.037155" elapsed="0.000228"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:56:44.034851" elapsed="0.002617"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:44.038187" 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-10-11T00:56:44.037813" elapsed="0.000407"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:44.039340" 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-10-11T00:56:44.038933" elapsed="0.000441"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:44.039520" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T00:56:44.039698" 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-10-11T00:56:44.038483" elapsed="0.001247"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:44.039978" elapsed="0.000231"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-10-11T00:56:44.037615" elapsed="0.002646"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:44.041000" 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-10-11T00:56:44.040608" elapsed="0.000427"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:44.042153" 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-10-11T00:56:44.041727" elapsed="0.000461"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:44.042251" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:44.042451" 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-10-11T00:56:44.041270" elapsed="0.001215"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:44.042714" elapsed="0.000246"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64497</var>
<status status="PASS" start="2026-10-11T00:56:44.040399" elapsed="0.002612"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:44.043982" 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-10-11T00:56:44.043330" elapsed="0.000687"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:44.045138" 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-10-11T00:56:44.044711" elapsed="0.000462"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:44.045234" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:44.045441" 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-10-11T00:56:44.044254" 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-10-11T00:56:44.045704" elapsed="0.000248"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.0.0.0/28</var>
<status status="PASS" start="2026-10-11T00:56:44.043148" elapsed="0.002856"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:56:44.023253" elapsed="0.022795"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:56:44.046100" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T00:56:44.046279" 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-10-11T00:56:44.020602" elapsed="0.025712"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:44.020000" elapsed="0.026354"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:44.046620" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:44.046385" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:44.019958" elapsed="0.026760"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:44.047840" 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-10-11T00:56:44.046959" elapsed="0.000919"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:56:44.047939" 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//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-10-11T00:56:44.012552" elapsed="0.035528"/>
</kw>
<msg time="2026-10-11T00:56:44.048155" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:44.001624" elapsed="0.046606"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:44.052930" 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/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-10-11T00:56:44.057502" 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/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-10-11T00:56:44.062059" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:44.062247" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:44.062442" 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-10-11T00:56:44.062801" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:44.062641" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:44.062627" 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-10-11T00:56:44.063031" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:44.063210" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:44.063373" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:56:44.062602" elapsed="0.000833"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:56:44.062512" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:44.063610" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:44.063677" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:56:44.063819" 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-10-11T00:56:44.000184" elapsed="0.063661"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:44.064955" 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-10-11T00:56:44.064754" elapsed="0.000262">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-10-11T00:56:44.065099" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:44.064429" elapsed="0.000692"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:44.065418" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:44.065184" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:44.065956" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:56:44.065672" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:44.065494" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:44.065167" elapsed="0.000866"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:44.066546" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:56:44.066194" elapsed="0.000376"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:56:44.066614" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:56:44.066784" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:56:44.064112" elapsed="0.002702"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:44.068018" 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-10-11T00:56:44.067711" elapsed="0.000367">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-10-11T00:56:44.068324" 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-10-11T00:56:44.067370" elapsed="0.000978"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:56:44.068531" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:56:44.068429" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:44.068397" elapsed="0.000211"/>
</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-10-11T00:56:44.068763" elapsed="0.000033"/>
</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-10-11T00:56:44.068957" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:56:44.069015" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:56:44.069138" 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-10-11T00:56:44.067070" elapsed="0.002091"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:44.070397" 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-10-11T00:56:44.070175" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:44.070880" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:44.070646" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:56:44.077373" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:56:44.077541" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:56:44.077634" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:44.071209" elapsed="0.006783">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:44.070980" elapsed="0.007088">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:44.078257" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:44.078100" elapsed="0.000214"/>
</branch>
<status status="FAIL" start="2026-10-11T00:56:44.070963" elapsed="0.007372">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:44.078683" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:44.078847" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:44.078784" elapsed="0.000104"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:44.078754" elapsed="0.000154"/>
</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-10-11T00:56:44.079048" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:56:44.079110" elapsed="0.000013"/>
</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-10-11T00:56:44.069457" elapsed="0.009753">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:44.079275" elapsed="0.000014"/>
</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-10-11T00:56:43.981389" elapsed="0.097972">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:44.079621" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:44.079459" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:44.079443" elapsed="0.000264"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:44.079736" elapsed="0.000013"/>
</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-10-11T00:56:43.979976" elapsed="0.099859">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:45.117743" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:45.116965" elapsed="0.000863"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:45.119391" 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-10-11T00:56:45.119004" elapsed="0.000554">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-10-11T00:56:45.119747" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:45.118203" elapsed="0.001622"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:45.120970" 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-10-11T00:56:45.120219" elapsed="0.000807"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:56:45.121686" 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-10-11T00:56:45.121978" 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-10-11T00:56:45.121401" elapsed="0.000633"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:45.123009" 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-10-11T00:56:45.122498" elapsed="0.000605"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:45.125218" 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-10-11T00:56:45.124670" elapsed="0.000718"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:56:45.126446" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:56:45.125847" elapsed="0.000656"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:45.127916" 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-10-11T00:56:45.127254" elapsed="0.000717"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:45.129250" 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-10-11T00:56:45.128816" elapsed="0.000469"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:45.129348" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T00:56:45.129558" 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-10-11T00:56:45.128346" 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-10-11T00:56:45.129838" elapsed="0.000243"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:56:45.126958" elapsed="0.003186"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:45.130956" 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-10-11T00:56:45.130564" elapsed="0.000426"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:45.132191" 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-10-11T00:56:45.131744" elapsed="0.000490"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:45.132310" elapsed="0.000048"/>
</return>
<msg time="2026-10-11T00:56:45.132563" 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-10-11T00:56:45.131261" elapsed="0.001334"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:45.132844" elapsed="0.001696"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:56:45.130313" elapsed="0.004282"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:45.135318" 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-10-11T00:56:45.134937" elapsed="0.000415"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:45.136527" 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-10-11T00:56:45.136082" elapsed="0.000480"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:45.136624" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:45.136822" 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-10-11T00:56:45.135632" 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-10-11T00:56:45.137086" elapsed="0.000232"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:56:45.134734" elapsed="0.002635"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:45.138123" 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-10-11T00:56:45.137720" elapsed="0.000438"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:45.139281" 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-10-11T00:56:45.138869" elapsed="0.000446"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:45.139376" elapsed="0.000073"/>
</return>
<msg time="2026-10-11T00:56:45.139590" 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-10-11T00:56:45.138395" elapsed="0.001226"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:45.139866" elapsed="0.000234"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:56:45.137537" elapsed="0.002614"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:45.140898" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:56:45.140495" elapsed="0.000438"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:45.142060" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:56:45.141629" elapsed="0.000466"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:45.142157" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:45.142331" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:56:45.141172" elapsed="0.001191"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:45.142632" elapsed="0.000301"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:56:45.140287" elapsed="0.002699"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:45.143711" 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-10-11T00:56:45.143307" elapsed="0.000438"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:45.144891" 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-10-11T00:56:45.144457" elapsed="0.000469"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:45.144988" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:45.145161" 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-10-11T00:56:45.144001" elapsed="0.001190"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:45.145455" elapsed="0.000237"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-10-11T00:56:45.143123" elapsed="0.002621"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:45.146483" 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-10-11T00:56:45.146085" elapsed="0.000441"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:45.147656" 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-10-11T00:56:45.147213" elapsed="0.000477"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:45.147752" elapsed="0.000068"/>
</return>
<msg time="2026-10-11T00:56:45.147958" 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-10-11T00:56:45.146781" elapsed="0.001208"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:45.148219" elapsed="0.000264"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64497</var>
<status status="PASS" start="2026-10-11T00:56:45.145902" elapsed="0.002639"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:45.149275" 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-10-11T00:56:45.148898" elapsed="0.000412"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:45.150700" 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-10-11T00:56:45.150249" elapsed="0.000485"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:45.150812" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:56:45.150989" 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-10-11T00:56:45.149809" elapsed="0.001212"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:45.151253" elapsed="0.000259"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.0.0.0/28</var>
<status status="PASS" start="2026-10-11T00:56:45.148680" elapsed="0.002885"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:56:45.126599" elapsed="0.025010"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:56:45.151663" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T00:56:45.151862" 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-10-11T00:56:45.123872" elapsed="0.028025"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:45.123240" elapsed="0.028697"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:45.152202" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:45.151968" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:45.123200" elapsed="0.029122"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:45.153200" 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-10-11T00:56:45.152578" elapsed="0.000648"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:56:45.153269" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:45.115674" elapsed="0.037694"/>
</kw>
<msg time="2026-10-11T00:56:45.153435" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:45.104865" elapsed="0.048649"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:45.158273" 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/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-10-11T00:56:45.162883" 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/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-10-11T00:56:45.167397" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:45.167593" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:45.167786" 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-10-11T00:56:45.168126" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:45.167980" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:45.167966" 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-10-11T00:56:45.168355" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:45.168551" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:45.168719" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:56:45.167940" elapsed="0.000838"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:56:45.167852" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:45.168956" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:45.169022" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:56:45.169133" 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-10-11T00:56:45.103455" elapsed="0.065702"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:45.170271" 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-10-11T00:56:45.170084" elapsed="0.000245">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-10-11T00:56:45.170426" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:45.169742" elapsed="0.000708"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:45.170800" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:45.170513" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:45.171319" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:56:45.171051" elapsed="0.000293"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:45.170878" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:45.170497" elapsed="0.000898"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:45.171927" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:56:45.171574" elapsed="0.000377"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:56:45.171996" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:56:45.172121" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:56:45.169438" elapsed="0.002710"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:45.173231" 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-10-11T00:56:45.173049" elapsed="0.000240">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-10-11T00:56:45.173372" 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-10-11T00:56:45.172717" elapsed="0.000677"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:56:45.173572" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:56:45.173474" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:45.173456" elapsed="0.000192"/>
</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-10-11T00:56:45.173818" elapsed="0.000020"/>
</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-10-11T00:56:45.173993" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:56:45.174050" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:56:45.174174" 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-10-11T00:56:45.172397" elapsed="0.001799"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:45.175637" 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-10-11T00:56:45.175397" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:45.176106" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:45.175888" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:56:45.182144" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:56:45.182324" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:56:45.182497" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:45.176448" elapsed="0.006524">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:45.176206" elapsed="0.006869">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:45.183362" elapsed="0.000098"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:45.183122" elapsed="0.000389"/>
</branch>
<status status="FAIL" start="2026-10-11T00:56:45.176189" elapsed="0.007345">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:45.183883" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:45.184003" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:45.183969" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:45.183953" elapsed="0.000106"/>
</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-10-11T00:56:45.184200" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:56:45.184265" elapsed="0.000013"/>
</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-10-11T00:56:45.174680" elapsed="0.009677">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:45.184437" 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-10-11T00:56:45.084859" elapsed="0.099665">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:45.184780" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:45.184605" elapsed="0.000239"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:45.184590" elapsed="0.000276"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:45.184895" elapsed="0.000013"/>
</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-10-11T00:56:45.083451" elapsed="0.101530">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:46.223139" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:46.222387" elapsed="0.000820"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:46.224913" 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-10-11T00:56:46.224487" elapsed="0.000564">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-10-11T00:56:46.225239" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:46.223602" elapsed="0.001689"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:46.226461" 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-10-11T00:56:46.225714" elapsed="0.000808"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:56:46.227173" 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-10-11T00:56:46.227544" 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-10-11T00:56:46.226923" elapsed="0.000679"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:46.228586" 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-10-11T00:56:46.228060" elapsed="0.000623"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:46.230821" 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-10-11T00:56:46.230235" elapsed="0.000683"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:56:46.231709" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:56:46.231331" elapsed="0.000411"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:46.232611" 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-10-11T00:56:46.232217" elapsed="0.000428"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:46.233825" 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-10-11T00:56:46.233356" elapsed="0.000504"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:46.233925" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T00:56:46.234109" 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-10-11T00:56:46.232920" elapsed="0.001221"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:46.234372" elapsed="0.000270"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:56:46.232031" elapsed="0.002664"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:46.235405" 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-10-11T00:56:46.235030" elapsed="0.000431"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:46.236601" 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-10-11T00:56:46.236154" elapsed="0.000482"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:46.236697" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:56:46.236889" 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-10-11T00:56:46.235707" elapsed="0.001215"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:46.237151" elapsed="0.000230"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:56:46.234848" elapsed="0.002616"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:46.238178" 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-10-11T00:56:46.237805" elapsed="0.000406"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:46.239594" 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-10-11T00:56:46.238922" elapsed="0.000709"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:46.239693" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:46.239884" 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-10-11T00:56:46.238471" elapsed="0.001444"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:46.240145" elapsed="0.000232"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:56:46.237606" elapsed="0.002848"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:46.241169" 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-10-11T00:56:46.240792" elapsed="0.000410"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:46.242333" 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-10-11T00:56:46.241917" elapsed="0.000451"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:46.242454" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:56:46.242631" 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-10-11T00:56:46.241467" 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-10-11T00:56:46.242907" elapsed="0.000232"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:56:46.240593" elapsed="0.002597"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:46.244022" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:56:46.243593" elapsed="0.000463"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:46.245181" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:56:46.244766" elapsed="0.000450"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:46.245278" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:56:46.245487" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:56:46.244294" elapsed="0.001226"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:46.245775" elapsed="0.000233"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:56:46.243374" elapsed="0.002684"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:46.246793" 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-10-11T00:56:46.246375" elapsed="0.000453"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:46.247958" 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-10-11T00:56:46.247526" elapsed="0.000467"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:46.248054" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:46.248226" 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-10-11T00:56:46.247064" 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-10-11T00:56:46.248522" elapsed="0.000249"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-10-11T00:56:46.246195" elapsed="0.002629"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:46.249535" 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-10-11T00:56:46.249141" elapsed="0.000427"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:46.250686" 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-10-11T00:56:46.250251" elapsed="0.000469"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:46.250799" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:56:46.250973" 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-10-11T00:56:46.249822" 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-10-11T00:56:46.251232" elapsed="0.000265"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64497</var>
<status status="PASS" start="2026-10-11T00:56:46.248960" elapsed="0.002593"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:46.252257" 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-10-11T00:56:46.251886" elapsed="0.000404"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:46.253433" 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-10-11T00:56:46.252997" elapsed="0.000473"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:46.253540" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:46.253712" 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-10-11T00:56:46.252554" elapsed="0.001207"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:46.253991" elapsed="0.000228"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.0.0.0/28</var>
<status status="PASS" start="2026-10-11T00:56:46.251689" elapsed="0.002582"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:56:46.231819" elapsed="0.022495"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:56:46.254365" elapsed="0.000279"/>
</return>
<msg time="2026-10-11T00:56:46.254841" 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-10-11T00:56:46.229442" elapsed="0.025435"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:46.228848" elapsed="0.026071"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:46.255160" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:46.254950" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:46.228805" elapsed="0.026451"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:46.256391" 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-10-11T00:56:46.255505" elapsed="0.000960"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:56:46.256553" 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-10-11T00:56:46.221152" elapsed="0.035504"/>
</kw>
<msg time="2026-10-11T00:56:46.256705" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:46.209911" elapsed="0.046854"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:46.261289" 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/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-10-11T00:56:46.265849" 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/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-10-11T00:56:46.270460" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:46.270644" 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-10-11T00:56:46.270840" 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-10-11T00:56:46.271182" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:46.271036" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:46.271023" 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-10-11T00:56:46.271423" 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-10-11T00:56:46.271606" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:46.271785" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:56:46.270996" elapsed="0.000838"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:56:46.270907" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:46.272009" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:46.272075" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:56:46.272190" 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-10-11T00:56:46.208472" elapsed="0.063743"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:46.273356" 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-10-11T00:56:46.273171" elapsed="0.000260">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-10-11T00:56:46.273516" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:46.272845" elapsed="0.000694"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:46.273835" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:46.273603" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:46.274345" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:56:46.274082" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:46.273909" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:46.273586" elapsed="0.000851"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:46.274953" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:56:46.274602" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:56:46.275022" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:56:46.275145" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:56:46.272529" elapsed="0.002643"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:46.276259" 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-10-11T00:56:46.276076" elapsed="0.000241">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-10-11T00:56:46.276400" 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-10-11T00:56:46.275739" elapsed="0.000700"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:56:46.276600" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-11T00:56:46.276503" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:46.276486" elapsed="0.000190"/>
</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-10-11T00:56:46.276858" elapsed="0.000020"/>
</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-10-11T00:56:46.277033" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:56:46.277091" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:56:46.277214" 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-10-11T00:56:46.275438" elapsed="0.001799"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:46.278662" 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-10-11T00:56:46.278240" elapsed="0.000466"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:46.279131" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:46.278912" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:56:46.285401" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:56:46.285558" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:56:46.285648" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:46.279474" elapsed="0.006552">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:46.279231" elapsed="0.006871">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:46.286288" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:46.286133" elapsed="0.000213"/>
</branch>
<status status="FAIL" start="2026-10-11T00:56:46.279215" elapsed="0.007152">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:46.286715" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:46.286849" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:46.286816" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:46.286800" elapsed="0.000106"/>
</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-10-11T00:56:46.287046" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:56:46.287108" 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-10-11T00:56:46.277530" elapsed="0.009676">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:46.287269" elapsed="0.000014"/>
</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-10-11T00:56:46.190092" elapsed="0.097260">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:46.287610" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:46.287448" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:46.287431" elapsed="0.000264"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:46.287724" elapsed="0.000014"/>
</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-10-11T00:56:46.188634" elapsed="0.099211">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:47.325481" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:47.324761" elapsed="0.000785"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:47.327096" 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-10-11T00:56:47.326669" elapsed="0.000562">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-10-11T00:56:47.327449" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:47.325924" elapsed="0.001583"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:47.328767" 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-10-11T00:56:47.328008" elapsed="0.000819"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:56:47.329479" 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-10-11T00:56:47.329829" 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-10-11T00:56:47.329202" elapsed="0.000685"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:47.330883" 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-10-11T00:56:47.330322" elapsed="0.000658"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:47.333312" 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-10-11T00:56:47.332732" elapsed="0.000705"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:56:47.334441" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:56:47.333857" elapsed="0.000641"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:47.335897" 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-10-11T00:56:47.335238" elapsed="0.000714"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:47.337829" 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-10-11T00:56:47.337071" elapsed="0.000815"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:47.337989" elapsed="0.000066"/>
</return>
<msg time="2026-10-11T00:56:47.338288" 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-10-11T00:56:47.336326" elapsed="0.002009"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:47.338592" elapsed="0.000255"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:56:47.334944" elapsed="0.003956"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:47.339620" 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-10-11T00:56:47.339220" elapsed="0.000434"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:47.340810" 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-10-11T00:56:47.340346" elapsed="0.000499"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:47.340907" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:56:47.341078" 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-10-11T00:56:47.339916" 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-10-11T00:56:47.341336" elapsed="0.000258"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:56:47.339039" elapsed="0.002606"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:47.342345" 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-10-11T00:56:47.341976" elapsed="0.000402"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:47.343772" 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-10-11T00:56:47.343096" elapsed="0.000714"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:47.343874" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:47.344047" 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-10-11T00:56:47.342645" elapsed="0.001433"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:47.344347" elapsed="0.000310"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:56:47.341796" elapsed="0.002913"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:47.345441" 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-10-11T00:56:47.345042" elapsed="0.000435"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:47.346659" 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-10-11T00:56:47.346165" elapsed="0.000528"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:47.346816" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:56:47.346993" 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-10-11T00:56:47.345714" elapsed="0.001311"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:47.347254" elapsed="0.000258"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:56:47.344860" elapsed="0.002705"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:47.348270" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:56:47.347898" elapsed="0.000406"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:47.349466" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:56:47.349027" elapsed="0.000474"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:47.349564" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:47.349750" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:56:47.348579" elapsed="0.001204"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:47.350015" elapsed="0.000229"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:56:47.347702" elapsed="0.002592"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:47.351044" 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-10-11T00:56:47.350654" elapsed="0.000423"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:47.352202" 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-10-11T00:56:47.351786" elapsed="0.000450"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:47.352297" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:56:47.352506" 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-10-11T00:56:47.351310" elapsed="0.001229"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:47.352783" elapsed="0.000234"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-10-11T00:56:47.350461" elapsed="0.002608"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:47.353813" 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-10-11T00:56:47.353387" elapsed="0.000459"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:47.354997" 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-10-11T00:56:47.354539" elapsed="0.000491"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:47.355091" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:47.355263" 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-10-11T00:56:47.354080" elapsed="0.001215"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:47.355558" elapsed="0.000246"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64497</var>
<status status="PASS" start="2026-10-11T00:56:47.353205" elapsed="0.002651"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:47.356569" 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-10-11T00:56:47.356174" elapsed="0.000428"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:47.357750" 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-10-11T00:56:47.357293" elapsed="0.000492"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:47.357847" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:56:47.358017" 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-10-11T00:56:47.356863" elapsed="0.001185"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:47.358274" elapsed="0.000490"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.0.0.0/28</var>
<status status="PASS" start="2026-10-11T00:56:47.355994" elapsed="0.002824"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:56:47.334593" elapsed="0.024268"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:56:47.358915" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T00:56:47.359101" 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-10-11T00:56:47.331720" elapsed="0.027415"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:47.331118" elapsed="0.028106"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:47.359496" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:47.359256" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:47.331079" elapsed="0.028517"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:47.360697" 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-10-11T00:56:47.359837" elapsed="0.000915"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:56:47.360816" 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/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-10-11T00:56:47.323543" elapsed="0.037413"/>
</kw>
<msg time="2026-10-11T00:56:47.361024" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:47.312441" elapsed="0.048645"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:47.366373" 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/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-10-11T00:56:47.370880" 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/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-10-11T00:56:47.375323" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:47.375517" 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-10-11T00:56:47.375699" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:47.376046" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:47.375901" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:47.375886" 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-10-11T00:56:47.376356" 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-10-11T00:56:47.376564" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:47.376727" elapsed="0.000045"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:56:47.375862" elapsed="0.000942"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:56:47.375775" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:47.376977" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:47.377043" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:56:47.377185" 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-10-11T00:56:47.311014" elapsed="0.066196"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:47.378312" 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-10-11T00:56:47.378129" elapsed="0.000242">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-10-11T00:56:47.378477" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:47.377806" elapsed="0.000694"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:47.378804" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:47.378563" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:47.379325" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:56:47.379044" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:47.378877" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:47.378546" elapsed="0.000854"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:47.379930" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:56:47.379577" elapsed="0.000377"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:56:47.379999" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:56:47.380121" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:56:47.377491" elapsed="0.002653"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:47.381218" 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-10-11T00:56:47.381036" elapsed="0.000240">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-10-11T00:56:47.381359" 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-10-11T00:56:47.380704" elapsed="0.000677"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:56:47.381559" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:56:47.381460" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:47.381442" elapsed="0.000194"/>
</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-10-11T00:56:47.381805" elapsed="0.000020"/>
</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-10-11T00:56:47.381978" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:56:47.382035" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:56:47.382159" 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-10-11T00:56:47.380389" elapsed="0.001793"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:47.383576" 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-10-11T00:56:47.383336" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:47.384041" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:47.383824" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:56:47.389989" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:56:47.390140" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:56:47.390231" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:47.384365" elapsed="0.006212">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:47.384140" elapsed="0.006511">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:47.390849" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:47.390682" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-10-11T00:56:47.384124" elapsed="0.006805">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:47.391269" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:47.391389" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:47.391357" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:47.391341" 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-10-11T00:56:47.391604" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:56:47.391665" 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-10-11T00:56:47.382474" elapsed="0.009295">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:47.391834" elapsed="0.000014"/>
</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-10-11T00:56:47.292900" elapsed="0.099018">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:47.392158" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:47.391997" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:47.391982" elapsed="0.000264"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:47.392278" elapsed="0.000014"/>
</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-10-11T00:56:47.291494" elapsed="0.100870">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:48.430522" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:48.429800" elapsed="0.000786"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:48.432252" 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-10-11T00:56:48.431864" elapsed="0.000521">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-10-11T00:56:48.432615" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:48.431089" elapsed="0.001577"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:48.433830" 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-10-11T00:56:48.433078" elapsed="0.000809"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:56:48.434534" 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-10-11T00:56:48.434886" 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-10-11T00:56:48.434261" elapsed="0.000682"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:48.435938" 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-10-11T00:56:48.435384" 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-10-11T00:56:48.438165" 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-10-11T00:56:48.437619" elapsed="0.000641"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:56:48.439260" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:56:48.438685" elapsed="0.000629"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:48.440709" 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-10-11T00:56:48.440084" elapsed="0.000707"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:48.442660" 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-10-11T00:56:48.441919" elapsed="0.000798"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:48.442846" elapsed="0.000068"/>
</return>
<msg time="2026-10-11T00:56:48.443134" 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-10-11T00:56:48.441170" elapsed="0.002017"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:48.443523" elapsed="0.000254"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:56:48.439790" elapsed="0.004039"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:48.444548" 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-10-11T00:56:48.444146" elapsed="0.000435"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:48.445721" 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-10-11T00:56:48.445269" elapsed="0.000502"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:48.445833" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:56:48.446005" 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-10-11T00:56:48.444835" 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-10-11T00:56:48.446266" elapsed="0.000257"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:56:48.443966" elapsed="0.002608"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:48.447278" 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-10-11T00:56:48.446908" elapsed="0.000403"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:48.449765" 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-10-11T00:56:48.448051" elapsed="0.001751"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:48.449866" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:56:48.450041" 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-10-11T00:56:48.447577" elapsed="0.002495"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:48.450345" elapsed="0.000270"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:56:48.446710" elapsed="0.003958"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:48.451379" 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-10-11T00:56:48.451003" elapsed="0.000436"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:48.452583" 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-10-11T00:56:48.452125" elapsed="0.000492"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:48.452679" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:48.452870" 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-10-11T00:56:48.451679" elapsed="0.001223"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:48.453130" elapsed="0.000232"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:56:48.450819" elapsed="0.002619"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:48.454155" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:56:48.453778" elapsed="0.000410"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:48.455338" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:56:48.454922" elapsed="0.000451"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:48.455461" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T00:56:48.455639" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:56:48.454455" elapsed="0.001216"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:48.455916" elapsed="0.000231"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:56:48.453579" elapsed="0.002619"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:48.456955" 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-10-11T00:56:48.456561" elapsed="0.000428"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:48.458105" 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-10-11T00:56:48.457680" elapsed="0.000460"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:48.458201" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:48.458373" 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-10-11T00:56:48.457224" 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-10-11T00:56:48.458707" elapsed="0.000275"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-10-11T00:56:48.456336" elapsed="0.002697"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:48.459768" 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-10-11T00:56:48.459350" elapsed="0.000452"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:48.460914" 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-10-11T00:56:48.460486" elapsed="0.000461"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:48.461008" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:48.461180" 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-10-11T00:56:48.460036" 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-10-11T00:56:48.461470" elapsed="0.000235"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64497</var>
<status status="PASS" start="2026-10-11T00:56:48.459169" elapsed="0.002604"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:48.462565" 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-10-11T00:56:48.462091" elapsed="0.000515"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:48.463795" 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-10-11T00:56:48.463307" elapsed="0.000523"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:48.463893" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:48.464066" 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-10-11T00:56:48.462856" elapsed="0.001242"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:48.464327" elapsed="0.000262"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.0.0.0/28</var>
<status status="PASS" start="2026-10-11T00:56:48.461912" elapsed="0.002773"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:56:48.439438" elapsed="0.025308"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:56:48.464801" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T00:56:48.464986" 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-10-11T00:56:48.436822" elapsed="0.028198"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:48.436172" elapsed="0.028889"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:48.465300" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:48.465091" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:48.436132" elapsed="0.029264"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:48.466801" 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-10-11T00:56:48.465656" elapsed="0.001183"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:56:48.466902" 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/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-10-11T00:56:48.428584" elapsed="0.038459"/>
</kw>
<msg time="2026-10-11T00:56:48.467111" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:48.416926" elapsed="0.050247"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:48.472419" 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/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-10-11T00:56:48.476918" 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/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-10-11T00:56:48.481401" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:48.481600" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:48.481794" 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-10-11T00:56:48.482131" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:48.481986" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:48.481973" 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-10-11T00:56:48.482357" 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-10-11T00:56:48.482554" 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-10-11T00:56:48.482770" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:56:48.481948" elapsed="0.000873"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:56:48.481860" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:48.482995" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:48.483063" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:56:48.483174" 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-10-11T00:56:48.415514" elapsed="0.067685"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:48.484318" 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-10-11T00:56:48.484128" elapsed="0.000250">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-10-11T00:56:48.484478" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:48.483800" elapsed="0.000707"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:48.484807" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:48.484572" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:48.485312" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:56:48.485051" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:48.484882" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:48.484556" elapsed="0.000831"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:48.485916" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:56:48.485566" elapsed="0.000374"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:56:48.485985" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:56:48.486108" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:56:48.483478" elapsed="0.002653"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:48.487215" 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-10-11T00:56:48.487027" elapsed="0.000246">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-10-11T00:56:48.487357" 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-10-11T00:56:48.486696" elapsed="0.000683"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:56:48.487563" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:56:48.487457" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:48.487440" elapsed="0.000199"/>
</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-10-11T00:56:48.487806" elapsed="0.000020"/>
</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-10-11T00:56:48.487980" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:56:48.488038" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:56:48.488161" 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-10-11T00:56:48.486379" elapsed="0.001804"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:48.489424" 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-10-11T00:56:48.489184" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:48.490098" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:48.489699" elapsed="0.000441"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:56:48.496808" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:56:48.496925" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:56:48.497022" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:48.490448" elapsed="0.006902">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:48.490202" elapsed="0.007247">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:48.497646" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:48.497484" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-10-11T00:56:48.490184" elapsed="0.007557">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:48.498078" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:48.498196" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:48.498164" elapsed="0.000069"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:48.498148" elapsed="0.000105"/>
</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-10-11T00:56:48.498393" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:56:48.498471" 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-10-11T00:56:48.488475" elapsed="0.010089">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:48.498628" elapsed="0.000014"/>
</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-10-11T00:56:48.397352" elapsed="0.101361">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:48.498967" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:48.498807" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:48.498791" elapsed="0.000261"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:48.499081" elapsed="0.000013"/>
</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-10-11T00:56:48.395959" elapsed="0.103207">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:49.537848" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:49.537083" elapsed="0.000830"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:49.539524" 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-10-11T00:56:49.539063" elapsed="0.000606">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-10-11T00:56:49.539888" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:49.538277" elapsed="0.001662"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:49.541081" 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-10-11T00:56:49.540327" elapsed="0.000810"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:56:49.541848" 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-10-11T00:56:49.542188" 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-10-11T00:56:49.541544" elapsed="0.000700"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:49.543232" 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-10-11T00:56:49.542737" elapsed="0.000591"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:49.545558" 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-10-11T00:56:49.544995" elapsed="0.000661"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:56:49.546699" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:56:49.546071" elapsed="0.000709"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:49.548183" 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-10-11T00:56:49.547550" elapsed="0.000687"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:49.550135" 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-10-11T00:56:49.549362" elapsed="0.000830"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:49.550295" elapsed="0.000071"/>
</return>
<msg time="2026-10-11T00:56:49.550637" 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-10-11T00:56:49.548648" elapsed="0.002041"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:49.551080" elapsed="0.000431"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:56:49.547223" elapsed="0.004373"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:49.552655" 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-10-11T00:56:49.552134" elapsed="0.000555"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:49.553883" 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-10-11T00:56:49.553400" elapsed="0.000518"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:49.553980" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:56:49.554155" 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-10-11T00:56:49.552962" elapsed="0.001224"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:49.554445" elapsed="0.000236"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:56:49.551843" elapsed="0.002906"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:49.555543" 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-10-11T00:56:49.555128" elapsed="0.000450"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:49.556936" 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-10-11T00:56:49.556265" elapsed="0.000706"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:49.557034" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:49.557208" 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-10-11T00:56:49.555833" elapsed="0.001407"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:49.557505" elapsed="0.000255"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:56:49.554943" elapsed="0.002869"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:49.558536" 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-10-11T00:56:49.558131" elapsed="0.000439"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:49.559700" 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-10-11T00:56:49.559254" elapsed="0.000494"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:49.559811" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:49.559984" 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-10-11T00:56:49.558821" 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-10-11T00:56:49.560247" elapsed="0.000258"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:56:49.557949" elapsed="0.002607"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:49.561268" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:56:49.560893" elapsed="0.000409"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:49.562462" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:56:49.562026" elapsed="0.000471"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:49.562559" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:56:49.562749" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:56:49.561576" 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-10-11T00:56:49.563011" elapsed="0.000229"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:56:49.560692" elapsed="0.002598"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:49.564084" 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-10-11T00:56:49.563651" elapsed="0.000466"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:49.565237" 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-10-11T00:56:49.564825" elapsed="0.000446"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:49.565333" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:49.565542" 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-10-11T00:56:49.564351" elapsed="0.001224"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:49.565819" elapsed="0.000229"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-10-11T00:56:49.563459" elapsed="0.002640"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:49.566833" 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-10-11T00:56:49.566434" elapsed="0.000433"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:49.567986" 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-10-11T00:56:49.567556" elapsed="0.000464"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:49.568082" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:49.568253" 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-10-11T00:56:49.567100" elapsed="0.001185"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:49.568549" elapsed="0.000246"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64497</var>
<status status="PASS" start="2026-10-11T00:56:49.566234" elapsed="0.002611"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:49.569564" 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-10-11T00:56:49.569162" elapsed="0.000481"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:49.570795" 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-10-11T00:56:49.570336" elapsed="0.000494"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:49.570893" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:56:49.571066" 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-10-11T00:56:49.569905" 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-10-11T00:56:49.571326" elapsed="0.000267"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.0.0.0/28</var>
<status status="PASS" start="2026-10-11T00:56:49.568982" elapsed="0.002664"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:56:49.546884" elapsed="0.024806"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:56:49.571787" elapsed="0.000248"/>
</return>
<msg time="2026-10-11T00:56:49.572191" 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-10-11T00:56:49.544104" elapsed="0.028122"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:49.543507" elapsed="0.028761"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:49.572533" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:49.572300" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:49.543462" elapsed="0.029172"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:49.573768" 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-10-11T00:56:49.572876" elapsed="0.000930"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:56:49.573870" 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/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-10-11T00:56:49.535875" elapsed="0.038134"/>
</kw>
<msg time="2026-10-11T00:56:49.574078" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:49.524383" elapsed="0.049759"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:49.579768" 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/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-10-11T00:56:49.584270" 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/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-10-11T00:56:49.588788" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:49.588982" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:49.589163" 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-10-11T00:56:49.589558" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:49.589391" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:49.589378" 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-10-11T00:56:49.589806" 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-10-11T00:56:49.589991" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:49.590156" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:56:49.589352" elapsed="0.000852"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:56:49.589259" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:49.590379" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:49.590462" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:56:49.590575" 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-10-11T00:56:49.522974" elapsed="0.067626"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:49.591728" 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-10-11T00:56:49.591529" elapsed="0.000261">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-10-11T00:56:49.591873" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:49.591186" elapsed="0.000709"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:49.592181" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:49.591958" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:49.592731" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:56:49.592453" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:49.592254" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:49.591941" elapsed="0.000867"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:49.593308" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:56:49.592969" elapsed="0.000363"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:56:49.593376" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T00:56:49.593517" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:56:49.590884" elapsed="0.002656"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:49.594635" 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-10-11T00:56:49.594441" elapsed="0.000253">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-10-11T00:56:49.594791" 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-10-11T00:56:49.594106" elapsed="0.000707"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:56:49.594973" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:56:49.594876" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:49.594859" elapsed="0.000189"/>
</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-10-11T00:56:49.595201" elapsed="0.000019"/>
</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-10-11T00:56:49.595373" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:56:49.595483" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:56:49.595613" 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-10-11T00:56:49.593807" elapsed="0.001829"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:49.597095" 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-10-11T00:56:49.596666" elapsed="0.000474"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:49.597572" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:49.597334" 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-10-11T00:56:49.603953" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:56:49.604093" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:56:49.604183" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:49.597921" elapsed="0.006650">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:49.597674" elapsed="0.006976">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:49.604854" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:49.604682" elapsed="0.000231"/>
</branch>
<status status="FAIL" start="2026-10-11T00:56:49.597657" elapsed="0.007278">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:49.605279" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:49.605422" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:49.605372" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:49.605356" 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-10-11T00:56:49.605625" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:56:49.605688" 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-10-11T00:56:49.595939" elapsed="0.009858">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:49.605863" elapsed="0.000014"/>
</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-10-11T00:56:49.504673" elapsed="0.101275">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:49.606225" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:49.606031" elapsed="0.000261"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:49.606015" elapsed="0.000299"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:49.606345" elapsed="0.000013"/>
</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-10-11T00:56:49.503139" elapsed="0.103310">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:50.644265" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:50.643545" elapsed="0.000785"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:50.645939" 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-10-11T00:56:50.645504" elapsed="0.000575">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-10-11T00:56:50.646268" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:50.644750" elapsed="0.001568"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:50.647490" 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-10-11T00:56:50.646761" elapsed="0.000786"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:56:50.648193" 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-10-11T00:56:50.648556" 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-10-11T00:56:50.647944" elapsed="0.000670"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:50.649597" 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-10-11T00:56:50.649078" elapsed="0.000614"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:50.651860" 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-10-11T00:56:50.651243" elapsed="0.000713"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:56:50.652968" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:56:50.652352" elapsed="0.000670"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:50.654438" 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-10-11T00:56:50.653815" elapsed="0.000680"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:50.656582" 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-10-11T00:56:50.655827" elapsed="0.000812"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:50.656773" elapsed="0.000072"/>
</return>
<msg time="2026-10-11T00:56:50.657071" 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-10-11T00:56:50.654980" elapsed="0.002142"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:50.657508" elapsed="0.000263"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:56:50.653492" elapsed="0.004333"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:50.658557" 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-10-11T00:56:50.658150" elapsed="0.000444"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:50.659834" 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-10-11T00:56:50.659350" elapsed="0.000519"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:50.659933" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:50.660110" 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-10-11T00:56:50.658855" elapsed="0.001288"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:50.660375" elapsed="0.000266"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:56:50.657964" elapsed="0.002728"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:50.661441" 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-10-11T00:56:50.661039" elapsed="0.000438"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:50.662873" 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-10-11T00:56:50.662181" elapsed="0.000729"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:50.662974" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T00:56:50.663152" 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-10-11T00:56:50.661740" elapsed="0.001444"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:50.663453" elapsed="0.000240"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:56:50.660854" elapsed="0.002913"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:50.664498" 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-10-11T00:56:50.664090" elapsed="0.000448"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:50.665679" 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-10-11T00:56:50.665234" elapsed="0.000496"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:50.665795" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:50.665969" 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-10-11T00:56:50.664795" elapsed="0.001205"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:50.666233" elapsed="0.000269"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:56:50.663904" elapsed="0.002659"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:50.667294" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:56:50.666913" elapsed="0.000415"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:50.668480" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:56:50.668042" elapsed="0.000482"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:50.668585" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:56:50.668777" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:56:50.667592" elapsed="0.001217"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:50.669037" elapsed="0.000229"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:56:50.666725" elapsed="0.002591"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:50.670051" 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-10-11T00:56:50.669661" elapsed="0.000423"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:50.671207" 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-10-11T00:56:50.670796" elapsed="0.000445"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:50.671301" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:50.671503" 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-10-11T00:56:50.670318" elapsed="0.001217"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:50.671779" elapsed="0.000234"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-10-11T00:56:50.669478" elapsed="0.002585"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:50.672807" 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-10-11T00:56:50.672379" elapsed="0.000461"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:50.673985" 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-10-11T00:56:50.673535" elapsed="0.000530"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:50.674129" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:50.674304" 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-10-11T00:56:50.673076" elapsed="0.001259"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:50.674597" elapsed="0.000258"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64497</var>
<status status="PASS" start="2026-10-11T00:56:50.672199" elapsed="0.002708"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:50.675628" 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-10-11T00:56:50.675226" elapsed="0.000436"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:50.676805" 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-10-11T00:56:50.676348" elapsed="0.000492"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:50.676902" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:56:50.677074" 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-10-11T00:56:50.675919" elapsed="0.001185"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:50.677332" elapsed="0.000490"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.0.0.0/28</var>
<status status="PASS" start="2026-10-11T00:56:50.675043" elapsed="0.002832"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:56:50.653122" elapsed="0.024799"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:56:50.677976" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T00:56:50.678159" 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-10-11T00:56:50.650449" elapsed="0.027744"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:50.649860" elapsed="0.028373"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:50.678493" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:50.678263" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:50.649816" elapsed="0.028787"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:50.679738" 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-10-11T00:56:50.678849" elapsed="0.000927"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:56:50.679838" 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//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-10-11T00:56:50.642318" elapsed="0.037657"/>
</kw>
<msg time="2026-10-11T00:56:50.680043" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:50.631066" elapsed="0.049039"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:50.685727" 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/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-10-11T00:56:50.690195" 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/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-10-11T00:56:50.694688" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:50.694915" 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-10-11T00:56:50.695097" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:50.695449" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:50.695287" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:50.695274" 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-10-11T00:56:50.695678" 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-10-11T00:56:50.695889" 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-10-11T00:56:50.696054" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:56:50.695249" elapsed="0.000852"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:56:50.695162" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:50.696276" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:50.696341" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:56:50.696467" 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-10-11T00:56:50.629614" elapsed="0.066879"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:50.697603" 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-10-11T00:56:50.697401" elapsed="0.000262">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-10-11T00:56:50.697761" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:50.697077" elapsed="0.000707"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:50.698069" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:50.697847" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:50.698597" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:56:50.698315" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:50.698142" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:50.697830" elapsed="0.000843"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:50.699184" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:56:50.698848" elapsed="0.000360"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:56:50.699253" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:56:50.699376" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:56:50.696774" elapsed="0.002624"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:50.700504" 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-10-11T00:56:50.700303" elapsed="0.000260">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-10-11T00:56:50.700680" 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-10-11T00:56:50.699982" elapsed="0.000733"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:56:50.700881" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:56:50.700781" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:50.700764" elapsed="0.000193"/>
</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-10-11T00:56:50.701111" elapsed="0.000020"/>
</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-10-11T00:56:50.701286" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:56:50.701345" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:56:50.701486" 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-10-11T00:56:50.699666" elapsed="0.001843"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:50.702916" 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-10-11T00:56:50.702677" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:50.703386" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:50.703164" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:56:50.709800" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:56:50.709927" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:56:50.710016" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:50.703754" elapsed="0.006600">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:50.703504" elapsed="0.006945">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:50.710644" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:50.710481" elapsed="0.000234"/>
</branch>
<status status="FAIL" start="2026-10-11T00:56:50.703487" elapsed="0.007251">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:50.711070" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:50.711188" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:50.711155" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:50.711139" elapsed="0.000105"/>
</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-10-11T00:56:50.711388" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:56:50.711465" 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-10-11T00:56:50.701799" elapsed="0.009759">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:50.711654" 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-10-11T00:56:50.611540" elapsed="0.100215">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:50.712002" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:50.711841" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:50.711825" elapsed="0.000262"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:50.712116" elapsed="0.000013"/>
</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-10-11T00:56:50.610104" elapsed="0.102097">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:51.750090" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:51.749344" elapsed="0.000807"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:51.751790" 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-10-11T00:56:51.751327" elapsed="0.000600">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-10-11T00:56:51.752115" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:51.750543" elapsed="0.001622"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.753311" 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-10-11T00:56:51.752589" elapsed="0.000779"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:56:51.754040" 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-10-11T00:56:51.754329" 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-10-11T00:56:51.753792" elapsed="0.000593"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.755374" 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-10-11T00:56:51.754884" elapsed="0.000618"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.757612" 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-10-11T00:56:51.757053" elapsed="0.000681"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.758747" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:56:51.758134" elapsed="0.000668"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.760232" 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-10-11T00:56:51.759607" elapsed="0.000679"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:51.762205" 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-10-11T00:56:51.761446" elapsed="0.000815"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:51.762483" elapsed="0.000076"/>
</return>
<msg time="2026-10-11T00:56:51.762813" 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-10-11T00:56:51.760718" elapsed="0.002147"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:51.763236" elapsed="0.000423"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:56:51.759228" elapsed="0.004538"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.764784" 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-10-11T00:56:51.764283" elapsed="0.000535"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:51.765958" 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-10-11T00:56:51.765518" elapsed="0.000475"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:51.766054" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:56:51.766226" 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-10-11T00:56:51.765055" 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-10-11T00:56:51.766513" elapsed="0.000249"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:56:51.763989" elapsed="0.002824"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.767531" 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-10-11T00:56:51.767129" elapsed="0.000436"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:51.770043" 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-10-11T00:56:51.768247" elapsed="0.001832"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:51.770143" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:56:51.770319" 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-10-11T00:56:51.767815" elapsed="0.002535"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:51.770611" elapsed="0.000254"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:56:51.766949" elapsed="0.003967"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.771644" 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-10-11T00:56:51.771236" elapsed="0.000442"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:51.772849" 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-10-11T00:56:51.772364" elapsed="0.000520"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:51.772947" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:56:51.773121" 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-10-11T00:56:51.771932" elapsed="0.001220"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:51.773383" elapsed="0.000272"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:56:51.771054" elapsed="0.002670"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.774444" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:56:51.774048" elapsed="0.000431"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:51.775614" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:56:51.775173" elapsed="0.000477"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:51.775728" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:56:51.775904" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:56:51.774738" elapsed="0.001197"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:51.776166" elapsed="0.000229"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:56:51.773864" elapsed="0.002618"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.777201" 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-10-11T00:56:51.776829" elapsed="0.000406"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:51.778366" 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-10-11T00:56:51.777951" elapsed="0.000449"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:51.778496" elapsed="0.000049"/>
</return>
<msg time="2026-10-11T00:56:51.778747" 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-10-11T00:56:51.777500" elapsed="0.001282"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:51.779014" elapsed="0.000235"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-10-11T00:56:51.776626" elapsed="0.002674"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.780047" 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-10-11T00:56:51.779650" elapsed="0.000431"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:51.781213" 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-10-11T00:56:51.780795" elapsed="0.000452"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:51.781310" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:51.781513" 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-10-11T00:56:51.780318" elapsed="0.001227"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:51.781793" elapsed="0.000232"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64497</var>
<status status="PASS" start="2026-10-11T00:56:51.779465" elapsed="0.002612"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.782825" 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-10-11T00:56:51.782395" elapsed="0.000465"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:51.784014" 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-10-11T00:56:51.783557" elapsed="0.000492"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:51.784112" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:56:51.784285" 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-10-11T00:56:51.783095" elapsed="0.001221"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:51.784581" elapsed="0.000254"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.0.0.0/28</var>
<status status="PASS" start="2026-10-11T00:56:51.782215" elapsed="0.002672"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:56:51.758898" elapsed="0.026034"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:56:51.784985" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T00:56:51.785168" 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-10-11T00:56:51.756232" elapsed="0.028969"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:51.755640" elapsed="0.029601"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:51.785502" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:51.785271" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:51.755600" elapsed="0.030003"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.786981" 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-10-11T00:56:51.785843" elapsed="0.001176"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:56:51.787082" 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/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-10-11T00:56:51.748052" elapsed="0.039172"/>
</kw>
<msg time="2026-10-11T00:56:51.787291" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:51.736822" elapsed="0.050531"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:51.792916" 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/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-10-11T00:56:51.797490" 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/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-10-11T00:56:51.802000" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:51.802183" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:51.802367" 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-10-11T00:56:51.802735" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:51.802577" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:51.802564" 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-10-11T00:56:51.802963" 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-10-11T00:56:51.803144" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:51.803314" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:56:51.802539" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:56:51.802449" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:51.803552" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:51.803620" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:56:51.803745" 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-10-11T00:56:51.735309" elapsed="0.068462"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:51.804891" 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-10-11T00:56:51.804702" elapsed="0.000249">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-10-11T00:56:51.805034" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:51.804341" elapsed="0.000716"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:51.805339" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:51.805118" elapsed="0.000272"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.805905" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:56:51.805608" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:51.805428" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:51.805102" elapsed="0.000880"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.806494" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:56:51.806142" elapsed="0.000376"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:56:51.806562" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:56:51.806733" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:56:51.804039" elapsed="0.002718"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:51.807861" 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-10-11T00:56:51.807659" elapsed="0.000261">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-10-11T00:56:51.808004" 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-10-11T00:56:51.807311" elapsed="0.000716"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:56:51.808188" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:56:51.808090" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:51.808073" elapsed="0.000190"/>
</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-10-11T00:56:51.808432" 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-10-11T00:56:51.808619" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:56:51.808677" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:56:51.808815" 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-10-11T00:56:51.807006" elapsed="0.001832"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.810060" 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-10-11T00:56:51.809838" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.810702" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:51.810290" elapsed="0.000455"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:56:51.817199" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:56:51.817324" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:56:51.817445" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:51.811034" elapsed="0.006759">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:51.810807" elapsed="0.007062">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:51.818056" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:51.817900" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-10-11T00:56:51.810790" elapsed="0.007347">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:51.818493" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:51.818641" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:51.818579" elapsed="0.000103"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:51.818564" elapsed="0.000153"/>
</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-10-11T00:56:51.818859" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:56:51.818921" elapsed="0.000013"/>
</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-10-11T00:56:51.809113" elapsed="0.009902">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:51.819078" elapsed="0.000014"/>
</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-10-11T00:56:51.717292" elapsed="0.101870">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:51.819402" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:51.819242" elapsed="0.000240"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:51.819227" elapsed="0.000277"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:51.819534" elapsed="0.000014"/>
</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-10-11T00:56:51.715898" elapsed="0.103722">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:51.819722" 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.173: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-10-11T00:56:41.802145" elapsed="10.017666">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.173: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-10-11T00:56:51.821099" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:56:51.820814" elapsed="0.000325"/>
</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-10-11T00:56:51.820420" elapsed="0.000765"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:56:51.820111" elapsed="0.001125"/>
</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-10-11T00:56:41.699664" elapsed="10.121609">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.173: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-10-11T00:56:51.822808" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:56:51.822544" 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-10-11T00:56:51.823985" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:51.823897" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:51.823880" elapsed="0.000168"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:51.826392" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:51.826307" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:51.826290" elapsed="0.000211"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.827438" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:56:51.827094" elapsed="0.000370"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.827931" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:56:51.827627" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:56:51.827996" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:56:51.828126" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:56:51.826730" elapsed="0.001419"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:51.830834" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:51.830747" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:51.830729" elapsed="0.000169"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:56:51.831960" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:51.831876" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:51.831859" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:56:51.832341" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:56:51.832171" elapsed="0.000195"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:56:51.832706" 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-10-11T00:56:51.832552" elapsed="0.000178"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:56:51.865745" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:56:51.833219" elapsed="0.032620"/>
</kw>
<msg time="2026-10-11T00:56:51.865987" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:56:51.866028" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:51.832888" elapsed="0.033176"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:56:51.893725" 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-10-11T00:56:51.866610" elapsed="0.027214"/>
</kw>
<msg time="2026-10-11T00:56:51.893972" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:56:51.894013" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:51.866248" elapsed="0.027800"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:51.894327" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:51.894116" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:51.894098" elapsed="0.000306"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.894853" 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-10-11T00:56:51.894611" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:51.895176" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:51.894976" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:51.894959" elapsed="0.000287"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:56:51.895276" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:56:51.897860" elapsed="0.000117"/>
</kw>
<msg time="2026-10-11T00:56:51.898033" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:51.896649" elapsed="0.001519"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:51.898528" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:51.898881" 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-10-11T00:56:51.896057" 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-10-11T00:56:51.895578" elapsed="0.003547"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:56:51.831606" elapsed="0.067593"/>
</kw>
<msg time="2026-10-11T00:56:51.899280" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:56:51.899319" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:51.831051" elapsed="0.068304"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:56:51.899542" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:56:51.899447" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:51.899428" elapsed="0.000189"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:51.899953" 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-10-11T00:56:51.900251" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:56:51.900314" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:56:51.830444" elapsed="0.069953"/>
</kw>
<msg time="2026-10-11T00:56:51.900502" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:56:51.900542" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:51.828501" elapsed="0.072077"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:51.900886" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:51.900644" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:51.900628" elapsed="0.000328"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:56:51.828337" elapsed="0.072641"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:56:51.828196" elapsed="0.072807"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:56:51.826007" elapsed="0.075044"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:56:51.823630" elapsed="0.077470"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:56:51.823218" elapsed="0.077921"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:56:51.822175" elapsed="0.079011"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.902088" 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-10-11T00:56:51.901385" elapsed="0.000730"/>
</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-10-11T00:56:51.919276" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:51.918975" elapsed="0.000327"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:51.919991" 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-10-11T00:56:51.919808" elapsed="0.000245">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-10-11T00:56:51.920170" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:51.919477" elapsed="0.000716"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.920708" 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-10-11T00:56:51.920368" elapsed="0.000365"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:56:51.921008" 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-10-11T00:56:51.921136" 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-10-11T00:56:51.920900" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.921587" 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-10-11T00:56:51.921353" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.922549" 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-10-11T00:56:51.922298" elapsed="0.000294"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.923029" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:56:51.922780" elapsed="0.000273"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.923665" 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-10-11T00:56:51.923375" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:51.924504" 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-10-11T00:56:51.924180" elapsed="0.000348"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:51.924573" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:56:51.924709" 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-10-11T00:56:51.923871" elapsed="0.000862"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:51.924898" elapsed="0.000174"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-10-11T00:56:51.923242" elapsed="0.001865"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.925630" 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-10-11T00:56:51.925334" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:51.926461" 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-10-11T00:56:51.926142" elapsed="0.000344"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:51.926530" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:56:51.926654" 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-10-11T00:56:51.925834" 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-10-11T00:56:51.926871" elapsed="0.000168"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:56:51.925205" elapsed="0.001871"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.927605" 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-10-11T00:56:51.927304" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:51.928440" 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-10-11T00:56:51.928123" elapsed="0.000343"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:51.928511" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:56:51.928635" 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-10-11T00:56:51.927813" 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-10-11T00:56:51.928835" elapsed="0.000319"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:56:51.927174" elapsed="0.002018"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.929737" 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-10-11T00:56:51.929444" elapsed="0.000316"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:51.930596" 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-10-11T00:56:51.930275" elapsed="0.000345"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:51.930665" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T00:56:51.930804" 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-10-11T00:56:51.929966" elapsed="0.000860"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:51.930991" elapsed="0.000165"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:56:51.929291" elapsed="0.001902"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.931735" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:56:51.931443" elapsed="0.000316"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:51.932554" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:56:51.932235" elapsed="0.000344"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:51.932623" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:56:51.932761" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:56:51.931928" elapsed="0.000855"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:51.932948" elapsed="0.000163"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:56:51.931291" elapsed="0.001857"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.933661" 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-10-11T00:56:51.933374" elapsed="0.000311"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:51.934491" 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-10-11T00:56:51.934174" elapsed="0.000350"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:51.934568" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:56:51.934706" 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-10-11T00:56:51.933867" elapsed="0.000862"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:51.934893" elapsed="0.000165"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-10-11T00:56:51.933246" elapsed="0.001848"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.935616" 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-10-11T00:56:51.935321" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:51.936452" 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-10-11T00:56:51.936130" elapsed="0.000347"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:51.936521" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:56:51.936645" 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-10-11T00:56:51.935822" 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-10-11T00:56:51.936853" elapsed="0.000163"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64496</var>
<status status="PASS" start="2026-10-11T00:56:51.935192" elapsed="0.001860"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.937567" 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-10-11T00:56:51.937279" elapsed="0.000312"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:51.938397" 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-10-11T00:56:51.938100" elapsed="0.000344"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:51.938489" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:56:51.938615" 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-10-11T00:56:51.937790" 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-10-11T00:56:51.938819" elapsed="0.000166"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.1.0.0/28</var>
<status status="PASS" start="2026-10-11T00:56:51.937150" elapsed="0.001871"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:56:51.923095" elapsed="0.015958"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:56:51.939092" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:56:51.939222" 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-10-11T00:56:51.921955" elapsed="0.017323"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:51.921700" elapsed="0.017609"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:51.939501" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:51.939331" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:51.921671" elapsed="0.017902"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.940596" 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-10-11T00:56:51.939799" elapsed="0.000824"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:56:51.940668" 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/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-10-11T00:56:51.918448" elapsed="0.022335"/>
</kw>
<msg time="2026-10-11T00:56:51.940831" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:51.913393" elapsed="0.027481"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:51.945366" 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/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-10-11T00:56:51.949984" 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/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-10-11T00:56:51.954482" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:51.954664" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:51.954857" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:51.955192" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:51.955047" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:51.955034" 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-10-11T00:56:51.955430" 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-10-11T00:56:51.955611" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:51.955787" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:56:51.955009" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:56:51.954921" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:51.956008" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:51.956105" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:56:51.956218" 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-10-11T00:56:51.912805" elapsed="0.043437"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:51.957432" 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-10-11T00:56:51.957229" elapsed="0.000263">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-10-11T00:56:51.957576" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:51.956853" elapsed="0.000746"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:51.957897" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:51.957661" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.958397" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:56:51.958133" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:51.957969" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:51.957644" elapsed="0.000845"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.959013" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:56:51.958650" elapsed="0.000387"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:56:51.959081" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:56:51.959205" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:56:51.956535" elapsed="0.002693"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:51.960340" 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-10-11T00:56:51.960159" elapsed="0.000240">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-10-11T00:56:51.960499" 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-10-11T00:56:51.959837" elapsed="0.000685"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:56:51.960683" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-10-11T00:56:51.960585" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:51.960568" elapsed="0.000207"/>
</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-10-11T00:56:51.960930" elapsed="0.000019"/>
</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-10-11T00:56:51.961103" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:56:51.961160" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:56:51.961283" 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-10-11T00:56:51.959491" elapsed="0.001815"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.962545" 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-10-11T00:56:51.962306" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:51.963179" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:51.962788" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:56:51.969249" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:56:51.969405" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:56:51.969517" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:51.963527" elapsed="0.006345">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:51.963282" elapsed="0.006666">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:51.970138" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:51.969978" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-10-11T00:56:51.963265" elapsed="0.006953">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:51.970568" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:51.970699" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:51.970654" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:51.970639" 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-10-11T00:56:51.970899" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:56:51.970960" 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-10-11T00:56:51.961596" elapsed="0.009458">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:51.971117" elapsed="0.000014"/>
</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-10-11T00:56:51.904828" elapsed="0.066372">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:51.971465" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:51.971281" elapsed="0.000248"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:51.971265" elapsed="0.000285"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:51.971581" elapsed="0.000013"/>
</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-10-11T00:56:51.904209" elapsed="0.067460">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:53.010994" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:53.010215" elapsed="0.000851"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:53.012861" 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-10-11T00:56:53.012350" elapsed="0.000666">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-10-11T00:56:53.013209" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:53.011593" elapsed="0.001666"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:53.014435" 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-10-11T00:56:53.013703" elapsed="0.000792"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:56:53.015161" 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-10-11T00:56:53.015503" 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-10-11T00:56:53.014904" elapsed="0.000638"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:53.016144" 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-10-11T00:56:53.015834" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:53.017564" 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-10-11T00:56:53.017210" elapsed="0.000414"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:56:53.018252" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:56:53.017892" elapsed="0.000393"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:53.019199" 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-10-11T00:56:53.018822" elapsed="0.000411"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:53.020449" 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-10-11T00:56:53.019947" elapsed="0.000539"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:53.020552" elapsed="0.000049"/>
</return>
<msg time="2026-10-11T00:56:53.020788" 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-10-11T00:56:53.019495" elapsed="0.001325"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:53.021054" elapsed="0.000257"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-10-11T00:56:53.018611" elapsed="0.002751"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:53.022099" 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-10-11T00:56:53.021726" elapsed="0.000406"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:53.023276" 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-10-11T00:56:53.022849" elapsed="0.000463"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:53.023373" elapsed="0.000077"/>
</return>
<msg time="2026-10-11T00:56:53.023592" 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-10-11T00:56:53.022368" elapsed="0.001256"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:53.023875" elapsed="0.000233"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:56:53.021526" elapsed="0.002632"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:53.024896" 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-10-11T00:56:53.024497" elapsed="0.000432"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:53.026336" 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-10-11T00:56:53.025712" elapsed="0.000659"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:53.026473" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T00:56:53.026651" 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-10-11T00:56:53.025163" 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-10-11T00:56:53.026972" elapsed="0.000239"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:56:53.024296" elapsed="0.002966"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:53.028002" 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-10-11T00:56:53.027608" elapsed="0.000427"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:53.029163" 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-10-11T00:56:53.028750" elapsed="0.000447"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:53.029258" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:56:53.029473" 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-10-11T00:56:53.028269" elapsed="0.001238"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:53.029756" elapsed="0.000232"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:56:53.027399" elapsed="0.002639"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:53.030766" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:56:53.030353" elapsed="0.000447"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:53.032014" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:56:53.031554" elapsed="0.000495"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:53.032110" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:56:53.032282" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:56:53.031035" elapsed="0.001278"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:53.032579" elapsed="0.000248"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:56:53.030174" elapsed="0.002704"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:53.033591" 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-10-11T00:56:53.033196" elapsed="0.000429"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:53.034774" 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-10-11T00:56:53.034303" elapsed="0.000506"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:53.034871" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:53.035043" 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-10-11T00:56:53.033875" elapsed="0.001199"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:53.035301" elapsed="0.000268"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-10-11T00:56:53.033016" elapsed="0.002604"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:53.036324" 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-10-11T00:56:53.035953" elapsed="0.000404"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:53.037510" 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-10-11T00:56:53.037072" elapsed="0.000473"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:53.037606" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:56:53.037822" 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-10-11T00:56:53.036624" elapsed="0.001230"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:53.038081" elapsed="0.000230"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64496</var>
<status status="PASS" start="2026-10-11T00:56:53.035772" elapsed="0.002588"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:53.039100" 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-10-11T00:56:53.038726" elapsed="0.000409"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:53.040271" 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-10-11T00:56:53.039856" elapsed="0.000450"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:53.040367" elapsed="0.000072"/>
</return>
<msg time="2026-10-11T00:56:53.040579" 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-10-11T00:56:53.039372" elapsed="0.001239"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:53.040857" elapsed="0.000447"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.1.0.0/28</var>
<status status="PASS" start="2026-10-11T00:56:53.038528" elapsed="0.002930"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:56:53.018361" elapsed="0.023156"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:56:53.041588" elapsed="0.000044"/>
</return>
<msg time="2026-10-11T00:56:53.041812" 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-10-11T00:56:53.016721" elapsed="0.025125"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:53.016308" elapsed="0.025579"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:53.042128" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:53.041920" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:53.016274" elapsed="0.025950"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:53.043540" 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-10-11T00:56:53.042523" elapsed="0.001064"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:56:53.043662" 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/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-10-11T00:56:53.008961" elapsed="0.034867"/>
</kw>
<msg time="2026-10-11T00:56:53.043897" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:52.997356" elapsed="0.046605"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:53.050364" 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-10-11T00:56:53.056876" 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-10-11T00:56:53.063313" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:53.063598" 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-10-11T00:56:53.063875" elapsed="0.000030"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:53.064351" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:53.064147" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:53.064128" elapsed="0.000345"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:53.064727" 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-10-11T00:56:53.064984" 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-10-11T00:56:53.065261" elapsed="0.000027"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:56:53.064092" elapsed="0.001238"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:56:53.063971" elapsed="0.001392"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:53.065604" elapsed="0.000027"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:53.065716" elapsed="0.000022"/>
</return>
<msg time="2026-10-11T00:56:53.065873" 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-10-11T00:56:52.995930" elapsed="0.069978"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:53.067479" 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-10-11T00:56:53.067200" elapsed="0.000363">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-10-11T00:56:53.067705" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:53.066745" elapsed="0.000993"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:53.068135" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:53.067827" elapsed="0.000379"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:53.068904" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:56:53.068517" elapsed="0.000421"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:53.068237" elapsed="0.000746"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:53.067804" elapsed="0.001206"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:53.069779" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:56:53.069236" elapsed="0.000567"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:56:53.069847" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:56:53.069970" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:56:53.066285" elapsed="0.003708"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:53.071081" 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-10-11T00:56:53.070897" elapsed="0.000243">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-10-11T00:56:53.071224" 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-10-11T00:56:53.070562" elapsed="0.000685"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:56:53.071427" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:56:53.071309" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:53.071293" elapsed="0.000213"/>
</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-10-11T00:56:53.071660" elapsed="0.000033"/>
</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-10-11T00:56:53.071850" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:56:53.071908" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:56:53.072031" 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-10-11T00:56:53.070246" elapsed="0.001808"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:53.074617" 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-10-11T00:56:53.074365" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:53.075121" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:53.074899" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:56:53.081590" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:56:53.081785" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:56:53.081888" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:53.075474" elapsed="0.006790">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:53.075222" elapsed="0.007121">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:53.082554" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:53.082377" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-10-11T00:56:53.075205" elapsed="0.007430">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:53.082990" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:53.083108" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:53.083076" elapsed="0.000069"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:53.083061" elapsed="0.000104"/>
</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-10-11T00:56:53.083305" elapsed="0.000018"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:56:53.083369" 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-10-11T00:56:53.072341" elapsed="0.011139">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:53.083545" elapsed="0.000014"/>
</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-10-11T00:56:52.977745" elapsed="0.105883">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:53.083888" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:53.083723" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:53.083708" elapsed="0.000264"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:53.084002" elapsed="0.000013"/>
</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-10-11T00:56:52.976058" elapsed="0.108028">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:54.123374" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:54.122626" elapsed="0.000847"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:54.125103" 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-10-11T00:56:54.124629" elapsed="0.000630">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-10-11T00:56:54.125481" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:54.123875" elapsed="0.001660"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:54.126755" 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-10-11T00:56:54.125951" elapsed="0.000865"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:56:54.127493" 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-10-11T00:56:54.127723" 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-10-11T00:56:54.127191" elapsed="0.000568"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:54.128338" 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-10-11T00:56:54.128031" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:54.129751" 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-10-11T00:56:54.129380" elapsed="0.000442"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:56:54.130451" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:56:54.130072" elapsed="0.000413"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:54.131353" 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-10-11T00:56:54.130979" elapsed="0.000412"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:54.132618" 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-10-11T00:56:54.132110" elapsed="0.000542"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:54.132735" elapsed="0.000048"/>
</return>
<msg time="2026-10-11T00:56:54.132927" 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-10-11T00:56:54.131656" elapsed="0.001302"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:54.133191" elapsed="0.000375"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-10-11T00:56:54.130790" elapsed="0.002832"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:54.134337" 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-10-11T00:56:54.133963" elapsed="0.000412"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:54.135550" 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-10-11T00:56:54.135095" elapsed="0.000490"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:54.135648" elapsed="0.000059"/>
</return>
<msg time="2026-10-11T00:56:54.135845" 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-10-11T00:56:54.134639" elapsed="0.001238"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:54.136110" elapsed="0.000233"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:56:54.133780" elapsed="0.002614"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:54.137207" 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-10-11T00:56:54.136829" elapsed="0.000411"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:54.138441" 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-10-11T00:56:54.137988" elapsed="0.000489"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:54.138540" elapsed="0.000045"/>
</return>
<msg time="2026-10-11T00:56:54.138744" 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-10-11T00:56:54.137514" elapsed="0.001263"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:54.139010" elapsed="0.000497"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:56:54.136628" elapsed="0.002933"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:54.140279" 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-10-11T00:56:54.139902" elapsed="0.000411"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:54.141482" 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-10-11T00:56:54.141030" elapsed="0.000488"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:54.141580" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:54.141769" 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-10-11T00:56:54.140582" elapsed="0.001219"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:54.142029" elapsed="0.000234"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:56:54.139716" elapsed="0.002599"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:54.143062" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:56:54.142687" elapsed="0.000409"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:54.144232" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:56:54.143815" elapsed="0.000451"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:54.144330" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:56:54.144545" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:56:54.143330" elapsed="0.001247"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:54.144826" elapsed="0.000240"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:56:54.142478" elapsed="0.002639"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:54.145871" 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-10-11T00:56:54.145466" elapsed="0.000439"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:54.147033" 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-10-11T00:56:54.146608" elapsed="0.000459"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:54.147129" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T00:56:54.147303" 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-10-11T00:56:54.146142" 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-10-11T00:56:54.147605" elapsed="0.000258"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-10-11T00:56:54.145258" elapsed="0.002658"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:54.148634" 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-10-11T00:56:54.148234" elapsed="0.000469"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:54.149838" 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-10-11T00:56:54.149374" elapsed="0.000498"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:54.149935" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:54.150108" 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-10-11T00:56:54.148943" 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-10-11T00:56:54.150371" elapsed="0.000271"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64496</var>
<status status="PASS" start="2026-10-11T00:56:54.148053" elapsed="0.002659"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:54.151432" 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-10-11T00:56:54.151038" elapsed="0.000472"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:54.152647" 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-10-11T00:56:54.152200" elapsed="0.000497"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:54.152760" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:56:54.152935" 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-10-11T00:56:54.151771" 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-10-11T00:56:54.153211" elapsed="0.000271"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.1.0.0/28</var>
<status status="PASS" start="2026-10-11T00:56:54.150853" elapsed="0.002682"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:56:54.130553" elapsed="0.023026"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:56:54.153639" elapsed="0.000063"/>
</return>
<msg time="2026-10-11T00:56:54.153913" 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-10-11T00:56:54.128904" elapsed="0.025057"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:54.128522" elapsed="0.025496"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:54.154356" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:54.154066" elapsed="0.000424"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:54.128491" elapsed="0.026040"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:54.156026" 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-10-11T00:56:54.154831" elapsed="0.001233"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:56:54.156128" 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/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-10-11T00:56:54.121397" elapsed="0.034876"/>
</kw>
<msg time="2026-10-11T00:56:54.156346" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:54.109790" elapsed="0.046658"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:54.163004" 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-10-11T00:56:54.169507" 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/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-10-11T00:56:54.175946" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:54.176205" 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-10-11T00:56:54.176496" 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-10-11T00:56:54.177068" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:54.176860" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:54.176839" elapsed="0.000331"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:54.177428" 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-10-11T00:56:54.177742" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:54.177914" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:56:54.176800" elapsed="0.001162"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:56:54.176647" elapsed="0.001338"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:54.178138" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:54.178204" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:56:54.178319" 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-10-11T00:56:54.108246" elapsed="0.070098"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:54.179515" 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-10-11T00:56:54.179288" elapsed="0.000299">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-10-11T00:56:54.179765" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:54.178960" 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-10-11T00:56:54.180076" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:54.179854" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:54.180617" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:56:54.180334" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:54.180150" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:54.179837" elapsed="0.000869"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:54.181207" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:56:54.180867" elapsed="0.000364"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:56:54.181276" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:56:54.181405" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:56:54.178635" elapsed="0.002809"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:54.182547" 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-10-11T00:56:54.182347" elapsed="0.000258">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-10-11T00:56:54.182705" 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-10-11T00:56:54.182028" elapsed="0.000700"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:56:54.182890" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:56:54.182793" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:54.182776" elapsed="0.000190"/>
</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-10-11T00:56:54.183119" elapsed="0.000020"/>
</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-10-11T00:56:54.183293" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:56:54.183382" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:56:54.183528" 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-10-11T00:56:54.181727" elapsed="0.001824"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:54.184837" 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-10-11T00:56:54.184583" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:54.185480" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:54.185072" elapsed="0.000450"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:56:54.191984" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:56:54.192137" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:56:54.192228" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:54.185834" elapsed="0.006779">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:54.185584" elapsed="0.007140">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:54.192916" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:54.192758" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-10-11T00:56:54.185566" elapsed="0.007429">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:54.193348" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:54.193489" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:54.193456" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:54.193439" elapsed="0.000106"/>
</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-10-11T00:56:54.193701" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:56:54.193764" elapsed="0.000013"/>
</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-10-11T00:56:54.183861" elapsed="0.009999">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:54.193925" elapsed="0.000014"/>
</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-10-11T00:56:54.089857" elapsed="0.104152">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:54.194287" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:54.194092" elapsed="0.000265"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:54.194076" elapsed="0.000304"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:54.194432" elapsed="0.000014"/>
</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-10-11T00:56:54.088258" elapsed="0.106265">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:55.233802" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:55.233002" elapsed="0.000870"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:55.235503" 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-10-11T00:56:55.235037" elapsed="0.000637">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-10-11T00:56:55.235871" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:55.234247" elapsed="0.001675"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:55.237101" 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-10-11T00:56:55.236312" elapsed="0.000846"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:56:55.237844" 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-10-11T00:56:55.238187" 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-10-11T00:56:55.237566" elapsed="0.000678"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:55.239285" 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-10-11T00:56:55.238786" elapsed="0.000598"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:55.241107" 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-10-11T00:56:55.240778" elapsed="0.000390"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:56:55.241829" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:56:55.241434" elapsed="0.000429"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:55.242776" 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-10-11T00:56:55.242338" elapsed="0.000472"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:55.244031" 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-10-11T00:56:55.243499" elapsed="0.000566"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:55.244131" elapsed="0.000048"/>
</return>
<msg time="2026-10-11T00:56:55.244320" 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-10-11T00:56:55.243047" elapsed="0.001304"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:55.244603" elapsed="0.000264"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-10-11T00:56:55.242152" elapsed="0.002767"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:55.245626" 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-10-11T00:56:55.245236" elapsed="0.000438"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:55.246897" 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-10-11T00:56:55.246404" elapsed="0.000527"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:55.246994" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:55.247167" 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-10-11T00:56:55.245909" elapsed="0.001290"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:55.247449" elapsed="0.000247"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:56:55.245055" elapsed="0.002693"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:55.248478" 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-10-11T00:56:55.248065" elapsed="0.000448"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:55.249849" 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-10-11T00:56:55.249187" elapsed="0.000697"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:55.249947" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:55.250120" 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-10-11T00:56:55.248758" elapsed="0.001394"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:55.250381" elapsed="0.000291"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:56:55.247884" elapsed="0.002841"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:55.251439" 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-10-11T00:56:55.251040" elapsed="0.000434"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:55.252610" 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-10-11T00:56:55.252155" elapsed="0.000490"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:55.252724" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:55.252897" 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-10-11T00:56:55.251724" elapsed="0.001204"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:55.253156" elapsed="0.000229"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:56:55.250860" elapsed="0.002607"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:55.254171" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:56:55.253801" elapsed="0.000404"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:55.255345" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:56:55.254937" elapsed="0.000442"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:55.255469" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:56:55.255643" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:56:55.254490" elapsed="0.001198"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:55.255917" elapsed="0.000230"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:56:55.253603" elapsed="0.002594"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:55.256926" 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-10-11T00:56:55.256532" elapsed="0.000428"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:55.258100" 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-10-11T00:56:55.257686" elapsed="0.000449"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:55.258196" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:55.258370" 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-10-11T00:56:55.257192" elapsed="0.001210"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:55.258673" elapsed="0.000233"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-10-11T00:56:55.256331" elapsed="0.002626"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:55.259711" 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-10-11T00:56:55.259274" elapsed="0.000471"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:55.260872" 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-10-11T00:56:55.260441" elapsed="0.000506"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:55.261012" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:55.261187" 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-10-11T00:56:55.259982" elapsed="0.001236"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:55.261487" elapsed="0.000249"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64496</var>
<status status="PASS" start="2026-10-11T00:56:55.259094" elapsed="0.002694"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:55.262511" 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-10-11T00:56:55.262105" elapsed="0.000440"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:55.263736" 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-10-11T00:56:55.263245" elapsed="0.000526"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:55.263834" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T00:56:55.264018" 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-10-11T00:56:55.262806" elapsed="0.001243"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:55.264279" elapsed="0.000286"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.1.0.0/28</var>
<status status="PASS" start="2026-10-11T00:56:55.261924" elapsed="0.002694"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:56:55.241933" elapsed="0.022746"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:56:55.264736" elapsed="0.000258"/>
</return>
<msg time="2026-10-11T00:56:55.265151" 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-10-11T00:56:55.240169" elapsed="0.025016"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:55.239568" elapsed="0.025658"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:55.265499" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:55.265260" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:55.239520" elapsed="0.026079"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:55.266674" 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-10-11T00:56:55.265840" elapsed="0.000862"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:56:55.266751" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:55.231807" elapsed="0.035044"/>
</kw>
<msg time="2026-10-11T00:56:55.266901" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:55.220329" elapsed="0.046621"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:55.271626" 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/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-10-11T00:56:55.276183" 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/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-10-11T00:56:55.280708" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:55.280929" 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-10-11T00:56:55.281116" 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-10-11T00:56:55.281482" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:55.281318" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:55.281303" 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-10-11T00:56:55.281721" 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-10-11T00:56:55.281902" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:55.282065" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:56:55.281275" elapsed="0.000838"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:56:55.281185" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:55.282286" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:55.282352" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:56:55.282496" 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-10-11T00:56:55.218861" elapsed="0.063661"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:55.283675" 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-10-11T00:56:55.283459" elapsed="0.000285">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-10-11T00:56:55.283828" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:55.283103" elapsed="0.000748"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:55.284136" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:55.283913" elapsed="0.000275"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:55.284704" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:56:55.284393" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:55.284210" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:55.283896" elapsed="0.000884"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:55.285277" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:56:55.284940" elapsed="0.000361"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:56:55.285345" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:56:55.285484" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:56:55.282802" elapsed="0.002705"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:55.288116" 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-10-11T00:56:55.286448" elapsed="0.001729">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-10-11T00:56:55.288297" 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-10-11T00:56:55.286097" elapsed="0.002223"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:56:55.288508" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:56:55.288387" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:55.288368" elapsed="0.000218"/>
</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-10-11T00:56:55.288752" 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-10-11T00:56:55.288929" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:56:55.288987" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:56:55.289113" 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-10-11T00:56:55.285780" elapsed="0.003356"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:55.290602" 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-10-11T00:56:55.290304" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:55.291065" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:55.290851" elapsed="0.000254"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:56:55.297582" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:56:55.297743" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:56:55.297835" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:55.291393" elapsed="0.006795">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:55.291164" elapsed="0.007100">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:55.298477" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:55.298296" elapsed="0.000240"/>
</branch>
<status status="FAIL" start="2026-10-11T00:56:55.291147" elapsed="0.007411">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:55.298910" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:55.299031" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:55.298996" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:55.298980" elapsed="0.000109"/>
</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-10-11T00:56:55.299233" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:56:55.299295" 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-10-11T00:56:55.289434" elapsed="0.009955">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:55.299501" 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-10-11T00:56:55.200473" elapsed="0.099117">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:55.299853" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:55.299685" elapsed="0.000233"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:55.299668" elapsed="0.000272"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:55.299971" elapsed="0.000013"/>
</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-10-11T00:56:55.198727" elapsed="0.101329">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:56.338691" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:56.337930" elapsed="0.000829"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:56.340325" 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-10-11T00:56:56.339899" elapsed="0.000604">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-10-11T00:56:56.340717" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:56.339126" elapsed="0.001646"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:56.341918" 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-10-11T00:56:56.341160" elapsed="0.000816"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:56:56.342634" 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-10-11T00:56:56.342955" 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-10-11T00:56:56.342351" elapsed="0.000660"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:56.344005" 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-10-11T00:56:56.343474" elapsed="0.000625"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:56.345617" 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-10-11T00:56:56.345249" elapsed="0.000448"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:56:56.346296" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:56:56.345943" elapsed="0.000386"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:56.347235" 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-10-11T00:56:56.346862" elapsed="0.000407"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:56.348487" 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-10-11T00:56:56.347982" elapsed="0.000540"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:56.348736" elapsed="0.000050"/>
</return>
<msg time="2026-10-11T00:56:56.348934" 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-10-11T00:56:56.347530" elapsed="0.001437"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:56.349198" elapsed="0.000276"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-10-11T00:56:56.346672" elapsed="0.002854"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:56.350248" 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-10-11T00:56:56.349869" elapsed="0.000413"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:56.351440" 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-10-11T00:56:56.350997" elapsed="0.000479"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:56.351539" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:56:56.351736" 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-10-11T00:56:56.350547" 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-10-11T00:56:56.351999" elapsed="0.000234"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:56:56.349686" elapsed="0.002598"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:56.353041" 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-10-11T00:56:56.352659" elapsed="0.000416"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:56.354403" 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-10-11T00:56:56.353796" elapsed="0.000665"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:56.354524" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:56:56.354724" 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-10-11T00:56:56.353312" elapsed="0.001444"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:56.354984" elapsed="0.000231"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:56:56.352460" elapsed="0.002805"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:56.355989" 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-10-11T00:56:56.355603" elapsed="0.000420"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:56.357156" 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-10-11T00:56:56.356739" elapsed="0.000451"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:56.357251" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:56:56.357453" 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-10-11T00:56:56.356257" elapsed="0.001229"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:56.357729" elapsed="0.000231"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:56:56.355401" elapsed="0.002611"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:56.358738" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:56:56.358327" elapsed="0.000445"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:56.359920" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:56:56.359460" elapsed="0.000496"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:56.360016" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:56.360187" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:56:56.359004" elapsed="0.001214"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:56.360484" elapsed="0.000252"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:56:56.358147" elapsed="0.002641"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:56.361506" 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-10-11T00:56:56.361103" elapsed="0.000436"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:56.362676" 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-10-11T00:56:56.362225" elapsed="0.000486"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:56.362774" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:56:56.362992" 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-10-11T00:56:56.361789" elapsed="0.001235"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:56.363253" elapsed="0.000259"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-10-11T00:56:56.360923" elapsed="0.002641"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:56.364275" 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-10-11T00:56:56.363904" elapsed="0.000404"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:56.365523" 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-10-11T00:56:56.365033" elapsed="0.000532"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:56.365641" elapsed="0.000066"/>
</return>
<msg time="2026-10-11T00:56:56.365856" 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-10-11T00:56:56.364583" elapsed="0.001305"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:56.366115" elapsed="0.000226"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64496</var>
<status status="PASS" start="2026-10-11T00:56:56.363722" elapsed="0.002681"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:56.367183" 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-10-11T00:56:56.366813" elapsed="0.000403"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:56.368330" 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-10-11T00:56:56.367924" elapsed="0.000440"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:56.368463" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T00:56:56.368639" 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-10-11T00:56:56.367473" elapsed="0.001215"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:56.368916" elapsed="0.000432"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.1.0.0/28</var>
<status status="PASS" start="2026-10-11T00:56:56.366602" elapsed="0.002849"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:56:56.346394" elapsed="0.023115"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:56:56.369579" elapsed="0.000046"/>
</return>
<msg time="2026-10-11T00:56:56.369795" 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-10-11T00:56:56.344770" elapsed="0.025050"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:56.344242" elapsed="0.025606"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:56.370022" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:56.369873" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:56.344198" elapsed="0.025894"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:56.370931" 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-10-11T00:56:56.370253" elapsed="0.000704"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:56:56.371001" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:56.336686" elapsed="0.034417"/>
</kw>
<msg time="2026-10-11T00:56:56.371152" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:56.325297" elapsed="0.045899"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:56.375787" 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/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-10-11T00:56:56.380475" 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/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-10-11T00:56:56.385031" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:56.385213" 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-10-11T00:56:56.385395" 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-10-11T00:56:56.385767" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:56.385606" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:56.385592" 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-10-11T00:56:56.386008" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:56.386187" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:56.386351" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:56:56.385566" elapsed="0.000832"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:56:56.385477" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:56.386589" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:56.386666" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:56:56.386778" 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-10-11T00:56:56.323886" elapsed="0.062918"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:56.387929" 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-10-11T00:56:56.387743" elapsed="0.000246">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-10-11T00:56:56.388072" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:56.387384" elapsed="0.000710"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:56.388376" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:56.388156" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:56.388924" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:56:56.388660" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:56.388466" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:56.388140" elapsed="0.000860"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:56.389512" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:56:56.389162" elapsed="0.000374"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:56:56.389580" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:56:56.389751" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:56:56.387078" elapsed="0.002696"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:56.390865" 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-10-11T00:56:56.390681" elapsed="0.000242">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-10-11T00:56:56.391006" 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-10-11T00:56:56.390327" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:56:56.391188" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:56:56.391090" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:56.391074" elapsed="0.000190"/>
</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-10-11T00:56:56.391432" elapsed="0.000020"/>
</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-10-11T00:56:56.391608" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:56:56.391677" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:56:56.391801" 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-10-11T00:56:56.390025" elapsed="0.001799"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:56.394191" 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-10-11T00:56:56.393963" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:56.394679" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:56.394442" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:56:56.401307" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:56:56.401498" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:56:56.401680" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:56.395010" elapsed="0.007147">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:56.394781" elapsed="0.007481">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:56.402544" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:56.402304" elapsed="0.000323"/>
</branch>
<status status="FAIL" start="2026-10-11T00:56:56.394764" elapsed="0.007910">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:56.403145" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:56.403350" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:56.403264" elapsed="0.000161"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:56.403242" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:56.403692" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:56:56.403785" elapsed="0.000019"/>
</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-10-11T00:56:56.392108" elapsed="0.011809">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:56.404006" elapsed="0.000020"/>
</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-10-11T00:56:56.305744" elapsed="0.098379">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:56.404484" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:56.404235" elapsed="0.000339"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:56.404213" elapsed="0.000391"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:56.404662" elapsed="0.000019"/>
</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-10-11T00:56:56.304155" elapsed="0.100629">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:57.443590" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:57.442850" elapsed="0.000830"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:57.445275" 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-10-11T00:56:57.444836" elapsed="0.000616">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-10-11T00:56:57.445672" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:57.444057" elapsed="0.001668"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:57.446867" 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-10-11T00:56:57.446120" elapsed="0.000803"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:56:57.447581" 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-10-11T00:56:57.447945" 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-10-11T00:56:57.447297" elapsed="0.000705"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:57.448859" 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-10-11T00:56:57.448484" elapsed="0.000438"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:57.450229" 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-10-11T00:56:57.449899" elapsed="0.000459"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:56:57.451022" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:56:57.450647" elapsed="0.000409"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:57.451951" 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-10-11T00:56:57.451556" elapsed="0.000428"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:57.453170" 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-10-11T00:56:57.452700" elapsed="0.000504"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:57.453271" elapsed="0.000047"/>
</return>
<msg time="2026-10-11T00:56:57.453490" 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-10-11T00:56:57.452223" 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-10-11T00:56:57.453779" elapsed="0.000252"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-10-11T00:56:57.451342" elapsed="0.002741"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:57.454837" 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-10-11T00:56:57.454402" elapsed="0.000468"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:57.455996" 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-10-11T00:56:57.455558" elapsed="0.000472"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:57.456091" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:56:57.456263" 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-10-11T00:56:57.455106" 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-10-11T00:56:57.456549" elapsed="0.000319"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:56:57.454221" elapsed="0.002700"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:57.457683" 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-10-11T00:56:57.457239" elapsed="0.000479"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:57.458881" 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-10-11T00:56:57.458387" elapsed="0.000528"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:57.458977" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:57.459151" 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-10-11T00:56:57.457954" elapsed="0.001228"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:57.459487" elapsed="0.000485"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:56:57.457059" elapsed="0.002966"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:57.460782" 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-10-11T00:56:57.460346" elapsed="0.000472"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:57.461949" 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-10-11T00:56:57.461512" elapsed="0.000471"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:57.462044" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:56:57.462218" 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-10-11T00:56:57.461057" 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-10-11T00:56:57.462497" elapsed="0.000247"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:56:57.460163" elapsed="0.002631"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:57.463526" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:56:57.463111" elapsed="0.000451"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:57.464706" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:56:57.464242" elapsed="0.000499"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:57.464803" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:56:57.464977" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:56:57.463815" 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-10-11T00:56:57.465244" elapsed="0.000298"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:56:57.462931" elapsed="0.002663"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:57.466303" 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-10-11T00:56:57.465932" elapsed="0.000405"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:57.467482" 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-10-11T00:56:57.467035" elapsed="0.000484"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:57.467580" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:57.467769" 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-10-11T00:56:57.466592" elapsed="0.001209"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:57.468029" elapsed="0.000229"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-10-11T00:56:57.465747" elapsed="0.002562"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:57.469053" 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-10-11T00:56:57.468675" elapsed="0.000415"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:57.470247" 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-10-11T00:56:57.469830" elapsed="0.000451"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:57.470342" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:57.470538" 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-10-11T00:56:57.469328" elapsed="0.001242"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:57.470818" elapsed="0.000240"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64496</var>
<status status="PASS" start="2026-10-11T00:56:57.468477" elapsed="0.002631"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:57.471875" 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-10-11T00:56:57.471468" elapsed="0.000440"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:57.473044" 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-10-11T00:56:57.472615" elapsed="0.000464"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:57.473141" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:56:57.473314" 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-10-11T00:56:57.472144" 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-10-11T00:56:57.473593" elapsed="0.000246"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.1.0.0/28</var>
<status status="PASS" start="2026-10-11T00:56:57.471250" elapsed="0.002640"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:56:57.451123" elapsed="0.022811"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:56:57.473989" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T00:56:57.474171" 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-10-11T00:56:57.449379" elapsed="0.024826"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:57.449018" elapsed="0.025227"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:57.474504" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:57.474277" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:57.448988" elapsed="0.025615"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:57.475979" 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-10-11T00:56:57.474842" elapsed="0.001174"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:56:57.476079" 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//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-10-11T00:56:57.441657" elapsed="0.034561"/>
</kw>
<msg time="2026-10-11T00:56:57.476287" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:57.430177" elapsed="0.046217"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:57.483220" 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-10-11T00:56:57.489801" 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-10-11T00:56:57.496223" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:57.496505" 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-10-11T00:56:57.496781" 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-10-11T00:56:57.497269" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:57.497065" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:57.497045" 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-10-11T00:56:57.497611" elapsed="0.000039"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:57.497882" 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-10-11T00:56:57.498111" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:56:57.497005" elapsed="0.001173"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:56:57.496878" elapsed="0.001332"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:57.498443" elapsed="0.000030"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:57.498541" elapsed="0.000021"/>
</return>
<msg time="2026-10-11T00:56:57.498725" 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-10-11T00:56:57.428752" elapsed="0.070010"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:57.500387" 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-10-11T00:56:57.500097" elapsed="0.000408">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-10-11T00:56:57.500623" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:57.499591" elapsed="0.001082"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:57.501134" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:57.500763" elapsed="0.000444"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:57.501918" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:56:57.501535" elapsed="0.000407"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:57.501239" elapsed="0.000736"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:57.500739" elapsed="0.001255"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:57.502511" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:56:57.502156" elapsed="0.000379"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:56:57.502580" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:56:57.502737" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:56:57.499138" elapsed="0.003622"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:57.503860" 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-10-11T00:56:57.503674" elapsed="0.000244">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-10-11T00:56:57.504002" 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-10-11T00:56:57.503318" elapsed="0.000707"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:56:57.504186" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:56:57.504088" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:57.504071" elapsed="0.000192"/>
</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-10-11T00:56:57.504434" 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-10-11T00:56:57.504617" elapsed="0.000033"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:56:57.504691" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:56:57.504815" 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-10-11T00:56:57.503017" elapsed="0.001821"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:57.506079" 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-10-11T00:56:57.505855" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:57.506742" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:57.506311" 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="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:56:57.513323" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:56:57.513495" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:56:57.513587" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:57.507074" elapsed="0.006916">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:57.506844" elapsed="0.007225">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:57.514255" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:57.514100" elapsed="0.000246"/>
</branch>
<status status="FAIL" start="2026-10-11T00:56:57.506827" elapsed="0.007541">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:57.514752" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:57.514871" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:57.514838" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:57.514822" elapsed="0.000106"/>
</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-10-11T00:56:57.515070" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:56:57.515131" elapsed="0.000013"/>
</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-10-11T00:56:57.505124" elapsed="0.010102">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:57.515289" elapsed="0.000014"/>
</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-10-11T00:56:57.410473" elapsed="0.104901">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:57.515659" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:57.515479" elapsed="0.000245"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:57.515462" elapsed="0.000284"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:57.515775" elapsed="0.000013"/>
</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-10-11T00:56:57.408914" elapsed="0.106948">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:58.555050" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:58.554288" elapsed="0.000830"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:58.556785" 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-10-11T00:56:58.556290" elapsed="0.000641">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-10-11T00:56:58.557121" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:58.555519" elapsed="0.001654"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:58.558306" 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-10-11T00:56:58.557593" elapsed="0.000768"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:56:58.559046" 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-10-11T00:56:58.559488" 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-10-11T00:56:58.558794" elapsed="0.000753"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:58.560536" 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-10-11T00:56:58.560010" elapsed="0.000647"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:58.562809" 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-10-11T00:56:58.562219" elapsed="0.000685"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:56:58.563952" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:56:58.563300" elapsed="0.000706"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:58.565587" 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-10-11T00:56:58.564936" elapsed="0.000733"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:58.567572" 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-10-11T00:56:58.566804" elapsed="0.000843"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:58.567753" elapsed="0.000073"/>
</return>
<msg time="2026-10-11T00:56:58.568048" 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-10-11T00:56:58.566052" elapsed="0.002045"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:58.568498" elapsed="0.000416"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-10-11T00:56:58.564482" elapsed="0.004516"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:58.570173" 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-10-11T00:56:58.569554" elapsed="0.000673"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:58.572114" 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-10-11T00:56:58.571372" elapsed="0.000798"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:58.572268" elapsed="0.000061"/>
</return>
<msg time="2026-10-11T00:56:58.572590" 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-10-11T00:56:58.570681" elapsed="0.001984"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:58.573038" elapsed="0.000401"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:56:58.569219" elapsed="0.004306"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:58.574749" 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-10-11T00:56:58.574054" elapsed="0.000750"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:58.577041" 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-10-11T00:56:58.575987" elapsed="0.001112"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:58.577200" elapsed="0.000063"/>
</return>
<msg time="2026-10-11T00:56:58.577526" 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-10-11T00:56:58.575182" elapsed="0.002397"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:58.577976" elapsed="0.000369"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:56:58.573763" elapsed="0.004702"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:58.579260" 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-10-11T00:56:58.578887" elapsed="0.000406"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:58.580459" 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-10-11T00:56:58.580009" elapsed="0.000486"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:58.580556" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:58.580747" 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-10-11T00:56:58.579560" elapsed="0.001218"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:58.581009" elapsed="0.000229"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:56:58.578700" elapsed="0.002588"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:58.582078" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:56:58.581702" elapsed="0.000409"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:58.583237" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:56:58.582825" elapsed="0.000446"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:58.583333" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:56:58.583545" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:56:58.582346" elapsed="0.001232"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:58.583824" elapsed="0.000230"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:56:58.581498" elapsed="0.002607"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:58.584836" 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-10-11T00:56:58.584443" elapsed="0.000426"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:58.586020" 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-10-11T00:56:58.585568" elapsed="0.000490"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:58.586119" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:56:58.586290" 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-10-11T00:56:58.585104" elapsed="0.001217"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:58.586588" elapsed="0.000269"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-10-11T00:56:58.584240" elapsed="0.002669"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:58.587640" 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-10-11T00:56:58.587225" elapsed="0.000449"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:58.588808" 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-10-11T00:56:58.588344" elapsed="0.000499"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:58.588903" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:56:58.589075" 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-10-11T00:56:58.587917" elapsed="0.001189"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:58.589333" elapsed="0.000267"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64496</var>
<status status="PASS" start="2026-10-11T00:56:58.587044" elapsed="0.002623"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:58.590351" 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-10-11T00:56:58.589982" elapsed="0.000403"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:58.591581" 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-10-11T00:56:58.591108" elapsed="0.000509"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:58.591708" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T00:56:58.591893" 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-10-11T00:56:58.590659" elapsed="0.001266"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:58.592158" elapsed="0.000234"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.1.0.0/28</var>
<status status="PASS" start="2026-10-11T00:56:58.589802" elapsed="0.002680"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:56:58.564111" elapsed="0.028417"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:56:58.592582" elapsed="0.000295"/>
</return>
<msg time="2026-10-11T00:56:58.593033" 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-10-11T00:56:58.561390" elapsed="0.031678"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:58.560813" elapsed="0.032298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:58.593363" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:58.593145" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:58.560766" elapsed="0.032733"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:58.594687" 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-10-11T00:56:58.593753" elapsed="0.000973"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:56:58.594946" 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/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-10-11T00:56:58.553052" elapsed="0.042043"/>
</kw>
<msg time="2026-10-11T00:56:58.595168" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:58.541472" elapsed="0.053764"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:58.601736" 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//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-10-11T00:56:58.608059" 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-10-11T00:56:58.614372" elapsed="0.000048"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:58.614658" 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-10-11T00:56:58.614916" 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-10-11T00:56:58.615391" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:58.615189" elapsed="0.000293"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:58.615170" elapsed="0.000342"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:58.615752" 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-10-11T00:56:58.616000" 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-10-11T00:56:58.616228" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:56:58.615131" elapsed="0.001162"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:56:58.615008" elapsed="0.001317"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:58.616592" elapsed="0.000050"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:58.616727" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:56:58.616881" 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-10-11T00:56:58.540020" elapsed="0.076886"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:58.618091" 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-10-11T00:56:58.617883" elapsed="0.000277">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-10-11T00:56:58.618242" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:58.617536" elapsed="0.000729"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:58.618563" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:58.618327" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:58.619115" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:56:58.618850" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:58.618666" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:58.618310" elapsed="0.000880"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:58.619747" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:56:58.619352" elapsed="0.000422"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:56:58.619819" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:56:58.619943" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:56:58.617210" elapsed="0.002756"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:58.621088" 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-10-11T00:56:58.620897" elapsed="0.000250">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-10-11T00:56:58.621231" 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-10-11T00:56:58.620551" elapsed="0.000703"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:56:58.621441" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-10-11T00:56:58.621321" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:58.621304" elapsed="0.000220"/>
</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-10-11T00:56:58.621697" 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-10-11T00:56:58.621878" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:56:58.621936" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:56:58.622060" 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-10-11T00:56:58.620220" elapsed="0.001863"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:58.623516" 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-10-11T00:56:58.623093" elapsed="0.000468"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:58.623991" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:58.623769" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:56:58.630545" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:56:58.630706" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:56:58.630796" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:58.624322" elapsed="0.006885">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:58.624092" elapsed="0.007200">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:58.631508" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:58.631324" elapsed="0.000249"/>
</branch>
<status status="FAIL" start="2026-10-11T00:56:58.624074" elapsed="0.007521">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:58.631948" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:58.632069" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:58.632036" elapsed="0.000069"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:58.632020" elapsed="0.000105"/>
</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-10-11T00:56:58.632267" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:56:58.632328" 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-10-11T00:56:58.622365" elapsed="0.010073">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:58.632515" elapsed="0.000014"/>
</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-10-11T00:56:58.521386" elapsed="0.111215">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:58.632860" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:58.632697" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:58.632681" elapsed="0.000263"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:58.632973" elapsed="0.000013"/>
</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-10-11T00:56:58.519851" elapsed="0.113208">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:59.671762" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:56:59.671003" elapsed="0.000826"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:59.673519" 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-10-11T00:56:59.673054" elapsed="0.000635">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-10-11T00:56:59.673881" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:59.672197" elapsed="0.001736"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:59.675192" 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-10-11T00:56:59.674459" elapsed="0.000790"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:56:59.675960" 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-10-11T00:56:59.676253" 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-10-11T00:56:59.675706" elapsed="0.000603"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:59.677444" 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-10-11T00:56:59.676883" elapsed="0.000662"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:59.679736" 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-10-11T00:56:59.679155" elapsed="0.000677"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:56:59.680857" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:56:59.680228" elapsed="0.000683"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:59.681996" 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-10-11T00:56:59.681606" elapsed="0.000424"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:59.683204" 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-10-11T00:56:59.682744" elapsed="0.000494"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:59.683304" elapsed="0.000047"/>
</return>
<msg time="2026-10-11T00:56:59.683526" 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-10-11T00:56:59.682265" elapsed="0.001293"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:59.683892" elapsed="0.000252"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-10-11T00:56:59.681350" elapsed="0.002845"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:59.684927" 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-10-11T00:56:59.684535" elapsed="0.000426"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:59.686187" 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-10-11T00:56:59.685735" elapsed="0.000486"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:59.686282" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:56:59.686496" 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-10-11T00:56:59.685193" 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-10-11T00:56:59.686793" elapsed="0.000229"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:56:59.684332" elapsed="0.002739"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:59.687796" 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-10-11T00:56:59.687385" elapsed="0.000445"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:59.689232" 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-10-11T00:56:59.688538" elapsed="0.000729"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:59.689328" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:59.689571" 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-10-11T00:56:59.688061" 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-10-11T00:56:59.689877" elapsed="0.000232"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:56:59.687207" elapsed="0.002954"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:59.690892" 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-10-11T00:56:59.690500" elapsed="0.000426"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:59.692048" 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-10-11T00:56:59.691634" elapsed="0.000448"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:59.692185" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:56:59.692360" 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-10-11T00:56:59.691158" elapsed="0.001234"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:59.692682" elapsed="0.000232"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:56:59.690296" elapsed="0.002669"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:59.693700" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:56:59.693279" elapsed="0.000456"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:59.694882" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:56:59.694395" elapsed="0.000521"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:59.694977" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:59.695149" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:56:59.693968" elapsed="0.001212"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:59.695450" elapsed="0.000270"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:56:59.693100" elapsed="0.002670"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:59.696489" 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-10-11T00:56:59.696087" elapsed="0.000436"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:59.697674" 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-10-11T00:56:59.697208" elapsed="0.000501"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:59.697770" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:56:59.697941" 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-10-11T00:56:59.696777" 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-10-11T00:56:59.698198" elapsed="0.000269"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-10-11T00:56:59.695907" elapsed="0.002624"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:59.699307" 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-10-11T00:56:59.698937" elapsed="0.000403"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:59.700551" 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-10-11T00:56:59.700053" elapsed="0.000531"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:59.700663" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:59.700834" 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-10-11T00:56:59.699604" 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-10-11T00:56:59.701091" elapsed="0.000229"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64496</var>
<status status="PASS" start="2026-10-11T00:56:59.698728" elapsed="0.002642"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:56:59.702191" 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-10-11T00:56:59.701763" elapsed="0.000559"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:56:59.703553" 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-10-11T00:56:59.703104" elapsed="0.000484"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:56:59.703667" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:56:59.703841" 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-10-11T00:56:59.702642" elapsed="0.001237"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:56:59.704108" elapsed="0.000473"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.1.0.0/28</var>
<status status="PASS" start="2026-10-11T00:56:59.701538" elapsed="0.003110"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:56:59.681012" elapsed="0.023680"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:56:59.704746" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T00:56:59.704934" 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-10-11T00:56:59.678288" elapsed="0.026680"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:59.677716" elapsed="0.027348"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:59.705320" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:59.705098" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:59.677672" elapsed="0.027773"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:56:59.706593" 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-10-11T00:56:59.705692" elapsed="0.000957"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:56:59.706711" 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/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-10-11T00:56:59.669779" elapsed="0.037072"/>
</kw>
<msg time="2026-10-11T00:56:59.706920" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:56:59.658274" elapsed="0.048709"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:56:59.713456" 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/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-10-11T00:56:59.719983" 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-10-11T00:56:59.726307" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:59.726580" 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-10-11T00:56:59.726847" 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-10-11T00:56:59.727320" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:59.727116" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:59.727097" elapsed="0.000343"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:59.727682" 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-10-11T00:56:59.727935" 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-10-11T00:56:59.728174" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:56:59.727062" elapsed="0.001179"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:56:59.726938" elapsed="0.001335"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:59.728503" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:59.728596" elapsed="0.000052"/>
</return>
<msg time="2026-10-11T00:56:59.728831" 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-10-11T00:56:59.656875" elapsed="0.071992"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:59.730307" 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-10-11T00:56:59.730124" elapsed="0.000243">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-10-11T00:56:59.730466" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:56:59.729770" elapsed="0.000720"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:56:59.730785" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:59.730553" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:56:59.731300" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:56:59.731041" elapsed="0.000283"/>
</kw>
<status status="PASS" start="2026-10-11T00:56:59.730858" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:59.730536" elapsed="0.000839"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:56:59.731900" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:56:59.731551" elapsed="0.000373"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:56:59.731968" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:56:59.732099" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:56:59.729244" elapsed="0.002881"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:56:59.733218" 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-10-11T00:56:59.733034" elapsed="0.000243">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-10-11T00:56:59.733360" 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-10-11T00:56:59.732707" elapsed="0.000675"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:56:59.733566" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-11T00:56:59.733463" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-10-11T00:56:59.733445" elapsed="0.000210"/>
</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-10-11T00:56:59.733814" elapsed="0.000019"/>
</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-10-11T00:56:59.733990" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:56:59.734047" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:56:59.734170" 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-10-11T00:56:59.732378" elapsed="0.001815"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:59.736549" 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-10-11T00:56:59.736306" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:56:59.737013" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:56:59.736797" elapsed="0.000255"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:56:59.743053" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:56:59.743222" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:56:59.743320" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:59.737338" elapsed="0.006375">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:59.737111" elapsed="0.006679">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:59.743979" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:59.743822" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-10-11T00:56:59.737095" elapsed="0.006964">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:59.744397" elapsed="0.000046"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:59.744546" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:56:59.744512" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:59.744494" elapsed="0.000110"/>
</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-10-11T00:56:59.744759" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:56:59.744821" 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-10-11T00:56:59.734494" elapsed="0.010421">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:59.744979" 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-10-11T00:56:59.638710" elapsed="0.106354">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:56:59.745307" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:56:59.745144" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:56:59.745128" elapsed="0.000266"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:56:59.745441" elapsed="0.000014"/>
</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-10-11T00:56:59.637139" elapsed="0.108395">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:57:00.784253" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:00.783522" elapsed="0.000799"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:00.786061" 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-10-11T00:57:00.785624" elapsed="0.000584">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-10-11T00:57:00.786398" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:00.784851" elapsed="0.001630"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:00.787629" 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-10-11T00:57:00.786892" elapsed="0.000795"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:00.788311" 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-10-11T00:57:00.788654" 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-10-11T00:57:00.788062" elapsed="0.000649"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:00.789695" 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-10-11T00:57:00.789147" elapsed="0.000647"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:00.792043" 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-10-11T00:57:00.791395" elapsed="0.000746"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:57:00.793163" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:57:00.792568" elapsed="0.000650"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:00.794293" 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-10-11T00:57:00.793896" elapsed="0.000432"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:00.795530" 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-10-11T00:57:00.795042" elapsed="0.000523"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:00.795645" elapsed="0.000048"/>
</return>
<msg time="2026-10-11T00:57:00.795834" 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-10-11T00:57:00.794588" elapsed="0.001277"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:00.796098" elapsed="0.000250"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-10-11T00:57:00.793707" elapsed="0.002691"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:00.797130" 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-10-11T00:57:00.796758" elapsed="0.000405"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:00.798314" 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-10-11T00:57:00.797895" elapsed="0.000454"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:00.798447" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:57:00.798642" 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-10-11T00:57:00.797443" elapsed="0.001232"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:00.798904" elapsed="0.000231"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:57:00.796560" elapsed="0.002625"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:00.799917" 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-10-11T00:57:00.799525" elapsed="0.000425"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:00.801085" 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-10-11T00:57:00.800666" elapsed="0.000453"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:00.801181" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:57:00.801356" 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-10-11T00:57:00.800185" 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-10-11T00:57:00.801718" elapsed="0.000459"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:57:00.799322" elapsed="0.002908"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:00.802968" 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-10-11T00:57:00.802574" elapsed="0.000427"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:00.804142" 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-10-11T00:57:00.803722" elapsed="0.000454"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:00.804237" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:57:00.804450" 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-10-11T00:57:00.803237" elapsed="0.001247"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:00.804736" elapsed="0.000232"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:57:00.802368" elapsed="0.002651"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:00.805749" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:57:00.805337" elapsed="0.000445"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:00.806920" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:57:00.806474" elapsed="0.000480"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:00.807016" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:57:00.807187" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:57:00.806018" 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-10-11T00:57:00.807485" elapsed="0.000247"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:57:00.805156" elapsed="0.002627"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:00.808508" 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-10-11T00:57:00.808107" elapsed="0.000435"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:00.809757" 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-10-11T00:57:00.809223" elapsed="0.000574"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:00.809860" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:57:00.810034" 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-10-11T00:57:00.808795" elapsed="0.001271"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:00.810299" elapsed="0.000270"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-10-11T00:57:00.807919" elapsed="0.002717"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:00.811345" 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-10-11T00:57:00.810962" elapsed="0.000417"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:00.812570" 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-10-11T00:57:00.812115" elapsed="0.000504"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:00.812683" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:57:00.812881" 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-10-11T00:57:00.811666" elapsed="0.001248"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:00.813144" elapsed="0.000233"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64496</var>
<status status="PASS" start="2026-10-11T00:57:00.810775" elapsed="0.002683"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:00.814173" 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-10-11T00:57:00.813791" elapsed="0.000415"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:00.815340" 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-10-11T00:57:00.814922" elapsed="0.000453"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:00.815467" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:57:00.815658" 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-10-11T00:57:00.814473" elapsed="0.001217"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:00.815921" elapsed="0.000231"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.1.0.0/28</var>
<status status="PASS" start="2026-10-11T00:57:00.813609" elapsed="0.002737"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:57:00.793316" elapsed="0.023080"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:57:00.816493" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:57:00.816701" 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-10-11T00:57:00.790625" elapsed="0.026110"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:00.789963" elapsed="0.026813"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:00.817022" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:00.816809" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:00.789896" elapsed="0.027224"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:00.818533" 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-10-11T00:57:00.817345" elapsed="0.001227"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:57:00.818651" 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/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-10-11T00:57:00.782299" elapsed="0.036494"/>
</kw>
<msg time="2026-10-11T00:57:00.818863" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:00.770806" elapsed="0.048124"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:57:00.825563" 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/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-10-11T00:57:00.831940" 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-10-11T00:57:00.838380" elapsed="0.000050"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:00.838669" 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-10-11T00:57:00.838928" 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-10-11T00:57:00.839405" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:00.839201" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:00.839182" 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-10-11T00:57:00.839768" 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-10-11T00:57:00.840020" 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-10-11T00:57:00.840296" elapsed="0.000027"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:57:00.839145" elapsed="0.001219"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:57:00.839021" elapsed="0.001376"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:00.840645" elapsed="0.000027"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:00.840740" elapsed="0.000021"/>
</return>
<msg time="2026-10-11T00:57:00.840900" 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-10-11T00:57:00.769353" elapsed="0.071582"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:00.842546" 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-10-11T00:57:00.842240" elapsed="0.000414">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-10-11T00:57:00.842772" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:00.841779" elapsed="0.001024"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:00.843208" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:00.842890" elapsed="0.000388"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:00.843991" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:00.843587" elapsed="0.000438"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:00.843310" elapsed="0.000759"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:00.842866" elapsed="0.001231"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:00.844902" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:00.844324" elapsed="0.000602"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:57:00.844969" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:00.845092" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:57:00.841311" elapsed="0.003803"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:00.846205" 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-10-11T00:57:00.846023" elapsed="0.000240">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-10-11T00:57:00.846347" 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-10-11T00:57:00.845702" elapsed="0.000667"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:57:00.846553" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:57:00.846453" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:00.846435" elapsed="0.000207"/>
</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-10-11T00:57:00.846796" elapsed="0.000020"/>
</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-10-11T00:57:00.846971" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:57:00.847030" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:57:00.847155" 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-10-11T00:57:00.845368" elapsed="0.001810"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:00.848446" 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-10-11T00:57:00.848202" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:00.849144" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:00.848726" elapsed="0.000462"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:57:00.855823" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:00.855967" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:57:00.856057" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:57:00.849504" elapsed="0.006929">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:57:00.849252" elapsed="0.007259">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:57:00.856723" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:00.856542" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-10-11T00:57:00.849234" elapsed="0.007571">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:57:00.857151" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:00.857271" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:00.857238" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:00.857222" elapsed="0.000106"/>
</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-10-11T00:57:00.857487" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:57:00.857552" 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-10-11T00:57:00.847480" elapsed="0.010181">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:57:00.857727" elapsed="0.000014"/>
</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-10-11T00:57:00.751103" elapsed="0.106708">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:57:00.858057" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:00.857893" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:00.857877" elapsed="0.000266"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:00.858172" elapsed="0.000014"/>
</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-10-11T00:57:00.749517" elapsed="0.108741">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:57:01.897521" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:01.896783" elapsed="0.000828"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:01.899218" 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-10-11T00:57:01.898772" elapsed="0.000598">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-10-11T00:57:01.899620" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:01.897989" elapsed="0.001684"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:01.900819" 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-10-11T00:57:01.900066" elapsed="0.000810"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:01.901535" 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-10-11T00:57:01.901866" 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-10-11T00:57:01.901251" elapsed="0.000670"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:01.902921" 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-10-11T00:57:01.902365" elapsed="0.000653"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:01.904630" 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-10-11T00:57:01.904252" elapsed="0.000440"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:57:01.905297" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:57:01.904939" elapsed="0.000391"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:01.906243" 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-10-11T00:57:01.905868" elapsed="0.000409"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:01.907504" 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-10-11T00:57:01.906984" elapsed="0.000556"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:01.907661" elapsed="0.000049"/>
</return>
<msg time="2026-10-11T00:57:01.907853" 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-10-11T00:57:01.906534" elapsed="0.001352"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:01.908119" elapsed="0.000254"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-10-11T00:57:01.905677" elapsed="0.002767"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:01.909270" 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-10-11T00:57:01.908884" elapsed="0.000420"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:01.910529" 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-10-11T00:57:01.910073" elapsed="0.000492"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:01.910641" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:57:01.910814" 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-10-11T00:57:01.909601" 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-10-11T00:57:01.911074" elapsed="0.000232"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:57:01.908624" elapsed="0.002732"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:01.912154" 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-10-11T00:57:01.911777" elapsed="0.000411"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:01.913550" 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-10-11T00:57:01.912900" elapsed="0.000699"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:01.913664" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:57:01.913839" 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-10-11T00:57:01.912448" elapsed="0.001424"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:01.914102" elapsed="0.000232"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:57:01.911577" elapsed="0.002807"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:01.915121" 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-10-11T00:57:01.914746" elapsed="0.000409"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:01.916283" 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-10-11T00:57:01.915864" elapsed="0.000454"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:01.916380" elapsed="0.000073"/>
</return>
<msg time="2026-10-11T00:57:01.916628" 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-10-11T00:57:01.915386" elapsed="0.001276"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:01.916892" elapsed="0.000297"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:57:01.914542" elapsed="0.002699"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:01.917967" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:57:01.917578" elapsed="0.000422"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:01.919218" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:57:01.918761" elapsed="0.000493"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:01.919318" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:57:01.919537" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:57:01.918232" elapsed="0.001338"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:01.919827" elapsed="0.000241"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:57:01.917376" elapsed="0.002743"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:01.920905" 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-10-11T00:57:01.920461" elapsed="0.000477"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:01.922166" 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-10-11T00:57:01.921712" elapsed="0.000487"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:01.922262" elapsed="0.000044"/>
</return>
<msg time="2026-10-11T00:57:01.922479" 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-10-11T00:57:01.921177" elapsed="0.001342"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:01.922819" elapsed="0.000232"/>
</kw>
<var name="${key}">AS_NUMBER</var>
<var name="${value}">65432</var>
<status status="PASS" start="2026-10-11T00:57:01.920258" elapsed="0.002845"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:01.924054" 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-10-11T00:57:01.923486" elapsed="0.000602"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:01.925226" 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-10-11T00:57:01.924805" elapsed="0.000454"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:01.925321" elapsed="0.000044"/>
</return>
<msg time="2026-10-11T00:57:01.925536" 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-10-11T00:57:01.924322" elapsed="0.001246"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:01.925819" elapsed="0.000230"/>
</kw>
<var name="${key}">PEER_AS</var>
<var name="${value}">64496</var>
<status status="PASS" start="2026-10-11T00:57:01.923238" elapsed="0.002860"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:01.926845" 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-10-11T00:57:01.926434" elapsed="0.000506"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:01.928102" 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-10-11T00:57:01.927679" elapsed="0.000458"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:01.928199" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:57:01.928371" 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-10-11T00:57:01.927181" 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-10-11T00:57:01.928684" elapsed="0.000231"/>
</kw>
<var name="${key}">PREFIXLEN</var>
<var name="${value}">8.1.0.0/28</var>
<status status="PASS" start="2026-10-11T00:57:01.926236" elapsed="0.002731"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:57:01.905398" elapsed="0.023613"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:57:01.929065" elapsed="0.000266"/>
</return>
<msg time="2026-10-11T00:57:01.929519" 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-10-11T00:57:01.903772" elapsed="0.025783"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:01.903167" elapsed="0.026446"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:01.929863" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:01.929649" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:01.903122" elapsed="0.026840"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:01.931115" 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-10-11T00:57:01.930187" elapsed="0.000966"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:57:01.931215" 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//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-10-11T00:57:01.895527" elapsed="0.035828"/>
</kw>
<msg time="2026-10-11T00:57:01.931458" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:01.883817" elapsed="0.047709"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:57:01.937924" 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-10-11T00:57:01.944220" 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-10-11T00:57:01.950122" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:01.950304" 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-10-11T00:57:01.950503" 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-10-11T00:57:01.950901" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:01.950753" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:01.950737" 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-10-11T00:57:01.951136" 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-10-11T00:57:01.951318" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:01.951497" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:57:01.950709" elapsed="0.000838"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:57:01.950614" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:01.951735" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:01.951802" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:57:01.951916" 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-10-11T00:57:01.882296" elapsed="0.069645"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:01.953080" 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-10-11T00:57:01.952873" elapsed="0.000276">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-10-11T00:57:01.953238" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:01.952528" elapsed="0.000733"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:01.953560" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:01.953323" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:01.954104" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:01.953835" elapsed="0.000293"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:01.953649" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:01.953307" elapsed="0.000872"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:01.954710" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:01.954338" elapsed="0.000396"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:57:01.954778" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:57:01.954899" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:57:01.952211" elapsed="0.002712"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:01.956005" 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-10-11T00:57:01.955823" elapsed="0.000239">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-10-11T00:57:01.956145" 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-10-11T00:57:01.955489" elapsed="0.000679"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:57:01.956326" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-10-11T00:57:01.956229" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:01.956213" elapsed="0.000213"/>
</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-10-11T00:57:01.956583" 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-10-11T00:57:01.956771" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:57:01.956861" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:57:01.956989" 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-10-11T00:57:01.955176" elapsed="0.001836"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:01.958492" 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-10-11T00:57:01.958021" elapsed="0.000524"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:01.958974" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:01.958756" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:57:01.965648" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:01.965795" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:57:01.965884" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:57:01.959303" elapsed="0.006990">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:57:01.959074" elapsed="0.007296">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:57:01.966578" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:01.966402" elapsed="0.000254"/>
</branch>
<status status="FAIL" start="2026-10-11T00:57:01.959057" elapsed="0.007620">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:57:01.967020" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:01.967138" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:01.967106" elapsed="0.000068"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:01.967090" elapsed="0.000103"/>
</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-10-11T00:57:01.967334" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:57:01.967394" elapsed="0.000027"/>
</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-10-11T00:57:01.957292" elapsed="0.010212">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:57:01.967573" elapsed="0.000025"/>
</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-10-11T00:57:01.863955" elapsed="0.103715">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:57:01.967948" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:01.967753" elapsed="0.000260"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:01.967737" elapsed="0.000298"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:01.968065" elapsed="0.000013"/>
</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-10-11T00:57:01.862359" elapsed="0.105799">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:57:01.968248" 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.173: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-10-11T00:56:51.902313" elapsed="10.066023">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.173: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-10-11T00:57:01.969677" level="INFO">${SuiteFastFail} = True</msg>
<arg>${SuiteFastFail}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:57:01.969356" 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-10-11T00:57:01.968972" elapsed="0.000793"/>
</kw>
<doc>Set suite fail fast behavior on, if current test case has failed.</doc>
<status status="PASS" start="2026-10-11T00:57:01.968672" elapsed="0.001143"/>
</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-10-11T00:56:51.821630" elapsed="10.148220">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.173: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-10-11T00:57:01.971364" elapsed="0.000216"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:57:01.971106" elapsed="0.000602"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:01.972623" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:01.972521" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:01.972503" elapsed="0.000182"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:01.975057" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:01.974973" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:01.974956" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:01.976079" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:01.975751" elapsed="0.000354"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:57:01.976551" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:57:01.976262" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:57:01.976629" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T00:57:01.976759" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:57:01.975336" elapsed="0.001446"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:01.979427" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:01.979330" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:01.979313" elapsed="0.000178"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:01.980553" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:01.980469" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:01.980452" elapsed="0.000214"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:57:01.980988" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:57:01.980818" elapsed="0.000194"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:57:01.981319" 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-10-11T00:57:01.981178" elapsed="0.000165"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:57:02.016314" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:57:01.981869" elapsed="0.034557"/>
</kw>
<msg time="2026-10-11T00:57:02.016580" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:57:02.016637" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:01.981520" elapsed="0.035153"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:57:02.053683" 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-10-11T00:57:02.017208" elapsed="0.036634"/>
</kw>
<msg time="2026-10-11T00:57:02.054027" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:57:02.054110" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:02.016862" elapsed="0.037283"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.054506" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:02.054217" elapsed="0.000355"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.054198" elapsed="0.000448"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.055164" 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-10-11T00:57:02.054927" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.055515" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:02.055292" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.055276" elapsed="0.000321"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:57:02.055628" 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-10-11T00:57:02.058167" elapsed="0.000118"/>
</kw>
<msg time="2026-10-11T00:57:02.058344" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:02.057014" 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-10-11T00:57:02.058833" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.059171" 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-10-11T00:57:02.056386" elapsed="0.003001"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:57:02.055919" elapsed="0.003548"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:57:01.980193" elapsed="0.079348"/>
</kw>
<msg time="2026-10-11T00:57:02.059657" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:02.059698" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:01.979665" elapsed="0.080070"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:57:02.059903" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:57:02.059809" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.059789" elapsed="0.000193"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.060338" 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-10-11T00:57:02.060825" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:57:02.060892" 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-10-11T00:57:01.979047" elapsed="0.081937"/>
</kw>
<msg time="2026-10-11T00:57:02.061068" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:02.061108" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:01.977112" elapsed="0.084031"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.061523" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:02.061211" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.061195" elapsed="0.000416"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:57:01.976969" elapsed="0.084664"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:57:01.976829" elapsed="0.084836"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:57:01.974676" elapsed="0.087039"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:57:01.972252" elapsed="0.089514"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:01.971859" elapsed="0.089947"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:57:01.970759" elapsed="0.091094"/>
</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-10-11T00:57:02.062029" elapsed="0.000100"/>
</kw>
<kw name="Kill_BGP_Speaker" owner="BGPSpeaker">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.063318" 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-10-11T00:57:02.063004" 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-10-11T00:57:02.063511" 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-10-11T00:57:02.062725" elapsed="0.001064"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:57:02.086921" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-10-11T00:57:02.064288" elapsed="0.022712"/>
</kw>
<msg time="2026-10-11T00:57:02.087124" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:02.087175" level="INFO">${message} = [?2004l^C
[?2004h[jenkins@releng-26932-423-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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:02.063955" elapsed="0.023257"/>
</kw>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:57:02.087936" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-10-11T00:57:02.101021" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:57:02.101106" level="INFO">${output_log} = 2026-10-11 00:56:39,772 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:56:39,773 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.3
2026-10-11 00:56:39,773 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-10-11T00:57:02.087816" elapsed="0.013314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.101598" level="INFO">2026-10-11 00:56:39,772 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:56:39,773 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.3
2026-10-11 00:56:39,773 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 00:56:39,773 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 00:56:39,773 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 00:56:39,773 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:56:39,774 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:56:39,774 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104ff9800b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:56:39,774 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:56:39,774 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 1
2026-10-11 00:56:39,775 INFO BGP-Thread-1 (job):   Prefix base: 8.0.0.0/28
2026-10-11 00:56:39,775 INFO BGP-Thread-1 (job):   My Autonomous System number: 64497
2026-10-11 00:56:39,775 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 00:56:39,775 INFO BGP-Thread-1 (job):   My BGP Identifier: 2130706435
2026-10-11 00:56:39,775 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 00:56:39,775 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 00:56:39,775 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 00:56:39,775 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 00:56:39,775 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 00:56:39,775 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 00:56:39,775 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 1
2026-10-11 00:56:39,775 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, 0]
2026-10-11 00:56:39,775 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 00:56:39,775 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 00:56:39,775 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 00:56:39,775 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:56:39,776 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-10-11 00:56:39,776 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 00:56:39,776 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 00:56:39,776 DEBUG BGP-Thread-1 (job):   My Autonomous System=64497 (0xfbf1)
2026-10-11 00:56:39,776 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 00:56:39,776 DEBUG BGP-Thread-1 (job):   BGP Identifier=2130706435 (0x7f000003)
2026-10-11 00:56:39,776 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-10-11 00:56:39,776 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf1
2026-10-11 00:56:39,776 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf100b47f000003100206010400010001020641040000fbf1'
2026-10-11 00:56:39,776 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf100b47f000003100206010400010001020641040000fbf1
2026-10-11 00:56:39,777 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:56:39,777 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:56:39,777 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:56:39,777 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:56:39,777 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:56:39,778 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:56:39,778 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:56:39,778 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:56:39,778 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:56:39,778 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:56:39,778 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 00:56:39,778 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 1
2026-10-11 00:56:39,778 DEBUG BGP-Thread-1 (job): ########## Iteration: 0 ##########
2026-10-11 00:56:39,778 DEBUG BGP-Thread-1 (job): Remaining prefixes: 1
2026-10-11 00:56:39,778 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:56:39,778 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:56:39,779 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-10-11 00:56:39,779 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:56:39,779 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:56:39,779 DEBUG BGP-Thread-1 (job):   Prefix indexes: [0]
2026-10-11 00:56:39,779 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.0.0.0')]
2026-10-11 00:56:39,779 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:56:39,779 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-10-11 00:56:39,780 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:56:39,780 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:56:39,780 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:56:39,780 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:56:39,781 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:56:39,781 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:56:39,782 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-10-11 00:56:39,783 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:56:39,783 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:56:39,783 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:56:39,783 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-10-11 00:56:39,784 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf140050400000064400304c0000201)
2026-10-11 00:56:39,784 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:56:39,784 DEBUG BGP-Thread-1 (job):     AS path=64497
2026-10-11 00:56:39,784 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:56:39,784 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.0.0.0')]/28 (0x1c08000000)
2026-10-11 00:56:39,784 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf140050400000064400304c00002011c08000000
2026-10-11 00:56:39,784 INFO BGP-Thread-1 (job): All update messages generated.
2026-10-11 00:56:39,784 INFO BGP-Thread-1 (job): Storing performance results.
2026-10-11 00:56:39,784 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-10-11 00:56:39,784 INFO BGP-Thread-1 (job): Number of iterations: 1
2026-10-11 00:56:39,784 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-10-11 00:56:39,784 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-10-11 00:56:39,785 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 1
2026-10-11 00:56:39,785 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.005606412887573242s
2026-10-11 00:56:39,785 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-10-11 00:56:39,785 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-10-11 00:56:39,785 INFO BGP-Thread-1 (job):   
2026-10-11 00:56:39,785 INFO BGP-Thread-1 (job):   
2026-10-11 00:56:39,785 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-10-11 00:56:39,785 INFO BGP-Thread-1 (job):   
2026-10-11 00:56:39,785 INFO BGP-Thread-1 (job):   
2026-10-11 00:56:39,786 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-10-11 00:56:39,786 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:56:39,786 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:56:39,786 DEBUG BGP-Thread-1 (job):   Length=43 (0x002b)
2026-10-11 00:56:39,786 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:56:39,786 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:56:39,786 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:56:39,786 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=20 (0x0014)
2026-10-11 00:56:39,786 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf140050400000064)
2026-10-11 00:56:39,786 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:56:39,786 DEBUG BGP-Thread-1 (job):     AS path=64497
2026-10-11 00:56:39,786 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:56:39,787 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-10-11 00:56:39,787 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff002b02000000144001010040020602010000fbf140050400000064
2026-10-11 00:56:39,787 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 00:56:39,787 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:56:39,787 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:56:39,787 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 00:56:39,787 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:56:39,787 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:56:39,787 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:56:39,787 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:56:39,787 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:56:39,788 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:56:39,788 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:56:39,788 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:56:39,788 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:56:39,788 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:56:39,788 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:56:39,788 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:56:39,788 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-10-11 00:56:39,788 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-10-11 00:56:39,788 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:56:39,788 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:56:39,788 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:56:49,799 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-10-11 00:56:49,799 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.010s
2026-10-11 00:56:49,799 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:56:49,799 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:56:49,799 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:56:59,809 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-10-11 00:56:59,810 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.020s
2026-10-11 00:56:59,810 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:56:59,810 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:56:59,810 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-10-11T00:57:02.101327" elapsed="0.000455"/>
</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-10-11T00:57:02.087479" elapsed="0.014354"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<status status="PASS" start="2026-10-11T00:57:02.101977" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:57:02.101890" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.101873" elapsed="0.000178"/>
</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-10-11T00:57:02.102235" elapsed="0.000019"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was not seen within timeout period.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.102402" elapsed="0.000040"/>
</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-10-11T00:57:02.062376" elapsed="0.040118"/>
</kw>
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.103273" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:57:02.102982" elapsed="0.000330"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-10-11T00:57:02.102681" elapsed="0.000683"/>
</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-10-11T00:57:02.103908" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Teardown].</doc>
<status status="PASS" start="2026-10-11T00:57:02.103629" elapsed="0.000538"/>
</kw>
<doc>Abort the Python speaker. Also, attempt to stop failing fast.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:57:01.970199" elapsed="0.134003"/>
</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-10-11T00:57:02.106042" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:57:02.105311" elapsed="0.000990"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:02.107268" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:02.107182" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.107164" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:02.109554" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:02.109471" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.109455" elapsed="0.000177"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.110536" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:02.110197" elapsed="0.000364"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.110989" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:57:02.110728" elapsed="0.000285"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:57:02.111052" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:57:02.111177" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:57:02.109842" elapsed="0.001357"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:02.113861" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:02.113777" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.113760" elapsed="0.000162"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:02.114962" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:02.114880" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.114863" elapsed="0.000160"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:57:02.115346" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:57:02.115174" elapsed="0.000196"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:57:02.115700" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:57:02.115554" elapsed="0.000170"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:57:02.146816" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:57:02.116208" elapsed="0.030737"/>
</kw>
<msg time="2026-10-11T00:57:02.147136" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:57:02.147178" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:02.115881" elapsed="0.031384"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:57:02.181913" 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-10-11T00:57:02.147890" elapsed="0.034124"/>
</kw>
<msg time="2026-10-11T00:57:02.182160" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:57:02.182201" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:02.147489" elapsed="0.034747"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.182556" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:02.182313" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.182290" elapsed="0.000370"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.183086" 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-10-11T00:57:02.182850" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.184859" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:02.184644" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.183198" elapsed="0.001737"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:57:02.184967" 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-10-11T00:57:02.187523" elapsed="0.000140"/>
</kw>
<msg time="2026-10-11T00:57:02.187720" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:02.186433" elapsed="0.001425"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.188164" elapsed="0.000072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.188521" elapsed="0.000084"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:57:02.185824" 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-10-11T00:57:02.185290" 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-10-11T00:57:02.114626" elapsed="0.074224"/>
</kw>
<msg time="2026-10-11T00:57:02.188930" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:02.188970" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:02.114079" elapsed="0.074926"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:57:02.189157" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:57:02.189072" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.189055" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.189619" 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-10-11T00:57:02.189925" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:57:02.189989" 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-10-11T00:57:02.113481" elapsed="0.076592"/>
</kw>
<msg time="2026-10-11T00:57:02.190155" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:02.190194" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:02.111552" elapsed="0.078677"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.190569" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:02.190295" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.190279" elapsed="0.000375"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:57:02.111392" elapsed="0.079283"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:57:02.111249" elapsed="0.079456"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:57:02.109167" elapsed="0.081587"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:57:02.106925" elapsed="0.083878"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:02.106507" elapsed="0.084335"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:57:02.104960" elapsed="0.085930"/>
</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-10-11T00:57:02.191056" elapsed="0.000095"/>
</kw>
<kw name="Kill_BGP_Speaker" owner="BGPSpeaker">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.192356" 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-10-11T00:57:02.192064" elapsed="0.000318"/>
</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-10-11T00:57:02.192549" elapsed="0.000201"/>
</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-10-11T00:57:02.191789" elapsed="0.001038"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:57:02.214870" level="INFO">[?2004l^C
[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="PASS" start="2026-10-11T00:57:02.193309" elapsed="0.021615"/>
</kw>
<msg time="2026-10-11T00:57:02.215007" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:02.215046" level="INFO">${message} = [?2004l^C
[?2004h[jenkins@releng-26932-423-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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:02.192979" elapsed="0.022089"/>
</kw>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:57:02.215710" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-10-11T00:57:02.228510" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:57:02.228612" level="INFO">${output_log} = 2026-10-11 00:56:39,772 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:56:39,773 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.3
2026-10-11 00:56:39,773 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-10-11T00:57:02.215565" elapsed="0.013072"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.229060" level="INFO">2026-10-11 00:56:39,772 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:56:39,773 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.3
2026-10-11 00:56:39,773 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 00:56:39,773 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 00:56:39,773 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 00:56:39,773 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:56:39,774 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:56:39,774 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104ff9800b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:56:39,774 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:56:39,774 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 1
2026-10-11 00:56:39,775 INFO BGP-Thread-1 (job):   Prefix base: 8.0.0.0/28
2026-10-11 00:56:39,775 INFO BGP-Thread-1 (job):   My Autonomous System number: 64497
2026-10-11 00:56:39,775 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 00:56:39,775 INFO BGP-Thread-1 (job):   My BGP Identifier: 2130706435
2026-10-11 00:56:39,775 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 00:56:39,775 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 00:56:39,775 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 00:56:39,775 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 00:56:39,775 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 00:56:39,775 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 00:56:39,775 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 1
2026-10-11 00:56:39,775 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, 0]
2026-10-11 00:56:39,775 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 00:56:39,775 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 00:56:39,775 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 00:56:39,775 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:56:39,776 DEBUG BGP-Thread-1 (job):   Length=45 (0x002d)
2026-10-11 00:56:39,776 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 00:56:39,776 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 00:56:39,776 DEBUG BGP-Thread-1 (job):   My Autonomous System=64497 (0xfbf1)
2026-10-11 00:56:39,776 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 00:56:39,776 DEBUG BGP-Thread-1 (job):   BGP Identifier=2130706435 (0x7f000003)
2026-10-11 00:56:39,776 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=16 (0x10)
2026-10-11 00:56:39,776 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x0206010400010001020641040000fbf1
2026-10-11 00:56:39,776 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff002d0104fbf100b47f000003100206010400010001020641040000fbf1'
2026-10-11 00:56:39,776 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff002d0104fbf100b47f000003100206010400010001020641040000fbf1
2026-10-11 00:56:39,777 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:56:39,777 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:56:39,777 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:56:39,777 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:56:39,777 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:56:39,778 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:56:39,778 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:56:39,778 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:56:39,778 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:56:39,778 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:56:39,778 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 00:56:39,778 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 1
2026-10-11 00:56:39,778 DEBUG BGP-Thread-1 (job): ########## Iteration: 0 ##########
2026-10-11 00:56:39,778 DEBUG BGP-Thread-1 (job): Remaining prefixes: 1
2026-10-11 00:56:39,778 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:56:39,778 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:56:39,779 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-10-11 00:56:39,779 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:56:39,779 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:56:39,779 DEBUG BGP-Thread-1 (job):   Prefix indexes: [0]
2026-10-11 00:56:39,779 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.0.0.0')]
2026-10-11 00:56:39,779 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:56:39,779 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-10-11 00:56:39,780 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:56:39,780 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:56:39,780 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:56:39,780 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:56:39,781 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:56:39,781 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:56:39,782 DEBUG BGP-Thread-1 (job):   Length=55 (0x0037)
2026-10-11 00:56:39,783 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:56:39,783 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:56:39,783 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:56:39,783 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=27 (0x001b)
2026-10-11 00:56:39,784 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf140050400000064400304c0000201)
2026-10-11 00:56:39,784 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:56:39,784 DEBUG BGP-Thread-1 (job):     AS path=64497
2026-10-11 00:56:39,784 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:56:39,784 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[IPv4Address('8.0.0.0')]/28 (0x1c08000000)
2026-10-11 00:56:39,784 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff0037020000001b4001010040020602010000fbf140050400000064400304c00002011c08000000
2026-10-11 00:56:39,784 INFO BGP-Thread-1 (job): All update messages generated.
2026-10-11 00:56:39,784 INFO BGP-Thread-1 (job): Storing performance results.
2026-10-11 00:56:39,784 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-10-11 00:56:39,784 INFO BGP-Thread-1 (job): Number of iterations: 1
2026-10-11 00:56:39,784 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-10-11 00:56:39,784 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-10-11 00:56:39,785 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 1
2026-10-11 00:56:39,785 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.005606412887573242s
2026-10-11 00:56:39,785 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-10-11 00:56:39,785 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-10-11 00:56:39,785 INFO BGP-Thread-1 (job):   
2026-10-11 00:56:39,785 INFO BGP-Thread-1 (job):   
2026-10-11 00:56:39,785 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-10-11 00:56:39,785 INFO BGP-Thread-1 (job):   
2026-10-11 00:56:39,785 INFO BGP-Thread-1 (job):   
2026-10-11 00:56:39,786 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-10-11 00:56:39,786 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:56:39,786 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:56:39,786 DEBUG BGP-Thread-1 (job):   Length=43 (0x002b)
2026-10-11 00:56:39,786 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:56:39,786 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:56:39,786 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:56:39,786 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=20 (0x0014)
2026-10-11 00:56:39,786 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf140050400000064)
2026-10-11 00:56:39,786 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:56:39,786 DEBUG BGP-Thread-1 (job):     AS path=64497
2026-10-11 00:56:39,786 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:56:39,787 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-10-11 00:56:39,787 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff002b02000000144001010040020602010000fbf140050400000064
2026-10-11 00:56:39,787 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 00:56:39,787 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:56:39,787 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:56:39,787 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 00:56:39,787 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:56:39,787 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:56:39,787 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:56:39,787 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:56:39,787 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:56:39,788 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:56:39,788 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:56:39,788 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:56:39,788 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:56:39,788 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:56:39,788 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:56:39,788 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:56:39,788 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-10-11 00:56:39,788 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-10-11 00:56:39,788 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:56:39,788 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:56:39,788 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:56:49,799 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-10-11 00:56:49,799 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.010s
2026-10-11 00:56:49,799 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:56:49,799 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:56:49,799 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:56:59,809 INFO BGP-Thread-1 (job): ... idle for 10.010s
2026-10-11 00:56:59,810 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.020s
2026-10-11 00:56:59,810 INFO BGP-Thread-1 (job): total_received_update_message_counter: 1
2026-10-11 00:56:59,810 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:56:59,810 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-10-11T00:57:02.228834" elapsed="0.000403"/>
</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-10-11T00:57:02.215240" elapsed="0.014049"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<status status="PASS" start="2026-10-11T00:57:02.229454" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:57:02.229345" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.229328" elapsed="0.000205"/>
</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-10-11T00:57:02.229740" elapsed="0.000019"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was not seen within timeout period.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.229919" elapsed="0.000019"/>
</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-10-11T00:57:02.191388" elapsed="0.038601"/>
</kw>
<kw name="Do_Not_Fail_Fast_From_Now_On" owner="FailFast">
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.230782" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:57:02.230474" elapsed="0.000347"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-10-11T00:57:02.230161" elapsed="0.000711"/>
</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-10-11T00:57:02.231384" elapsed="0.046802"/>
</kw>
<doc>This is just a more readable 'None' to override [Teardown].</doc>
<status status="PASS" start="2026-10-11T00:57:02.231105" elapsed="0.047178"/>
</kw>
<doc>Abort the Python speaker. Also, attempt to stop failing fast.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:57:02.104425" elapsed="0.173901"/>
</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-10-11T00:57:02.279928" elapsed="0.000227"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:57:02.279669" 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-10-11T00:57:02.281216" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:02.281100" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.281077" 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-10-11T00:57:02.283535" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:02.283452" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.283434" elapsed="0.000181"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.284531" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:02.284182" elapsed="0.000375"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.284987" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:57:02.284727" elapsed="0.000283"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:57:02.285049" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T00:57:02.285183" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:57:02.283824" elapsed="0.001381"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:02.288000" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:02.287916" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.287898" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:02.289132" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:02.289049" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.289032" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:57:02.289540" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:57:02.289342" elapsed="0.000222"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:57:02.289894" 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-10-11T00:57:02.289753" elapsed="0.000164"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:57:02.326307" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:57:02.290400" elapsed="0.036004"/>
</kw>
<msg time="2026-10-11T00:57:02.326575" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:57:02.326647" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:02.290073" elapsed="0.036690"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:57:02.363279" 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-10-11T00:57:02.327275" elapsed="0.036184"/>
</kw>
<msg time="2026-10-11T00:57:02.363666" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:57:02.363709" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:02.326936" elapsed="0.036808"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.364126" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:02.363842" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.363811" elapsed="0.000393"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.364702" 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-10-11T00:57:02.364390" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.365030" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:02.364830" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.364813" elapsed="0.000287"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:57:02.365133" 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-10-11T00:57:02.367773" elapsed="0.000120"/>
</kw>
<msg time="2026-10-11T00:57:02.367949" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:02.366659" 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-10-11T00:57:02.368391" elapsed="0.000094"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.368773" 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-10-11T00:57:02.366017" elapsed="0.002941"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:57:02.365494" elapsed="0.003524"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:57:02.288795" elapsed="0.080297"/>
</kw>
<msg time="2026-10-11T00:57:02.369177" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:02.369216" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:02.288213" elapsed="0.081038"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:57:02.369422" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:57:02.369319" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.369302" elapsed="0.000198"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.369856" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.370164" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:57:02.370229" 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-10-11T00:57:02.287628" elapsed="0.082688"/>
</kw>
<msg time="2026-10-11T00:57:02.370474" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:02.370522" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:02.285560" elapsed="0.085000"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.370887" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:02.370661" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.370644" elapsed="0.000361"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:57:02.285400" elapsed="0.085627"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:57:02.285257" elapsed="0.085801"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:57:02.283145" elapsed="0.087964"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:57:02.280813" elapsed="0.090347"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:02.280358" elapsed="0.090842"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:57:02.279258" elapsed="0.091990"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.372023" 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-10-11T00:57:02.371520" elapsed="0.000529"/>
</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-10-11T00:57:02.386641" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:02.386306" elapsed="0.000362"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:02.387354" 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-10-11T00:57:02.387151" elapsed="0.000288">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-10-11T00:57:02.387525" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:02.386830" elapsed="0.000718"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.388052" 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-10-11T00:57:02.387741" elapsed="0.000337"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:02.388364" 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-10-11T00:57:02.388521" 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-10-11T00:57:02.388253" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.388995" 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-10-11T00:57:02.388775" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.389976" 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-10-11T00:57:02.389742" elapsed="0.000276"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.390468" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:57:02.390204" elapsed="0.000289"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.391100" 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-10-11T00:57:02.390832" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:02.391830" 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-10-11T00:57:02.391639" elapsed="0.000215"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:02.391898" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:57:02.392025" 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-10-11T00:57:02.391295" elapsed="0.000754"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:02.392216" elapsed="0.000180"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T00:57:02.390694" elapsed="0.001754"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.393014" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:57:02.392745" elapsed="0.000294"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:02.393734" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:57:02.393535" elapsed="0.000223"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:02.393801" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:57:02.393926" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:57:02.393208" elapsed="0.000741"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:02.394113" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:57:02.392608" elapsed="0.001706"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:57:02.390540" elapsed="0.003806"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:57:02.394384" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:57:02.394527" 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-10-11T00:57:02.389353" elapsed="0.005198"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:02.389100" elapsed="0.005479"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.394764" elapsed="0.000169"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:02.394613" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.389083" elapsed="0.005901"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.395701" 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-10-11T00:57:02.395157" elapsed="0.000572"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:57:02.395772" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:57:02.385793" elapsed="0.010078"/>
</kw>
<msg time="2026-10-11T00:57:02.395919" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:02.381029" elapsed="0.014933"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:57:02.400487" 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/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-10-11T00:57:02.405059" 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/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-10-11T00:57:02.409522" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.409716" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.409896" 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-10-11T00:57:02.410263" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:02.410086" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:02.410073" 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-10-11T00:57:02.410508" 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-10-11T00:57:02.410704" 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-10-11T00:57:02.410870" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:57:02.410047" elapsed="0.000871"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:57:02.409961" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.411094" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:02.411160" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:57:02.411269" 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-10-11T00:57:02.380388" elapsed="0.030906"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.412377" 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-10-11T00:57:02.412137" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:57:02.422529" level="INFO">DELETE Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:02.422576" level="INFO">DELETE Response : url=http://10.30.170.173: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-10-11T00:57:02.422691" 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-10-11T00:57:02.412777" elapsed="0.009939"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:02.412514" elapsed="0.010238"/>
</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-10-11T00:57:02.422925" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:02.422775" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.412496" elapsed="0.010502"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.424214" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:02.423944" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:02.423691" elapsed="0.000595"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.423674" elapsed="0.000634"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.424902" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:02.424637" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:02.424356" elapsed="0.000618"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.424342" elapsed="0.000653"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.425537" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:02.425180" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.425873" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:02.425659" elapsed="0.000265"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.426375" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:02.426113" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:02.425946" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.425641" elapsed="0.000870"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.427044" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:02.426707" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.427342" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:02.427131" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.427876" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:02.427610" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:02.427430" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.427115" elapsed="0.000837"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:02.428098" elapsed="0.000293"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:57:02.428819" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:02.428574" elapsed="0.000269"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:57:02.429001" elapsed="0.000341"/>
</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-10-11T00:57:02.423321" elapsed="0.006078"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:57:02.429456" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:57:02.429642" 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-10-11T00:57:02.411561" elapsed="0.018105"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:57:02.429712" elapsed="0.000026"/>
</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-10-11T00:57:02.372256" elapsed="0.057551"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.430397" 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-10-11T00:57:02.430014" elapsed="0.000423"/>
</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-10-11T00:57:02.445005" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:02.444704" elapsed="0.000327"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:02.445709" 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-10-11T00:57:02.445521" elapsed="0.000250">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-10-11T00:57:02.445854" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:02.445188" elapsed="0.000689"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.446359" 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-10-11T00:57:02.446052" elapsed="0.000332"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:02.446686" 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-10-11T00:57:02.446804" 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-10-11T00:57:02.446566" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.447241" 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-10-11T00:57:02.447025" 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-10-11T00:57:02.448241" 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-10-11T00:57:02.448012" elapsed="0.000270"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.448731" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:57:02.448472" elapsed="0.000283"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.449329" 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-10-11T00:57:02.449067" elapsed="0.000286"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:02.450035" 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-10-11T00:57:02.449858" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:02.450105" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:57:02.450230" 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-10-11T00:57:02.449537" elapsed="0.000716"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:02.450436" elapsed="0.000181"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-10-11T00:57:02.448935" elapsed="0.001720"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.451297" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:57:02.450884" elapsed="0.000438"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:02.452021" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:57:02.451844" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:02.452089" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:02.452211" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:57:02.451511" elapsed="0.000723"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:02.452399" elapsed="0.000193"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:57:02.450753" elapsed="0.001879"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:57:02.448799" elapsed="0.003864"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:57:02.452702" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:57:02.452829" 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-10-11T00:57:02.447671" elapsed="0.005181"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:02.447377" elapsed="0.005504"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.453053" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:02.452902" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.447359" elapsed="0.005762"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.453807" 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-10-11T00:57:02.453281" elapsed="0.000553"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:57:02.453877" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:57:02.444167" elapsed="0.009809"/>
</kw>
<msg time="2026-10-11T00:57:02.454023" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:02.439389" elapsed="0.014677"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:57:02.458641" 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/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-10-11T00:57:02.463281" 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/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-10-11T00:57:02.467865" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.468051" 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-10-11T00:57:02.468239" 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-10-11T00:57:02.468611" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:02.468449" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:02.468434" 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-10-11T00:57:02.468849" 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-10-11T00:57:02.469038" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.469205" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:57:02.468394" elapsed="0.000858"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:57:02.468305" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.469448" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:02.469516" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:57:02.469654" 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-10-11T00:57:02.438774" elapsed="0.030905"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.470698" 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-10-11T00:57:02.470461" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:57:02.478526" level="INFO">DELETE Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01w6r2d988hs1d1ghqiwu23xqwt14.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:02.478599" level="INFO">DELETE Response : url=http://10.30.170.173: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-10-11T00:57:02.478702" 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-10-11T00:57:02.471029" elapsed="0.007698"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:02.470802" elapsed="0.007969"/>
</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-10-11T00:57:02.479018" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:02.478799" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.470786" elapsed="0.008310"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.480439" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:02.480126" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:02.479861" elapsed="0.000651"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.479843" elapsed="0.000691"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.481143" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:02.480877" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:02.480619" elapsed="0.000596"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.480569" elapsed="0.000668"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.481825" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:02.481453" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.482125" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:02.481913" elapsed="0.000264"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.482860" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:02.482364" elapsed="0.000521"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:02.482199" elapsed="0.000720"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.481897" elapsed="0.001041"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.483484" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:02.483123" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.483799" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:02.483572" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.484302" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:02.484039" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:02.483873" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.483556" elapsed="0.000823"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:02.484543" elapsed="0.000307"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:57:02.485249" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:02.485016" elapsed="0.000256"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:57:02.485443" elapsed="0.000228"/>
</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-10-11T00:57:02.479462" elapsed="0.006265"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:57:02.485770" elapsed="0.000033"/>
</return>
<msg time="2026-10-11T00:57:02.485949" 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-10-11T00:57:02.469911" elapsed="0.016061"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:57:02.486019" elapsed="0.000024"/>
</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-10-11T00:57:02.430654" elapsed="0.055460"/>
</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-10-11T00:57:02.487273" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:02.486937" elapsed="0.000391"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.486921" elapsed="0.000429"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:02.487508" elapsed="0.000300"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.490257" 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-10-11T00:57:02.489890" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-10-11T00:57:02.490475" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:57:02.490350" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.490333" elapsed="0.000216"/>
</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-10-11T00:57:02.490733" elapsed="0.000020"/>
</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-10-11T00:57:02.490920" elapsed="0.000019"/>
</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-10-11T00:57:02.491094" elapsed="0.000018"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.491263" elapsed="0.000019"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.491446" elapsed="0.000019"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message of the current test case.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:02.491647" 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-10-11T00:57:02.491866" elapsed="0.000018"/>
</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-10-11T00:57:02.489522" elapsed="0.002413"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:02.486740" elapsed="0.005241"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-10-11T00:57:02.486372" elapsed="0.005646"/>
</kw>
<doc>Delete peer configuration.</doc>
<status status="PASS" start="2026-10-11T00:57:02.278742" elapsed="0.213309"/>
</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-10-11T00:57:02.493640" level="INFO">Executing command 'ps -elf | egrep python | egrep 'play.py' | egrep -v grep'.</msg>
<msg time="2026-10-11T00:57:02.516756" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-10-11T00:57:02.516842" 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-10-11T00:57:02.493506" elapsed="0.023359"/>
</kw>
<return>
<value>${processes}</value>
<status status="PASS" start="2026-10-11T00:57:02.516908" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:57:02.517034" 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-10-11T00:57:02.493200" elapsed="0.023856"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.517510" level="INFO"/>
<arg>${processes}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:02.517264" elapsed="0.000286"/>
</kw>
<kw name="Kill_Remote_Processes" owner="KillPythonTool">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:57:02.518503" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:57:02.518573" 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-10-11T00:57:02.518053" elapsed="0.000553"/>
</kw>
<if>
<branch type="IF" condition="${arg_length} == 0">
<return>
<status status="PASS" start="2026-10-11T00:57:02.518758" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:57:02.518671" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:02.518654" elapsed="0.000177"/>
</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-10-11T00:57:02.519028" elapsed="0.000020"/>
</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-10-11T00:57:02.519248" elapsed="0.000018"/>
</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-10-11T00:57:02.519471" elapsed="0.000020"/>
</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-10-11T00:57:02.517778" elapsed="0.001771"/>
</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-10-11T00:57:02.492947" elapsed="0.026661"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-10-11T00:57:02.519810" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects </doc>
<status status="PASS" start="2026-10-11T00:57:02.519744" elapsed="0.000298"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-10-11T00:57:02.520194" elapsed="0.000548"/>
</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-10-11T00:57:02.492698" elapsed="0.028097"/>
</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-10-11T00:54:34.387060" elapsed="148.133763"/>
</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-10-11T00:57:02.543813" elapsed="0.000314"/>
</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-10-11T00:57:02.545698" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:57:02.545775" 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-10-11T00:57:02.545405" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:02.545939" elapsed="0.000304"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:57:02.547026" level="INFO">Logging into '10.30.171.7:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:57:03.172391" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Sun Oct 11 00:57:02 UTC 2026

  System load:  0.0                Processes:             107
  Usage of /:   19.9% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.7
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:52:10 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:57:02.546791" elapsed="0.625806"/>
</kw>
<msg time="2026-10-11T00:57:03.172700" 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-10-11T00:57:02.546400" elapsed="0.626392"/>
</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-10-11T00:57:02.545048" elapsed="0.627877"/>
</kw>
<msg time="2026-10-11T00:57:03.172992" 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-10-11T00:57:02.544648" elapsed="0.628403"/>
</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-10-11T00:57:02.544313" elapsed="0.628834"/>
</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-10-11T00:57:03.177769" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:03.177318" 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-10-11T00:57:03.179639" level="INFO">Executing command 'cd '.' &amp;&amp; virtualenv /tmp/defaultvenv'.</msg>
<msg time="2026-10-11T00:57:03.414766" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:57:03.415107" 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-10-11T00:57:03.415206" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T00:57:03.415291" 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-10-11T00:57:03.179382" elapsed="0.235959"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:57:03.417300" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T00:57:03.416732" elapsed="0.000666"/>
</kw>
<msg time="2026-10-11T00:57:03.417649" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T00:57:03.417741" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:03.415864" elapsed="0.001924"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:03.419044" 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-10-11T00:57:03.418160" elapsed="0.000940"/>
</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-10-11T00:57:03.421336" 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-10-11T00:57:03.420829" elapsed="0.000642"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:03.422514" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:03.421995" elapsed="0.000627"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:03.423531" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:03.423018" elapsed="0.000631"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T00:57:03.419938" elapsed="0.003825"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:03.419278" elapsed="0.004557"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:03.419228" elapsed="0.004659"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T00:57:03.424182" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:03.424001" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:03.423966" elapsed="0.000355"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:57:03.424637" elapsed="0.000067"/>
</return>
<status status="PASS" start="2026-10-11T00:57:03.424456" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:03.424393" elapsed="0.000451"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:03.425191" elapsed="0.000058"/>
</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-10-11T00:57:03.178724" elapsed="0.246744"/>
</kw>
<msg time="2026-10-11T00:57:03.425648" 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-10-11T00:57:03.178013" elapsed="0.247772"/>
</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-10-11T00:57:03.176644" elapsed="0.249371"/>
</kw>
<msg time="2026-10-11T00:57:03.426147" 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-10-11T00:57:03.174336" elapsed="0.251915"/>
</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-10-11T00:57:03.173909" elapsed="0.252593"/>
</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-10-11T00:57:03.435342" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:03.434712" elapsed="0.000690"/>
</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-10-11T00:57:03.438978" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate'.</msg>
<msg time="2026-10-11T00:57:05.320179" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:57:05.320687" level="INFO">${stdout} = Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Using cached pip-26.2.1-py3-none-any.whl (1.8 MB)
Installing collected packages: pip
  Att...</msg>
<msg time="2026-10-11T00:57:05.320845" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T00:57:05.320989" 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-10-11T00:57:03.438264" elapsed="1.882808"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:57:05.326740" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T00:57:05.325663" elapsed="0.001338"/>
</kw>
<msg time="2026-10-11T00:57:05.327316" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T00:57:05.327653" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:05.321846" elapsed="0.005892"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:05.331662" 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-10-11T00:57:05.328303" elapsed="0.003447"/>
</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-10-11T00:57:05.336281" level="INFO">Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Using cached pip-26.2.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.2.1</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:05.335482" elapsed="0.001049"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:05.338348" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:05.337602" elapsed="0.001005"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:05.340303" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:05.339530" elapsed="0.001013"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T00:57:05.333362" elapsed="0.007403"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:05.332107" elapsed="0.008871"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:05.332053" elapsed="0.008985"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T00:57:05.341376" elapsed="0.000150"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:05.341156" elapsed="0.000604"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:05.341121" elapsed="0.000691"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:57:05.342120" elapsed="0.000067"/>
</return>
<status status="PASS" start="2026-10-11T00:57:05.341923" elapsed="0.000470"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:05.341889" elapsed="0.000743"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:05.342951" 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-10-11T00:57:03.437150" elapsed="1.906155"/>
</kw>
<msg time="2026-10-11T00:57:05.343474" 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-10-11T00:57:03.435843" elapsed="1.907772"/>
</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-10-11T00:57:03.433595" elapsed="1.910187"/>
</kw>
<msg time="2026-10-11T00:57:05.343890" 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-10-11T00:57:03.430234" elapsed="1.913747"/>
</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-10-11T00:57:03.429241" elapsed="1.914893"/>
</kw>
<msg time="2026-10-11T00:57:05.344229" 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-10-11T00:57:03.428459" elapsed="1.915856"/>
</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-10-11T00:57:03.427768" elapsed="1.916847"/>
</kw>
<msg time="2026-10-11T00:57:05.344733" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:03.426862" elapsed="1.917985"/>
</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-10-11T00:57:03.173500" elapsed="2.171513"/>
</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-10-11T00:57:05.357598" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:05.356908" elapsed="0.000752"/>
</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-10-11T00:57:05.361136" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate'.</msg>
<msg time="2026-10-11T00:57:06.138531" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:57:06.139021" 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-10-11T00:57:06.139120" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T00:57:06.139204" 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-10-11T00:57:05.360378" elapsed="0.778875"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:57:06.143977" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T00:57:06.142787" elapsed="0.001426"/>
</kw>
<msg time="2026-10-11T00:57:06.144576" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T00:57:06.144672" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:06.139921" elapsed="0.004799"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:06.147248" 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-10-11T00:57:06.145204" elapsed="0.002099"/>
</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-10-11T00:57:06.151701" 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-10-11T00:57:06.150981" elapsed="0.000868"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:06.153370" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:06.152728" elapsed="0.000920"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:06.155118" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:06.154388" elapsed="0.000865"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T00:57:06.148978" elapsed="0.006424"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:06.147807" elapsed="0.007860"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:06.147756" elapsed="0.007970"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T00:57:06.156026" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:06.155845" elapsed="0.000382"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:06.155807" elapsed="0.000470"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:57:06.156617" elapsed="0.000069"/>
</return>
<status status="PASS" start="2026-10-11T00:57:06.156382" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:06.156351" elapsed="0.000570"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:06.157225" elapsed="0.000044"/>
</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-10-11T00:57:05.359244" elapsed="0.798276"/>
</kw>
<msg time="2026-10-11T00:57:06.157655" 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-10-11T00:57:05.357982" elapsed="0.799782"/>
</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-10-11T00:57:05.355792" elapsed="0.802159"/>
</kw>
<msg time="2026-10-11T00:57:06.158060" 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-10-11T00:57:05.350116" elapsed="0.808035"/>
</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-10-11T00:57:05.349132" elapsed="0.809195"/>
</kw>
<msg time="2026-10-11T00:57:06.158510" 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-10-11T00:57:05.348221" elapsed="0.810403"/>
</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-10-11T00:57:05.346873" elapsed="0.811926"/>
</kw>
<msg time="2026-10-11T00:57:06.158883" 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-10-11T00:57:05.345971" elapsed="0.812996"/>
</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-10-11T00:57:05.345380" elapsed="0.813744"/>
</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-10-11T00:57:06.168598" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:06.167907" elapsed="0.000756"/>
</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-10-11T00:57:06.172271" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==3.4.16; deactivate'.</msg>
<msg time="2026-10-11T00:57:07.629694" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:57:07.630159" 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-10-11T00:57:07.630269" 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-10-11T00:57:07.630369" 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-10-11T00:57:06.171518" elapsed="1.458940"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:57:07.635039" level="INFO">Length is 1862.</msg>
<msg time="2026-10-11T00:57:07.636073" 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-rvx3hb3l/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-rvx3hb3l/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-rvx3hb3l/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-rvx3hb3l/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())  # noqa: S102 # exec is intentional here
        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-10-11T00:57:07.633850" elapsed="0.002752">'  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-rvx3hb3l/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-rvx3hb3l/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-rvx3hb3l/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-rvx3hb3l/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())  # noqa: S102 # exec is intentional here
        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-10-11T00:57:07.636970" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-10-11T00:57:07.637072" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:07.631090" elapsed="0.006037"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:07.639908" 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-10-11T00:57:07.637778" elapsed="0.002190"/>
</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-10-11T00:57:07.644075" 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-10-11T00:57:07.643333" elapsed="0.000889"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:07.645786" 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-rvx3hb3l/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-rvx3hb3l/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-rvx3hb3l/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-rvx3hb3l/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())  # noqa: S102 # exec is intentional here
        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-10-11T00:57:07.645064" elapsed="0.000988"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:07.647728" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:07.647003" elapsed="0.000869"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T00:57:07.641360" elapsed="0.006664"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:07.640252" elapsed="0.007965"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:07.640202" elapsed="0.008076"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T00:57:07.648672" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:07.648397" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:07.648361" elapsed="0.000572"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:57:07.649201" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-10-11T00:57:07.649043" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:07.649011" elapsed="0.000542"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:07.649864" elapsed="0.000044"/>
</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-10-11T00:57:06.170280" elapsed="1.479845"/>
</kw>
<msg time="2026-10-11T00:57:07.650241" 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-10-11T00:57:06.168993" elapsed="1.481353"/>
</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-10-11T00:57:06.166809" elapsed="1.483792"/>
</kw>
<msg time="2026-10-11T00:57:07.650713" 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-10-11T00:57:06.163474" elapsed="1.487333"/>
</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-10-11T00:57:06.162493" elapsed="1.488490"/>
</kw>
<msg time="2026-10-11T00:57:07.651082" 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-10-11T00:57:06.161636" elapsed="1.489536"/>
</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-10-11T00:57:06.160888" elapsed="1.490452"/>
</kw>
<msg time="2026-10-11T00:57:07.651490" 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-10-11T00:57:06.160066" elapsed="1.491551"/>
</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-10-11T00:57:06.159540" elapsed="1.492237"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:57:07.652651" level="INFO">Creating Session using : alias=session, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7434455fa010&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-10-11T00:57:07.652130" elapsed="0.000834"/>
</kw>
<kw name="Upload_Config_Files">
<kw name="Put Directory" owner="SSHLibrary">
<msg time="2026-10-11T00:57:07.677940" level="INFO">[chan 5] Opened sftp connection (server version 3)</msg>
<msg time="2026-10-11T00:57:07.700219" 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-10-11T00:57:07.700306" 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-10-11T00:57:07.653971" elapsed="0.046469"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-10-11T00:57:07.710607" level="INFO">4 files:
bgp-flowspec-redirect.cfg
bgp-flowspec.cfg
exa-md5.cfg
gobgp.cfg</msg>
<msg time="2026-10-11T00:57:07.710846" 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-10-11T00:57:07.700821" elapsed="0.010078"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:57:07.712019" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-10-11T00:57:07.724663" 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-10-11T00:57:07.711732" elapsed="0.013054"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:57:07.725498" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-10-11T00:57:07.772512" 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-10-11T00:57:07.725181" elapsed="0.047489"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:57:07.773360" level="INFO">Executing command 'cat bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-10-11T00:57:07.820480" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:57:07.820699" level="INFO">${stdout} = neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0.1/3...</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-10-11T00:57:07.773100" elapsed="0.047655"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:07.821847" level="INFO">neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
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-10-11T00:57:07.821218" elapsed="0.000735"/>
</kw>
<var name="${cfgfile}">bgp-flowspec-redirect.cfg</var>
<status status="PASS" start="2026-10-11T00:57:07.711319" elapsed="0.110704"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:57:07.822912" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-10-11T00:57:07.868975" 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-10-11T00:57:07.822638" elapsed="0.046456"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:57:07.869831" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-10-11T00:57:07.916279" 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-10-11T00:57:07.869548" elapsed="0.046898"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:57:07.917141" level="INFO">Executing command 'cat bgp-flowspec.cfg'.</msg>
<msg time="2026-10-11T00:57:07.964479" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:57:07.964734" level="INFO">${stdout} = neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0.1/3...</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-10-11T00:57:07.916888" elapsed="0.047902"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:07.965893" level="INFO">neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
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-10-11T00:57:07.965266" elapsed="0.000737"/>
</kw>
<var name="${cfgfile}">bgp-flowspec.cfg</var>
<status status="PASS" start="2026-10-11T00:57:07.822239" elapsed="0.143834"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:57:07.966984" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' exa-md5.cfg'.</msg>
<msg time="2026-10-11T00:57:08.012803" 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-10-11T00:57:07.966704" elapsed="0.046220"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:57:08.013670" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' exa-md5.cfg'.</msg>
<msg time="2026-10-11T00:57:08.060558" 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-10-11T00:57:08.013318" elapsed="0.047358"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:57:08.061314" level="INFO">Executing command 'cat exa-md5.cfg'.</msg>
<msg time="2026-10-11T00:57:08.108831" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:57:08.109061" level="INFO">${stdout} = neighbor 10.30.170.173 {
  router-id 10.30.171.7;
  local-address 10.30.171.7;
  local-as 64496;
  peer-as 64496;
  md5-password topsecret;

  capability {
    route-refresh disable;
    add-path disa...</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-10-11T00:57:08.061073" elapsed="0.048047"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.110256" level="INFO">neighbor 10.30.170.173 {
  router-id 10.30.171.7;
  local-address 10.30.171.7;
  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-10-11T00:57:08.109682" elapsed="0.000674"/>
</kw>
<var name="${cfgfile}">exa-md5.cfg</var>
<status status="PASS" start="2026-10-11T00:57:07.966294" elapsed="0.144164"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:57:08.111332" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' gobgp.cfg'.</msg>
<msg time="2026-10-11T00:57:08.157009" 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-10-11T00:57:08.111056" elapsed="0.046088"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:57:08.158017" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' gobgp.cfg'.</msg>
<msg time="2026-10-11T00:57:08.205008" 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-10-11T00:57:08.157719" elapsed="0.047433"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:57:08.205931" level="INFO">Executing command 'cat gobgp.cfg'.</msg>
<msg time="2026-10-11T00:57:08.253010" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:57:08.253222" level="INFO">${stdout} = [global.config]
    as = 64496
    router-id = "10.30.171.7"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.173"
        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-10-11T00:57:08.205650" elapsed="0.047629"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.254378" level="INFO">[global.config]
    as = 64496
    router-id = "10.30.171.7"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.173"
        local-as = 64496
    [neighbors.transport.config]
        local-address = "10.30.171.7"
        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-10-11T00:57:08.253816" elapsed="0.000726"/>
</kw>
<var name="${cfgfile}">gobgp.cfg</var>
<status status="PASS" start="2026-10-11T00:57:08.110699" elapsed="0.143918"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-10-11T00:57:07.711025" elapsed="0.543661"/>
</for>
<arg>${BGP_VARIABLES_FOLDER}</arg>
<doc>Uploads exabgp config files</doc>
<status status="PASS" start="2026-10-11T00:57:07.653345" elapsed="0.601467"/>
</kw>
<doc>Suite setup keyword</doc>
<status status="PASS" start="2026-10-11T00:57:02.543516" elapsed="5.711405"/>
</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-10-11T00:57:08.290271" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:08.289584" elapsed="0.000747"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:08.292030" 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-10-11T00:57:08.291384" elapsed="0.000792">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-10-11T00:57:08.292367" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:08.290705" elapsed="0.001756"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.293598" 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-10-11T00:57:08.292841" elapsed="0.000815"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:08.294233" 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-10-11T00:57:08.294601" 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-10-11T00:57:08.293990" elapsed="0.000668"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.295616" 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-10-11T00:57:08.295051" elapsed="0.000659"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.297840" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:08.297075" elapsed="0.000845"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.298886" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:57:08.298147" elapsed="0.000774"/>
</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-10-11T00:57:08.299390" elapsed="0.000087"/>
</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-10-11T00:57:08.300285" elapsed="0.000066"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:57:08.300801" elapsed="0.000060"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:57:08.299152" elapsed="0.001867"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:57:08.298990" elapsed="0.002115"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:57:08.301234" elapsed="0.000051"/>
</return>
<msg time="2026-10-11T00:57:08.301469" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:57:08.296404" elapsed="0.005100"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:08.295862" elapsed="0.005699"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.302056" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:08.301595" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.295818" elapsed="0.006340"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.303093" 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-10-11T00:57:08.302362" elapsed="0.000768"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:57:08.303191" 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/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-10-11T00:57:08.288388" elapsed="0.014943"/>
</kw>
<msg time="2026-10-11T00:57:08.303402" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:08.279366" elapsed="0.024229"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-10-11T00:57:08.309132" 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/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-10-11T00:57:08.314369" 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/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-10-11T00:57:08.319776" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.320008" 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-10-11T00:57:08.320239" 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-10-11T00:57:08.320738" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:08.320548" elapsed="0.000262"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:08.320511" elapsed="0.000328"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.321036" 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-10-11T00:57:08.321263" 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-10-11T00:57:08.321490" elapsed="0.000027"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:57:08.320472" elapsed="0.001132"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:57:08.320331" elapsed="0.001306"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.321831" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:08.321967" elapsed="0.000022"/>
</return>
<msg time="2026-10-11T00:57:08.322129" 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-10-11T00:57:08.278001" elapsed="0.044163"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:08.323693" 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-10-11T00:57:08.323360" elapsed="0.000420">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-10-11T00:57:08.323869" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:08.323036" 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-10-11T00:57:08.324168" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:08.323957" elapsed="0.000263"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.324705" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:08.324399" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:08.324242" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.323940" elapsed="0.000842"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.325270" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:08.324929" elapsed="0.000364"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:57:08.325338" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:08.325479" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:57:08.322558" elapsed="0.002945"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:08.326512" 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-10-11T00:57:08.326348" elapsed="0.000224"/>
</kw>
<msg time="2026-10-11T00:57:08.326649" 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-10-11T00:57:08.326044" elapsed="0.000626"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T00:57:08.326839" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:08.326737" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.326719" elapsed="0.000180"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:08.327160" 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-10-11T00:57:08.327301" 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-10-11T00:57:08.327035" elapsed="0.000289"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T00:57:08.327692" 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-10-11T00:57:08.327488" elapsed="0.000228"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T00:57:08.327757" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:57:08.327882" 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-10-11T00:57:08.325760" elapsed="0.002144"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.329107" 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-10-11T00:57:08.328885" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.329563" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:08.329321" 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-10-11T00:57:08.339751" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:08.339900" level="INFO">GET Response : url=http://10.30.170.173: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=node01lvkwbkce3bgv1mcqt2k48u6gq16.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Sat, 10-Oct-2026 00:57: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': '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-10-11T00:57:08.340084" 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-10-11T00:57:08.329916" elapsed="0.010203"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:08.329698" elapsed="0.010461"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.340329" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:08.340184" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.329677" elapsed="0.010753"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.341783" 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-10-11T00:57:08.341420" elapsed="0.000407"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:08.341180" elapsed="0.000680"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.341162" elapsed="0.000721"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.342446" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:08.342157" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:08.341933" elapsed="0.000605"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.341918" elapsed="0.000643"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.343083" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:08.342719" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.343362" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:08.343171" elapsed="0.000260"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.343898" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:08.343636" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:08.343454" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.343155" elapsed="0.000819"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.344475" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:08.344126" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.344764" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:08.344576" elapsed="0.000239"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.345233" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:08.344975" elapsed="0.000282"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:08.344836" elapsed="0.000453"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.344558" elapsed="0.000749"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:08.345453" elapsed="0.000307"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:57:08.346147" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:08.345904" elapsed="0.000266"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:57:08.346308" elapsed="0.000251"/>
</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-10-11T00:57:08.340780" elapsed="0.005836"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:08.346768" elapsed="0.000050"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:08.346681" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.346664" elapsed="0.000205"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:57:08.347511" 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-10-11T00:57:08.346999" elapsed="0.000557"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:57:08.347604" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:57:08.347731" 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-10-11T00:57:08.328171" elapsed="0.019583"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:57:08.347810" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:57:08.347932" 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-10-11T00:57:08.262441" elapsed="0.085515"/>
</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-10-11T00:57:08.358561" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:08.357784" elapsed="0.000805"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:08.360434" 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-10-11T00:57:08.359933" elapsed="0.000638">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-10-11T00:57:08.360694" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:08.358736" elapsed="0.001982"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.361580" 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-10-11T00:57:08.360879" elapsed="0.000727"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:08.361948" 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-10-11T00:57:08.362163" 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-10-11T00:57:08.361758" elapsed="0.000430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.362999" 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-10-11T00:57:08.362368" elapsed="0.000692"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:57:08.363625" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:08.363123" elapsed="0.000655"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.364612" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:08.363962" elapsed="0.000690"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:08.363802" elapsed="0.000927"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.363105" elapsed="0.001646"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.365734" 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-10-11T00:57:08.364902" elapsed="0.000860"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:57:08.365806" 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/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-10-11T00:57:08.357251" elapsed="0.008657"/>
</kw>
<msg time="2026-10-11T00:57:08.365986" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:08.353172" elapsed="0.012861"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-10-11T00:57:08.369914" 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/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-10-11T00:57:08.373689" 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/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-10-11T00:57:08.377391" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.377590" 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-10-11T00:57:08.377763" 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-10-11T00:57:08.378141" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:08.378008" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:08.377993" elapsed="0.000221"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.378358" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.378554" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.378706" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:57:08.377962" elapsed="0.000792"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:57:08.377834" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.378915" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:08.378982" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:57:08.379099" 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-10-11T00:57:08.352466" elapsed="0.026659"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:08.379277" elapsed="0.000390"/>
</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-10-11T00:57:08.380797" 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-10-11T00:57:08.380330" elapsed="0.000495"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:57:08.381196" 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-10-11T00:57:08.380961" elapsed="0.000262"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:57:08.381393" 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-10-11T00:57:08.379968" elapsed="0.001807"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:08.379776" elapsed="0.002029"/>
</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-10-11T00:57:08.381988" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:08.381828" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.379758" elapsed="0.002300"/>
</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-10-11T00:57:08.348891" elapsed="0.033212"/>
</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-10-11T00:57:08.348223" elapsed="0.033947"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:08.348029" elapsed="0.034181"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.348014" elapsed="0.034218"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:57:08.382261" elapsed="0.000029"/>
</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-10-11T00:57:08.260994" elapsed="0.121372"/>
</kw>
<doc>Verify empty flowspec data on neon</doc>
<status status="PASS" start="2026-10-11T00:57:08.257826" elapsed="0.124615"/>
</kw>
<doc>Verify expected response.</doc>
<status status="PASS" start="2026-10-11T00:57:08.257261" elapsed="0.125226"/>
</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-10-11T00:57:08.256284" elapsed="0.126254"/>
</kw>
<doc>Sanity check bgp-flowspec:flowspec-routes is up but empty.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:57:08.255053" elapsed="0.127591"/>
</test>
<test id="s1-s10-t2" name="Reconfigure_ODL_To_Accept_Connection" line="46">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.383975" level="INFO">&amp;{mapping} = { IP=10.30.171.7 | 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-10-11T00:57:08.383440" elapsed="0.000563"/>
</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-10-11T00:57:08.393766" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:08.393381" elapsed="0.000411"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:08.394461" 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-10-11T00:57:08.394236" elapsed="0.000307">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-10-11T00:57:08.394634" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:08.393934" elapsed="0.000722"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.395120" 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-10-11T00:57:08.394814" elapsed="0.000331"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:08.395430" 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-10-11T00:57:08.395621" 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-10-11T00:57:08.395302" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.396046" 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-10-11T00:57:08.395826" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.396995" level="INFO">mapping: {'IP': '10.30.171.7', '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-10-11T00:57:08.396765" elapsed="0.000273"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.397473" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:57:08.397210" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.398088" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:57:08.397822" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:08.398934" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:57:08.398748" elapsed="0.000211"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:08.399003" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:57:08.399130" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:57:08.398268" 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-10-11T00:57:08.399311" elapsed="0.000202"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:57:08.397704" elapsed="0.001876"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.400068" 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-10-11T00:57:08.399802" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:08.400755" 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-10-11T00:57:08.400579" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:08.400822" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:08.400945" 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-10-11T00:57:08.400245" elapsed="0.000723"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:08.401115" elapsed="0.000163"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:57:08.399682" elapsed="0.001632"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.401824" 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-10-11T00:57:08.401555" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:08.402491" 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-10-11T00:57:08.402299" elapsed="0.000216"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:08.402570" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:57:08.402697" 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-10-11T00:57:08.402003" elapsed="0.000716"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:08.402875" elapsed="0.000165"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:57:08.401427" elapsed="0.001649"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.403590" 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-10-11T00:57:08.403292" elapsed="0.000322"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:08.404247" 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-10-11T00:57:08.404071" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:08.404312" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:08.404450" 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-10-11T00:57:08.403771" elapsed="0.000702"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:08.404642" elapsed="0.000163"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:57:08.403175" elapsed="0.001666"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.405359" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:57:08.405091" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:08.406048" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:57:08.405871" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:08.406115" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:08.406238" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:57:08.405569" elapsed="0.000691"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:08.406423" elapsed="0.000179"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:57:08.404973" elapsed="0.001666"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.407124" 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-10-11T00:57:08.406852" elapsed="0.000296"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:08.407953" 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-10-11T00:57:08.407632" elapsed="0.000346"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:08.408023" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:08.408148" 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-10-11T00:57:08.407312" 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-10-11T00:57:08.408320" elapsed="0.000183"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:57:08.406738" elapsed="0.001815"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:57:08.397553" elapsed="0.011033"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:57:08.408624" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:57:08.408759" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', '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-10-11T00:57:08.396386" elapsed="0.012397"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:08.396149" elapsed="0.012662"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.408972" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:08.408833" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.396131" elapsed="0.012910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.409817" 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-10-11T00:57:08.409184" elapsed="0.000660"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:57:08.409890" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>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-10-11T00:57:08.392898" elapsed="0.017096"/>
</kw>
<msg time="2026-10-11T00:57:08.410043" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:08.388933" elapsed="0.021154"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-10-11T00:57:08.413847" 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/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-10-11T00:57:08.417543" 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/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-10-11T00:57:08.421268" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.421449" 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-10-11T00:57:08.421646" 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-10-11T00:57:08.421967" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:08.421837" elapsed="0.000180"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:08.421824" elapsed="0.000215"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.422179" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.422343" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.422507" elapsed="0.000035"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:57:08.421799" elapsed="0.000774"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:57:08.421713" elapsed="0.000884"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.422734" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:08.422799" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:57:08.422907" 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-10-11T00:57:08.388323" elapsed="0.034609"/>
</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-10-11T00:57:08.431113" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:08.430810" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:08.431785" 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-10-11T00:57:08.431611" elapsed="0.000234">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-10-11T00:57:08.431932" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:08.431281" elapsed="0.000673"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.432439" 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-10-11T00:57:08.432111" elapsed="0.000354"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:08.432771" 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-10-11T00:57:08.432892" 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-10-11T00:57:08.432658" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.433337" 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-10-11T00:57:08.433118" 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-10-11T00:57:08.433754" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:08.433505" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.434221" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', '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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:08.433961" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:08.433830" elapsed="0.000448"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.433487" elapsed="0.000810"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.435115" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflecto...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:08.434468" elapsed="0.000675"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:57:08.435187" 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/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-10-11T00:57:08.430286" elapsed="0.005001"/>
</kw>
<msg time="2026-10-11T00:57:08.435340" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:08.426349" elapsed="0.009034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-10-11T00:57:08.439265" 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/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-10-11T00:57:08.442988" 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/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-10-11T00:57:08.446710" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.446878" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.447046" 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-10-11T00:57:08.447369" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:08.447236" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:08.447222" 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-10-11T00:57:08.447642" 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-10-11T00:57:08.447807" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.447954" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:57:08.447198" elapsed="0.000802"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:57:08.447111" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.448192" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:08.448259" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:57:08.448378" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflecto...</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-10-11T00:57:08.425665" elapsed="0.022756"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:08.449514" 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-10-11T00:57:08.449306" elapsed="0.000284">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-10-11T00:57:08.449673" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:08.448992" elapsed="0.000705"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.449971" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:08.449763" elapsed="0.000258"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.450479" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:08.450202" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:08.450048" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.449746" elapsed="0.000823"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.451048" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:08.450715" elapsed="0.000357"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:57:08.451117" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:57:08.451239" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:57:08.448706" elapsed="0.002556"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.452472" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:08.452236" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.452928" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T00:57:08.452714" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.453371" 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-10-11T00:57:08.453156" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.453826" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:08.453611" elapsed="0.000254"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:57:08.454577" 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-10-11T00:57:08.454371" elapsed="0.000231"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:57:08.454884" 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-10-11T00:57:08.454742" 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-10-11T00:57:08.455098" elapsed="0.000156"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.455692" 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-10-11T00:57:08.455447" elapsed="0.000286"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:57:08.455771" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:08.455899" 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-10-11T00:57:08.454032" elapsed="0.001890"/>
</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-10-11T00:57:08.474435" level="INFO">PUT Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node01lvkwbkce3bgv1mcqt2k48u6gq16.node0', 'Content-Length': '1130', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T00:57:08.474502" level="INFO">PUT Response : url=http://10.30.170.173: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.171.7 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:08.474605" 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-10-11T00:57:08.456200" elapsed="0.018430"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:08.455984" elapsed="0.018687"/>
</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-10-11T00:57:08.474834" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:08.474696" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.455968" elapsed="0.018945"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.476039" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:08.475769" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:08.475542" elapsed="0.000568"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.475510" elapsed="0.000622"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.476703" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:08.476402" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:08.476182" elapsed="0.000592"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.476167" elapsed="0.000629"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.477296" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:08.476953" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.477615" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:08.477382" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.478092" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:08.477832" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:08.477690" elapsed="0.000458"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.477365" elapsed="0.000802"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.478691" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:08.478322" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.478968" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:08.478783" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.479493" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:08.479215" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:08.479071" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.478766" elapsed="0.000815"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:08.479710" elapsed="0.000294"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:57:08.480378" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:08.480152" elapsed="0.000250"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:57:08.480572" elapsed="0.000214"/>
</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-10-11T00:57:08.475226" elapsed="0.005616"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:57:08.480983" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:57:08.480901" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.480885" elapsed="0.000175"/>
</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-10-11T00:57:08.481189" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:57:08.481248" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:57:08.481404" 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-10-11T00:57:08.451579" elapsed="0.029866"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:57:08.481500" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T00:57:08.481635" 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-10-11T00:57:08.384825" elapsed="0.096832"/>
</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-10-11T00:57:08.481935" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:08.481742" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.481726" elapsed="0.000294"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:57:08.482049" elapsed="0.000023"/>
</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-10-11T00:57:08.384234" elapsed="0.097910"/>
</kw>
<doc>Configure BGP peer module with initiate-connection set to false.</doc>
<status status="PASS" start="2026-10-11T00:57:08.382941" elapsed="0.099301"/>
</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-10-11T00:57:08.498715" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:08.498376" elapsed="0.000366"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:08.499428" 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-10-11T00:57:08.499192" elapsed="0.000300">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-10-11T00:57:08.499610" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:08.498889" elapsed="0.000744"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.500107" 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-10-11T00:57:08.499799" elapsed="0.000364"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:08.500444" 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-10-11T00:57:08.500588" 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-10-11T00:57:08.500318" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.501011" 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-10-11T00:57:08.500792" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.502157" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:08.501706" elapsed="0.000493"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.502821" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:57:08.502360" elapsed="0.000486"/>
</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-10-11T00:57:08.503151" 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-10-11T00:57:08.503635" elapsed="0.000076"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:57:08.503942" elapsed="0.000074"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:57:08.503005" elapsed="0.001098"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:57:08.502892" elapsed="0.001240"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:57:08.504172" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:57:08.504304" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:57:08.501350" elapsed="0.002978"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:08.501114" elapsed="0.003243"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.504541" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:08.504378" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.501097" elapsed="0.003516"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.505135" 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-10-11T00:57:08.504765" elapsed="0.000396"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:57:08.505205" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>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-10-11T00:57:08.497886" elapsed="0.007417"/>
</kw>
<msg time="2026-10-11T00:57:08.505351" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:08.493919" elapsed="0.011476"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-10-11T00:57:08.509398" 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/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-10-11T00:57:08.513176" 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/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-10-11T00:57:08.517046" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.517222" 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-10-11T00:57:08.517395" 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-10-11T00:57:08.517769" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:08.517633" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:08.517618" 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-10-11T00:57:08.517992" 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-10-11T00:57:08.518158" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.518309" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:57:08.517590" elapsed="0.000767"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:57:08.517478" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.518547" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:08.518617" elapsed="0.000017"/>
</return>
<msg time="2026-10-11T00:57:08.518739" 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-10-11T00:57:08.493313" elapsed="0.025452"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:08.519890" 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-10-11T00:57:08.519683" elapsed="0.000272">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-10-11T00:57:08.520039" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:08.519318" 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-10-11T00:57:08.520341" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:08.520124" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.520861" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:08.520598" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:08.520430" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.520107" elapsed="0.000831"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.521438" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:08.521086" elapsed="0.000377"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:57:08.521509" elapsed="0.000059"/>
</return>
<msg time="2026-10-11T00:57:08.521667" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:57:08.519020" elapsed="0.002670"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:08.522691" 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-10-11T00:57:08.522540" elapsed="0.000200"/>
</kw>
<msg time="2026-10-11T00:57:08.522848" 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-10-11T00:57:08.522209" elapsed="0.000662"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T00:57:08.523035" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:08.522936" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.522920" elapsed="0.000175"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:08.523356" 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-10-11T00:57:08.523507" 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-10-11T00:57:08.523231" elapsed="0.000314"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T00:57:08.523888" 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-10-11T00:57:08.523694" elapsed="0.000217"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T00:57:08.523953" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:57:08.524077" 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-10-11T00:57:08.521928" elapsed="0.002172"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.525303" 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-10-11T00:57:08.525079" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.525765" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:08.525547" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:57:08.532266" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01lvkwbkce3bgv1mcqt2k48u6gq16.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:08.532439" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:57:08.532563" 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-10-11T00:57:08.526077" elapsed="0.006516"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:08.525865" elapsed="0.006767"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.532804" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:08.532656" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.525848" elapsed="0.007037"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.534311" 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-10-11T00:57:08.533984" elapsed="0.000371"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:08.533752" elapsed="0.000635"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.533734" elapsed="0.000691"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.534989" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:08.534715" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:08.534478" elapsed="0.000585"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.534462" elapsed="0.000624"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.535627" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:08.535240" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.535905" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:08.535715" elapsed="0.000242"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.536381" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:08.536121" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:08.535979" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.535698" elapsed="0.000807"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.537009" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:08.536673" elapsed="0.000361"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.537284" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:08.537097" elapsed="0.000239"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.537799" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:08.537535" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:08.537358" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.537080" elapsed="0.000795"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:08.538005" elapsed="0.000288"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:57:08.538704" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:08.538455" elapsed="0.000274"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:57:08.538867" elapsed="0.000214"/>
</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-10-11T00:57:08.533357" elapsed="0.005780"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:08.539280" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:08.539199" elapsed="0.000120"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.539182" elapsed="0.000157"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:57:08.539972" 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-10-11T00:57:08.539481" elapsed="0.000518"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:57:08.540045" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:57:08.540170" 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-10-11T00:57:08.524369" elapsed="0.015825"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:57:08.540249" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:57:08.540368" 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-10-11T00:57:08.486740" elapsed="0.053652"/>
</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-10-11T00:57:08.550762" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:08.550041" elapsed="0.000748"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:08.552027" 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-10-11T00:57:08.551576" elapsed="0.000679">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-10-11T00:57:08.552376" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:08.550939" elapsed="0.001462"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.553152" 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-10-11T00:57:08.552601" elapsed="0.000576"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:08.553561" 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-10-11T00:57:08.553695" 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-10-11T00:57:08.553359" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.554330" 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-10-11T00:57:08.553901" elapsed="0.000472"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:57:08.554748" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:08.554454" elapsed="0.000454"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.555673" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:08.555072" elapsed="0.000704"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:08.554934" elapsed="0.001010"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.554436" elapsed="0.001531"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.556899" 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-10-11T00:57:08.556116" elapsed="0.000810"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:57:08.556971" 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/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-10-11T00:57:08.549551" elapsed="0.007522"/>
</kw>
<msg time="2026-10-11T00:57:08.557121" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:08.545326" elapsed="0.011840"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-10-11T00:57:08.561042" 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//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-10-11T00:57:08.564853" 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/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-10-11T00:57:08.568606" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.568774" 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-10-11T00:57:08.568943" 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-10-11T00:57:08.569273" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:08.569143" elapsed="0.000180"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:08.569130" 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-10-11T00:57:08.569597" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.569770" 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-10-11T00:57:08.569923" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:57:08.569102" elapsed="0.000870"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:57:08.569011" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:08.570131" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:08.570199" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:57:08.570307" 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-10-11T00:57:08.544643" elapsed="0.025689"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:08.570500" elapsed="0.000328"/>
</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-10-11T00:57:08.571703" 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-10-11T00:57:08.571447" elapsed="0.000282"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:57:08.572097" 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-10-11T00:57:08.571862" elapsed="0.000261"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:57:08.572292" elapsed="0.000309"/>
</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-10-11T00:57:08.571087" elapsed="0.001570"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:08.570898" elapsed="0.001789"/>
</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-10-11T00:57:08.572870" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:08.572709" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.570882" elapsed="0.002057"/>
</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-10-11T00:57:08.541325" elapsed="0.031657"/>
</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-10-11T00:57:08.540689" elapsed="0.032357"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:08.540483" elapsed="0.032602"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.540465" elapsed="0.032642"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:57:08.573137" elapsed="0.000026"/>
</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-10-11T00:57:08.486100" elapsed="0.087138"/>
</kw>
<doc>Verify empty flowspec data on neon</doc>
<status status="PASS" start="2026-10-11T00:57:08.483372" elapsed="0.089920"/>
</kw>
<doc>Verify expected response.</doc>
<status status="PASS" start="2026-10-11T00:57:08.483156" elapsed="0.090179"/>
</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-10-11T00:57:08.575065" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:08.574769" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.575539" 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-10-11T00:57:08.575278" elapsed="0.000349"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:57:08.577935" 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-10-11T00:57:08.576179" elapsed="0.001809"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:57:08.581667" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T00:57:08.581749" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T00:57:08.578144" elapsed="0.003630"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.582310" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T00:57:08.582087" elapsed="0.000266"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:08.581840" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:08.581820" elapsed="0.000604"/>
</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-10-11T00:57:08.575845" elapsed="0.006625"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:57:08.584343" level="INFO">env exabgp.tcp.port=1790 exabgp --debug bgp-flowspec.cfg</msg>
<msg time="2026-10-11T00:57:08.584435" 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-10-11T00:57:08.582624" elapsed="0.001836"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.584873" 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-10-11T00:57:08.584653" elapsed="0.000265"/>
</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-10-11T00:57:08.574471" elapsed="0.010496"/>
</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-10-11T00:57:08.586735" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:08.586393" elapsed="0.000368"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.587203" 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-10-11T00:57:08.586920" elapsed="0.000307"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:57:08.592202" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01lvkwbkce3bgv1mcqt2k48u6gq16.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:08.592333" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T00:57:08.592439" 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-10-11T00:57:08.587372" elapsed="0.005093"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.592962" 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-10-11T00:57:08.592677" elapsed="0.000329"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T00:57:08.593550" 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-10-11T00:57:08.593162" elapsed="0.000453">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-10-11T00:57:08.585996" elapsed="0.007722">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.596472" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:11.595657" elapsed="0.000904"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.597668" 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-10-11T00:57:11.596938" elapsed="0.000786"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:57:11.612441" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01lvkwbkce3bgv1mcqt2k48u6gq16.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:11.612838" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '3991'} 
 body={"bgp-rib:peer":[{"peer-id":"bgp://10.30.171.7","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-10-11T00:57:11.613300" 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-10-11T00:57:11.598053" elapsed="0.015334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.615277" level="INFO">{"bgp-rib:peer":[{"peer-id":"bgp://10.30.171.7","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-10-11T00:57:11.614210" elapsed="0.001381"/>
</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-10-11T00:57:11.616118" elapsed="0.000787"/>
</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-10-11T00:57:11.594521" elapsed="0.022513"/>
</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-10-11T00:57:08.585515" elapsed="3.031627"/>
</kw>
<msg time="2026-10-11T00:57:11.617345" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:11.617470" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:08.585117" elapsed="3.032422"/>
</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-10-11T00:57:11.618239" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:11.617730" elapsed="0.000620"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:11.617685" elapsed="0.000716"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="PASS" start="2026-10-11T00:57:11.618767" elapsed="0.000547"/>
</return>
<status status="PASS" start="2026-10-11T00:57:11.618576" elapsed="0.000811"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:11.618541" elapsed="0.000929"/>
</if>
<var name="${idx}">0</var>
<status status="PASS" start="2026-10-11T00:57:08.574306" elapsed="3.045257"/>
</iter>
<var>${idx}</var>
<value>${connection_retries}</value>
<status status="PASS" start="2026-10-11T00:57:08.573938" elapsed="3.045694"/>
</for>
<kw name="Fail" owner="BuiltIn">
<arg>Unable to connect ExaBgp to ODL</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:11.619955" elapsed="0.000046"/>
</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-10-11T00:57:08.573622" elapsed="3.046526"/>
</kw>
<arg>${CFG1}</arg>
<status status="PASS" start="2026-10-11T00:57:08.482899" elapsed="3.137372"/>
</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-10-11T00:57:11.653304" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:11.652866" elapsed="0.000561"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:11.654422" 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-10-11T00:57:11.654093" elapsed="0.000450">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-10-11T00:57:11.654664" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:11.653659" elapsed="0.001037"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.655355" 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-10-11T00:57:11.654922" elapsed="0.000469"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:11.655805" 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-10-11T00:57:11.656007" 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-10-11T00:57:11.655643" elapsed="0.000399"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.656643" 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-10-11T00:57:11.656296" elapsed="0.000435"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.658701" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:11.658234" elapsed="0.000553"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.659402" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:57:11.659044" elapsed="0.000412"/>
</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-10-11T00:57:11.659880" 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-10-11T00:57:11.660122" elapsed="0.000030"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:57:11.660357" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:57:11.659715" elapsed="0.000733"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:57:11.659552" elapsed="0.000950"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:57:11.660561" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T00:57:11.660749" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:57:11.657427" elapsed="0.003354"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:11.656865" elapsed="0.003956"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:11.661039" elapsed="0.000240"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:11.660853" elapsed="0.000477"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:11.656825" elapsed="0.004534"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.662147" 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-10-11T00:57:11.661603" elapsed="0.000581"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:57:11.662246" 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/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-10-11T00:57:11.652148" elapsed="0.010238"/>
</kw>
<msg time="2026-10-11T00:57:11.662476" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:11.644870" elapsed="0.017691"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-10-11T00:57:11.667805" 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/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-10-11T00:57:11.674151" 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.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-10-11T00:57:11.677924" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:11.678092" 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-10-11T00:57:11.678260" 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-10-11T00:57:11.678614" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:11.678467" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:11.678452" 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-10-11T00:57:11.678831" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:11.678997" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:11.679148" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:57:11.678425" elapsed="0.000771"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:57:11.678325" elapsed="0.000896"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:11.679358" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:11.679439" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:57:11.679579" 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-10-11T00:57:11.642602" elapsed="0.037003"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:11.680677" 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-10-11T00:57:11.680471" elapsed="0.000266">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-10-11T00:57:11.680820" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:11.680146" elapsed="0.000698"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:11.681114" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:11.680906" elapsed="0.000259"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.681641" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:11.681348" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:11.681187" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:11.680889" elapsed="0.000872"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.682427" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:11.681965" elapsed="0.000512"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:57:11.682549" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:57:11.682720" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:57:11.679861" elapsed="0.002908"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:11.684196" 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-10-11T00:57:11.683950" elapsed="0.000336">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-10-11T00:57:11.684392" 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-10-11T00:57:11.683512" elapsed="0.000929"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:57:11.684693" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:57:11.684574" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:11.684536" 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-10-11T00:57:11.684913" elapsed="0.000032"/>
</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-10-11T00:57:11.685111" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:57:11.685171" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:57:11.685295" 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-10-11T00:57:11.683080" elapsed="0.002238"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.686545" 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-10-11T00:57:11.686294" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.687146" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:11.686765" elapsed="0.000422"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:57:11.695758" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01lvkwbkce3bgv1mcqt2k48u6gq16.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:11.696126" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:57:11.696259" 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-10-11T00:57:11.687480" elapsed="0.008805"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:11.687248" elapsed="0.009083"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:11.696543" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:11.696358" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:11.687231" elapsed="0.009435"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.698036" 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-10-11T00:57:11.697663" elapsed="0.000427"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:11.697384" elapsed="0.000738"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:11.697367" elapsed="0.000778"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.698730" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:11.698438" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:11.698196" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:11.698181" elapsed="0.000645"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.699357" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:11.698996" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:11.699679" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:11.699464" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.700174" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:11.699905" elapsed="0.000294"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:11.699755" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:11.699446" elapsed="0.000807"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.700782" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:11.700426" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:11.701061" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:11.700870" elapsed="0.000242"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.701589" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:11.701275" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:11.701134" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:11.700852" elapsed="0.000813"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:11.701796" elapsed="0.000294"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:57:11.702509" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:11.702237" 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-10-11T00:57:11.702675" elapsed="0.000217"/>
</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-10-11T00:57:11.697012" elapsed="0.005936"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:11.703096" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:11.703011" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:11.702994" elapsed="0.000164"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:57:11.704480" 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-10-11T00:57:11.703285" elapsed="0.001238"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:57:11.704570" elapsed="0.000032"/>
</return>
<msg time="2026-10-11T00:57:11.704704" 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-10-11T00:57:11.685617" elapsed="0.019153"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:57:11.704830" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:57:11.704954" 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-10-11T00:57:11.626330" elapsed="0.078648"/>
</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-10-11T00:57:11.715124" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:11.714822" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:11.716013" 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-10-11T00:57:11.715766" elapsed="0.000375">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-10-11T00:57:11.716305" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:11.715297" elapsed="0.001032"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.716848" 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-10-11T00:57:11.716535" elapsed="0.000338"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:11.717137" 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-10-11T00:57:11.717289" 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-10-11T00:57:11.717025" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.717755" 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-10-11T00:57:11.717525" 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-10-11T00:57:11.718210" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:11.717920" elapsed="0.000344"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.718906" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:11.718441" elapsed="0.000491"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:11.718287" elapsed="0.000677"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:11.717902" elapsed="0.001083"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.719590" 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-10-11T00:57:11.719133" elapsed="0.000483"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:57:11.719661" 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/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-10-11T00:57:11.714297" elapsed="0.005466"/>
</kw>
<msg time="2026-10-11T00:57:11.719834" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:11.710202" elapsed="0.009679"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-10-11T00:57:11.723674" 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/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-10-11T00:57:11.727387" 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//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-10-11T00:57:11.731117" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:11.731284" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:11.731465" elapsed="0.000030"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:11.731811" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:11.731680" elapsed="0.000181"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:11.731666" 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-10-11T00:57:11.732023" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:11.732190" elapsed="0.000017"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:11.732338" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:57:11.731640" elapsed="0.000745"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:57:11.731545" elapsed="0.000879"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:11.732583" elapsed="0.000048"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:11.732682" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:57:11.732807" 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-10-11T00:57:11.709396" elapsed="0.023436"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:11.732985" elapsed="0.000340"/>
</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-10-11T00:57:11.735476" 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-10-11T00:57:11.733957" elapsed="0.001584"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:57:11.737008" 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-10-11T00:57:11.735682" elapsed="0.001353"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:57:11.737205" 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-10-11T00:57:11.733611" elapsed="0.003979"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:11.733396" elapsed="0.004224"/>
</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-10-11T00:57:11.737804" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:11.737643" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:11.733379" elapsed="0.004495"/>
</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-10-11T00:57:11.705939" elapsed="0.031979"/>
</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-10-11T00:57:11.705252" elapsed="0.032731"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:11.705054" elapsed="0.032969"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:11.705037" elapsed="0.033007"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:57:11.738074" elapsed="0.000026"/>
</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-10-11T00:57:11.624864" elapsed="0.113310"/>
</kw>
<arg>${EXP1}</arg>
<doc>Verify expected response</doc>
<status status="PASS" start="2026-10-11T00:57:11.621656" elapsed="0.116573"/>
</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-10-11T00:57:11.620705" elapsed="0.117567"/>
</kw>
<kw name="Stop_ExaBgp" owner="ExaBgpLib" type="TEARDOWN">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-10-11T00:57:11.738983" level="INFO">[?2004l00:57:08 | 2636   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:57:08 | 2636   | [01;34mversion      [0m | [1m4.2.17  [0m
00:57:08 | 2636   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
00:57:08 | 2636   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
00:57:08 | 2636   | [01;34minstallation [0m | [1m        [0m
00:57:08 | 2636   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:57:08 | 2636   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:57:08 | 2636   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:57:08 | 2636   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:57:08 | 2636   | [01;31mcli control  [0m | [1m - /run/[0m
00:57:08 | 2636   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:57:08 | 2636   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:57:08 | 2636   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:57:08 | 2636   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:57:08 | 2636   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:57:08 | 2636   | [01;31mcli control  [0m | [1m - /run/[0m
00:57:08 | 2636   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:57:08 | 2636   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:57:08 | 2636   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:57:08 | 2636   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:57:08 | 2636   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:57:08 | 2636   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:57:08 | 2636   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:57:08 | 2636   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:57:08 | 2636   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
00:57:08 | 2636   | configuration[0m | . router-id        | '10.30.171.7'[0m
00:57:08 | 2636   | configuration[0m | . local-address    | '10.30.171.7'[0m
00:57:08 | 2636   | configuration[0m | . local-as         | '64496'[0m
00:57:08 | 2636   | configuration[0m | . peer-as          | '64496'[0m
00:57:08 | 2636   | configuration[0m | &gt; family           | [0m
00:57:08 | 2636   | configuration[0m | . ipv4             | 'flow'[0m
00:57:08 | 2636   | configuration[0m | &lt; family           | [0m
00:57:08 | 2636   | configuration[0m | &gt; flow             | [0m
00:57:08 | 2636   | configuration[0m | &gt; route            | 'flow1'[0m
00:57:08 | 2636   | configuration[0m | &gt; match            | [0m
00:57:08 | 2636   | configuration[0m | . source           | '10.0.0.1/32'[0m
00:57:08 | 2636   | configuration[0m | . destination      | '192.168.0.1/32'[0m
00:57:08 | 2636   | configuration[0m | . port             | '=80'[0m
00:57:08 | 2636   | configuration[0m | . destination-port | '&gt;8080&amp;&lt;8088'[0m
00:57:08 | 2636   | configuration[0m | . source-port      | '&gt;1024'[0m
00:57:08 | 2636   | configuration[0m | . protocol         | 'tcp'[0m
00:57:08 | 2636   | configuration[0m | . packet-length    | '&gt;400&amp;&lt;500'[0m
00:57:08 | 2636   | configuration[0m | . fragment         | '=first-fragment'[0m
00:57:08 | 2636   | configuration[0m | . icmp-type        | 'echo-reply'[0m
00:57:08 | 2636   | configuration[0m | . icmp-code        | 'network-unreachable'[0m
00:57:08 | 2636   | configuration[0m | . tcp-flags        | '=urgent'[0m
00:57:08 | 2636   | configuration[0m | . dscp             | '20'[0m
00:57:08 | 2636   | configuration[0m | &lt; match            | [0m
00:57:08 | 2636   | configuration[0m | &gt; then             | [0m
00:57:08 | 2636   | configuration[0m | . action           | 'sample-terminal'[0m
00:57:08 | 2636   | configuration[0m | &lt; then             | [0m
00:57:08 | 2636   | configuration[0m | &lt; route            | [0m
00:57:08 | 2636   | configuration[0m | &lt; flow             | [0m
00:57:08 | 2636   | configuration[0m | &lt; neighbor         | [0m
00:57:08 | 2636   | reactor      [0m | new peer: neighbor 10.30.170.173 local-ip 10.30.171.7 local-as 64496 peer-as 64496 router-id 10.30.171.7 family-allowed in-open[0m
00:57:08 | 2636   | [01;34mreactor      [0m | [1mloaded new configuration successfully[0m
00:57:08 | 2636   | reactor      [0m | initialising connection to peer-1[0m
00:57:08 | 2636   | outgoing-1   [0m | attempting connection to 10.30.170.173:1790[0m
00:57:08 | 2636   | outgoing-1   [0m | sending TCP payload (  49) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0031 0104 FBF0 00B4 0A1E AB07 1402 0601 0400 0100 8502 0641 0400 00FB F002 0206 00[0m
00:57:08 | 2636   | outgoing-1   [0m | &gt;&gt; OPEN version=4 asn=64496 hold_time=180 router_id=10.30.171.7 capabilities=[Multiprotocol(ipv4 flow), Extended Message(65535), ASN4(64496)][0m
00:57:08 | 2636   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0047 01[0m
00:57:08 | 2636   | 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:57:08 | 2636   | outgoing-1   [0m | &lt;&lt; message of type OPEN[0m
00:57:08 | 2636   | 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:57:08 | 2636   | ka-outgoing-1[0m | receive-timer 60 second(s) left[0m
00:57:08 | 2636   | [01;33moutgoing-1   [0m | [1m--------------------------------------------------------------------[0m
00:57:08 | 2636   | [01;33moutgoing-1   [0m | [1mthe connection can not carry the following family/families[0m
00:57:08 | 2636   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/flow[0m
00:57:08 | 2636   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/unicast[0m
00:57:08 | 2636   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/mpls-vpn[0m
00:57:08 | 2636   | [01;33moutgoing-1   [0m | [1mtherefore no routes of this kind can be announced on the connection[0m
00:57:08 | 2636   | [01;33moutgoing-1   [0m | [1m--------------------------------------------------------------------[0m
00:57:08 | 2636   | outgoing-1   [0m | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04[0m
00:57:08 | 2636   | outgoing-1   [0m | &gt;&gt; KEEPALIVE (OPENCONFIRM)[0m
00:57:08 | 2636   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04[0m
00:57:08 | 2636   | outgoing-1   [0m | &lt;&lt; message of type KEEPALIVE[0m
00:57:08 | 2636   | ka-outgoing-1[0m | receive-timer 180 second(s) left[0m
00:57:08 | 2636   | [01;34mreactor      [0m | [1mconnected to peer-1 with outgoing-1 10.30.171.7-10.30.170.173[0m
00:57:08 | 2636   | 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:57:08 | 2636   | outgoing-1   [0m | &gt;&gt; 1 UPDATE(s)[0m
00:57:08 | 2636   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001D 02[0m
00:57:08 | 2636   | outgoing-1   [0m | received complete TCP payload (  10) 0000 0006 800F 0300 0185[0m
00:57:08 | 2636   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:57:08 | 2636   | parser       [0m | parsing UPDATE (  10) 0000 0006 800F 0300 0185[0m
00:57:08 | 2636   | routes       [0m | withdrawn NLRI none[0m
00:57:08 | 2636   | parser       [0m | attribute mp-unreach-nlri    flag 0x80 type 0x0f len 0x03 payload 0001 85[0m
00:57:08 | 2636   | routes       [0m | announced NLRI none[0m
00:57:08 | 2636   | peer-1       [0m | &lt;&lt; UPDATE #1[0m
00:57:08 | 2636   | peer-1       [0m |    UPDATE #1 nlri  (  11) eor 1/133 (ipv4 flow)[0m
00:57:08 | 2636   | outgoing-1   [0m | sending TCP payload (  30) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001E 0200 0000 0790 0F00 0300 0185[0m
00:57:08 | 2636   | outgoing-1   [0m | &gt;&gt; EOR ipv4 flow[0m
00:57:08 | 2636   | peer-1       [0m | &gt;&gt; EOR(s)[0m
00:57:08 | 2636   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02[0m
00:57:08 | 2636   | outgoing-1   [0m | received complete TCP payload (   4) 0000 0000[0m
00:57:08 | 2636   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:57:08 | 2636   | parser       [0m | parsing UPDATE (   4) 0000 0000[0m
00:57:08 | 2636   | peer-1       [0m | &lt;&lt; UPDATE #2[0m
00:57:08 | 2636   | peer-1       [0m |    UPDATE #2 nlri  (   4) eor 1/1 (ipv4 unicast)[0m
00:57:08 | 2636   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02[0m
00:57:08 | 2636   | outgoing-1   [0m | received complete TCP payload (   4) 0000 0000[0m
00:57:08 | 2636   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:57:08 | 2636   | parser       [0m | parsing UPDATE (   4) 0000 0000[0m
00:57:08 | 2636   | peer-1       [0m | &lt;&lt; UPDATE #3[0m
00:57:08 | 2636   | peer-1       [0m |    UPDATE #3 nlri  (   4) eor 1/1 (ipv4 unicast)[0m
00:57:09 | 2636   | ka-outgoing-1[0m | receive-timer 179 second(s) left[0m
00:57:09 | 2636   | ka-outgoing-1[0m | send-timer 59 second(s) left[0m
00:57:10 | 2636   | ka-outgoing-1[0m | receive-timer 178 second(s) left[0m
00:57:10 | 2636   | ka-outgoing-1[0m | send-timer 58 second(s) left[0m
00:57:10 | 2636   | ka-outgoing-1[0m | receive-timer 177 second(s) left[0m
00:57:10 | 2636   | ka-outgoing-1[0m | send-timer 57 second(s) left[0m</msg>
<msg time="2026-10-11T00:57:11.739259" level="INFO">${output} = [?2004l00:57:08 | 2636   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:57:08 | 2636   | [01;34mversion      [0m | [1m4.2.17  [0m
00:57:08 | 2636   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-10-11T00:57:11.738854" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.739774" level="INFO">[?2004l00:57:08 | 2636   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:57:08 | 2636   | [01;34mversion      [0m | [1m4.2.17  [0m
00:57:08 | 2636   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
00:57:08 | 2636   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
00:57:08 | 2636   | [01;34minstallation [0m | [1m        [0m
00:57:08 | 2636   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:57:08 | 2636   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:57:08 | 2636   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:57:08 | 2636   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:57:08 | 2636   | [01;31mcli control  [0m | [1m - /run/[0m
00:57:08 | 2636   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:57:08 | 2636   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:57:08 | 2636   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:57:08 | 2636   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:57:08 | 2636   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:57:08 | 2636   | [01;31mcli control  [0m | [1m - /run/[0m
00:57:08 | 2636   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:57:08 | 2636   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:57:08 | 2636   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:57:08 | 2636   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:57:08 | 2636   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:57:08 | 2636   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:57:08 | 2636   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:57:08 | 2636   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:57:08 | 2636   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
00:57:08 | 2636   | configuration[0m | . router-id        | '10.30.171.7'[0m
00:57:08 | 2636   | configuration[0m | . local-address    | '10.30.171.7'[0m
00:57:08 | 2636   | configuration[0m | . local-as         | '64496'[0m
00:57:08 | 2636   | configuration[0m | . peer-as          | '64496'[0m
00:57:08 | 2636   | configuration[0m | &gt; family           | [0m
00:57:08 | 2636   | configuration[0m | . ipv4             | 'flow'[0m
00:57:08 | 2636   | configuration[0m | &lt; family           | [0m
00:57:08 | 2636   | configuration[0m | &gt; flow             | [0m
00:57:08 | 2636   | configuration[0m | &gt; route            | 'flow1'[0m
00:57:08 | 2636   | configuration[0m | &gt; match            | [0m
00:57:08 | 2636   | configuration[0m | . source           | '10.0.0.1/32'[0m
00:57:08 | 2636   | configuration[0m | . destination      | '192.168.0.1/32'[0m
00:57:08 | 2636   | configuration[0m | . port             | '=80'[0m
00:57:08 | 2636   | configuration[0m | . destination-port | '&gt;8080&amp;&lt;8088'[0m
00:57:08 | 2636   | configuration[0m | . source-port      | '&gt;1024'[0m
00:57:08 | 2636   | configuration[0m | . protocol         | 'tcp'[0m
00:57:08 | 2636   | configuration[0m | . packet-length    | '&gt;400&amp;&lt;500'[0m
00:57:08 | 2636   | configuration[0m | . fragment         | '=first-fragment'[0m
00:57:08 | 2636   | configuration[0m | . icmp-type        | 'echo-reply'[0m
00:57:08 | 2636   | configuration[0m | . icmp-code        | 'network-unreachable'[0m
00:57:08 | 2636   | configuration[0m | . tcp-flags        | '=urgent'[0m
00:57:08 | 2636   | configuration[0m | . dscp             | '20'[0m
00:57:08 | 2636   | configuration[0m | &lt; match            | [0m
00:57:08 | 2636   | configuration[0m | &gt; then             | [0m
00:57:08 | 2636   | configuration[0m | . action           | 'sample-terminal'[0m
00:57:08 | 2636   | configuration[0m | &lt; then             | [0m
00:57:08 | 2636   | configuration[0m | &lt; route            | [0m
00:57:08 | 2636   | configuration[0m | &lt; flow             | [0m
00:57:08 | 2636   | configuration[0m | &lt; neighbor         | [0m
00:57:08 | 2636   | reactor      [0m | new peer: neighbor 10.30.170.173 local-ip 10.30.171.7 local-as 64496 peer-as 64496 router-id 10.30.171.7 family-allowed in-open[0m
00:57:08 | 2636   | [01;34mreactor      [0m | [1mloaded new configuration successfully[0m
00:57:08 | 2636   | reactor      [0m | initialising connection to peer-1[0m
00:57:08 | 2636   | outgoing-1   [0m | attempting connection to 10.30.170.173:1790[0m
00:57:08 | 2636   | outgoing-1   [0m | sending TCP payload (  49) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0031 0104 FBF0 00B4 0A1E AB07 1402 0601 0400 0100 8502 0641 0400 00FB F002 0206 00[0m
00:57:08 | 2636   | outgoing-1   [0m | &gt;&gt; OPEN version=4 asn=64496 hold_time=180 router_id=10.30.171.7 capabilities=[Multiprotocol(ipv4 flow), Extended Message(65535), ASN4(64496)][0m
00:57:08 | 2636   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0047 01[0m
00:57:08 | 2636   | 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:57:08 | 2636   | outgoing-1   [0m | &lt;&lt; message of type OPEN[0m
00:57:08 | 2636   | 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:57:08 | 2636   | ka-outgoing-1[0m | receive-timer 60 second(s) left[0m
00:57:08 | 2636   | [01;33moutgoing-1   [0m | [1m--------------------------------------------------------------------[0m
00:57:08 | 2636   | [01;33moutgoing-1   [0m | [1mthe connection can not carry the following family/families[0m
00:57:08 | 2636   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/flow[0m
00:57:08 | 2636   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/unicast[0m
00:57:08 | 2636   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/mpls-vpn[0m
00:57:08 | 2636   | [01;33moutgoing-1   [0m | [1mtherefore no routes of this kind can be announced on the connection[0m
00:57:08 | 2636   | [01;33moutgoing-1   [0m | [1m--------------------------------------------------------------------[0m
00:57:08 | 2636   | outgoing-1   [0m | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04[0m
00:57:08 | 2636   | outgoing-1   [0m | &gt;&gt; KEEPALIVE (OPENCONFIRM)[0m
00:57:08 | 2636   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04[0m
00:57:08 | 2636   | outgoing-1   [0m | &lt;&lt; message of type KEEPALIVE[0m
00:57:08 | 2636   | ka-outgoing-1[0m | receive-timer 180 second(s) left[0m
00:57:08 | 2636   | [01;34mreactor      [0m | [1mconnected to peer-1 with outgoing-1 10.30.171.7-10.30.170.173[0m
00:57:08 | 2636   | 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:57:08 | 2636   | outgoing-1   [0m | &gt;&gt; 1 UPDATE(s)[0m
00:57:08 | 2636   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001D 02[0m
00:57:08 | 2636   | outgoing-1   [0m | received complete TCP payload (  10) 0000 0006 800F 0300 0185[0m
00:57:08 | 2636   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:57:08 | 2636   | parser       [0m | parsing UPDATE (  10) 0000 0006 800F 0300 0185[0m
00:57:08 | 2636   | routes       [0m | withdrawn NLRI none[0m
00:57:08 | 2636   | parser       [0m | attribute mp-unreach-nlri    flag 0x80 type 0x0f len 0x03 payload 0001 85[0m
00:57:08 | 2636   | routes       [0m | announced NLRI none[0m
00:57:08 | 2636   | peer-1       [0m | &lt;&lt; UPDATE #1[0m
00:57:08 | 2636   | peer-1       [0m |    UPDATE #1 nlri  (  11) eor 1/133 (ipv4 flow)[0m
00:57:08 | 2636   | outgoing-1   [0m | sending TCP payload (  30) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001E 0200 0000 0790 0F00 0300 0185[0m
00:57:08 | 2636   | outgoing-1   [0m | &gt;&gt; EOR ipv4 flow[0m
00:57:08 | 2636   | peer-1       [0m | &gt;&gt; EOR(s)[0m
00:57:08 | 2636   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02[0m
00:57:08 | 2636   | outgoing-1   [0m | received complete TCP payload (   4) 0000 0000[0m
00:57:08 | 2636   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:57:08 | 2636   | parser       [0m | parsing UPDATE (   4) 0000 0000[0m
00:57:08 | 2636   | peer-1       [0m | &lt;&lt; UPDATE #2[0m
00:57:08 | 2636   | peer-1       [0m |    UPDATE #2 nlri  (   4) eor 1/1 (ipv4 unicast)[0m
00:57:08 | 2636   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02[0m
00:57:08 | 2636   | outgoing-1   [0m | received complete TCP payload (   4) 0000 0000[0m
00:57:08 | 2636   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:57:08 | 2636   | parser       [0m | parsing UPDATE (   4) 0000 0000[0m
00:57:08 | 2636   | peer-1       [0m | &lt;&lt; UPDATE #3[0m
00:57:08 | 2636   | peer-1       [0m |    UPDATE #3 nlri  (   4) eor 1/1 (ipv4 unicast)[0m
00:57:09 | 2636   | ka-outgoing-1[0m | receive-timer 179 second(s) left[0m
00:57:09 | 2636   | ka-outgoing-1[0m | send-timer 59 second(s) left[0m
00:57:10 | 2636   | ka-outgoing-1[0m | receive-timer 178 second(s) left[0m
00:57:10 | 2636   | ka-outgoing-1[0m | send-timer 58 second(s) left[0m
00:57:10 | 2636   | ka-outgoing-1[0m | receive-timer 177 second(s) left[0m
00:57:10 | 2636   | 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-10-11T00:57:11.739546" elapsed="0.000456"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.740803" 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-10-11T00:57:11.740509" elapsed="0.000322"/>
</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-10-11T00:57:11.740975" 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-10-11T00:57:11.740178" elapsed="0.001076"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:57:11.866899" level="INFO">^C00:57:11 | 2636   | [00;31mreactor      [0m | [1m^C received[0m
00:57:11 | 2636   | [00;31mreactor      [0m | [1mperforming shutdown[0m
00:57:11 | 2636   | outgoing-1   [0m | stop, message [shutting down][0m
00:57:11 | 2636   | [01;33moutgoing-1   [0m | [1moutgoing-1 10.30.171.7-10.30.170.173, closing connection[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T00:57:11.867095" level="INFO">${output} = ^C00:57:11 | 2636   | [00;31mreactor      [0m | [1m^C received[0m
00:57:11 | 2636   | [00;31mreactor      [0m | [1mperforming shutdown[0m
00:57:11 | 2636   | 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-10-11T00:57:11.741426" elapsed="0.125700"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.867917" level="INFO">^C00:57:11 | 2636   | [00;31mreactor      [0m | [1m^C received[0m
00:57:11 | 2636   | [00;31mreactor      [0m | [1mperforming shutdown[0m
00:57:11 | 2636   | outgoing-1   [0m | stop, message [shutting down][0m
00:57:11 | 2636   | [01;33moutgoing-1   [0m | [1moutgoing-1 10.30.171.7-10.30.170.173, closing connection[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T00:57:11.867477" elapsed="0.000503"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:57:11.869941" 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-10-11T00:57:11.868797" elapsed="0.001205"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:57:11.871330" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T00:57:11.871429" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-423-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-10-11T00:57:11.870180" elapsed="0.001275"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.872038" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-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-10-11T00:57:11.871810" elapsed="0.000273"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:11.871543" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:11.871519" elapsed="0.000622"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-10-11T00:57:11.868284" elapsed="0.003902"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-10-11T00:57:11.738567" elapsed="0.133670"/>
</kw>
<doc>Testing flowspec values for bgp-flowspec.cfg</doc>
<status status="PASS" start="2026-10-11T00:57:08.482515" elapsed="3.389763"/>
</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-10-11T00:57:11.888757" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:11.888386" elapsed="0.000397"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:11.889573" 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-10-11T00:57:11.889242" elapsed="0.000420">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-10-11T00:57:11.889750" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:11.888932" elapsed="0.000840"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.890243" 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-10-11T00:57:11.889933" elapsed="0.000336"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:11.890574" 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-10-11T00:57:11.890717" 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-10-11T00:57:11.890443" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.891142" 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-10-11T00:57:11.890921" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.892382" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:11.891925" elapsed="0.000521"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.893075" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:57:11.892642" 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-10-11T00:57:11.893426" 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-10-11T00:57:11.893906" elapsed="0.000075"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:57:11.894199" elapsed="0.000071"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:57:11.893263" elapsed="0.001095"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:57:11.893148" elapsed="0.001241"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:57:11.894453" elapsed="0.000046"/>
</return>
<msg time="2026-10-11T00:57:11.894608" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:57:11.891580" elapsed="0.003052"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:11.891297" elapsed="0.003364"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:11.894822" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:11.894684" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:11.891277" elapsed="0.003614"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.895453" 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-10-11T00:57:11.895035" elapsed="0.000445"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:57:11.895537" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>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-10-11T00:57:11.887873" elapsed="0.007764"/>
</kw>
<msg time="2026-10-11T00:57:11.895688" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:11.883762" elapsed="0.011973"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-10-11T00:57:11.899667" 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/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-10-11T00:57:11.903510" 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/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-10-11T00:57:11.907282" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:11.907470" elapsed="0.000113"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:11.907739" 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-10-11T00:57:11.908132" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:11.907998" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:11.907983" elapsed="0.000221"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:11.908346" 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-10-11T00:57:11.908548" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:11.908701" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:57:11.907951" elapsed="0.000799"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:57:11.907808" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:11.908913" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:11.908981" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:57:11.909104" 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-10-11T00:57:11.883064" elapsed="0.026065"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:11.910273" 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-10-11T00:57:11.910051" elapsed="0.000295">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-10-11T00:57:11.910465" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:11.909714" 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-10-11T00:57:11.910862" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:11.910601" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.911440" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:11.911149" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:11.910951" elapsed="0.000601"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:11.910580" elapsed="0.000997"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.912105" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:11.911760" elapsed="0.000369"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:57:11.912174" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:57:11.912299" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:57:11.909386" elapsed="0.002936"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:11.913332" 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-10-11T00:57:11.913182" elapsed="0.000200"/>
</kw>
<msg time="2026-10-11T00:57:11.913475" 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-10-11T00:57:11.912876" elapsed="0.000634"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T00:57:11.913676" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:11.913577" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:11.913560" elapsed="0.000176"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:11.913996" 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-10-11T00:57:11.914137" 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-10-11T00:57:11.913871" elapsed="0.000289"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T00:57:11.914562" 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-10-11T00:57:11.914337" elapsed="0.000249"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T00:57:11.914627" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:11.914752" 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-10-11T00:57:11.912593" elapsed="0.002182"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.915971" 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-10-11T00:57:11.915748" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.916401" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:11.916186" elapsed="0.000271"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:57:11.925193" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01lvkwbkce3bgv1mcqt2k48u6gq16.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:11.925337" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:57:11.925458" 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-10-11T00:57:11.916742" elapsed="0.008753"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:11.916528" elapsed="0.009008"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:11.925701" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:11.925561" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:11.916511" elapsed="0.009267"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.927006" 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-10-11T00:57:11.926677" elapsed="0.000373"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:11.926441" elapsed="0.000640"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:11.926423" elapsed="0.000680"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.927672" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:11.927373" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:11.927152" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:11.927137" elapsed="0.000630"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.928282" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:11.927926" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:11.928593" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:11.928370" elapsed="0.000275"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.929075" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:11.928810" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:11.928668" elapsed="0.000465"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:11.928354" elapsed="0.000798"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.929673" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:11.929308" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:11.929951" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:11.929762" elapsed="0.000239"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.930439" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:11.930166" elapsed="0.000299"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:11.930023" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:11.929745" elapsed="0.000816"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:11.930696" elapsed="0.000297"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:57:11.931377" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:11.931138" elapsed="0.000264"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:57:11.931575" elapsed="0.000215"/>
</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-10-11T00:57:11.926085" elapsed="0.005763"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:11.932002" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:11.931911" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:11.931894" elapsed="0.000170"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:57:11.932698" 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-10-11T00:57:11.932194" elapsed="0.000531"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:57:11.932771" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:11.932899" 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-10-11T00:57:11.915041" elapsed="0.017882"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:57:11.932978" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:57:11.933097" 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-10-11T00:57:11.875838" elapsed="0.057282"/>
</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-10-11T00:57:11.943453" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:11.942755" elapsed="0.000726"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:11.944718" 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-10-11T00:57:11.944216" 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-10-11T00:57:11.945072" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:11.943645" elapsed="0.001450"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.945854" 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-10-11T00:57:11.945264" elapsed="0.000616"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:11.946194" 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-10-11T00:57:11.946334" 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-10-11T00:57:11.946033" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.947039" 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-10-11T00:57:11.946602" 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-10-11T00:57:11.947554" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:11.947145" elapsed="0.000565"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.948397" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:11.947876" elapsed="0.000670"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:11.947735" elapsed="0.000977"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:11.947127" elapsed="0.001608"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.949661" 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-10-11T00:57:11.948896" elapsed="0.000793"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:57:11.949733" 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/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-10-11T00:57:11.942238" elapsed="0.007596"/>
</kw>
<msg time="2026-10-11T00:57:11.949883" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:11.938172" elapsed="0.011756"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-10-11T00:57:11.953742" 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/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-10-11T00:57:11.957477" 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/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-10-11T00:57:11.961243" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:11.961422" 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-10-11T00:57:11.961603" 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-10-11T00:57:11.961932" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:11.961803" elapsed="0.000179"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:11.961789" elapsed="0.000214"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:11.962142" 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-10-11T00:57:11.962308" 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-10-11T00:57:11.962472" elapsed="0.000030"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:57:11.961763" elapsed="0.000771"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:57:11.961671" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:11.962695" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:11.962792" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:57:11.962899" 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-10-11T00:57:11.937473" elapsed="0.025451"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:11.963077" elapsed="0.000313"/>
</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-10-11T00:57:11.964262" 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-10-11T00:57:11.964024" elapsed="0.000264"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:57:11.964838" 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-10-11T00:57:11.964435" 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-10-11T00:57:11.965035" elapsed="0.000281"/>
</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-10-11T00:57:11.963678" elapsed="0.001695"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:11.963477" elapsed="0.001939"/>
</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-10-11T00:57:11.965616" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:11.965442" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:11.963459" elapsed="0.002227"/>
</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-10-11T00:57:11.934071" elapsed="0.031660"/>
</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-10-11T00:57:11.933383" elapsed="0.032414"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:11.933193" elapsed="0.032645"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:11.933177" elapsed="0.032682"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:57:11.965888" elapsed="0.000026"/>
</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-10-11T00:57:11.875123" elapsed="0.090865"/>
</kw>
<doc>Verify empty flowspec data on neon</doc>
<status status="PASS" start="2026-10-11T00:57:11.873568" elapsed="0.092475"/>
</kw>
<doc>Verify expected response.</doc>
<status status="PASS" start="2026-10-11T00:57:11.873321" elapsed="0.092764"/>
</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-10-11T00:57:11.967608" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:11.967302" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.968029" 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-10-11T00:57:11.967812" elapsed="0.000257"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:57:11.970333" 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-10-11T00:57:11.968619" elapsed="0.001766"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:57:11.974020" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T00:57:11.974100" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T00:57:11.970566" elapsed="0.003559"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.974680" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T00:57:11.974436" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:11.974186" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:11.974169" elapsed="0.000645"/>
</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-10-11T00:57:11.968271" elapsed="0.006586"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:57:11.977057" level="INFO">env exabgp.tcp.port=1790 exabgp --debug bgp-flowspec-redirect.cfg</msg>
<msg time="2026-10-11T00:57:11.977141" 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-10-11T00:57:11.974996" elapsed="0.002170"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.977615" 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-10-11T00:57:11.977346" elapsed="0.000311"/>
</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-10-11T00:57:11.967020" elapsed="0.010688"/>
</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-10-11T00:57:11.979372" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:11.979074" elapsed="0.000323"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.979869" 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-10-11T00:57:11.979584" elapsed="0.000309"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:57:11.986272" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01lvkwbkce3bgv1mcqt2k48u6gq16.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:11.986383" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T00:57:11.986505" 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-10-11T00:57:11.980035" elapsed="0.006496"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.986995" 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-10-11T00:57:11.986719" elapsed="0.000319"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T00:57:11.987568" 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-10-11T00:57:11.987192" elapsed="0.000436">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-10-11T00:57:11.978690" elapsed="0.009042">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:14.991063" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:14.989687" elapsed="0.001446"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:14.992249" 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-10-11T00:57:14.991570" elapsed="0.000738"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:57:15.003716" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01lvkwbkce3bgv1mcqt2k48u6gq16.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:15.004102" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '3475'} 
 body={"bgp-rib:peer":[{"peer-id":"bgp://10.30.171.7","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-10-11T00:57:15.004527" 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-10-11T00:57:14.992689" elapsed="0.011898"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.005741" level="INFO">{"bgp-rib:peer":[{"peer-id":"bgp://10.30.171.7","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-10-11T00:57:15.005020" elapsed="0.000872"/>
</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-10-11T00:57:15.006242" elapsed="0.000810"/>
</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-10-11T00:57:14.988583" elapsed="0.018599"/>
</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-10-11T00:57:11.978224" elapsed="3.029064"/>
</kw>
<msg time="2026-10-11T00:57:15.007564" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:15.007656" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:11.977857" elapsed="3.029847"/>
</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-10-11T00:57:15.008401" elapsed="0.000109"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:15.007896" elapsed="0.000678"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:15.007851" elapsed="0.000776"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="PASS" start="2026-10-11T00:57:15.008927" elapsed="0.000067"/>
</return>
<status status="PASS" start="2026-10-11T00:57:15.008738" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:15.008706" elapsed="0.000399"/>
</if>
<var name="${idx}">0</var>
<status status="PASS" start="2026-10-11T00:57:11.966874" elapsed="3.042286"/>
</iter>
<var>${idx}</var>
<value>${connection_retries}</value>
<status status="PASS" start="2026-10-11T00:57:11.966695" elapsed="3.042533"/>
</for>
<kw name="Fail" owner="BuiltIn">
<arg>Unable to connect ExaBgp to ODL</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:15.009596" elapsed="0.000046"/>
</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-10-11T00:57:11.966337" elapsed="3.043425"/>
</kw>
<arg>${CFG2}</arg>
<status status="PASS" start="2026-10-11T00:57:11.873059" elapsed="3.136824"/>
</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-10-11T00:57:15.041689" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:15.041220" elapsed="0.000508"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:15.042775" 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-10-11T00:57:15.042366" elapsed="0.000507">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-10-11T00:57:15.042993" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:15.041935" elapsed="0.001090"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.043940" 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-10-11T00:57:15.043248" elapsed="0.000728"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:15.044349" 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-10-11T00:57:15.044586" 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-10-11T00:57:15.044191" elapsed="0.000430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.045185" 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-10-11T00:57:15.044874" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.046786" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:15.046177" elapsed="0.000672"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.047477" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:57:15.047078" elapsed="0.000435"/>
</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-10-11T00:57:15.047912" 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-10-11T00:57:15.048161" elapsed="0.000032"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:57:15.048403" elapsed="0.000066"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:57:15.047746" elapsed="0.000772"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:57:15.047582" elapsed="0.000975"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:57:15.048615" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T00:57:15.048807" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:57:15.045714" elapsed="0.003127"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:15.045334" elapsed="0.003548"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:15.049102" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:15.048914" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:15.045308" elapsed="0.003891"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.049982" 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-10-11T00:57:15.049400" elapsed="0.000620"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:57:15.050081" 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/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-10-11T00:57:15.040539" elapsed="0.009680"/>
</kw>
<msg time="2026-10-11T00:57:15.050289" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:15.032514" elapsed="0.017838"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-10-11T00:57:15.055671" 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/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-10-11T00:57:15.060953" 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/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-10-11T00:57:15.065710" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:15.065879" 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-10-11T00:57:15.066046" 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-10-11T00:57:15.066373" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:15.066239" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:15.066225" 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-10-11T00:57:15.066620" 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-10-11T00:57:15.066787" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:15.066942" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:57:15.066200" elapsed="0.000790"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:57:15.066112" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:15.067151" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:15.067216" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:57:15.067326" 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-10-11T00:57:15.031044" elapsed="0.036306"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:15.068438" 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-10-11T00:57:15.068229" elapsed="0.000282">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-10-11T00:57:15.068595" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:15.067919" elapsed="0.000699"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:15.068890" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:15.068681" elapsed="0.000261"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.069397" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:15.069129" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:15.068964" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:15.068664" elapsed="0.000841"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.069993" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:15.069653" elapsed="0.000364"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:57:15.070091" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:57:15.070218" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:57:15.067633" elapsed="0.002608"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:15.071288" 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-10-11T00:57:15.071098" elapsed="0.000249">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-10-11T00:57:15.071447" 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-10-11T00:57:15.070792" elapsed="0.000692"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:57:15.071649" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:57:15.071549" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:15.071532" elapsed="0.000196"/>
</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-10-11T00:57:15.071868" elapsed="0.000020"/>
</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-10-11T00:57:15.072028" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:57:15.072086" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:57:15.072209" 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-10-11T00:57:15.070508" elapsed="0.001724"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.073647" 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-10-11T00:57:15.073386" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.074084" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:15.073868" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:57:15.081221" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01lvkwbkce3bgv1mcqt2k48u6gq16.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:15.081375" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:57:15.081506" 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-10-11T00:57:15.074400" elapsed="0.007131"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:15.074185" elapsed="0.007385"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:15.081733" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:15.081595" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:15.074168" elapsed="0.007642"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.083070" 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-10-11T00:57:15.082729" elapsed="0.000430"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:15.082498" elapsed="0.000694"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:15.082480" elapsed="0.000736"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.083804" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:15.083530" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:15.083268" elapsed="0.000610"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:15.083252" elapsed="0.000649"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.084432" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:15.084060" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:15.084730" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:15.084535" elapsed="0.000247"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.085210" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:15.084947" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:15.084804" elapsed="0.000463"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:15.084517" elapsed="0.000770"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.085813" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:15.085476" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:15.086095" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:15.085901" elapsed="0.000246"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.086623" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:15.086311" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:15.086169" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:15.085884" elapsed="0.000816"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:15.086829" elapsed="0.000288"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:57:15.087550" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:15.087264" 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-10-11T00:57:15.087718" elapsed="0.000215"/>
</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-10-11T00:57:15.082131" elapsed="0.005858"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:15.088132" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:15.088050" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:15.088033" elapsed="0.000160"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:57:15.089370" 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-10-11T00:57:15.088319" elapsed="0.001079"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:57:15.089480" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:57:15.089613" 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-10-11T00:57:15.072531" elapsed="0.017106"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:57:15.089693" elapsed="0.000023"/>
</return>
<msg time="2026-10-11T00:57:15.089813" 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-10-11T00:57:15.015952" elapsed="0.073885"/>
</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-10-11T00:57:15.100051" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:15.099750" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:15.100808" 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-10-11T00:57:15.100575" elapsed="0.000353">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-10-11T00:57:15.101095" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:15.100220" elapsed="0.000899"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.101619" 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-10-11T00:57:15.101276" elapsed="0.000368"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:15.101902" 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-10-11T00:57:15.102046" 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-10-11T00:57:15.101794" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.102493" 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-10-11T00:57:15.102248" 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-10-11T00:57:15.102903" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:15.102619" elapsed="0.000338"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.103596" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:15.103112" elapsed="0.000509"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:15.102980" elapsed="0.000674"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:15.102601" elapsed="0.001072"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.104211" 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-10-11T00:57:15.103820" elapsed="0.000417"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:57:15.104280" 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/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-10-11T00:57:15.099215" elapsed="0.005231"/>
</kw>
<msg time="2026-10-11T00:57:15.104526" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:15.094958" elapsed="0.009614"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-10-11T00:57:15.108356" 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/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-10-11T00:57:15.112164" 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/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-10-11T00:57:15.115865" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:15.116032" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:15.116199" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:15.116554" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:15.116393" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:15.116379" 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-10-11T00:57:15.116768" 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-10-11T00:57:15.116932" 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-10-11T00:57:15.117080" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:57:15.116352" elapsed="0.000776"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:57:15.116264" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:15.117286" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:15.117352" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:57:15.117540" 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-10-11T00:57:15.094206" elapsed="0.023360"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:15.117751" elapsed="0.000336"/>
</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-10-11T00:57:15.119847" 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-10-11T00:57:15.118727" elapsed="0.001149"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:57:15.120960" 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-10-11T00:57:15.120014" elapsed="0.000973"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:57:15.121158" 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-10-11T00:57:15.118346" elapsed="0.003204"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:15.118157" elapsed="0.003423"/>
</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-10-11T00:57:15.121764" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:15.121602" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:15.118140" elapsed="0.003693"/>
</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-10-11T00:57:15.090785" elapsed="0.031091"/>
</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-10-11T00:57:15.090104" elapsed="0.031837"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:15.089910" elapsed="0.032070"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:15.089895" elapsed="0.032106"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:57:15.122030" elapsed="0.000026"/>
</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-10-11T00:57:15.014486" elapsed="0.107642"/>
</kw>
<arg>${EXP2}</arg>
<doc>Verify expected response</doc>
<status status="PASS" start="2026-10-11T00:57:15.011221" elapsed="0.110961"/>
</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-10-11T00:57:15.010263" elapsed="0.111960"/>
</kw>
<kw name="Stop_ExaBgp" owner="ExaBgpLib" type="TEARDOWN">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-10-11T00:57:15.122944" level="INFO">[?2004l00:57:12 | 2640   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:57:12 | 2640   | [01;34mversion      [0m | [1m4.2.17  [0m
00:57:12 | 2640   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
00:57:12 | 2640   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
00:57:12 | 2640   | [01;34minstallation [0m | [1m        [0m
00:57:12 | 2640   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:57:12 | 2640   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:57:12 | 2640   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:57:12 | 2640   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:57:12 | 2640   | [01;31mcli control  [0m | [1m - /run/[0m
00:57:12 | 2640   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:57:12 | 2640   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:57:12 | 2640   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:57:12 | 2640   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:57:12 | 2640   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:57:12 | 2640   | [01;31mcli control  [0m | [1m - /run/[0m
00:57:12 | 2640   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:57:12 | 2640   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:57:12 | 2640   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:57:12 | 2640   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:57:12 | 2640   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:57:12 | 2640   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:57:12 | 2640   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:57:12 | 2640   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:57:12 | 2640   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
00:57:12 | 2640   | configuration[0m | . router-id        | '10.30.171.7'[0m
00:57:12 | 2640   | configuration[0m | . local-address    | '10.30.171.7'[0m
00:57:12 | 2640   | configuration[0m | . local-as         | '64496'[0m
00:57:12 | 2640   | configuration[0m | . peer-as          | '64496'[0m
00:57:12 | 2640   | configuration[0m | &gt; family           | [0m
00:57:12 | 2640   | configuration[0m | . ipv4             | 'flow'[0m
00:57:12 | 2640   | configuration[0m | &lt; family           | [0m
00:57:12 | 2640   | configuration[0m | &gt; flow             | [0m
00:57:12 | 2640   | configuration[0m | &gt; route            | 'flow1'[0m
00:57:12 | 2640   | configuration[0m | &gt; match            | [0m
00:57:12 | 2640   | configuration[0m | . source           | '10.0.0.1/32'[0m
00:57:12 | 2640   | configuration[0m | . destination      | '192.168.0.1/32'[0m
00:57:12 | 2640   | configuration[0m | &lt; match            | [0m
00:57:12 | 2640   | configuration[0m | &gt; then             | [0m
00:57:12 | 2640   | configuration[0m | . redirect         | '65500:12345'[0m
00:57:12 | 2640   | configuration[0m | &lt; then             | [0m
00:57:12 | 2640   | configuration[0m | &lt; route            | [0m
00:57:12 | 2640   | configuration[0m | &gt; route            | 'flow2'[0m
00:57:12 | 2640   | configuration[0m | &gt; match            | [0m
00:57:12 | 2640   | configuration[0m | . source           | '10.0.0.2/32'[0m
00:57:12 | 2640   | configuration[0m | . destination      | '192.168.0.2/32'[0m
00:57:12 | 2640   | configuration[0m | &lt; match            | [0m
00:57:12 | 2640   | configuration[0m | &gt; then             | [0m
00:57:12 | 2640   | configuration[0m | . redirect         | '1.2.3.4'[0m
00:57:12 | 2640   | configuration[0m | &lt; then             | [0m
00:57:12 | 2640   | configuration[0m | &lt; route            | [0m
00:57:12 | 2640   | configuration[0m | &gt; route            | 'flow4'[0m
00:57:12 | 2640   | configuration[0m | &gt; match            | [0m
00:57:12 | 2640   | configuration[0m | . source           | '10.0.0.4/32'[0m
00:57:12 | 2640   | configuration[0m | . destination      | '192.168.0.4/32'[0m
00:57:12 | 2640   | configuration[0m | &lt; match            | [0m
00:57:12 | 2640   | configuration[0m | . next-hop         | '127.0.0.1'[0m
00:57:12 | 2640   | configuration[0m | &gt; then             | [0m
00:57:12 | 2640   | configuration[0m | . redirect-to-nexthop | [0m
00:57:12 | 2640   | configuration[0m | &lt; then             | [0m
00:57:12 | 2640   | configuration[0m | &lt; route            | [0m
00:57:12 | 2640   | configuration[0m | &lt; flow             | [0m
00:57:12 | 2640   | configuration[0m | &lt; neighbor         | [0m
00:57:12 | 2640   | reactor      [0m | new peer: neighbor 10.30.170.173 local-ip 10.30.171.7 local-as 64496 peer-as 64496 router-id 10.30.171.7 family-allowed in-open[0m
00:57:12 | 2640   | [01;34mreactor      [0m | [1mloaded new configuration successfully[0m
00:57:12 | 2640   | reactor      [0m | initialising connection to peer-1[0m
00:57:12 | 2640   | outgoing-1   [0m | attempting connection to 10.30.170.173:1790[0m
00:57:12 | 2640   | outgoing-1   [0m | sending TCP payload (  49) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0031 0104 FBF0 00B4 0A1E AB07 1402 0601 0400 0100 8502 0641 0400 00FB F002 0206 00[0m
00:57:12 | 2640   | outgoing-1   [0m | &gt;&gt; OPEN version=4 asn=64496 hold_time=180 router_id=10.30.171.7 capabilities=[Multiprotocol(ipv4 flow), Extended Message(65535), ASN4(64496)][0m
00:57:12 | 2640   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0047 01[0m
00:57:12 | 2640   | 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:57:12 | 2640   | outgoing-1   [0m | &lt;&lt; message of type OPEN[0m
00:57:12 | 2640   | 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:57:12 | 2640   | ka-outgoing-1[0m | receive-timer 60 second(s) left[0m
00:57:12 | 2640   | [01;33moutgoing-1   [0m | [1m--------------------------------------------------------------------[0m
00:57:12 | 2640   | [01;33moutgoing-1   [0m | [1mthe connection can not carry the following family/families[0m
00:57:12 | 2640   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/flow[0m
00:57:12 | 2640   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/unicast[0m
00:57:12 | 2640   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/mpls-vpn[0m
00:57:12 | 2640   | [01;33moutgoing-1   [0m | [1mtherefore no routes of this kind can be announced on the connection[0m
00:57:12 | 2640   | [01;33moutgoing-1   [0m | [1m--------------------------------------------------------------------[0m
00:57:12 | 2640   | outgoing-1   [0m | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04[0m
00:57:12 | 2640   | outgoing-1   [0m | &gt;&gt; KEEPALIVE (OPENCONFIRM)[0m
00:57:12 | 2640   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04[0m
00:57:12 | 2640   | outgoing-1   [0m | &lt;&lt; message of type KEEPALIVE[0m
00:57:12 | 2640   | ka-outgoing-1[0m | receive-timer 180 second(s) left[0m
00:57:12 | 2640   | [01;34mreactor      [0m | [1mconnected to peer-1 with outgoing-1 10.30.171.7-10.30.170.173[0m
00:57:12 | 2640   | 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:57:12 | 2640   | 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:57:12 | 2640   | 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:57:12 | 2640   | outgoing-1   [0m | &gt;&gt; 3 UPDATE(s)[0m
00:57:12 | 2640   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02[0m
00:57:12 | 2640   | outgoing-1   [0m | received complete TCP payload (   4) 0000 0000[0m
00:57:12 | 2640   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:57:12 | 2640   | parser       [0m | parsing UPDATE (   4) 0000 0000[0m
00:57:12 | 2640   | peer-1       [0m | &lt;&lt; UPDATE #1[0m
00:57:12 | 2640   | peer-1       [0m |    UPDATE #1 nlri  (   4) eor 1/1 (ipv4 unicast)[0m
00:57:12 | 2640   | outgoing-1   [0m | sending TCP payload (  30) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001E 0200 0000 0790 0F00 0300 0185[0m
00:57:12 | 2640   | outgoing-1   [0m | &gt;&gt; EOR ipv4 flow[0m
00:57:12 | 2640   | peer-1       [0m | &gt;&gt; EOR(s)[0m
00:57:12 | 2640   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001D 02[0m
00:57:12 | 2640   | outgoing-1   [0m | received complete TCP payload (  10) 0000 0006 800F 0300 0185[0m
00:57:12 | 2640   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:57:12 | 2640   | parser       [0m | parsing UPDATE (  10) 0000 0006 800F 0300 0185[0m
00:57:12 | 2640   | routes       [0m | withdrawn NLRI none[0m
00:57:12 | 2640   | parser       [0m | attribute mp-unreach-nlri    flag 0x80 type 0x0f len 0x03 payload 0001 85[0m
00:57:12 | 2640   | routes       [0m | announced NLRI none[0m
00:57:12 | 2640   | peer-1       [0m | &lt;&lt; UPDATE #2[0m
00:57:12 | 2640   | peer-1       [0m |    UPDATE #2 nlri  (  11) eor 1/133 (ipv4 flow)[0m
00:57:12 | 2640   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02[0m
00:57:12 | 2640   | outgoing-1   [0m | received complete TCP payload (   4) 0000 0000[0m
00:57:12 | 2640   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:57:12 | 2640   | parser       [0m | parsing UPDATE (   4) 0000 0000[0m
00:57:12 | 2640   | peer-1       [0m | &lt;&lt; UPDATE #3[0m
00:57:12 | 2640   | peer-1       [0m |    UPDATE #3 nlri  (   4) eor 1/1 (ipv4 unicast)[0m
00:57:13 | 2640   | ka-outgoing-1[0m | receive-timer 179 second(s) left[0m
00:57:13 | 2640   | ka-outgoing-1[0m | send-timer 59 second(s) left[0m
00:57:14 | 2640   | ka-outgoing-1[0m | receive-timer 178 second(s) left[0m
00:57:14 | 2640   | ka-outgoing-1[0m | send-timer 58 second(s) left[0m
00:57:14 | 2640   | ka-outgoing-1[0m | receive-timer 177 second(s) left[0m
00:57:14 | 2640   | ka-outgoing-1[0m | send-timer 57 second(s) left[0m</msg>
<msg time="2026-10-11T00:57:15.123233" level="INFO">${output} = [?2004l00:57:12 | 2640   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:57:12 | 2640   | [01;34mversion      [0m | [1m4.2.17  [0m
00:57:12 | 2640   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-10-11T00:57:15.122811" elapsed="0.000451"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.123695" level="INFO">[?2004l00:57:12 | 2640   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:57:12 | 2640   | [01;34mversion      [0m | [1m4.2.17  [0m
00:57:12 | 2640   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
00:57:12 | 2640   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
00:57:12 | 2640   | [01;34minstallation [0m | [1m        [0m
00:57:12 | 2640   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:57:12 | 2640   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:57:12 | 2640   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:57:12 | 2640   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:57:12 | 2640   | [01;31mcli control  [0m | [1m - /run/[0m
00:57:12 | 2640   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:57:12 | 2640   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:57:12 | 2640   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:57:12 | 2640   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:57:12 | 2640   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:57:12 | 2640   | [01;31mcli control  [0m | [1m - /run/[0m
00:57:12 | 2640   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:57:12 | 2640   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:57:12 | 2640   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:57:12 | 2640   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:57:12 | 2640   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:57:12 | 2640   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:57:12 | 2640   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:57:12 | 2640   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:57:12 | 2640   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
00:57:12 | 2640   | configuration[0m | . router-id        | '10.30.171.7'[0m
00:57:12 | 2640   | configuration[0m | . local-address    | '10.30.171.7'[0m
00:57:12 | 2640   | configuration[0m | . local-as         | '64496'[0m
00:57:12 | 2640   | configuration[0m | . peer-as          | '64496'[0m
00:57:12 | 2640   | configuration[0m | &gt; family           | [0m
00:57:12 | 2640   | configuration[0m | . ipv4             | 'flow'[0m
00:57:12 | 2640   | configuration[0m | &lt; family           | [0m
00:57:12 | 2640   | configuration[0m | &gt; flow             | [0m
00:57:12 | 2640   | configuration[0m | &gt; route            | 'flow1'[0m
00:57:12 | 2640   | configuration[0m | &gt; match            | [0m
00:57:12 | 2640   | configuration[0m | . source           | '10.0.0.1/32'[0m
00:57:12 | 2640   | configuration[0m | . destination      | '192.168.0.1/32'[0m
00:57:12 | 2640   | configuration[0m | &lt; match            | [0m
00:57:12 | 2640   | configuration[0m | &gt; then             | [0m
00:57:12 | 2640   | configuration[0m | . redirect         | '65500:12345'[0m
00:57:12 | 2640   | configuration[0m | &lt; then             | [0m
00:57:12 | 2640   | configuration[0m | &lt; route            | [0m
00:57:12 | 2640   | configuration[0m | &gt; route            | 'flow2'[0m
00:57:12 | 2640   | configuration[0m | &gt; match            | [0m
00:57:12 | 2640   | configuration[0m | . source           | '10.0.0.2/32'[0m
00:57:12 | 2640   | configuration[0m | . destination      | '192.168.0.2/32'[0m
00:57:12 | 2640   | configuration[0m | &lt; match            | [0m
00:57:12 | 2640   | configuration[0m | &gt; then             | [0m
00:57:12 | 2640   | configuration[0m | . redirect         | '1.2.3.4'[0m
00:57:12 | 2640   | configuration[0m | &lt; then             | [0m
00:57:12 | 2640   | configuration[0m | &lt; route            | [0m
00:57:12 | 2640   | configuration[0m | &gt; route            | 'flow4'[0m
00:57:12 | 2640   | configuration[0m | &gt; match            | [0m
00:57:12 | 2640   | configuration[0m | . source           | '10.0.0.4/32'[0m
00:57:12 | 2640   | configuration[0m | . destination      | '192.168.0.4/32'[0m
00:57:12 | 2640   | configuration[0m | &lt; match            | [0m
00:57:12 | 2640   | configuration[0m | . next-hop         | '127.0.0.1'[0m
00:57:12 | 2640   | configuration[0m | &gt; then             | [0m
00:57:12 | 2640   | configuration[0m | . redirect-to-nexthop | [0m
00:57:12 | 2640   | configuration[0m | &lt; then             | [0m
00:57:12 | 2640   | configuration[0m | &lt; route            | [0m
00:57:12 | 2640   | configuration[0m | &lt; flow             | [0m
00:57:12 | 2640   | configuration[0m | &lt; neighbor         | [0m
00:57:12 | 2640   | reactor      [0m | new peer: neighbor 10.30.170.173 local-ip 10.30.171.7 local-as 64496 peer-as 64496 router-id 10.30.171.7 family-allowed in-open[0m
00:57:12 | 2640   | [01;34mreactor      [0m | [1mloaded new configuration successfully[0m
00:57:12 | 2640   | reactor      [0m | initialising connection to peer-1[0m
00:57:12 | 2640   | outgoing-1   [0m | attempting connection to 10.30.170.173:1790[0m
00:57:12 | 2640   | outgoing-1   [0m | sending TCP payload (  49) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0031 0104 FBF0 00B4 0A1E AB07 1402 0601 0400 0100 8502 0641 0400 00FB F002 0206 00[0m
00:57:12 | 2640   | outgoing-1   [0m | &gt;&gt; OPEN version=4 asn=64496 hold_time=180 router_id=10.30.171.7 capabilities=[Multiprotocol(ipv4 flow), Extended Message(65535), ASN4(64496)][0m
00:57:12 | 2640   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0047 01[0m
00:57:12 | 2640   | 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:57:12 | 2640   | outgoing-1   [0m | &lt;&lt; message of type OPEN[0m
00:57:12 | 2640   | 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:57:12 | 2640   | ka-outgoing-1[0m | receive-timer 60 second(s) left[0m
00:57:12 | 2640   | [01;33moutgoing-1   [0m | [1m--------------------------------------------------------------------[0m
00:57:12 | 2640   | [01;33moutgoing-1   [0m | [1mthe connection can not carry the following family/families[0m
00:57:12 | 2640   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/flow[0m
00:57:12 | 2640   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/unicast[0m
00:57:12 | 2640   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/mpls-vpn[0m
00:57:12 | 2640   | [01;33moutgoing-1   [0m | [1mtherefore no routes of this kind can be announced on the connection[0m
00:57:12 | 2640   | [01;33moutgoing-1   [0m | [1m--------------------------------------------------------------------[0m
00:57:12 | 2640   | outgoing-1   [0m | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04[0m
00:57:12 | 2640   | outgoing-1   [0m | &gt;&gt; KEEPALIVE (OPENCONFIRM)[0m
00:57:12 | 2640   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04[0m
00:57:12 | 2640   | outgoing-1   [0m | &lt;&lt; message of type KEEPALIVE[0m
00:57:12 | 2640   | ka-outgoing-1[0m | receive-timer 180 second(s) left[0m
00:57:12 | 2640   | [01;34mreactor      [0m | [1mconnected to peer-1 with outgoing-1 10.30.171.7-10.30.170.173[0m
00:57:12 | 2640   | 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:57:12 | 2640   | 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:57:12 | 2640   | 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:57:12 | 2640   | outgoing-1   [0m | &gt;&gt; 3 UPDATE(s)[0m
00:57:12 | 2640   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02[0m
00:57:12 | 2640   | outgoing-1   [0m | received complete TCP payload (   4) 0000 0000[0m
00:57:12 | 2640   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:57:12 | 2640   | parser       [0m | parsing UPDATE (   4) 0000 0000[0m
00:57:12 | 2640   | peer-1       [0m | &lt;&lt; UPDATE #1[0m
00:57:12 | 2640   | peer-1       [0m |    UPDATE #1 nlri  (   4) eor 1/1 (ipv4 unicast)[0m
00:57:12 | 2640   | outgoing-1   [0m | sending TCP payload (  30) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001E 0200 0000 0790 0F00 0300 0185[0m
00:57:12 | 2640   | outgoing-1   [0m | &gt;&gt; EOR ipv4 flow[0m
00:57:12 | 2640   | peer-1       [0m | &gt;&gt; EOR(s)[0m
00:57:12 | 2640   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001D 02[0m
00:57:12 | 2640   | outgoing-1   [0m | received complete TCP payload (  10) 0000 0006 800F 0300 0185[0m
00:57:12 | 2640   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:57:12 | 2640   | parser       [0m | parsing UPDATE (  10) 0000 0006 800F 0300 0185[0m
00:57:12 | 2640   | routes       [0m | withdrawn NLRI none[0m
00:57:12 | 2640   | parser       [0m | attribute mp-unreach-nlri    flag 0x80 type 0x0f len 0x03 payload 0001 85[0m
00:57:12 | 2640   | routes       [0m | announced NLRI none[0m
00:57:12 | 2640   | peer-1       [0m | &lt;&lt; UPDATE #2[0m
00:57:12 | 2640   | peer-1       [0m |    UPDATE #2 nlri  (  11) eor 1/133 (ipv4 flow)[0m
00:57:12 | 2640   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02[0m
00:57:12 | 2640   | outgoing-1   [0m | received complete TCP payload (   4) 0000 0000[0m
00:57:12 | 2640   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:57:12 | 2640   | parser       [0m | parsing UPDATE (   4) 0000 0000[0m
00:57:12 | 2640   | peer-1       [0m | &lt;&lt; UPDATE #3[0m
00:57:12 | 2640   | peer-1       [0m |    UPDATE #3 nlri  (   4) eor 1/1 (ipv4 unicast)[0m
00:57:13 | 2640   | ka-outgoing-1[0m | receive-timer 179 second(s) left[0m
00:57:13 | 2640   | ka-outgoing-1[0m | send-timer 59 second(s) left[0m
00:57:14 | 2640   | ka-outgoing-1[0m | receive-timer 178 second(s) left[0m
00:57:14 | 2640   | ka-outgoing-1[0m | send-timer 58 second(s) left[0m
00:57:14 | 2640   | ka-outgoing-1[0m | receive-timer 177 second(s) left[0m
00:57:14 | 2640   | 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-10-11T00:57:15.123468" elapsed="0.000475"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.124738" 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-10-11T00:57:15.124434" elapsed="0.000329"/>
</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-10-11T00:57:15.124901" 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-10-11T00:57:15.124119" elapsed="0.001063"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:57:15.254943" level="INFO">^C00:57:15 | 2640   | [00;31mreactor      [0m | [1m^C received[0m
00:57:15 | 2640   | [00;31mreactor      [0m | [1mperforming shutdown[0m
00:57:15 | 2640   | outgoing-1   [0m | stop, message [shutting down][0m
00:57:15 | 2640   | [01;33moutgoing-1   [0m | [1moutgoing-1 10.30.171.7-10.30.170.173, closing connection[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T00:57:15.255159" level="INFO">${output} = ^C00:57:15 | 2640   | [00;31mreactor      [0m | [1m^C received[0m
00:57:15 | 2640   | [00;31mreactor      [0m | [1mperforming shutdown[0m
00:57:15 | 2640   | 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-10-11T00:57:15.125340" elapsed="0.129851"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.255838" level="INFO">^C00:57:15 | 2640   | [00;31mreactor      [0m | [1m^C received[0m
00:57:15 | 2640   | [00;31mreactor      [0m | [1mperforming shutdown[0m
00:57:15 | 2640   | outgoing-1   [0m | stop, message [shutting down][0m
00:57:15 | 2640   | [01;33moutgoing-1   [0m | [1moutgoing-1 10.30.171.7-10.30.170.173, closing connection[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T00:57:15.255499" elapsed="0.000392"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:57:15.258924" 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-10-11T00:57:15.256585" elapsed="0.002394"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:57:15.259756" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T00:57:15.259832" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-423-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-10-11T00:57:15.259139" elapsed="0.000718"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.260442" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-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-10-11T00:57:15.260194" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:15.259933" elapsed="0.000603"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:15.259910" elapsed="0.000651"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-10-11T00:57:15.256147" elapsed="0.004458"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-10-11T00:57:15.122521" elapsed="0.138133"/>
</kw>
<doc>Testing flowspec values for bgp-flowspec-redirect.cfg</doc>
<status status="PASS" start="2026-10-11T00:57:11.872659" elapsed="3.388038"/>
</test>
<test id="s1-s10-t5" name="Deconfigure_ODL_To_Accept_Connection" line="72">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.261920" level="INFO">&amp;{mapping} = { IP=10.30.171.7 | 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-10-11T00:57:15.261507" elapsed="0.000439"/>
</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-10-11T00:57:15.274686" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:15.274345" elapsed="0.000368"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:15.275377" 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-10-11T00:57:15.275168" elapsed="0.000331">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-10-11T00:57:15.275589" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:15.274861" elapsed="0.000752"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.276101" 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-10-11T00:57:15.275780" elapsed="0.000347"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:15.276391" 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-10-11T00:57:15.276567" 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-10-11T00:57:15.276279" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.276988" 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-10-11T00:57:15.276770" 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-10-11T00:57:15.277999" level="INFO">mapping: {'IP': '10.30.171.7', '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-10-11T00:57:15.277767" elapsed="0.000274"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.278474" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:57:15.278201" elapsed="0.000298"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.279079" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:57:15.278813" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:15.279783" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:57:15.279592" elapsed="0.000215"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:15.279855" elapsed="0.000034"/>
</return>
<msg time="2026-10-11T00:57:15.279989" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:57:15.279262" elapsed="0.000750"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:15.280163" elapsed="0.000184"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:57:15.278695" elapsed="0.001688"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.280897" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:57:15.280631" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:15.281577" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:57:15.281371" elapsed="0.000230"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:15.281644" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:57:15.281766" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:57:15.281076" elapsed="0.000712"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:15.281942" elapsed="0.000163"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:57:15.280513" elapsed="0.001628"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:57:15.278547" elapsed="0.003625"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:57:15.282211" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:57:15.282336" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:57:15.277392" elapsed="0.004968"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:15.277149" elapsed="0.005240"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:15.282572" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:15.282426" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:15.277130" elapsed="0.005512"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.283306" 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-10-11T00:57:15.282786" elapsed="0.000547"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:57:15.283376" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>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-10-11T00:57:15.273847" elapsed="0.009658"/>
</kw>
<msg time="2026-10-11T00:57:15.283554" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:15.269616" elapsed="0.013982"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>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-10-11T00:57:15.287515" 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/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-10-11T00:57:15.291271" 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/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-10-11T00:57:15.294985" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:15.295151" 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-10-11T00:57:15.295318" 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-10-11T00:57:15.295668" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:15.295537" elapsed="0.000181"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:15.295523" elapsed="0.000217"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:15.295880" 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-10-11T00:57:15.296045" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:15.296195" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:57:15.295497" elapsed="0.000746"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:57:15.295383" elapsed="0.000884"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:15.296417" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:15.296500" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:57:15.296611" 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-10-11T00:57:15.268987" elapsed="0.027649"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.297640" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:15.297363" 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-10-11T00:57:15.307730" level="INFO">DELETE Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01lvkwbkce3bgv1mcqt2k48u6gq16.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:15.307777" level="INFO">DELETE Response : url=http://10.30.170.173: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.171.7 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:15.307874" 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-10-11T00:57:15.297957" elapsed="0.009942"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:15.297744" elapsed="0.010193"/>
</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-10-11T00:57:15.308127" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:15.307961" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:15.297728" elapsed="0.010477"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.309394" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:15.309118" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:15.308892" elapsed="0.000610"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:15.308873" elapsed="0.000651"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.310067" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:15.309796" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:15.309574" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:15.309559" elapsed="0.000602"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.310723" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:15.310326" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:15.311001" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:15.310811" elapsed="0.000241"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.311513" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:15.311218" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:15.311074" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:15.310795" elapsed="0.000795"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.312077" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:15.311744" elapsed="0.000358"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:15.312350" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:15.312163" elapsed="0.000238"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.312849" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:15.312590" elapsed="0.000283"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:15.312438" elapsed="0.000467"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:15.312147" elapsed="0.000777"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:15.313052" elapsed="0.000287"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:57:15.313735" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:15.313509" elapsed="0.000250"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:57:15.313897" elapsed="0.000212"/>
</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-10-11T00:57:15.308553" elapsed="0.005611"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:57:15.314204" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:15.314374" 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-10-11T00:57:15.296858" elapsed="0.017540"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:57:15.314470" elapsed="0.000025"/>
</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-10-11T00:57:15.262348" elapsed="0.052219"/>
</kw>
<doc>Deconfigure BGP peer.</doc>
<status status="PASS" start="2026-10-11T00:57:15.261027" elapsed="0.053636"/>
</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-10-11T00:57:15.315263" elapsed="0.000287"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-10-11T00:57:15.315756" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects </doc>
<status status="PASS" start="2026-10-11T00:57:15.315691" elapsed="0.000123"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-10-11T00:57:15.315073" elapsed="0.000789"/>
</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-10-11T00:57:02.521710" elapsed="12.794182"/>
</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-10-11T00:57:15.346737" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:57:15.344993" elapsed="0.001789"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-10-11T00:57:15.344755" elapsed="0.002082"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.349177" 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-10-11T00:57:15.347814" elapsed="0.001388"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-10-11T00:57:15.349354" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:15.349273" elapsed="0.000118"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:15.349255" elapsed="0.000172"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.349944" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:57:15.349623" elapsed="0.000360"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.350434" 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-10-11T00:57:15.350147" elapsed="0.000329"/>
</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-10-11T00:57:15.350979" elapsed="0.000244"/>
</kw>
<msg time="2026-10-11T00:57:15.351310" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:15.351352" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:15.350643" elapsed="0.000730"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.351898" 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-10-11T00:57:15.351586" elapsed="0.000336"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.352795" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:57:15.352551" elapsed="0.000269"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.353201" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:57:15.352966" elapsed="0.000260"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.353694" 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-10-11T00:57:15.353402" elapsed="0.000317"/>
</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-10-11T00:57:15.354607" elapsed="0.000157"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.355198" level="INFO">${member_ip} = 10.30.170.173</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:15.354924" elapsed="0.000298"/>
</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-10-11T00:57:15.355388" elapsed="0.000196"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.356495" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:15.356030" elapsed="0.000491"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-11T00:57:15.356562" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T00:57:15.356688" 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-10-11T00:57:15.355765" elapsed="0.000945"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:57:15.357206" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7434456060d0&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-10-11T00:57:15.356891" elapsed="0.000430"/>
</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-10-11T00:57:15.357514" elapsed="0.000150"/>
</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-10-11T00:57:15.354121" elapsed="0.003597"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:57:15.353944" elapsed="0.003813"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-10-11T00:57:15.353763" elapsed="0.004022"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.358322" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:57:15.357970" elapsed="0.000391"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.358958" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.173'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:57:15.358608" elapsed="0.000388"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.359547" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:57:15.359183" elapsed="0.000403"/>
</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-10-11T00:57:15.352147" elapsed="0.007492"/>
</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-10-11T00:57:15.347506" elapsed="0.012181"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:15.359833" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:15.359744" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:15.359727" elapsed="0.000167"/>
</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-10-11T00:57:15.361085" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:15.360768" elapsed="0.000343"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.361552" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:57:15.361264" elapsed="0.000312"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:57:15.361616" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:15.361741" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:57:15.360466" elapsed="0.001297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:57:15.362615" level="INFO">${member_ip} = 10.30.170.173</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-10-11T00:57:15.362383" elapsed="0.000257"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:57:15.363355" 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-10-11T00:57:15.363530" 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-10-11T00:57:15.363211" elapsed="0.000346"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:15.366425" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:15.365881" elapsed="0.000639"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:15.365863" elapsed="0.000695"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:57:15.367218" 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-10-11T00:57:15.367471" 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-10-11T00:57:15.366803" elapsed="0.000719"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.368376" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.173" 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-10-11T00:57:15.367824" elapsed="0.000712"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:57:15.369818" 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-10-11T00:57:15.368829" elapsed="0.001038"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:57:15.371612" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:57:15.371775" 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-10-11T00:57:15.371254" elapsed="0.000562"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:15.372143" elapsed="0.000485"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:57:15.373716" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:57:15.992264" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 00:57:15 UTC 2026

  System load:  0.19               Processes:             120
  Usage of /:   14.2% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.173
  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.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:54:36 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:57:15.373437" elapsed="0.619050"/>
</kw>
<msg time="2026-10-11T00:57:15.992593" 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-10-11T00:57:15.372967" elapsed="0.619828"/>
</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-10-11T00:57:15.370280" elapsed="0.622706"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:57:15.994183" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-10-11T00:57:16.007960" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-10-11T00:57:16.008188" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T00:57:16.008326" 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-10-11T00:57:15.993566" elapsed="0.014826"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:57:16.008907" elapsed="0.000719"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:16.011339" 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-10-11T00:57:16.010596" elapsed="0.000965"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T00:57:16.012109" elapsed="0.000095"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:16.011789" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:16.011753" elapsed="0.000615"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:57:16.012789" elapsed="0.000107"/>
</return>
<status status="PASS" start="2026-10-11T00:57:16.012520" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:16.012496" elapsed="0.000568"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T00:57:16.013139" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:16.015042" elapsed="0.000667"/>
</kw>
<kw name="Open 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-10-11T00:57:16.016140" elapsed="0.000418"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:57:16.016927" elapsed="0.000293"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:57:16.013977" elapsed="0.003332"/>
</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-10-11T00:57:15.365181" elapsed="0.652374"/>
</kw>
<msg time="2026-10-11T00:57:16.017626" 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-10-11T00:57:15.364590" elapsed="0.653105"/>
</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-10-11T00:57:15.364176" elapsed="0.653619"/>
</kw>
<msg time="2026-10-11T00:57:16.017845" 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-10-11T00:57:15.363719" elapsed="0.654185"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:16.018900" elapsed="0.000387"/>
</kw>
<kw name="Open 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-10-11T00:57:16.019639" elapsed="0.000192"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:57:16.020035" 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-10-11T00:57:16.018355" elapsed="0.001936"/>
</kw>
<msg time="2026-10-11T00:57:16.020473" 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-10-11T00:57:15.362841" elapsed="0.657669"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:16.021122" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:16.020811" elapsed="0.000365"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-11T00:57:16.021229" elapsed="0.000038"/>
</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-10-11T00:57:15.362072" elapsed="0.659298"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:57:15.361907" elapsed="0.659530"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:57:15.361808" elapsed="0.659692"/>
</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-10-11T00:57:15.360096" elapsed="0.661475"/>
</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-10-11T00:57:16.021787" elapsed="0.000281"/>
</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-10-11T00:57:16.030024" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:16.029935" elapsed="0.000133"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:16.029916" elapsed="0.000173"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:57:16.030433" 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-10-11T00:57:16.030562" 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-10-11T00:57:16.030292" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:16.031012" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:16.030784" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:16.031491" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:16.031245" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:57:16.032246" 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-10-11T00:57:16.032068" elapsed="0.000280">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-10-11T00:57:16.032482" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T00:57:16.032526" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:16.031702" elapsed="0.000845"/>
</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-10-11T00:57:16.032837" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:16.032615" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:16.032598" elapsed="0.000329"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:57:16.033601" level="INFO">${ip_address} = 10.30.170.173</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-10-11T00:57:16.033362" elapsed="0.000263"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-10-11T00:57:16.033669" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:16.033790" level="INFO">${odl_ip} = 10.30.170.173</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-10-11T00:57:16.033115" elapsed="0.000698"/>
</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-10-11T00:57:16.033992" elapsed="0.000324"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:57:16.034669" level="INFO">index=4
host=10.30.170.173
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-10-11T00:57:16.034761" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.173
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-10-11T00:57:16.034566" elapsed="0.000219"/>
</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-10-11T00:57:16.034953" elapsed="0.000241"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-10-11T00:57:16.035607" level="INFO">Logging into '10.30.170.173:8101' as 'karaf'.</msg>
<msg time="2026-10-11T00:57:16.270516" 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-10-11T00:57:16.035384" elapsed="0.235334"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:16.272534" elapsed="0.000280"/>
</kw>
<kw name="Open 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-10-11T00:57:16.273004" elapsed="0.000155"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:57:16.273308" elapsed="0.000092"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:57:16.272114" elapsed="0.001369"/>
</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-10-11T00:57:16.271152" elapsed="0.002374"/>
</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-10-11T00:57:16.029693" elapsed="0.243880"/>
</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-10-11T00:57:16.023059" elapsed="0.250559"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:16.022532" elapsed="0.251135"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:57:16.022300" elapsed="0.251406"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-10-11T00:57:16.022137" elapsed="0.251606"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-10-11T00:57:15.347091" elapsed="0.926708"/>
</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-10-11T00:57:16.274676" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:16.274581" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:16.274558" elapsed="0.000187"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:16.276760" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:16.276678" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:16.276661" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:16.277714" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:16.277347" elapsed="0.000393"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:57:16.278158" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:57:16.277897" elapsed="0.000285"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:57:16.278222" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T00:57:16.278358" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:57:16.277035" elapsed="0.001345"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:16.280906" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:16.280821" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:16.280804" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:16.282038" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:16.281952" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:16.281935" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:57:16.282561" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:57:16.282251" elapsed="0.000335"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:57:16.282953" 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-10-11T00:57:16.282759" elapsed="0.000218"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:57:16.321793" 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-10-11T00:57:16.283704" elapsed="0.038218"/>
</kw>
<msg time="2026-10-11T00:57:16.322065" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:57:16.322106" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:16.283138" elapsed="0.039052"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:57:16.416093" 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-10-11T00:57:16.322923" elapsed="0.093321"/>
</kw>
<msg time="2026-10-11T00:57:16.416380" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:57:16.416449" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:16.322371" elapsed="0.094116"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:16.416783" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:16.416561" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:16.416542" elapsed="0.000406"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:16.417598" 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-10-11T00:57:16.417138" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:16.418101" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:16.417742" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:16.417725" elapsed="0.000541"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:57:16.418297" 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">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:16.420212" elapsed="0.000437"/>
</kw>
<kw name="Open 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-10-11T00:57:16.421013" elapsed="0.000267"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:57:16.421657" elapsed="0.000216"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:57:16.419505" elapsed="0.002451"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:57:16.418618" elapsed="0.003463"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:57:16.281749" elapsed="0.140411"/>
</kw>
<msg time="2026-10-11T00:57:16.422243" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:16.422284" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:16.281122" elapsed="0.141198"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:57:16.422523" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:57:16.422390" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:16.422372" 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-10-11T00:57:16.422941" 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-10-11T00:57:16.423254" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:57:16.423319" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:57:16.280588" elapsed="0.142816"/>
</kw>
<msg time="2026-10-11T00:57:16.423620" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:16.423660" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:16.278755" elapsed="0.144941"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:16.423987" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:16.423763" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:16.423747" elapsed="0.000344"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:57:16.278606" elapsed="0.145507"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:57:16.278460" elapsed="0.145680"/>
</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-10-11T00:57:16.276447" elapsed="0.147743"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-10-11T00:57:16.274370" elapsed="0.149870"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:16.273958" elapsed="0.150320"/>
</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-10-11T00:57:15.344484" elapsed="1.079840"/>
</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-10-11T00:57:16.424514" elapsed="0.000146"/>
</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-10-11T00:57:16.424839" elapsed="0.000146"/>
</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-10-11T00:57:16.426529" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:57:16.426601" 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-10-11T00:57:16.426241" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:16.426778" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:57:16.427862" level="INFO">Logging into '10.30.171.7:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:57:16.796172" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Sun Oct 11 00:57:02 UTC 2026

  System load:  0.0                Processes:             107
  Usage of /:   19.9% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.7
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:57:03 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:57:16.427628" elapsed="0.368683"/>
</kw>
<msg time="2026-10-11T00:57:16.796393" 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-10-11T00:57:16.427227" elapsed="0.369267"/>
</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-10-11T00:57:16.425861" elapsed="0.370739"/>
</kw>
<msg time="2026-10-11T00:57:16.796647" 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-10-11T00:57:16.425490" elapsed="0.371200"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-10-11T00:57:16.425169" elapsed="0.371592"/>
</kw>
<kw name="Require_Python" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:57:16.798497" level="INFO">Executing command 'python3 --help'.</msg>
<msg time="2026-10-11T00:57:16.811268" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:57:16.811455" 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-10-11T00:57:16.811518" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T00:57:16.811571" 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-10-11T00:57:16.798288" elapsed="0.013313"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:57:16.812768" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T00:57:16.812371" elapsed="0.000454"/>
</kw>
<msg time="2026-10-11T00:57:16.812944" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T00:57:16.812999" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:16.811859" elapsed="0.001169"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:16.813860" 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-10-11T00:57:16.813280" elapsed="0.000615"/>
</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-10-11T00:57:16.814380" elapsed="0.000167"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:16.814010" elapsed="0.000628"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:16.813980" elapsed="0.000696"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-10-11T00:57:16.814862" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-10-11T00:57:16.814751" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:16.814730" elapsed="0.000245"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-10-11T00:57:16.815087" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:16.815044" elapsed="0.000093"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:16.815025" elapsed="0.000139"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:16.815375" elapsed="0.000026"/>
</kw>
<msg time="2026-10-11T00:57:16.815581" 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-10-11T00:57:16.797911" elapsed="0.017703"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-10-11T00:57:16.815795" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-10-11T00:57:16.815698" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:16.815677" elapsed="0.000215"/>
</if>
<kw name="Fatal Error" owner="BuiltIn">
<arg>Python 3 is not installed!</arg>
<doc>Stops the whole execution.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:16.816086" elapsed="0.000027"/>
</kw>
<doc>Verify current SSH connection leads to machine with python working. Fatal fail otherwise.</doc>
<status status="PASS" start="2026-10-11T00:57:16.797125" elapsed="0.019060"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:57:16.817812" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-10-11T00:57:16.900812" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:57:16.901072" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T00:57:16.901163" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T00:57:16.901247" 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-10-11T00:57:16.817603" elapsed="0.083693"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:57:16.903170" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T00:57:16.902626" elapsed="0.000640"/>
</kw>
<msg time="2026-10-11T00:57:16.903552" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T00:57:16.903649" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:16.901800" elapsed="0.001899"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:16.904961" 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-10-11T00:57:16.904105" elapsed="0.000911"/>
</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-10-11T00:57:16.905830" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:16.905177" elapsed="0.000781"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:16.905135" elapsed="0.000873"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-10-11T00:57:16.906281" elapsed="0.000062"/>
</return>
<status status="PASS" start="2026-10-11T00:57:16.906117" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:16.906086" elapsed="0.000421"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-10-11T00:57:16.906690" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:16.906620" elapsed="0.000151"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:16.906589" elapsed="0.000226"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:16.907149" elapsed="0.000042"/>
</kw>
<msg time="2026-10-11T00:57:16.907467" 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-10-11T00:57:16.817067" elapsed="0.090457"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-10-11T00:57:16.907823" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-10-11T00:57:16.907666" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:16.907628" elapsed="0.000350"/>
</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-10-11T00:57:16.908359" elapsed="0.000043"/>
</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-10-11T00:57:16.816536" elapsed="0.092043"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T00:57:16.945388" level="INFO">[chan 3] Opened sftp connection (server version 3)</msg>
<msg time="2026-10-11T00:57:16.963935" 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-10-11T00:57:16.908964" elapsed="0.055097"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:57:16.965132" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x74344593dc50&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-10-11T00:57:16.964631" elapsed="0.000916"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T00:57:16.968915" 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-10-11T00:57:16.968179" elapsed="0.000792"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="PASS" start="2026-10-11T00:57:16.969298" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-10-11T00:57:16.969127" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:16.969087" elapsed="0.000461"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:16.969989" elapsed="0.000046"/>
</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-10-11T00:57:16.970386" elapsed="0.000091"/>
</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 errorw.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:16.970831" elapsed="0.000043"/>
</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-10-11T00:57:16.971300" elapsed="0.000044"/>
</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-10-11T00:57:16.971878" elapsed="0.000056"/>
</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-10-11T00:57:16.967466" elapsed="0.004616"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:16.972461" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:16.972220" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:16.972186" elapsed="0.000413"/>
</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-10-11T00:57:16.975328" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:16.974592" elapsed="0.000790"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:57:16.976386" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:57:16.975795" elapsed="0.000691"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:57:16.976581" elapsed="0.000061"/>
</return>
<msg time="2026-10-11T00:57:16.976864" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:57:16.973857" elapsed="0.003056"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:57:16.978925" level="INFO">${member_ip} = 10.30.170.173</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-10-11T00:57:16.978389" elapsed="0.000590"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:57:16.980627" level="INFO">index=7
host=10.30.171.7
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-10-11T00:57:16.980832" level="INFO">${current_connection} = index=7
host=10.30.171.7
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-10-11T00:57:16.980303" elapsed="0.000583"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:16.986320" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:16.985763" elapsed="0.000985"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:16.985722" elapsed="0.001083"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:57:16.987534" level="INFO">index=7
host=10.30.171.7
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-10-11T00:57:16.987789" level="INFO">${current_ssh_connection} = index=7
host=10.30.171.7
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-10-11T00:57:16.987254" elapsed="0.000593"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:16.990616" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.173" 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-10-11T00:57:16.988357" elapsed="0.002362"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:57:16.991869" 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-10-11T00:57:16.991130" elapsed="0.000774"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:57:16.993729" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:57:16.994028" 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-10-11T00:57:16.992894" elapsed="0.001201"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:16.994542" elapsed="0.000780"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:57:16.997334" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:57:17.387463" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 00:57:15 UTC 2026

  System load:  0.19               Processes:             120
  Usage of /:   14.2% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.173
  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.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:57:15 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:57:16.996906" elapsed="0.390759"/>
</kw>
<msg time="2026-10-11T00:57:17.387767" 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-10-11T00:57:16.995817" elapsed="0.392118"/>
</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-10-11T00:57:16.992204" elapsed="0.395962"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:57:17.388755" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-10-11T00:57:17.401792" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-10-11T00:57:17.401998" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T00:57:17.402054" 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-10-11T00:57:17.388489" elapsed="0.013596"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:57:17.402311" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.403728" 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-10-11T00:57:17.403004" elapsed="0.000788"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T00:57:17.404063" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:17.403903" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:17.403869" elapsed="0.000287"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:57:17.404337" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-10-11T00:57:17.404224" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:17.404204" elapsed="0.000289"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T00:57:17.404538" elapsed="0.000019"/>
</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-10-11T00:57:17.407154" elapsed="0.000432"/>
</kw>
<msg time="2026-10-11T00:57:17.407702" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:17.405632" elapsed="0.002277"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:17.408445" elapsed="0.000098"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:17.408795" elapsed="0.000088"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:57:17.404961" elapsed="0.004037"/>
</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-10-11T00:57:16.984887" elapsed="0.424210"/>
</kw>
<msg time="2026-10-11T00:57:17.409227" 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-10-11T00:57:16.983275" elapsed="0.426018"/>
</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-10-11T00:57:16.982315" elapsed="0.427077"/>
</kw>
<msg time="2026-10-11T00:57:17.409540" 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-10-11T00:57:16.981236" elapsed="0.428364"/>
</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-10-11T00:57:17.411148" elapsed="0.000151"/>
</kw>
<msg time="2026-10-11T00:57:17.411353" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:17.410558" elapsed="0.001011"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:17.411826" elapsed="0.000279"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:17.412311" elapsed="0.000026"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:57:17.409988" elapsed="0.002487"/>
</kw>
<msg time="2026-10-11T00:57:17.412688" 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-10-11T00:57:16.979492" elapsed="0.433232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.413340" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:17.413028" elapsed="0.000365"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-11T00:57:17.413487" elapsed="0.000039"/>
</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-10-11T00:57:16.977689" elapsed="0.435938"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:57:16.977268" elapsed="0.436405"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:57:16.977026" elapsed="0.436693"/>
</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-10-11T00:57:16.973037" elapsed="0.440753"/>
</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-10-11T00:57:17.414005" elapsed="0.000281"/>
</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-10-11T00:57:17.422213" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:17.422094" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:17.422070" elapsed="0.000231"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:57:17.422768" level="INFO">index=7
host=10.30.171.7
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-10-11T00:57:17.422896" level="INFO">${current_ssh_connection_object} = index=7
host=10.30.171.7
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-10-11T00:57:17.422622" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.423580" 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-10-11T00:57:17.423200" elapsed="0.000437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.424209" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:17.423906" elapsed="0.000360"/>
</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-10-11T00:57:17.425028" elapsed="0.000194"/>
</kw>
<msg time="2026-10-11T00:57:17.425343" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:17.425400" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:17.424523" elapsed="0.000948"/>
</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-10-11T00:57:17.426593" elapsed="0.000152"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:57:17.437015" 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-10-11T00:57:17.427470" elapsed="0.009598"/>
</kw>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:17.427004" elapsed="0.010113"/>
</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-10-11T00:57:17.437644" elapsed="0.000167"/>
</kw>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:17.437287" elapsed="0.000569"/>
</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-10-11T00:57:17.425871" elapsed="0.012062"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:17.425567" elapsed="0.012412"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:17.425543" elapsed="0.012459"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:57:17.438742" level="INFO">${ip_address} = 10.30.170.173</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-10-11T00:57:17.438525" elapsed="0.000242"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-10-11T00:57:17.438810" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:57:17.438935" level="INFO">${odl_ip} = 10.30.170.173</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-10-11T00:57:17.438195" elapsed="0.000763"/>
</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-10-11T00:57:17.439139" elapsed="0.000400"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:57:17.439862" level="INFO">index=9
host=10.30.170.173
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-10-11T00:57:17.439951" level="INFO">${karaf_connection_object} = index=9
host=10.30.170.173
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-10-11T00:57:17.439766" elapsed="0.000210"/>
</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-10-11T00:57:17.440143" elapsed="0.000244"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-10-11T00:57:17.440813" level="INFO">Logging into '10.30.170.173:8101' as 'karaf'.</msg>
<msg time="2026-10-11T00:57:17.680606" 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-10-11T00:57:17.440617" elapsed="0.240123"/>
</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-10-11T00:57:17.682718" elapsed="0.000118"/>
</kw>
<msg time="2026-10-11T00:57:17.682876" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:17.682238" elapsed="0.000712"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:17.683136" elapsed="0.000020"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:17.683297" elapsed="0.000019"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:57:17.681850" elapsed="0.001524"/>
</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-10-11T00:57:17.681159" elapsed="0.002371"/>
</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-10-11T00:57:17.421769" elapsed="0.261817"/>
</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-10-11T00:57:17.415279" elapsed="0.268354"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:17.414762" elapsed="0.268922"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:57:17.414559" elapsed="0.269163"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-10-11T00:57:17.414357" elapsed="0.269403"/>
</for>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-10-11T00:57:16.966167" elapsed="0.717655"/>
</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-10-11T00:57:15.344161" elapsed="2.339708"/>
</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-10-11T00:57:17.685374" elapsed="0.000232"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:57:17.685051" 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-10-11T00:57:17.686624" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:17.686528" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:17.686504" elapsed="0.000188"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:17.688806" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:17.688720" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:17.688703" elapsed="0.000164"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.689860" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:17.689518" elapsed="0.000367"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.690322" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:57:17.690058" elapsed="0.000288"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:57:17.690386" elapsed="0.000053"/>
</return>
<msg time="2026-10-11T00:57:17.690541" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:57:17.689081" elapsed="0.001484"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:17.693321" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:17.693236" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:17.693218" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:17.694508" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:17.694386" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:17.694368" elapsed="0.000203"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:57:17.694895" 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-10-11T00:57:17.694721" elapsed="0.000198"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:57:17.695221" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:57:17.695087" elapsed="0.000157"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:57:17.741307" 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-10-11T00:57:17.695769" elapsed="0.045695"/>
</kw>
<msg time="2026-10-11T00:57:17.741636" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:57:17.741678" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:17.695403" elapsed="0.046310"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:57:17.794007" 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-10-11T00:57:17.742287" elapsed="0.051819"/>
</kw>
<msg time="2026-10-11T00:57:17.794256" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:57:17.794297" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:17.741906" elapsed="0.052425"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:17.794675" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:17.794444" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:17.794387" elapsed="0.000361"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.795168" 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-10-11T00:57:17.794937" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:17.795657" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:17.795291" elapsed="0.000418"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:17.795275" elapsed="0.000456"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:57:17.795763" 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-10-11T00:57:17.798330" elapsed="0.000148"/>
</kw>
<msg time="2026-10-11T00:57:17.798536" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:17.797207" 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-10-11T00:57:17.798979" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:17.799480" 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-10-11T00:57:17.796608" elapsed="0.003064"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:57:17.796089" elapsed="0.003642"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:57:17.694129" elapsed="0.105678"/>
</kw>
<msg time="2026-10-11T00:57:17.799893" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:17.799933" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:17.693568" elapsed="0.106401"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:57:17.800123" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:57:17.800038" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:17.800020" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:17.800578" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:17.800892" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:57:17.800961" 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-10-11T00:57:17.692946" elapsed="0.108103"/>
</kw>
<msg time="2026-10-11T00:57:17.801135" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:17.801175" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:17.690907" elapsed="0.110305"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:17.801599" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:17.801280" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:17.801264" elapsed="0.000406"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:57:17.690761" elapsed="0.110931"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:57:17.690615" elapsed="0.111109"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:57:17.688400" elapsed="0.113374"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:57:17.686225" elapsed="0.115599"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:17.685809" elapsed="0.116057"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:57:17.684596" elapsed="0.117319"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.802823" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.171.7 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | BGP_RIB=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCONFIG=exampl...</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-10-11T00:57:17.802127" elapsed="0.000724"/>
</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-10-11T00:57:17.815657" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:17.815318" elapsed="0.000365"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:17.816389" 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-10-11T00:57:17.816176" elapsed="0.000314">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-10-11T00:57:17.816576" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:17.815846" elapsed="0.000752"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.817099" 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-10-11T00:57:17.816788" elapsed="0.000336"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:17.817436" 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-10-11T00:57:17.817588" 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-10-11T00:57:17.817295" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.818027" 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-10-11T00:57:17.817809" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.819010" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', '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-10-11T00:57:17.818760" elapsed="0.000294"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.819536" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:57:17.819234" elapsed="0.000327"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.820183" 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-10-11T00:57:17.819911" elapsed="0.000297"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:17.820916" 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-10-11T00:57:17.820723" elapsed="0.000216"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:17.820984" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:57:17.821108" 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-10-11T00:57:17.820383" elapsed="0.000748"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:17.821300" elapsed="0.000214"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:57:17.819773" elapsed="0.001778"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.822052" 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-10-11T00:57:17.821786" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:17.822769" 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-10-11T00:57:17.822593" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:17.822836" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:17.822959" 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-10-11T00:57:17.822247" elapsed="0.000735"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:17.823149" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-10-11T00:57:17.821652" elapsed="0.001697"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.824022" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:57:17.823602" elapsed="0.000445"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:17.824775" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:57:17.824596" elapsed="0.000203"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:17.824844" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:17.824967" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:57:17.824253" elapsed="0.000737"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:17.825155" elapsed="0.000165"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:57:17.823468" elapsed="0.001889"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.825885" 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-10-11T00:57:17.825619" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:17.826598" 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-10-11T00:57:17.826395" elapsed="0.000227"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:17.826665" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:57:17.826788" 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-10-11T00:57:17.826086" elapsed="0.000725"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:17.826976" elapsed="0.000165"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:57:17.825484" elapsed="0.001693"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.827704" 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-10-11T00:57:17.827432" elapsed="0.000296"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:17.828385" 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-10-11T00:57:17.828210" elapsed="0.000221"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:17.828476" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:17.828600" 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-10-11T00:57:17.827902" elapsed="0.000720"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:17.828788" elapsed="0.000168"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:57:17.827275" elapsed="0.001718"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.829518" 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-10-11T00:57:17.829227" elapsed="0.000315"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:17.830206" 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-10-11T00:57:17.830032" elapsed="0.000197"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:17.830272" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:57:17.830392" 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-10-11T00:57:17.829717" elapsed="0.000739"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:17.830624" elapsed="0.000164"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:57:17.829090" elapsed="0.001733"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.831315" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:57:17.831052" elapsed="0.000287"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:17.832017" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:57:17.831842" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:17.832083" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:17.832206" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:57:17.831535" elapsed="0.000694"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:17.832392" elapsed="0.000194"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:57:17.830921" elapsed="0.001701"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.833117" 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-10-11T00:57:17.832851" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:17.834023" 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-10-11T00:57:17.833655" elapsed="0.000392"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:17.834092" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:17.834216" 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-10-11T00:57:17.833312" elapsed="0.000926"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:17.834404" elapsed="0.000192"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:57:17.832720" elapsed="0.001913"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.835132" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:57:17.834864" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:17.835882" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:57:17.835703" elapsed="0.000203"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:17.835950" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:17.836075" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:57:17.835331" 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-10-11T00:57:17.836263" elapsed="0.000189"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:57:17.834732" elapsed="0.001757"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.836985" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:57:17.836719" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:17.837701" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:57:17.837512" elapsed="0.000213"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:17.837768" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:17.837894" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:57:17.837179" elapsed="0.000738"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:17.838083" elapsed="0.000165"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:57:17.836587" elapsed="0.001696"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:57:17.819607" elapsed="0.018709"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:57:17.838352" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:57:17.838510" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 't...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:57:17.818386" elapsed="0.020149"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:17.818129" elapsed="0.020435"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:17.838738" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:17.838587" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:17.818112" elapsed="0.020695"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.839649" 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-10-11T00:57:17.838967" elapsed="0.000708"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:57:17.839718" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:57:17.814801" elapsed="0.025016"/>
</kw>
<msg time="2026-10-11T00:57:17.839871" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:17.810325" elapsed="0.029589"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:57:17.844143" 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/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-10-11T00:57:17.848364" 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/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-10-11T00:57:17.852595" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:17.852780" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:17.852964" 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-10-11T00:57:17.853306" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:17.853157" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:17.853144" 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-10-11T00:57:17.853565" 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-10-11T00:57:17.853749" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:17.853917" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:57:17.853119" elapsed="0.000845"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:57:17.853029" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:17.854143" elapsed="0.000017"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:17.854208" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:57:17.854317" 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-10-11T00:57:17.809719" elapsed="0.044631"/>
</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-10-11T00:57:17.864626" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:17.864277" elapsed="0.000377"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:17.865336" 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-10-11T00:57:17.865161" elapsed="0.000235">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-10-11T00:57:17.865513" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:17.864821" elapsed="0.000715"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.866021" 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-10-11T00:57:17.865714" elapsed="0.000332"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:17.866323" 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-10-11T00:57:17.866508" 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-10-11T00:57:17.866216" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.866972" 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-10-11T00:57:17.866741" 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-10-11T00:57:17.867349" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:17.867089" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.867875" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'BGP_RIB': 'example-bgp-rib', 'PASSIVE_MODE': 't...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:17.867609" elapsed="0.000292"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:17.867456" elapsed="0.000477"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:17.867071" elapsed="0.000882"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.868849" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflecto...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:17.868118" elapsed="0.000759"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:57:17.868922" 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-10-11T00:57:17.863756" elapsed="0.005272"/>
</kw>
<msg time="2026-10-11T00:57:17.869082" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:17.858399" elapsed="0.010725"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:57:17.873345" 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/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-10-11T00:57:17.877595" 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/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-10-11T00:57:17.882021" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:17.882207" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:17.882444" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:17.882790" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:17.882641" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:17.882628" 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-10-11T00:57:17.883021" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:17.883203" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:17.883369" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:57:17.882602" elapsed="0.000842"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:57:17.882513" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:17.883626" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:17.883692" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:57:17.883812" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflecto...</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-10-11T00:57:17.857687" elapsed="0.026152"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:17.884960" 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-10-11T00:57:17.884775" elapsed="0.000244">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-10-11T00:57:17.885102" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:17.884445" elapsed="0.000680"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:17.885433" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:17.885188" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.885949" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:17.885682" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:17.885508" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:17.885171" elapsed="0.000853"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.886564" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:17.886187" elapsed="0.000402"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:57:17.886633" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:57:17.886756" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:57:17.884117" elapsed="0.002661"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.887997" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:17.887778" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.888471" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T00:57:17.888233" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.888978" 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-10-11T00:57:17.888754" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.889449" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:17.889209" elapsed="0.000282"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:57:17.890204" 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-10-11T00:57:17.890042" elapsed="0.000187"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:57:17.890556" 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-10-11T00:57:17.890386" 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-10-11T00:57:17.890746" elapsed="0.000154"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.891316" 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-10-11T00:57:17.891097" elapsed="0.000259"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:57:17.891394" elapsed="0.000053"/>
</return>
<msg time="2026-10-11T00:57:17.891550" 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-10-11T00:57:17.889679" elapsed="0.001894"/>
</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-10-11T00:57:17.907490" level="INFO">PUT Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Content-Length': '1077', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T00:57:17.907557" level="INFO">PUT Response : url=http://10.30.170.173: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.171.7 
 status=201, reason=Created 
 headers={'Set-Cookie': 'JSESSIONID=node0i95srcw30m6z17a2l147cl1kz17.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Sat, 10-Oct-2026 00:57:17 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:17.907652" 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-10-11T00:57:17.891869" elapsed="0.015806"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:17.891635" elapsed="0.016081"/>
</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-10-11T00:57:17.907898" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:17.907740" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:17.891619" elapsed="0.016363"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.909337" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:17.909055" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:17.908801" elapsed="0.000645"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:17.908783" elapsed="0.000688"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.910035" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:17.909765" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:17.909523" elapsed="0.000584"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:17.909508" elapsed="0.000621"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.910707" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:17.910312" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:17.911009" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:17.910794" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.911574" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:17.911284" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:17.911117" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:17.910778" elapsed="0.000872"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.912162" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:17.911829" elapsed="0.000358"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:17.912494" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:17.912258" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.913003" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:17.912739" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:17.912570" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:17.912240" elapsed="0.000839"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:17.913226" elapsed="0.000319"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:57:17.913938" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:17.913709" elapsed="0.000253"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:57:17.914118" elapsed="0.000213"/>
</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-10-11T00:57:17.908505" elapsed="0.005881"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:57:17.914560" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:57:17.914477" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:17.914459" elapsed="0.000179"/>
</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-10-11T00:57:17.914784" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:57:17.914843" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:57:17.915000" 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-10-11T00:57:17.887076" elapsed="0.027948"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:57:17.915079" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:57:17.915200" 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-10-11T00:57:17.803847" elapsed="0.111375"/>
</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-10-11T00:57:17.915550" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:17.915306" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:17.915290" elapsed="0.000343"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:57:17.915662" elapsed="0.000024"/>
</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-10-11T00:57:17.803112" elapsed="0.112646"/>
</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-10-11T00:57:17.916920" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:17.916585" elapsed="0.000391"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:17.916568" elapsed="0.000431"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:17.917141" elapsed="0.000360"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.919922" 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-10-11T00:57:17.919558" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-10-11T00:57:17.920117" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:57:17.920013" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:17.919997" elapsed="0.000193"/>
</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-10-11T00:57:17.920354" elapsed="0.000020"/>
</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-10-11T00:57:17.920564" elapsed="0.000019"/>
</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-10-11T00:57:17.920738" elapsed="0.000018"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:17.920904" elapsed="0.000018"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:17.921070" elapsed="0.000018"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message of the current test case.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:17.921239" elapsed="0.000017"/>
</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-10-11T00:57:17.921479" 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-10-11T00:57:17.919218" elapsed="0.002335"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:17.916354" elapsed="0.005245"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-10-11T00:57:17.916015" elapsed="0.005622"/>
</kw>
<doc>Configure BGP peer module with initiate-connection set to false.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:57:17.684001" elapsed="0.237669"/>
</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-10-11T00:57:17.923084" elapsed="0.000201"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:57:17.922830" elapsed="0.000504"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:17.924321" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:17.924236" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:17.924219" elapsed="0.000164"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:17.926448" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:17.926338" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:17.926322" elapsed="0.000189"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.927398" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:17.927076" elapsed="0.000372"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:57:17.927865" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:57:17.927606" elapsed="0.000282"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:57:17.927928" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:17.928052" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:57:17.926719" elapsed="0.001355"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:17.930787" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:17.930703" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:17.930685" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:17.931933" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:17.931849" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:17.931832" elapsed="0.000167"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:57:17.932322" 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-10-11T00:57:17.932149" elapsed="0.000232"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:57:17.932746" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:57:17.932597" elapsed="0.000177"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:57:17.968120" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:57:17.933277" elapsed="0.034983"/>
</kw>
<msg time="2026-10-11T00:57:17.968474" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:57:17.968517" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:17.932937" elapsed="0.035615"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:57:18.001236" 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-10-11T00:57:17.969169" elapsed="0.032173"/>
</kw>
<msg time="2026-10-11T00:57:18.001534" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:57:18.001576" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:17.968765" elapsed="0.032848"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:18.001923" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:18.001692" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:18.001670" elapsed="0.000329"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:18.002449" 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-10-11T00:57:18.002188" elapsed="0.000331"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:18.002780" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:18.002579" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:18.002563" elapsed="0.000288"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:57:18.002884" 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-10-11T00:57:18.005508" elapsed="0.000120"/>
</kw>
<msg time="2026-10-11T00:57:18.005686" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:18.004346" elapsed="0.001475"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:18.006130" elapsed="0.000072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:18.006499" 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-10-11T00:57:18.003735" elapsed="0.002950"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:57:18.003214" 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-10-11T00:57:17.931590" elapsed="0.075227"/>
</kw>
<msg time="2026-10-11T00:57:18.006902" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:18.006942" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:17.931003" elapsed="0.075976"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:57:18.007132" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:57:18.007047" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:18.007030" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:18.007582" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:18.007890" elapsed="0.000068"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:57:18.008002" 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-10-11T00:57:17.930389" elapsed="0.077702"/>
</kw>
<msg time="2026-10-11T00:57:18.008177" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:18.008217" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:17.928403" elapsed="0.079850"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:18.008641" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:18.008320" elapsed="0.000372"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:18.008304" elapsed="0.000410"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:57:17.928259" elapsed="0.080478"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:57:17.928120" elapsed="0.080649"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:57:17.926049" elapsed="0.082773"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:57:17.923984" elapsed="0.084893"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:17.923588" elapsed="0.085333"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:57:17.922489" elapsed="0.086482"/>
</kw>
<kw name="Check_Example_Bgp_Rib_Does_Not_Contain" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:57:18.019978" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i95srcw30m6z17a2l147cl1kz17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:18.020188" level="INFO">GET Response : url=http://10.30.170.173: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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-10-11T00:57:18.020380" 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-10-11T00:57:18.009654" elapsed="0.010805"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:18.020961" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:18.020671" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:18.021597" 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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:18.021197" elapsed="0.000553"/>
</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 the `container` contains the `item`.</doc>
<status status="PASS" start="2026-10-11T00:57:18.021917" elapsed="0.000549"/>
</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-10-11T00:57:18.009185" elapsed="0.013342"/>
</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-10-11T00:57:18.023700" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:18.023328" elapsed="0.000429"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:18.023310" elapsed="0.000470"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:18.023926" elapsed="0.000281"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:18.026565" 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-10-11T00:57:18.026165" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-10-11T00:57:18.026767" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:57:18.026657" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:18.026640" elapsed="0.000206"/>
</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-10-11T00:57:18.027021" 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-10-11T00:57:18.027211" 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-10-11T00:57:18.027386" elapsed="0.000018"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:18.027593" elapsed="0.000019"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:18.027762" elapsed="0.000018"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message of the current test case.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:18.027934" 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-10-11T00:57:18.028140" elapsed="0.000018"/>
</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-10-11T00:57:18.025842" elapsed="0.002374"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:18.023132" elapsed="0.005131"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-10-11T00:57:18.022777" elapsed="0.005525"/>
</kw>
<doc>Check RIB for none linkstate-routes</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:57:17.921970" elapsed="0.106365"/>
</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-10-11T00:57:18.029808" elapsed="0.000200"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:57:18.029554" elapsed="0.000504"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:18.031022" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:18.030937" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:18.030919" elapsed="0.000166"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:18.033318" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:18.033234" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:18.033217" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:18.034311" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:18.033984" elapsed="0.000352"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:57:18.034782" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:57:18.034520" elapsed="0.000287"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:57:18.034847" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:18.034973" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:57:18.033619" elapsed="0.001407"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:18.037617" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:18.037532" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:18.037514" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:18.038731" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:18.038648" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:18.038630" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:57:18.039113" 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-10-11T00:57:18.038942" elapsed="0.000195"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:57:18.039470" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:57:18.039302" elapsed="0.000193"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:57:18.074560" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:57:18.039991" elapsed="0.034666"/>
</kw>
<msg time="2026-10-11T00:57:18.074808" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:57:18.074850" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:18.039655" elapsed="0.035231"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:57:18.101253" 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-10-11T00:57:18.075396" elapsed="0.025952"/>
</kw>
<msg time="2026-10-11T00:57:18.101532" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:57:18.101573" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:18.075056" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:18.101885" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:18.101677" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:18.101659" elapsed="0.000299"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:18.102368" 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-10-11T00:57:18.102142" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:18.102722" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:18.102521" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:18.102505" elapsed="0.000288"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:57:18.102822" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:57:18.105284" elapsed="0.000272"/>
</kw>
<msg time="2026-10-11T00:57:18.105615" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:18.104205" 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-10-11T00:57:18.106056" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:18.106389" 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-10-11T00:57:18.103618" 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-10-11T00:57:18.103114" 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-10-11T00:57:18.038356" elapsed="0.068382"/>
</kw>
<msg time="2026-10-11T00:57:18.106853" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:18.106893" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:18.037833" elapsed="0.069096"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:57:18.107082" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:57:18.106998" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:18.106980" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:18.107522" 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-10-11T00:57:18.107829" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:57:18.107893" 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-10-11T00:57:18.037220" elapsed="0.070757"/>
</kw>
<msg time="2026-10-11T00:57:18.108059" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:18.108098" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:18.035376" elapsed="0.072757"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:18.108529" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:18.108198" elapsed="0.000385"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:18.108183" elapsed="0.000422"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:57:18.035228" elapsed="0.073398"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:57:18.035079" elapsed="0.073575"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:57:18.032930" elapsed="0.075773"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:57:18.030686" elapsed="0.078067"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:18.030257" elapsed="0.078537"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:57:18.029181" elapsed="0.079658"/>
</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-10-11T00:57:18.111267" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:18.111184" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:18.111167" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:18.112245" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:18.111926" elapsed="0.000344"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:57:18.112711" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:57:18.112450" elapsed="0.000286"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:57:18.112775" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:57:18.112898" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:57:18.111565" elapsed="0.001355"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:18.115667" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:18.115402" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:18.115385" elapsed="0.000346"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:18.116721" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:18.116639" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:18.116622" elapsed="0.000160"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:57:18.117097" 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-10-11T00:57:18.116929" elapsed="0.000192"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:57:18.117478" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:57:18.117316" elapsed="0.000186"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:57:18.163657" 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-10-11T00:57:18.117997" elapsed="0.045762"/>
</kw>
<msg time="2026-10-11T00:57:18.163872" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:57:18.163914" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:18.117660" elapsed="0.046295"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:57:18.260622" 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-10-11T00:57:18.164580" elapsed="0.096142"/>
</kw>
<msg time="2026-10-11T00:57:18.260814" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:57:18.260855" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:18.164160" elapsed="0.096730"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:18.261211" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:18.260973" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:18.260949" elapsed="0.000335"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:18.261736" 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-10-11T00:57:18.261497" elapsed="0.000321"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:18.262078" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:18.261877" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:18.261861" elapsed="0.000286"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:57:18.262181" 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-10-11T00:57:18.263967" elapsed="0.000209"/>
</kw>
<msg time="2026-10-11T00:57:18.264319" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:18.263435" elapsed="0.000950"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:18.264605" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:18.264765" 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-10-11T00:57:18.263052" elapsed="0.001788"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:57:18.262557" elapsed="0.002326"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:57:18.116358" elapsed="0.148597"/>
</kw>
<msg time="2026-10-11T00:57:18.265038" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:18.265077" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:18.115884" elapsed="0.149229"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:57:18.265265" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:57:18.265181" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:18.265164" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:18.265721" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:18.266034" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:57:18.266147" 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-10-11T00:57:18.115113" elapsed="0.151128"/>
</kw>
<msg time="2026-10-11T00:57:18.266326" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:18.266366" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:18.113250" elapsed="0.153151"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:18.266739" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:18.266514" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:18.266497" elapsed="0.000312"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:57:18.113106" elapsed="0.153725"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:57:18.112965" elapsed="0.153897"/>
</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-10-11T00:57:18.110916" elapsed="0.155998"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:18.108999" elapsed="0.157961"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:18.270366" level="INFO">${start_cmd} = python3 play.py --amount 1 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:18.270084" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:18.270843" level="INFO">python3 play.py --amount 1 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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-10-11T00:57:18.270627" elapsed="0.000259"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:57:18.274463" level="INFO">python3 play.py --amount 1 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --peerport=1790 --debug --logfile bgp_peer.log --bgpls True --skipattr &amp;&gt;bgp_peer.log</msg>
<msg time="2026-10-11T00:57:18.274549" level="INFO">${output} =  python3 play.py --amount 1 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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-10-11T00:57:18.271042" elapsed="0.003532"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:18.274989" level="INFO"> python3 play.py --amount 1 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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-10-11T00:57:18.274772" elapsed="0.000260"/>
</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-10-11T00:57:18.269723" elapsed="0.005360"/>
</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-10-11T00:57:28.277028" 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-10-11T00:57:18.276744" elapsed="10.002606">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-10-11T00:57:28.279664" elapsed="0.000028"/>
</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-10-11T00:57:18.276463" elapsed="10.003334">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-10-11T00:57:18.276074" elapsed="10.003833"/>
</kw>
<msg time="2026-10-11T00:57:28.280000" 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-10-11T00:57:18.275695" elapsed="10.004329"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-10-11T00:57:28.280174" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-10-11T00:57:28.280106" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:28.280082" elapsed="0.000173"/>
</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-10-11T00:57:28.280499" elapsed="0.000025"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:28.280680" elapsed="0.000019"/>
</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-10-11T00:57:18.275315" elapsed="10.005436"/>
</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-10-11T00:57:28.282038" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:28.281685" elapsed="0.000410"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:28.281668" elapsed="0.000449"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:28.282265" elapsed="0.000369"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:28.284966" 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-10-11T00:57:28.284582" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-10-11T00:57:28.285168" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:57:28.285060" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:28.285043" elapsed="0.000200"/>
</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-10-11T00:57:28.285435" 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-10-11T00:57:28.285633" elapsed="0.000019"/>
</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-10-11T00:57:28.285807" elapsed="0.000018"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:28.285976" elapsed="0.000019"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:28.286145" elapsed="0.000019"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message of the current test case.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:28.286496" 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-10-11T00:57:28.286705" elapsed="0.000018"/>
</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-10-11T00:57:28.284238" elapsed="0.002537"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:28.281488" elapsed="0.005333"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-10-11T00:57:28.280995" elapsed="0.005864"/>
</kw>
<doc>Connect BGP peer with advertising the routes without mandatory params like LOC_PREF.</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:57:18.028652" elapsed="10.258241"/>
</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-10-11T00:57:28.288927" elapsed="0.000201"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:57:28.288656" 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-10-11T00:57:28.290097" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:28.290010" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:28.289993" elapsed="0.000166"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:28.292629" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:28.292543" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:28.292525" elapsed="0.000167"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:28.293625" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:28.293262" elapsed="0.000388"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:57:28.294068" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:57:28.293805" elapsed="0.000287"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:57:28.294132" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:28.294257" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:57:28.292907" elapsed="0.001372"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:28.296877" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:28.296794" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:28.296776" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:28.298056" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:28.297973" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:28.297956" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:57:28.298490" 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-10-11T00:57:28.298267" elapsed="0.000248"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:57:28.298825" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:57:28.298684" elapsed="0.000164"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:57:28.333348" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:57:28.299358" elapsed="0.034112"/>
</kw>
<msg time="2026-10-11T00:57:28.333626" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:57:28.333684" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:28.299008" elapsed="0.034713"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:57:28.361126" 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-10-11T00:57:28.334236" elapsed="0.026987"/>
</kw>
<msg time="2026-10-11T00:57:28.361389" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:57:28.361458" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:28.333891" elapsed="0.027602"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:28.361772" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:28.361562" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:28.361544" elapsed="0.000299"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:28.362262" 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-10-11T00:57:28.362026" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:28.362617" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:28.362398" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:28.362381" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:57:28.362717" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:57:28.365132" elapsed="0.000245"/>
</kw>
<msg time="2026-10-11T00:57:28.365458" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:28.364090" elapsed="0.001500"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:28.365898" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:28.366236" 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-10-11T00:57:28.363515" elapsed="0.003025"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:57:28.363011" elapsed="0.003607"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:57:28.297721" elapsed="0.068972"/>
</kw>
<msg time="2026-10-11T00:57:28.366775" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:28.366814" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:28.297094" elapsed="0.069756"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:57:28.367034" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:57:28.366918" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:28.366900" 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-10-11T00:57:28.367512" 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-10-11T00:57:28.367966" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:57:28.368035" 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-10-11T00:57:28.296471" elapsed="0.071651"/>
</kw>
<msg time="2026-10-11T00:57:28.368206" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:28.368245" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:28.294650" elapsed="0.073630"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:28.368669" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:28.368358" elapsed="0.000362"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:28.368342" elapsed="0.000399"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:57:28.294502" elapsed="0.074260"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:57:28.294342" elapsed="0.074449"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:57:28.292145" elapsed="0.076694"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:57:28.289758" elapsed="0.079130"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:28.289347" elapsed="0.079580"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:57:28.288106" elapsed="0.080867"/>
</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-10-11T00:57:28.383776" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i95srcw30m6z17a2l147cl1kz17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:28.384061" level="INFO">GET Response : url=http://10.30.170.173: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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-10-11T00:57:28.384342" 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-10-11T00:57:28.373046" elapsed="0.011387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:28.385358" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:28.384732" elapsed="0.000702"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:28.386450" 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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:28.385701" elapsed="0.000940"/>
</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 the `container` contains the `item`.</doc>
<status status="PASS" start="2026-10-11T00:57:28.386874" elapsed="0.001143"/>
</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-10-11T00:57:28.372702" elapsed="0.015476"/>
</kw>
<msg time="2026-10-11T00:57:28.388271" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:28.388310" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:28.372283" elapsed="0.016074"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-10-11T00:57:28.388539" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:28.388448" elapsed="0.000134"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:28.388428" elapsed="0.000174"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:28.389024" 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-10-11T00:57:28.388746" elapsed="0.000302"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-10-11T00:57:28.389620" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-10-11T00:57:28.389208" elapsed="0.000475">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-10-11T00:57:28.371971" elapsed="0.017809">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-10-11T00:57:29.407599" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i95srcw30m6z17a2l147cl1kz17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:29.408206" level="INFO">GET Response : url=http://10.30.170.173: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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-10-11T00:57:29.408925" 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-10-11T00:57:29.394343" elapsed="0.014738"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:29.411384" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:29.409847" elapsed="0.001720"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:29.413954" 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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:29.412167" elapsed="0.002175"/>
</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 the `container` contains the `item`.</doc>
<status status="PASS" start="2026-10-11T00:57:29.414949" elapsed="0.002731"/>
</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-10-11T00:57:29.393532" elapsed="0.024511"/>
</kw>
<msg time="2026-10-11T00:57:29.418244" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:29.418364" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:29.392449" elapsed="0.026029"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-10-11T00:57:29.418861" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:29.418646" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:29.418597" elapsed="0.000410"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:29.420028" 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-10-11T00:57:29.419357" elapsed="0.000727"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-10-11T00:57:29.421220" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-10-11T00:57:29.420591" elapsed="0.000800">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-10-11T00:57:29.391483" elapsed="0.030186">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-10-11T00:57:30.439814" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i95srcw30m6z17a2l147cl1kz17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:30.440494" level="INFO">GET Response : url=http://10.30.170.173: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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-10-11T00:57:30.441116" 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-10-11T00:57:30.425607" elapsed="0.015662"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:30.443552" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:30.441985" elapsed="0.001699"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:30.446136" 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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:30.444271" elapsed="0.002350"/>
</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 the `container` contains the `item`.</doc>
<status status="PASS" start="2026-10-11T00:57:30.447144" elapsed="0.002663"/>
</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-10-11T00:57:30.424741" elapsed="0.025417"/>
</kw>
<msg time="2026-10-11T00:57:30.450452" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:30.450552" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:30.423670" elapsed="0.026930"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-10-11T00:57:30.450965" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:30.450758" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:30.450712" elapsed="0.000396"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:30.452201" 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-10-11T00:57:30.451572" elapsed="0.000686"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-10-11T00:57:30.453387" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-10-11T00:57:30.452721" elapsed="0.000856">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-10-11T00:57:30.422700" elapsed="0.031102">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-10-11T00:57:31.471919" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i95srcw30m6z17a2l147cl1kz17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:31.472573" level="INFO">GET Response : url=http://10.30.170.173: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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-10-11T00:57:31.473267" 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-10-11T00:57:31.457551" elapsed="0.015937"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:31.475926" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:31.474204" elapsed="0.001855"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:31.478854" 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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:31.476813" elapsed="0.002410"/>
</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 the `container` contains the `item`.</doc>
<status status="PASS" start="2026-10-11T00:57:31.479882" elapsed="0.002589"/>
</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-10-11T00:57:31.456735" elapsed="0.026095"/>
</kw>
<msg time="2026-10-11T00:57:31.483033" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:31.483123" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:31.455727" elapsed="0.027443"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-10-11T00:57:31.483670" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:31.483352" elapsed="0.000420"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:31.483301" elapsed="0.000518"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:31.484857" 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-10-11T00:57:31.484142" elapsed="0.000769"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-10-11T00:57:31.485935" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-10-11T00:57:31.485263" elapsed="0.000806">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-10-11T00:57:31.454807" elapsed="0.031498">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-10-11T00:57:32.498157" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i95srcw30m6z17a2l147cl1kz17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:32.498487" level="INFO">GET Response : url=http://10.30.170.173: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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-10-11T00:57:32.498776" 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-10-11T00:57:32.488335" elapsed="0.010511"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:32.499853" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:32.499153" elapsed="0.000763"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:32.500967" 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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:32.500187" elapsed="0.000941"/>
</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 the `container` contains the `item`.</doc>
<status status="PASS" start="2026-10-11T00:57:32.501381" elapsed="0.001169"/>
</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-10-11T00:57:32.487952" elapsed="0.014759"/>
</kw>
<msg time="2026-10-11T00:57:32.502803" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:32.502843" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:32.487463" elapsed="0.015402"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-10-11T00:57:32.503045" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:32.502942" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:32.502918" elapsed="0.000196"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:32.503696" 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-10-11T00:57:32.503261" elapsed="0.000461"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-10-11T00:57:32.504177" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-10-11T00:57:32.503885" elapsed="0.000361">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-10-11T00:57:32.486927" elapsed="0.017466">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-10-11T00:57:33.521230" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i95srcw30m6z17a2l147cl1kz17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:33.521953" level="INFO">GET Response : url=http://10.30.170.173: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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-10-11T00:57:33.522657" 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-10-11T00:57:33.508171" elapsed="0.014642"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:33.525039" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:33.523542" elapsed="0.001630"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:33.527658" 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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:33.525828" elapsed="0.002201"/>
</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 the `container` contains the `item`.</doc>
<status status="PASS" start="2026-10-11T00:57:33.528734" elapsed="0.003217"/>
</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-10-11T00:57:33.507308" elapsed="0.025040"/>
</kw>
<msg time="2026-10-11T00:57:33.532621" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:33.532712" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:33.506225" elapsed="0.026534"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-10-11T00:57:33.533125" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:33.532919" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:33.532874" elapsed="0.000420"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:33.534348" 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-10-11T00:57:33.533694" elapsed="0.000708"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-10-11T00:57:33.535580" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-10-11T00:57:33.534802" elapsed="0.000918">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-10-11T00:57:33.505237" elapsed="0.030701">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-10-11T00:57:34.547614" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i95srcw30m6z17a2l147cl1kz17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:34.547908" level="INFO">GET Response : url=http://10.30.170.173: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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-10-11T00:57:34.548208" 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-10-11T00:57:34.538518" elapsed="0.009774"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:34.549296" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:34.548621" elapsed="0.000736"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:34.550396" 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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:34.549649" elapsed="0.000928"/>
</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 the `container` contains the `item`.</doc>
<status status="PASS" start="2026-10-11T00:57:34.550813" elapsed="0.001160"/>
</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-10-11T00:57:34.538125" elapsed="0.014008"/>
</kw>
<msg time="2026-10-11T00:57:34.552224" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:34.552279" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:34.537648" elapsed="0.014654"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-10-11T00:57:34.552556" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:34.552378" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:34.552355" elapsed="0.000267"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:34.553053" 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-10-11T00:57:34.552770" elapsed="0.000308"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-10-11T00:57:34.553619" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-10-11T00:57:34.553239" elapsed="0.000446">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-10-11T00:57:34.537020" elapsed="0.016766">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-10-11T00:57:35.568560" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i95srcw30m6z17a2l147cl1kz17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:35.569138" level="INFO">GET Response : url=http://10.30.170.173: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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-10-11T00:57:35.569791" 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-10-11T00:57:35.557478" elapsed="0.012463"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:35.572131" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:35.570662" elapsed="0.001618"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:35.574684" 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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:35.572905" elapsed="0.002143"/>
</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 the `container` contains the `item`.</doc>
<status status="PASS" start="2026-10-11T00:57:35.575707" elapsed="0.002521"/>
</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-10-11T00:57:35.556661" elapsed="0.021974"/>
</kw>
<msg time="2026-10-11T00:57:35.578826" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:35.578912" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:35.555662" elapsed="0.023295"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-10-11T00:57:35.579360" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:35.579110" elapsed="0.000399"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:35.579066" elapsed="0.000488"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:35.580550" 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-10-11T00:57:35.579872" elapsed="0.000809"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-10-11T00:57:35.581821" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-10-11T00:57:35.581041" elapsed="0.000919">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-10-11T00:57:35.554741" elapsed="0.027911">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-10-11T00:57:36.601023" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i95srcw30m6z17a2l147cl1kz17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:36.601801" level="INFO">GET Response : url=http://10.30.170.173: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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-10-11T00:57:36.602583" 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-10-11T00:57:36.587111" elapsed="0.015654"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:36.605446" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:36.603603" elapsed="0.001994"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:36.608352" 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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:36.606306" elapsed="0.002546"/>
</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 the `container` contains the `item`.</doc>
<status status="PASS" start="2026-10-11T00:57:36.609517" elapsed="0.003027"/>
</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-10-11T00:57:36.586063" elapsed="0.026876"/>
</kw>
<msg time="2026-10-11T00:57:36.613175" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:36.613291" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:36.584869" elapsed="0.028485"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-10-11T00:57:36.613839" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:36.613609" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:36.613540" elapsed="0.000479"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:36.615251" 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-10-11T00:57:36.614501" elapsed="0.000815"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-10-11T00:57:36.616581" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-10-11T00:57:36.615781" elapsed="0.000972">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-10-11T00:57:36.583772" elapsed="0.033242">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-10-11T00:57:37.633913" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i95srcw30m6z17a2l147cl1kz17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:37.634569" level="INFO">GET Response : url=http://10.30.170.173: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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-10-11T00:57:37.635178" 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-10-11T00:57:37.620737" elapsed="0.014636"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:37.637790" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:37.636090" elapsed="0.001834"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:37.640332" 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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:37.638584" elapsed="0.002155"/>
</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 the `container` contains the `item`.</doc>
<status status="PASS" start="2026-10-11T00:57:37.641293" elapsed="0.002705"/>
</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-10-11T00:57:37.619896" elapsed="0.024487"/>
</kw>
<msg time="2026-10-11T00:57:37.644638" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:37.644727" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:37.618867" elapsed="0.025907"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-10-11T00:57:37.645147" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:37.644936" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:37.644890" elapsed="0.000429"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:37.646329" 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-10-11T00:57:37.645683" elapsed="0.000704"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-10-11T00:57:37.647580" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-10-11T00:57:37.646877" elapsed="0.000839">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-10-11T00:57:37.617953" elapsed="0.029979">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-10-11T00:57:38.662635" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i95srcw30m6z17a2l147cl1kz17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:38.663032" level="INFO">GET Response : url=http://10.30.170.173: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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-10-11T00:57:38.663504" 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-10-11T00:57:38.651176" elapsed="0.012431"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:38.664967" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:38.664024" elapsed="0.001024"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:38.666519" 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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:38.665461" elapsed="0.001324"/>
</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 the `container` contains the `item`.</doc>
<status status="PASS" start="2026-10-11T00:57:38.667145" elapsed="0.001792"/>
</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-10-11T00:57:38.650674" elapsed="0.018496"/>
</kw>
<msg time="2026-10-11T00:57:38.669316" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:38.669373" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:38.649616" elapsed="0.019788"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-10-11T00:57:38.669691" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:38.669554" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:38.669522" elapsed="0.000259"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:38.670387" 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-10-11T00:57:38.669984" elapsed="0.000459"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-10-11T00:57:38.671069" level="FAIL">None</msg>
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-10-11T00:57:38.670676" elapsed="0.000480">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-10-11T00:57:38.648831" elapsed="0.022479">None</status>
</kw>
<msg time="2026-10-11T00:57:38.671450" 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-10-11T00:57:28.371453" elapsed="10.300117">Keyword 'Invert_Failure' failed after retrying for 10 seconds. The last error was: None</status>
</kw>
<msg time="2026-10-11T00:57:38.671637" 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-10-11T00:57:28.371052" elapsed="10.300648"/>
</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-10-11T00:57:28.370727" elapsed="10.301096">Keyword 'Invert_Failure' failed after retrying for 10 seconds. The last error was: None</status>
</kw>
<msg time="2026-10-11T00:57:38.671965" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T00:57:38.672019" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:28.370346" elapsed="10.301704"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot; != &quot;PASS&quot;">
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-11T00:57:38.672282" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-10-11T00:57:38.672142" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:38.672117" elapsed="0.000273"/>
</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-10-11T00:57:38.672687" elapsed="0.000028"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:38.672933" elapsed="0.000026"/>
</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-10-11T00:57:28.369993" elapsed="10.303075"/>
</kw>
<msg time="2026-10-11T00:57:38.673131" 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-10-11T00:57:28.369581" elapsed="10.303609"/>
</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-10-11T00:57:28.369162" elapsed="10.304142"/>
</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-10-11T00:57:38.675022" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:38.674546" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:38.674521" elapsed="0.000609"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:38.675352" elapsed="0.000418"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:38.679007" 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-10-11T00:57:38.678486" elapsed="0.000557"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-10-11T00:57:38.679350" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-10-11T00:57:38.679181" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:38.679155" elapsed="0.000320"/>
</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-10-11T00:57:38.679710" elapsed="0.000028"/>
</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-10-11T00:57:38.679969" elapsed="0.000027"/>
</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-10-11T00:57:38.680226" elapsed="0.000027"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:38.680484" elapsed="0.000027"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:38.680722" elapsed="0.000025"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message of the current test case.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:38.680961" elapsed="0.000026"/>
</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-10-11T00:57:38.681257" elapsed="0.000027"/>
</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-10-11T00:57:38.678016" elapsed="0.003340"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:38.674243" elapsed="0.007195"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-10-11T00:57:38.673704" elapsed="0.007790"/>
</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-10-11T00:57:28.287451" elapsed="10.394090"/>
</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-10-11T00:57:38.683858" elapsed="0.000283"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:57:38.683365" elapsed="0.000928"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:38.686353" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:38.686229" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:38.686187" 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-10-11T00:57:38.689284" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:38.689152" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:38.689129" elapsed="0.000240"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:38.690673" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:38.690186" elapsed="0.000522"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:57:38.691305" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:57:38.690925" elapsed="0.000419"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:57:38.691403" elapsed="0.000059"/>
</return>
<msg time="2026-10-11T00:57:38.691601" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:57:38.689684" elapsed="0.001948"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:38.695368" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:38.695245" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:38.695205" elapsed="0.000272"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:38.696953" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:38.696835" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:38.696811" elapsed="0.000228"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:57:38.697537" 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-10-11T00:57:38.697268" elapsed="0.000304"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:57:38.698002" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:57:38.697807" elapsed="0.000228"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:57:38.732790" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:57:38.698819" elapsed="0.034068"/>
</kw>
<msg time="2026-10-11T00:57:38.733035" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:57:38.733076" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:38.698268" elapsed="0.034872"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:57:38.759683" 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-10-11T00:57:38.733691" elapsed="0.026088"/>
</kw>
<msg time="2026-10-11T00:57:38.759926" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:57:38.759967" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:38.733325" elapsed="0.026677"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:38.760292" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:38.760069" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:38.760051" elapsed="0.000324"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:38.760805" 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-10-11T00:57:38.760579" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:38.761126" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:38.760925" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:38.760908" elapsed="0.000288"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:57:38.761238" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:57:38.763902" elapsed="0.000115"/>
</kw>
<msg time="2026-10-11T00:57:38.764074" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:38.762769" 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-10-11T00:57:38.764553" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:38.764892" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:57:38.762149" 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-10-11T00:57:38.761562" elapsed="0.003574"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:57:38.696477" elapsed="0.068746"/>
</kw>
<msg time="2026-10-11T00:57:38.765306" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:38.765345" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:38.695692" elapsed="0.069867"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:57:38.765723" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:57:38.765634" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:38.765616" elapsed="0.000184"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:38.766131" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:38.766534" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:57:38.766600" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:57:38.694833" elapsed="0.071852"/>
</kw>
<msg time="2026-10-11T00:57:38.766768" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:38.766807" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:38.692105" elapsed="0.074767"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:38.767163" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:38.766941" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:38.766925" elapsed="0.000319"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:57:38.691902" elapsed="0.075363"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:57:38.691702" elapsed="0.075591"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:57:38.688743" elapsed="0.078599"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:57:38.685854" elapsed="0.081539"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:38.684954" elapsed="0.082517"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:57:38.682857" elapsed="0.084669"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:38.768631" 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-10-11T00:57:38.768316" 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-10-11T00:57:38.768812" elapsed="0.000179"/>
</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-10-11T00:57:38.768024" elapsed="0.001031"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-10-11T00:57:40.769803" level="INFO">^C
[?2004h[jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T00:57:40.770153" level="INFO">${output} = ^C
[?2004h[jenkins@releng-26932-423-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-10-11T00:57:38.769226" elapsed="2.001008"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:40.771541" level="INFO">^C
[?2004h[jenkins@releng-26932-423-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-10-11T00:57:40.770857" elapsed="0.000788"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-10-11T00:57:38.767724" elapsed="2.004049"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:57:40.779608" level="INFO">Executing command 'cat bgp_peer.log'.</msg>
<msg time="2026-10-11T00:57:40.793936" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:57:40.794130" level="INFO">${output_log} = 2026-10-11 00:57:18,371 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:57:18,372 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 00:57:18,372 DEBUG BGP-Threa...</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-10-11T00:57:40.779309" elapsed="0.014874"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:40.795231" level="INFO">2026-10-11 00:57:18,371 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:57:18,372 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 00:57:18,372 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 00:57:18,372 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 00:57:18,372 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 00:57:18,373 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:57:18,375 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:57:18,375 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:57:18,375 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:57:18,375 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 1
2026-10-11 00:57:18,375 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-10-11 00:57:18,375 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 00:57:18,375 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 00:57:18,375 INFO BGP-Thread-1 (job):   My BGP Identifier: 169782023
2026-10-11 00:57:18,375 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 00:57:18,375 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 00:57:18,375 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 00:57:18,375 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 00:57:18,375 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 00:57:18,375 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 00:57:18,375 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 1
2026-10-11 00:57:18,375 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, 0]
2026-10-11 00:57:18,375 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 00:57:18,375 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 00:57:18,375 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 00:57:18,375 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:57:18,375 DEBUG BGP-Thread-1 (job):   Length=53 (0x0035)
2026-10-11 00:57:18,376 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 00:57:18,376 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 00:57:18,376 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-10-11 00:57:18,376 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 00:57:18,376 DEBUG BGP-Thread-1 (job):   BGP Identifier=169782023 (0x0a1eab07)
2026-10-11 00:57:18,376 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=24 (0x18)
2026-10-11 00:57:18,376 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x02060104000100010206010440040047020641040000fbf0
2026-10-11 00:57:18,376 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff00350104fbf000b40a1eab071802060104000100010206010440040047020641040000fbf0'
2026-10-11 00:57:18,376 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff00350104fbf000b40a1eab071802060104000100010206010440040047020641040000fbf0
2026-10-11 00:57:18,378 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:57:18,378 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:57:18,378 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:57:18,378 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:57:18,378 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:57:18,378 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:57:18,378 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:57:18,378 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:57:18,378 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:57:18,378 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:57:18,378 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 00:57:18,378 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 1
2026-10-11 00:57:18,378 DEBUG BGP-Thread-1 (job): ########## Iteration: 0 ##########
2026-10-11 00:57:18,378 DEBUG BGP-Thread-1 (job): Remaining prefixes: 1
2026-10-11 00:57:18,378 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:57:18,378 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:57:18,378 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-10-11 00:57:18,378 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:57:18,378 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:57:18,378 DEBUG BGP-Thread-1 (job):   Prefix indexes: [0]
2026-10-11 00:57:18,378 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.0.1.0')]
2026-10-11 00:57:18,378 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:57:18,378 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-10-11 00:57:18,378 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:57:18,378 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:57:18,378 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:57:18,378 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:57:18,379 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:57:18,379 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:57:18,379 DEBUG BGP-Thread-1 (job):   Length=60 (0x003c)
2026-10-11 00:57:18,379 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:57:18,379 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:57:18,379 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:57:18,379 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=37 (0x0025)
2026-10-11 00:57:18,379 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x800e2240044704c00002010000050015070000000000000001010203040001000105060708)
2026-10-11 00:57:18,379 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:57:18,379 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:57:18,379 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:57:18,379 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-10-11 00:57:18,379 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-10-11 00:57:18,379 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff003c0200000025800e2240044704c00002010000050015070000000000000001010203040001000105060708
2026-10-11 00:57:18,379 INFO BGP-Thread-1 (job): All update messages generated.
2026-10-11 00:57:18,379 INFO BGP-Thread-1 (job): Storing performance results.
2026-10-11 00:57:18,379 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-10-11 00:57:18,379 INFO BGP-Thread-1 (job): Number of iterations: 1
2026-10-11 00:57:18,379 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-10-11 00:57:18,379 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-10-11 00:57:18,379 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 1
2026-10-11 00:57:18,379 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.0007970333099365234s
2026-10-11 00:57:18,379 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-10-11 00:57:18,379 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-10-11 00:57:18,379 INFO BGP-Thread-1 (job):   
2026-10-11 00:57:18,379 INFO BGP-Thread-1 (job):   
2026-10-11 00:57:18,379 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-10-11 00:57:18,379 INFO BGP-Thread-1 (job):   
2026-10-11 00:57:18,379 INFO BGP-Thread-1 (job):   
2026-10-11 00:57:18,380 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-10-11 00:57:18,380 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:57:18,380 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:57:18,380 DEBUG BGP-Thread-1 (job):   Length=23 (0x0017)
2026-10-11 00:57:18,380 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:57:18,380 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:57:18,380 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:57:18,380 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-10-11 00:57:18,380 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 00:57:18,380 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:57:18,380 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:57:18,380 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:57:18,388 INFO BGP-Thread-1 (job): ... idle for 0.008s
2026-10-11 00:57:18,388 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.008s
2026-10-11 00:57:18,388 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 00:57:18,388 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:57:18,388 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:57:18,388 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 00:57:18,388 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:57:18,388 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:57:18,388 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:57:18,388 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:57:18,388 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:57:18,388 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:57:18,388 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:57:18,388 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:57:18,388 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:57:18,388 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:57:18,388 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:57:18,388 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:57:18,388 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0000' (0)
2026-10-11 00:57:18,389 DEBUG BGP-Thread-1 (job): Path attributes: 0xb''
2026-10-11 00:57:18,389 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:57:18,389 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:57:18,389 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:57:18,389 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03400447
2026-10-11 00:57:18,389 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:57:18,389 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:57:18,389 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 00:57:18,389 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:57:18,389 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:57:18,389 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:57:18,389 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:57:18,389 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:57:18,389 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:57:18,389 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:57:18,389 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:57:18,389 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:57:18,389 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:57:18,389 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:57:18,389 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:57:18,389 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0006' (6)
2026-10-11 00:57:18,389 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'800f03400447'
2026-10-11 00:57:18,389 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-10-11 00:57:18,389 DEBUG BGP-Thread-1 (job): Attribute value=0xb'400447'
2026-10-11 00:57:18,389 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'4004'
2026-10-11 00:57:18,390 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'47'
2026-10-11 00:57:18,390 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb''
2026-10-11 00:57:18,390 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: []
2026-10-11 00:57:18,390 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:57:18,390 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:57:18,390 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:57:18,553 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-10-11T00:57:40.794698" elapsed="0.001019"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:40.796843" 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-10-11T00:57:40.796178" elapsed="0.000780"/>
</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-10-11T00:57:40.778379" elapsed="0.018699"/>
</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-10-11T00:57:40.799803" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:40.798968" elapsed="0.000960"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:40.798922" elapsed="0.001059"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:40.800329" elapsed="0.000674"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:40.806742" 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-10-11T00:57:40.805875" elapsed="0.000926"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-10-11T00:57:40.807210" elapsed="0.000068"/>
</return>
<status status="PASS" start="2026-10-11T00:57:40.806950" elapsed="0.000391"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:40.806912" elapsed="0.000478"/>
</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-10-11T00:57:40.807794" elapsed="0.000044"/>
</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-10-11T00:57:40.808223" elapsed="0.000043"/>
</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-10-11T00:57:40.808637" elapsed="0.000041"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:40.809012" elapsed="0.000041"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:40.809405" elapsed="0.000069"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message of the current test case.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:40.809833" elapsed="0.000040"/>
</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-10-11T00:57:40.810304" elapsed="0.000042"/>
</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-10-11T00:57:40.805118" elapsed="0.005376"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:40.798515" elapsed="0.012090"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-10-11T00:57:40.797691" elapsed="0.012996"/>
</kw>
<doc>Stop BGP peer &amp; store logs</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:57:38.682128" elapsed="2.128632"/>
</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-10-11T00:57:40.815528" elapsed="0.000459"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:57:40.814792" elapsed="0.001309"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:40.818204" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:40.817990" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:40.817951" elapsed="0.000399"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:40.823008" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:40.822790" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:40.822753" elapsed="0.000396"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:40.825282" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:40.824527" elapsed="0.000812"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:57:40.826335" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:57:40.825725" elapsed="0.000665"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:57:40.826580" elapsed="0.000065"/>
</return>
<msg time="2026-10-11T00:57:40.826872" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:57:40.823672" elapsed="0.003251"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:40.832472" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:40.832332" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:40.832308" 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-10-11T00:57:40.834049" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:40.833933" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:40.833909" elapsed="0.000227"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:57:40.834637" 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-10-11T00:57:40.834366" elapsed="0.000305"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:57:40.835092" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:57:40.834903" elapsed="0.000221"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:57:40.870716" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:57:40.835853" elapsed="0.034966"/>
</kw>
<msg time="2026-10-11T00:57:40.870968" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:57:40.871008" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:40.835362" elapsed="0.035682"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:57:40.897629" 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-10-11T00:57:40.871608" elapsed="0.026115"/>
</kw>
<msg time="2026-10-11T00:57:40.897868" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:57:40.897909" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:40.871245" elapsed="0.026698"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:40.898232" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:40.898011" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:40.897993" elapsed="0.000311"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:40.898737" 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-10-11T00:57:40.898511" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:40.899060" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:40.898858" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:40.898842" elapsed="0.000288"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:57:40.899160" 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-10-11T00:57:40.901660" elapsed="0.000115"/>
</kw>
<msg time="2026-10-11T00:57:40.901832" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:40.900550" 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-10-11T00:57:40.902287" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:40.902652" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:57:40.899931" elapsed="0.002932"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:57:40.899469" elapsed="0.003456"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:57:40.833577" elapsed="0.069454"/>
</kw>
<msg time="2026-10-11T00:57:40.903113" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:40.903152" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:40.832779" elapsed="0.070419"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:57:40.903353" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:57:40.903267" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:40.903250" 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-10-11T00:57:40.903792" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:40.904096" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:57:40.904159" 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-10-11T00:57:40.831905" elapsed="0.072350"/>
</kw>
<msg time="2026-10-11T00:57:40.904339" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:40.904379" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:40.827728" elapsed="0.076704"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:40.904722" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:40.904500" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:40.904484" elapsed="0.000308"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:57:40.827361" elapsed="0.077453"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:57:40.827027" elapsed="0.077816"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:57:40.822087" elapsed="0.082804"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:57:40.817397" elapsed="0.087541"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:40.816496" elapsed="0.088481"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:57:40.813666" elapsed="0.091356"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:57:40.905779" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.171.7 | 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-10-11T00:57:40.905218" elapsed="0.000587"/>
</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-10-11T00:57:40.920918" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:40.920616" elapsed="0.000327"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:40.921650" 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-10-11T00:57:40.921456" elapsed="0.000266">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-10-11T00:57:40.921807" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:40.921104" elapsed="0.000725"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:40.922323" 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-10-11T00:57:40.922003" elapsed="0.000345"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:40.922641" 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-10-11T00:57:40.922798" 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-10-11T00:57:40.922531" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:40.923246" 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-10-11T00:57:40.923018" elapsed="0.000270"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:40.924205" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', '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-10-11T00:57:40.923963" elapsed="0.000284"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:57:40.924687" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:57:40.924440" elapsed="0.000271"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:40.925306" 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-10-11T00:57:40.925027" elapsed="0.000302"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:40.926017" 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-10-11T00:57:40.925831" elapsed="0.000209"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:40.926085" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:57:40.926221" 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-10-11T00:57:40.925519" elapsed="0.000726"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:40.926427" elapsed="0.000185"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:57:40.924893" elapsed="0.001755"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:40.927143" 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-10-11T00:57:40.926880" elapsed="0.000287"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:40.927850" 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-10-11T00:57:40.927674" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:40.927918" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:57:40.928040" 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-10-11T00:57:40.927351" elapsed="0.000712"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:40.928238" elapsed="0.000180"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-10-11T00:57:40.926748" elapsed="0.001707"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:40.929095" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:57:40.928686" elapsed="0.000433"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:40.929809" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:57:40.929632" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:40.929877" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:40.930000" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:57:40.929305" elapsed="0.000717"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:40.930200" elapsed="0.000168"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:57:40.928555" elapsed="0.001863"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:40.930917" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:57:40.930651" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:40.931625" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:57:40.931447" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:40.931692" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:40.931814" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:57:40.931113" elapsed="0.000723"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:40.932000" elapsed="0.000163"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:57:40.930520" elapsed="0.001724"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:57:40.924754" elapsed="0.007524"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:57:40.932316" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:57:40.932461" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:57:40.923622" elapsed="0.008863"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:40.923349" elapsed="0.009164"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:40.932687" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:40.932535" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:40.923331" elapsed="0.009424"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:40.933497" 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-10-11T00:57:40.932913" elapsed="0.000611"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:57:40.933567" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:57:40.920088" elapsed="0.013576"/>
</kw>
<msg time="2026-10-11T00:57:40.933713" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:40.915690" elapsed="0.018065"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:57:40.937965" 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/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-10-11T00:57:40.942178" 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/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-10-11T00:57:40.946376" elapsed="0.000023"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:40.946572" 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-10-11T00:57:40.946757" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:40.947095" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:40.946947" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:40.946934" 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-10-11T00:57:40.947337" 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-10-11T00:57:40.947538" 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-10-11T00:57:40.947704" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:57:40.946909" elapsed="0.000842"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:57:40.946822" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:40.947961" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:40.948028" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:57:40.948139" 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-10-11T00:57:40.915045" elapsed="0.033119"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:40.949204" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:40.948964" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:57:40.961510" level="INFO">DELETE Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i95srcw30m6z17a2l147cl1kz17.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:40.961567" level="INFO">DELETE Response : url=http://10.30.170.173: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.171.7 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:40.961672" 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-10-11T00:57:40.949556" elapsed="0.012143"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:40.949310" elapsed="0.012433"/>
</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-10-11T00:57:40.961942" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:40.961770" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:40.949293" elapsed="0.012726"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:40.963359" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:40.963053" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:40.962797" elapsed="0.000652"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:40.962778" elapsed="0.000694"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:40.964288" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:40.963768" elapsed="0.000563"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:40.963525" elapsed="0.000839"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:40.963507" elapsed="0.000880"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:40.964964" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:40.964600" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:40.965287" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:40.965054" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:40.965813" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:40.965547" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:40.965363" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:40.965038" elapsed="0.000853"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:40.966436" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:40.966069" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:40.966745" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:40.966532" elapsed="0.000265"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:40.967262" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:40.966984" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:40.966819" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:40.966515" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:40.967553" elapsed="0.000294"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:57:40.968262" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:40.968011" elapsed="0.000275"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:57:40.968457" elapsed="0.000220"/>
</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-10-11T00:57:40.962392" elapsed="0.006342"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:57:40.968777" elapsed="0.000034"/>
</return>
<msg time="2026-10-11T00:57:40.968958" 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-10-11T00:57:40.948435" elapsed="0.020547"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:57:40.969030" elapsed="0.000024"/>
</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-10-11T00:57:40.906019" elapsed="0.063108"/>
</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-10-11T00:57:40.970301" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:40.969947" elapsed="0.000410"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:40.969931" elapsed="0.000447"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:40.970536" elapsed="0.000274"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:40.973123" 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-10-11T00:57:40.972764" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-10-11T00:57:40.973335" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:57:40.973228" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:40.973210" elapsed="0.000216"/>
</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-10-11T00:57:40.973594" elapsed="0.000019"/>
</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-10-11T00:57:40.973777" elapsed="0.000019"/>
</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-10-11T00:57:40.973948" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:40.974115" elapsed="0.000018"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:40.974297" elapsed="0.000019"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message of the current test case.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:40.974483" 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-10-11T00:57:40.974690" elapsed="0.000018"/>
</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-10-11T00:57:40.972436" elapsed="0.002324"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:40.969753" elapsed="0.005053"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-10-11T00:57:40.969396" elapsed="0.005447"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-10-11T00:57:40.811800" elapsed="0.163075"/>
</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-10-11T00:57:40.976338" elapsed="0.000218"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:57:40.976069" 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-10-11T00:57:40.977528" elapsed="0.000191"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:40.977440" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:40.977421" elapsed="0.000351"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:40.979808" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:40.979725" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:40.979708" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:40.980799" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:40.980472" elapsed="0.000353"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:57:40.981260" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:57:40.980982" elapsed="0.000302"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:57:40.981323" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:40.981466" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:57:40.980082" elapsed="0.001407"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:40.984042" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:40.983958" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:40.983940" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:40.985173" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:40.985091" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:40.985074" elapsed="0.000175"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:57:40.985594" 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-10-11T00:57:40.985400" elapsed="0.000219"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:57:40.985928" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:57:40.985787" elapsed="0.000164"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:57:41.020225" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:57:40.986476" elapsed="0.033841"/>
</kw>
<msg time="2026-10-11T00:57:41.020556" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:57:41.020599" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:40.986111" elapsed="0.034523"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:57:41.047323" 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-10-11T00:57:41.021149" elapsed="0.026284"/>
</kw>
<msg time="2026-10-11T00:57:41.047580" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:57:41.047621" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:41.020808" elapsed="0.026848"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.047930" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:41.047722" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.047704" elapsed="0.000297"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.048445" 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-10-11T00:57:41.048202" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.048769" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:41.048568" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.048551" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:57:41.048905" 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-10-11T00:57:41.051469" elapsed="0.000116"/>
</kw>
<msg time="2026-10-11T00:57:41.051644" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:41.050294" elapsed="0.001482"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.052087" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.052466" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:57:41.049695" elapsed="0.002955"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:57:41.049204" elapsed="0.003506"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:57:40.984837" elapsed="0.067946"/>
</kw>
<msg time="2026-10-11T00:57:41.052865" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:41.052905" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:40.984269" elapsed="0.068671"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:57:41.053092" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:57:41.053008" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.052990" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.053526" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.053829" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:57:41.053894" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:57:40.983672" elapsed="0.070307"/>
</kw>
<msg time="2026-10-11T00:57:41.054063" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:41.054102" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:40.981828" elapsed="0.072309"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.054552" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:41.054216" elapsed="0.000387"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.054199" elapsed="0.000426"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:57:40.981682" elapsed="0.072965"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:57:40.981537" elapsed="0.073138"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:57:40.979430" elapsed="0.075293"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:57:40.977159" elapsed="0.077614"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:40.976760" elapsed="0.078053"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:57:40.975692" elapsed="0.079167"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.055668" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.171.7 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | RIB_INSTANCE_NAME=example-bgp-rib | PASSIVE_MODE=true | BGP_RIB_OPENCON...</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-10-11T00:57:41.055042" 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-10-11T00:57:41.066264" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:41.065944" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:41.066998" 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-10-11T00:57:41.066793" elapsed="0.000281">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-10-11T00:57:41.067159" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:41.066469" elapsed="0.000726"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.067697" 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-10-11T00:57:41.067373" elapsed="0.000350"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:41.068004" 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-10-11T00:57:41.068144" 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-10-11T00:57:41.067893" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.068618" 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-10-11T00:57:41.068383" elapsed="0.000277"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.069756" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', '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-10-11T00:57:41.069337" elapsed="0.000463"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.070248" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:57:41.069981" elapsed="0.000292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.070893" 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-10-11T00:57:41.070624" elapsed="0.000294"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:41.071629" 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-10-11T00:57:41.071438" elapsed="0.000215"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:41.071699" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:57:41.071825" 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-10-11T00:57:41.071093" elapsed="0.000756"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:41.072016" elapsed="0.000189"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:57:41.070486" elapsed="0.001756"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.072758" 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-10-11T00:57:41.072491" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:41.073474" 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-10-11T00:57:41.073280" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:41.073541" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:41.073664" 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-10-11T00:57:41.072953" elapsed="0.000734"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:41.073851" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-10-11T00:57:41.072343" elapsed="0.001709"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.074580" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:57:41.074298" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:41.075274" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:57:41.075084" elapsed="0.000214"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:41.075375" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T00:57:41.075518" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:57:41.074773" 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-10-11T00:57:41.075705" elapsed="0.000166"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:57:41.074151" elapsed="0.001756"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.076437" 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-10-11T00:57:41.076137" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:41.077119" 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-10-11T00:57:41.076944" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:41.077202" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:57:41.077326" 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-10-11T00:57:41.076632" elapsed="0.000717"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:41.077529" elapsed="0.000166"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:57:41.076006" elapsed="0.001726"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.078247" 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-10-11T00:57:41.077963" elapsed="0.000309"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:41.078940" 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-10-11T00:57:41.078766" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:41.079008" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:41.079130" 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-10-11T00:57:41.078457" elapsed="0.000696"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:41.079335" elapsed="0.000180"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:57:41.077831" elapsed="0.001721"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.080224" 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-10-11T00:57:41.079781" elapsed="0.000468"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:41.080922" 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-10-11T00:57:41.080748" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:41.080990" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:41.081112" 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-10-11T00:57:41.080436" elapsed="0.000698"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:41.081316" elapsed="0.000182"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:57:41.079650" elapsed="0.001885"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.082032" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:57:41.081767" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:41.082740" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:57:41.082565" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:41.082807" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:41.082928" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:57:41.082241" elapsed="0.000710"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:41.083118" elapsed="0.000180"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:57:41.081634" elapsed="0.001700"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.083849" 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-10-11T00:57:41.083583" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:41.084564" 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-10-11T00:57:41.084368" elapsed="0.000221"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:41.084666" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:57:41.084792" 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-10-11T00:57:41.084043" 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-10-11T00:57:41.084982" elapsed="0.000165"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:57:41.083448" elapsed="0.001751"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.085717" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:57:41.085447" elapsed="0.000295"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:41.086424" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:57:41.086234" elapsed="0.000215"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:41.086494" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:41.086617" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:57:41.085913" elapsed="0.000726"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:41.086804" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:57:41.085299" elapsed="0.001705"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:57:41.070316" elapsed="0.016720"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:57:41.087073" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:57:41.087217" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'PASSIVE...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:57:41.068976" elapsed="0.018266"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:41.068720" elapsed="0.018551"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.087462" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:41.087294" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.068703" elapsed="0.018828"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.088341" 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-10-11T00:57:41.087694" elapsed="0.000674"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:57:41.088427" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:57:41.065389" elapsed="0.023139"/>
</kw>
<msg time="2026-10-11T00:57:41.088576" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:41.060953" elapsed="0.027667"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:57:41.093047" 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/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-10-11T00:57:41.097287" 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/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-10-11T00:57:41.101523" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.101742" 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-10-11T00:57:41.101928" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.102284" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:41.102120" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:41.102107" 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-10-11T00:57:41.102530" 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-10-11T00:57:41.102715" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.102882" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:57:41.102082" elapsed="0.000848"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:57:41.101993" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.103107" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:41.103173" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:57:41.103319" 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-10-11T00:57:41.060343" elapsed="0.043004"/>
</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-10-11T00:57:41.113048" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:41.112742" elapsed="0.000333"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:41.113826" 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-10-11T00:57:41.113639" elapsed="0.000258">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-10-11T00:57:41.113993" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:41.113267" elapsed="0.000750"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.114570" 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-10-11T00:57:41.114225" elapsed="0.000372"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:41.114878" 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-10-11T00:57:41.114997" 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-10-11T00:57:41.114768" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.115488" 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-10-11T00:57:41.115247" 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-10-11T00:57:41.115921" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:41.115663" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.116508" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'PASSIVE...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:41.116147" elapsed="0.000392"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:41.115997" elapsed="0.000583"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.115645" elapsed="0.000956"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.117584" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflecto...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:41.116783" elapsed="0.000832"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:57:41.117663" 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-10-11T00:57:41.112204" elapsed="0.005562"/>
</kw>
<msg time="2026-10-11T00:57:41.117819" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:41.107638" elapsed="0.010232"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:57:41.122517" 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/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-10-11T00:57:41.126947" 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/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-10-11T00:57:41.131353" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.131569" 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-10-11T00:57:41.131757" 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-10-11T00:57:41.132155" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:41.131981" elapsed="0.000248"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:41.131967" 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-10-11T00:57:41.132444" 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-10-11T00:57:41.132660" 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-10-11T00:57:41.132833" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:57:41.131940" elapsed="0.000941"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:57:41.131837" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.133119" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:41.133207" elapsed="0.000021"/>
</return>
<msg time="2026-10-11T00:57:41.133360" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflecto...</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-10-11T00:57:41.106834" elapsed="0.026554"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:41.134674" 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-10-11T00:57:41.134476" elapsed="0.000273">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-10-11T00:57:41.134847" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:41.134056" 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-10-11T00:57:41.135203" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:41.134934" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.135795" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:41.135510" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:41.135293" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.134917" elapsed="0.000976"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.136493" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:41.136087" elapsed="0.000430"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:57:41.136563" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T00:57:41.136716" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:57:41.133715" elapsed="0.003025"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.138114" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:41.137863" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.138655" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T00:57:41.138400" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.139202" 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-10-11T00:57:41.138935" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.139722" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:41.139473" elapsed="0.000289"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:57:41.140562" 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-10-11T00:57:41.140382" elapsed="0.000207"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:57:41.140944" 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-10-11T00:57:41.140780" elapsed="0.000188"/>
</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-10-11T00:57:41.141223" elapsed="0.000178"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.141868" 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-10-11T00:57:41.141638" elapsed="0.000273"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:57:41.141950" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:57:41.142080" 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-10-11T00:57:41.139980" 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-10-11T00:57:41.157962" level="INFO">PUT Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0i95srcw30m6z17a2l147cl1kz17.node0', 'Content-Length': '1077', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T00:57:41.158027" level="INFO">PUT Response : url=http://10.30.170.173: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.171.7 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:41.158109" 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-10-11T00:57:41.142470" elapsed="0.015662"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:41.142196" elapsed="0.015976"/>
</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-10-11T00:57:41.158367" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:41.158210" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.142163" elapsed="0.016304"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.159620" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:41.159330" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:41.159074" elapsed="0.000618"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.159058" elapsed="0.000656"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.160307" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:41.160028" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:41.159763" elapsed="0.000616"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.159748" elapsed="0.000653"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.160941" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:41.160598" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.161255" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:41.161028" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.161772" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:41.161509" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:41.161330" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.161012" elapsed="0.000836"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.162381" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:41.162025" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.162736" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:41.162496" elapsed="0.000344"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.163318" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:41.163035" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:41.162865" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.162475" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:41.163584" elapsed="0.000295"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:57:41.164289" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:41.164042" elapsed="0.000272"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:57:41.164485" elapsed="0.000218"/>
</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-10-11T00:57:41.158788" elapsed="0.005975"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:57:41.164910" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-10-11T00:57:41.164824" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.164807" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.165142" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:57:41.165217" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:57:41.165380" 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-10-11T00:57:41.137079" elapsed="0.028339"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:57:41.165481" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:57:41.165606" 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-10-11T00:57:41.056554" elapsed="0.109074"/>
</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-10-11T00:57:41.165926" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:41.165714" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.165698" elapsed="0.000311"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:57:41.166039" elapsed="0.000024"/>
</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-10-11T00:57:41.055949" elapsed="0.110188"/>
</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-10-11T00:57:41.167318" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:41.166969" elapsed="0.000405"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.166952" elapsed="0.000444"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:41.167556" elapsed="0.000277"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.170296" 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-10-11T00:57:41.169914" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-10-11T00:57:41.170515" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:57:41.170389" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.170372" elapsed="0.000218"/>
</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-10-11T00:57:41.170757" elapsed="0.000020"/>
</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-10-11T00:57:41.170941" 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-10-11T00:57:41.171148" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.171335" elapsed="0.000019"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.171522" elapsed="0.000020"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message of the current test case.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.171698" 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-10-11T00:57:41.171902" 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-10-11T00:57:41.169595" elapsed="0.002379"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:41.166773" elapsed="0.005248"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-10-11T00:57:41.166418" elapsed="0.005642"/>
</kw>
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="PASS" start="2026-10-11T00:57:40.975172" elapsed="0.196922"/>
</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-10-11T00:57:41.173382" elapsed="0.000215"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:57:41.173112" 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-10-11T00:57:41.174566" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:41.174481" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.174463" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:41.176650" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:41.176569" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.176552" elapsed="0.000159"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.177628" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:41.177290" elapsed="0.000362"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.178066" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:57:41.177809" elapsed="0.000281"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:57:41.178130" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:41.178270" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:57:41.176919" elapsed="0.001373"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:41.180993" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:41.180910" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.180892" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:41.182144" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:41.182058" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.182041" elapsed="0.000181"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:57:41.182568" 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-10-11T00:57:41.182373" elapsed="0.000219"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:57:41.182902" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:57:41.182760" elapsed="0.000166"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:57:41.218041" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:57:41.183447" elapsed="0.034689"/>
</kw>
<msg time="2026-10-11T00:57:41.218303" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:57:41.218345" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:41.183085" elapsed="0.035294"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:57:41.251377" 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-10-11T00:57:41.218942" elapsed="0.032549"/>
</kw>
<msg time="2026-10-11T00:57:41.251638" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:57:41.251680" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:41.218599" elapsed="0.033115"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.251992" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:41.251781" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.251764" elapsed="0.000300"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.252504" 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-10-11T00:57:41.252260" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.252833" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:41.252630" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.252613" elapsed="0.000289"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:57:41.252933" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:57:41.255340" elapsed="0.000132"/>
</kw>
<msg time="2026-10-11T00:57:41.255529" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:41.254315" elapsed="0.001348"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.255971" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.256323" 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-10-11T00:57:41.253722" elapsed="0.002807"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:57:41.253228" elapsed="0.003359"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:57:41.181799" elapsed="0.074861"/>
</kw>
<msg time="2026-10-11T00:57:41.256743" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:41.256783" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:41.181231" elapsed="0.075587"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:57:41.256969" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:57:41.256885" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.256868" elapsed="0.000176"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.257383" elapsed="0.000056"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.257724" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:57:41.257789" 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-10-11T00:57:41.180624" elapsed="0.077252"/>
</kw>
<msg time="2026-10-11T00:57:41.257959" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:41.257998" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:41.178648" elapsed="0.079386"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.258340" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:41.258101" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.258085" elapsed="0.000429"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:57:41.178501" elapsed="0.080040"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:57:41.178342" elapsed="0.080228"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:57:41.176265" elapsed="0.082355"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:57:41.174212" elapsed="0.084457"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:41.173802" elapsed="0.084906"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:57:41.172771" elapsed="0.085983"/>
</kw>
<kw name="Check_Example_Bgp_Rib_Does_Not_Contain" owner="BgpOperations">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:57:41.269801" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i95srcw30m6z17a2l147cl1kz17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:41.270004" level="INFO">GET Response : url=http://10.30.170.173: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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-10-11T00:57:41.270216" 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-10-11T00:57:41.259347" elapsed="0.010895"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.270757" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:41.270469" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.271381" 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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":true}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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}}]}}]}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:41.270997" elapsed="0.000551"/>
</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 the `container` contains the `item`.</doc>
<status status="PASS" start="2026-10-11T00:57:41.271716" elapsed="0.000516"/>
</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-10-11T00:57:41.258958" elapsed="0.013336"/>
</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-10-11T00:57:41.273480" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:41.273104" elapsed="0.000434"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.273086" elapsed="0.000476"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:41.273708" elapsed="0.000283"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.276287" 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-10-11T00:57:41.275909" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-10-11T00:57:41.276502" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-10-11T00:57:41.276381" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.276364" elapsed="0.000216"/>
</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-10-11T00:57:41.276748" elapsed="0.000020"/>
</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-10-11T00:57:41.276934" elapsed="0.000019"/>
</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-10-11T00:57:41.277108" elapsed="0.000018"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.277287" elapsed="0.000019"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.277470" elapsed="0.000019"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message of the current test case.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.277642" elapsed="0.000018"/>
</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-10-11T00:57:41.277844" elapsed="0.000018"/>
</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-10-11T00:57:41.275593" elapsed="0.002322"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:41.272904" elapsed="0.005056"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-10-11T00:57:41.272560" elapsed="0.005437"/>
</kw>
<doc>Check RIB for none linkstate-routes</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:57:41.172309" elapsed="0.105720"/>
</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-10-11T00:57:41.279243" elapsed="0.000213"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:57:41.278980" 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-10-11T00:57:41.280390" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:41.280304" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.280287" elapsed="0.000180"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:41.282663" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:41.282580" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.282563" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.283672" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:41.283307" elapsed="0.000391"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.284121" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:57:41.283858" elapsed="0.000288"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:57:41.284202" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T00:57:41.284337" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:57:41.282936" elapsed="0.001465"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:41.287006" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:41.286920" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.286902" elapsed="0.000168"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:41.288154" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:41.288069" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.288052" elapsed="0.000178"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:57:41.288591" 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-10-11T00:57:41.288383" elapsed="0.000233"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:57:41.288924" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:57:41.288785" elapsed="0.000162"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:57:41.323594" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:57:41.289485" elapsed="0.034361"/>
</kw>
<msg time="2026-10-11T00:57:41.324091" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:57:41.324135" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:41.289109" elapsed="0.035062"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:57:41.349884" 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-10-11T00:57:41.324993" elapsed="0.024998"/>
</kw>
<msg time="2026-10-11T00:57:41.350144" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:57:41.350197" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:41.324488" elapsed="0.025747"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.350618" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:41.350329" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.350299" elapsed="0.000401"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.351140" 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-10-11T00:57:41.350895" elapsed="0.000329"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.351510" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:41.351287" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.351270" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:57:41.351621" 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-10-11T00:57:41.354266" elapsed="0.000370"/>
</kw>
<msg time="2026-10-11T00:57:41.354696" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:41.353210" elapsed="0.001628"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.355150" elapsed="0.000088"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.355532" 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-10-11T00:57:41.352562" 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-10-11T00:57:41.352008" 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-10-11T00:57:41.287811" elapsed="0.068049"/>
</kw>
<msg time="2026-10-11T00:57:41.355998" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:41.356039" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:41.287240" elapsed="0.068836"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:57:41.356249" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:57:41.356147" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.356129" elapsed="0.000199"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.356718" 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-10-11T00:57:41.357033" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:57:41.357098" 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-10-11T00:57:41.286629" elapsed="0.070568"/>
</kw>
<msg time="2026-10-11T00:57:41.357285" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:41.357326" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:41.284764" elapsed="0.072597"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:41.357681" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:41.357453" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:41.357435" elapsed="0.000317"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:57:41.284617" elapsed="0.073157"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:57:41.284472" elapsed="0.073336"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:57:41.282272" elapsed="0.075592"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:57:41.280043" elapsed="0.077878"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:41.279655" elapsed="0.078313"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:57:41.278640" elapsed="0.079381"/>
</kw>
<kw name="Start_Console_Tool" owner="BGPcliKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.361531" level="INFO">${start_cmd} = python3 play.py --amount 1 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:41.361225" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.361984" level="INFO">python3 play.py --amount 1 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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-10-11T00:57:41.361766" elapsed="0.000261"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:57:41.366162" level="INFO">python3 play.py --amount 1 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --peerport=1790 --debug --logfile bgp_peer.log --bgpls True &amp;&gt;bgp_peer.log</msg>
<msg time="2026-10-11T00:57:41.366258" level="INFO">${output} = python3 play.py --amount 1 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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-10-11T00:57:41.362196" elapsed="0.004089"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:41.366725" level="INFO">python3 play.py --amount 1 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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-10-11T00:57:41.366499" elapsed="0.000269"/>
</kw>
<arg>${BGP_PEER_COMMAND}</arg>
<arg>${BGP_PEER_OPTIONS}</arg>
<doc>Start the tool ${command} ${tool_opt}</doc>
<status status="PASS" start="2026-10-11T00:57:41.360867" elapsed="0.005951"/>
</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-10-11T00:57:51.368650" 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-10-11T00:57:41.368394" elapsed="10.000876">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-10-11T00:57:51.369613" elapsed="0.000031"/>
</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-10-11T00:57:41.368099" elapsed="10.001659">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-10-11T00:57:41.367735" elapsed="10.002202"/>
</kw>
<msg time="2026-10-11T00:57:51.370040" 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-10-11T00:57:41.367346" elapsed="10.002719"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-10-11T00:57:51.370239" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-10-11T00:57:51.370166" elapsed="0.000133"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:51.370142" elapsed="0.000180"/>
</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-10-11T00:57:51.370560" elapsed="0.000025"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:51.370742" 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-10-11T00:57:41.367057" elapsed="10.003759"/>
</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-10-11T00:57:51.372063" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:51.371703" elapsed="0.000432"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:51.371685" elapsed="0.000474"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:51.372307" elapsed="0.000354"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:51.375333" 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-10-11T00:57:51.374934" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-10-11T00:57:51.375555" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:57:51.375445" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:51.375426" elapsed="0.000203"/>
</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-10-11T00:57:51.375864" elapsed="0.000021"/>
</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-10-11T00:57:51.376053" elapsed="0.000019"/>
</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-10-11T00:57:51.376248" elapsed="0.000018"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:51.376435" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:51.376609" elapsed="0.000019"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message of the current test case.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:51.376783" elapsed="0.000018"/>
</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-10-11T00:57:51.376988" 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-10-11T00:57:51.374607" elapsed="0.002453"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:51.371503" elapsed="0.005640"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-10-11T00:57:51.371070" elapsed="0.006113"/>
</kw>
<doc>Connect BGP peer</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:57:41.278227" elapsed="10.098989"/>
</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-10-11T00:57:51.378576" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:57:51.378307" 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-10-11T00:57:51.379857" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:51.379770" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:51.379752" elapsed="0.000166"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:51.381960" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:51.381877" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:51.381861" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:51.383002" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:51.382674" elapsed="0.000354"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:57:51.383477" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:57:51.383198" elapsed="0.000303"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:57:51.383541" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:51.383667" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:57:51.382296" elapsed="0.001393"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:51.386427" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:51.386328" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:51.386310" elapsed="0.000182"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:57:51.387616" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:51.387531" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:51.387513" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:57:51.388005" 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-10-11T00:57:51.387832" elapsed="0.000197"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:57:51.388370" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:57:51.388229" elapsed="0.000165"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:57:51.438823" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:57:51.388903" elapsed="0.050024"/>
</kw>
<msg time="2026-10-11T00:57:51.439090" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:57:51.439133" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:51.388571" elapsed="0.050615"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:57:51.466161" 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-10-11T00:57:51.439726" elapsed="0.026535"/>
</kw>
<msg time="2026-10-11T00:57:51.466434" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:57:51.466477" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:51.439359" elapsed="0.027153"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:51.466826" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:51.466582" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:51.466563" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:51.467333" 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-10-11T00:57:51.467103" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:51.467678" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:51.467474" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:51.467457" elapsed="0.000292"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:57:51.467779" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:57:51.470272" elapsed="0.000116"/>
</kw>
<msg time="2026-10-11T00:57:51.470462" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:51.469187" 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-10-11T00:57:51.470940" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:51.471296" 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-10-11T00:57:51.468590" 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-10-11T00:57:51.468100" elapsed="0.003464"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:57:51.387251" elapsed="0.084387"/>
</kw>
<msg time="2026-10-11T00:57:51.471721" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:51.471760" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:51.386647" elapsed="0.085148"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:57:51.471948" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:57:51.471863" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:51.471846" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:51.472363" elapsed="0.000022"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:51.472708" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:57:51.472772" 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-10-11T00:57:51.386024" elapsed="0.086833"/>
</kw>
<msg time="2026-10-11T00:57:51.472941" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:57:51.472980" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:51.384026" elapsed="0.088989"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:51.473321" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:51.473099" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:51.473065" elapsed="0.000326"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:57:51.383881" elapsed="0.089557"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:57:51.383738" elapsed="0.089730"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:57:51.381587" elapsed="0.091930"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:57:51.379400" elapsed="0.094166"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:57:51.378983" elapsed="0.094622"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:57:51.377924" elapsed="0.095728"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:57:51.474251" level="INFO">&amp;{mapping} = { IP=10.30.171.7 | 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-10-11T00:57:51.473839" elapsed="0.000438"/>
</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-10-11T00:57:51.490535" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:51.490217" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:51.491319" 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-10-11T00:57:51.491039" elapsed="0.000346">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-10-11T00:57:51.491489" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:51.490720" elapsed="0.000791"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:51.492029" 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-10-11T00:57:51.491720" elapsed="0.000334"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:51.492354" 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-10-11T00:57:51.492516" 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-10-11T00:57:51.492242" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:51.492956" 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-10-11T00:57:51.492737" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:51.493922" level="INFO">mapping: {'IP': '10.30.171.7', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:51.493692" elapsed="0.000273"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:57:51.494420" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:57:51.494159" elapsed="0.000288"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:51.495032" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:57:51.494762" elapsed="0.000294"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:51.495892" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:57:51.495575" elapsed="0.000342"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:51.495962" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:57:51.496102" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:57:51.495245" 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-10-11T00:57:51.496295" elapsed="0.000202"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:57:51.494627" elapsed="0.001906"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:51.497191" 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-10-11T00:57:51.496764" elapsed="0.000451"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:51.498016" 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-10-11T00:57:51.497717" elapsed="0.000324"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:51.498116" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:57:51.498246" 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-10-11T00:57:51.497387" 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-10-11T00:57:51.498458" elapsed="0.000167"/>
</kw>
<var name="${key}">ROUTE_KEY</var>
<var name="${value}">AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</var>
<status status="PASS" start="2026-10-11T00:57:51.496632" elapsed="0.002030"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:57:51.494489" elapsed="0.004205"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:57:51.498731" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:57:51.498857" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:57:51.493331" elapsed="0.005550"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:51.493060" elapsed="0.005851"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:51.499103" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:51.498933" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:51.493042" elapsed="0.006132"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:51.499874" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-lin...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:51.499336" elapsed="0.000565"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:57:51.499945" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:57:51.489697" elapsed="0.010347"/>
</kw>
<msg time="2026-10-11T00:57:51.500139" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:51.485258" elapsed="0.014927"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:57:51.504443" 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/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-10-11T00:57:51.508720" 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/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-10-11T00:57:51.512952" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:51.513153" 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-10-11T00:57:51.513338" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:51.513697" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:51.513545" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:51.513531" 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-10-11T00:57:51.513930" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:51.514126" 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-10-11T00:57:51.514295" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:57:51.513506" elapsed="0.000836"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:57:51.513402" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:51.514535" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:51.514603" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:57:51.514714" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-lin...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T00:57:51.484646" elapsed="0.030093"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:51.515879" 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-10-11T00:57:51.515684" elapsed="0.000256">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-10-11T00:57:51.516023" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:51.515337" elapsed="0.000708"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:51.516381" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:51.516156" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:51.516906" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:51.516645" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:51.516470" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:51.516138" elapsed="0.000843"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:51.517509" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:51.517158" elapsed="0.000374"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:57:51.517577" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:57:51.517700" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:57:51.515010" elapsed="0.002713"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:51.518821" 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-10-11T00:57:51.518633" elapsed="0.000247">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-10-11T00:57:51.518962" 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-10-11T00:57:51.518296" elapsed="0.000689"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:57:51.519161" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-11T00:57:51.519047" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:51.519030" elapsed="0.000206"/>
</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-10-11T00:57:51.519393" elapsed="0.000034"/>
</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-10-11T00:57:51.519591" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:57:51.519649" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:57:51.519773" 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-10-11T00:57:51.517976" elapsed="0.001820"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:51.521264" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:51.521012" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:51.521739" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:51.521522" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:57:51.530800" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i95srcw30m6z17a2l147cl1kz17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:51.530956" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:51.531050" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:51.522068" elapsed="0.009372">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:51.521838" elapsed="0.009681">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:51.531742" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:51.531579" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-10-11T00:57:51.521822" elapsed="0.009998">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:51.532177" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:51.532296" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:51.532263" elapsed="0.000069"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:51.532247" elapsed="0.000105"/>
</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-10-11T00:57:51.532511" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:57:51.532574" 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-10-11T00:57:51.520297" elapsed="0.012372">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:51.532736" 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-10-11T00:57:51.477154" elapsed="0.055670">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:51.533092" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:51.532906" elapsed="0.000251"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:51.532890" elapsed="0.000289"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:51.533209" elapsed="0.000013"/>
</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-10-11T00:57:51.476530" elapsed="0.056765">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:52.568504" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:52.567767" elapsed="0.000799"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:52.570180" 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-10-11T00:57:52.569701" elapsed="0.000615">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-10-11T00:57:52.570538" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:52.568930" elapsed="0.001659"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:52.571712" 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-10-11T00:57:52.570976" elapsed="0.000796"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:52.572438" 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-10-11T00:57:52.572850" 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-10-11T00:57:52.572169" elapsed="0.000737"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:52.573898" 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-10-11T00:57:52.573369" elapsed="0.000624"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:52.576105" level="INFO">mapping: {'IP': '10.30.171.7', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:52.575570" elapsed="0.000630"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:57:52.577212" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:57:52.576624" elapsed="0.000641"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:52.578302" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:57:52.577913" elapsed="0.000423"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:52.579514" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:57:52.579032" elapsed="0.000517"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:52.579611" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T00:57:52.579790" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:57:52.578597" elapsed="0.001224"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:52.580054" elapsed="0.000258"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:57:52.577704" elapsed="0.002659"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:52.581127" 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-10-11T00:57:52.580712" elapsed="0.000450"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:52.582305" 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-10-11T00:57:52.581864" elapsed="0.000476"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:52.582401" elapsed="0.000076"/>
</return>
<msg time="2026-10-11T00:57:52.582615" 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-10-11T00:57:52.581401" elapsed="0.001246"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:52.582880" elapsed="0.000250"/>
</kw>
<var name="${key}">ROUTE_KEY</var>
<var name="${value}">AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</var>
<status status="PASS" start="2026-10-11T00:57:52.580524" elapsed="0.002657"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:57:52.577361" elapsed="0.005864"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:57:52.583277" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T00:57:52.583476" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:57:52.574757" elapsed="0.008755"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:52.574155" elapsed="0.009398"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:52.583796" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:52.583584" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:52.574115" elapsed="0.009777"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:52.584869" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-lin...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:52.584134" elapsed="0.000773"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:57:52.584967" 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//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-10-11T00:57:52.566581" elapsed="0.018544"/>
</kw>
<msg time="2026-10-11T00:57:52.585195" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:52.556193" elapsed="0.029107"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:57:52.591509" 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/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-10-11T00:57:52.597429" 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//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-10-11T00:57:52.603506" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:52.603770" 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-10-11T00:57:52.604028" 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-10-11T00:57:52.604540" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:52.604315" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:52.604296" elapsed="0.000345"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:52.604860" 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-10-11T00:57:52.605128" 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-10-11T00:57:52.605361" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:57:52.604260" elapsed="0.001186"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:57:52.604137" elapsed="0.001343"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:52.605695" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:52.605787" elapsed="0.000020"/>
</return>
<msg time="2026-10-11T00:57:52.605941" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-lin...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T00:57:52.554788" elapsed="0.051188"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:52.607565" 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-10-11T00:57:52.607285" elapsed="0.000363">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-10-11T00:57:52.607763" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:52.606811" elapsed="0.000983"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:52.608260" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:52.607883" elapsed="0.000450"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:52.608994" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:52.608627" elapsed="0.000401"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:52.608365" elapsed="0.000727"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:52.607859" elapsed="0.001261"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:52.609842" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:52.609351" elapsed="0.000525"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:57:52.609937" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:57:52.610129" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:57:52.606367" elapsed="0.003795"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:52.611714" 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-10-11T00:57:52.611455" elapsed="0.000340">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-10-11T00:57:52.611910" 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-10-11T00:57:52.610951" elapsed="0.000991"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:57:52.612183" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-10-11T00:57:52.612030" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:52.612006" elapsed="0.000284"/>
</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-10-11T00:57:52.612527" elapsed="0.000028"/>
</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-10-11T00:57:52.612775" elapsed="0.000026"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:57:52.612855" elapsed="0.000019"/>
</return>
<msg time="2026-10-11T00:57:52.613028" 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-10-11T00:57:52.610531" elapsed="0.002529"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:52.614839" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:52.614526" elapsed="0.000374"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:52.615509" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:52.615184" 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-10-11T00:57:52.624030" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i95srcw30m6z17a2l147cl1kz17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:52.624214" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:52.624338" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:52.615970" elapsed="0.008844">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:52.615649" elapsed="0.009268">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:52.625241" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:52.625000" elapsed="0.000325"/>
</branch>
<status status="FAIL" start="2026-10-11T00:57:52.615625" elapsed="0.009730">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:52.625852" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:52.626023" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:52.625975" elapsed="0.000126"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:52.625952" 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-10-11T00:57:52.626333" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:57:52.626440" 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-10-11T00:57:52.613487" elapsed="0.013087">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:52.626664" elapsed="0.000020"/>
</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-10-11T00:57:52.538117" elapsed="0.088667">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:52.627146" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:52.626899" elapsed="0.000337"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:52.626877" elapsed="0.000389"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:52.627307" elapsed="0.000018"/>
</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-10-11T00:57:52.536664" elapsed="0.090782">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:53.662862" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:53.662141" elapsed="0.000783"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:53.664530" 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-10-11T00:57:53.664096" elapsed="0.000574">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-10-11T00:57:53.664863" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:53.663315" elapsed="0.001598"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:53.666075" 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-10-11T00:57:53.665332" elapsed="0.000802"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:53.666784" 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-10-11T00:57:53.667163" 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-10-11T00:57:53.666538" elapsed="0.000681"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:53.668254" 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-10-11T00:57:53.667695" elapsed="0.000656"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:53.670859" level="INFO">mapping: {'IP': '10.30.171.7', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:53.670295" elapsed="0.000659"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:57:53.671978" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:57:53.671381" elapsed="0.000650"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:53.673241" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:57:53.672823" elapsed="0.000452"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:53.674455" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:57:53.673972" elapsed="0.000519"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:53.674555" elapsed="0.000044"/>
</return>
<msg time="2026-10-11T00:57:53.674737" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:57:53.673537" elapsed="0.001234"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:53.675005" elapsed="0.000260"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:57:53.672508" elapsed="0.002808"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:53.676034" 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-10-11T00:57:53.675663" elapsed="0.000424"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:53.677238" 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-10-11T00:57:53.676790" elapsed="0.000483"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:53.677334" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:57:53.677546" 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-10-11T00:57:53.676328" elapsed="0.001251"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:53.677814" elapsed="0.000229"/>
</kw>
<var name="${key}">ROUTE_KEY</var>
<var name="${value}">AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</var>
<status status="PASS" start="2026-10-11T00:57:53.675478" elapsed="0.002636"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:57:53.672161" elapsed="0.005997"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:57:53.678211" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T00:57:53.678386" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:57:53.669131" elapsed="0.009309"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:53.668525" elapsed="0.009957"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:53.678724" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:53.678513" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:53.668483" elapsed="0.010337"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:53.679875" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-lin...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:53.679045" elapsed="0.000873"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:57:53.679981" 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/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-10-11T00:57:53.660936" elapsed="0.019209"/>
</kw>
<msg time="2026-10-11T00:57:53.680214" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:53.650817" elapsed="0.029499"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:57:53.686255" 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/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-10-11T00:57:53.692171" 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//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-10-11T00:57:53.698067" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:53.698325" 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-10-11T00:57:53.698602" 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-10-11T00:57:53.699090" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:53.698868" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:53.698849" 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-10-11T00:57:53.699440" 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-10-11T00:57:53.699698" 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-10-11T00:57:53.699928" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:57:53.698813" elapsed="0.001180"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:57:53.698693" elapsed="0.001333"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:53.700261" elapsed="0.000025"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:53.700352" elapsed="0.000020"/>
</return>
<msg time="2026-10-11T00:57:53.700526" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-lin...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T00:57:53.649433" elapsed="0.051129"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:53.702148" 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-10-11T00:57:53.701855" elapsed="0.000377">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-10-11T00:57:53.702346" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:53.701370" elapsed="0.001007"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:53.702855" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:53.702489" elapsed="0.000439"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:53.705564" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:53.703224" elapsed="0.002376"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:53.702959" elapsed="0.002689"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:53.702465" elapsed="0.003212"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:53.706439" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:53.705911" elapsed="0.000564"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:57:53.706540" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:57:53.706718" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:57:53.700929" elapsed="0.005822"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:53.708450" 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-10-11T00:57:53.708167" elapsed="0.000367">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-10-11T00:57:53.708654" 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-10-11T00:57:53.707593" elapsed="0.001094"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:57:53.708915" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-10-11T00:57:53.708777" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:53.708753" 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-10-11T00:57:53.709269" elapsed="0.000028"/>
</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-10-11T00:57:53.709541" elapsed="0.000028"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:57:53.709626" elapsed="0.000019"/>
</return>
<msg time="2026-10-11T00:57:53.709801" 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-10-11T00:57:53.707133" elapsed="0.002702"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:53.711601" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:53.711262" elapsed="0.000402"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:53.712265" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:53.711935" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:57:53.720243" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i95srcw30m6z17a2l147cl1kz17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:53.720444" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:53.720581" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:53.712753" elapsed="0.008294">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:53.712428" elapsed="0.008748">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:53.721507" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:53.721262" elapsed="0.000328"/>
</branch>
<status status="FAIL" start="2026-10-11T00:57:53.712384" elapsed="0.009236">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:53.722113" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:53.722280" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:53.722234" elapsed="0.000100"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:53.722212" elapsed="0.000149"/>
</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-10-11T00:57:53.722581" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:57:53.722670" 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-10-11T00:57:53.710243" elapsed="0.012559">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:53.722893" elapsed="0.000020"/>
</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-10-11T00:57:53.632438" elapsed="0.090574">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:53.723382" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:53.723154" elapsed="0.000337"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:53.723131" elapsed="0.000391"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:53.723564" elapsed="0.000019"/>
</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-10-11T00:57:53.630924" elapsed="0.092761">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:54.759479" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:54.758736" elapsed="0.000806"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:54.761105" 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-10-11T00:57:54.760691" elapsed="0.000549">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-10-11T00:57:54.761458" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:54.759906" elapsed="0.001606"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:54.762641" 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-10-11T00:57:54.761904" elapsed="0.000794"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:54.763339" 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-10-11T00:57:54.763707" 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-10-11T00:57:54.763095" elapsed="0.000669"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:54.764757" 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-10-11T00:57:54.764232" elapsed="0.000621"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:54.766953" level="INFO">mapping: {'IP': '10.30.171.7', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:54.766436" elapsed="0.000636"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:57:54.768097" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:57:54.767502" elapsed="0.000652"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:54.769599" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:57:54.768896" elapsed="0.000759"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:54.770929" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:57:54.770494" elapsed="0.000470"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:54.771026" elapsed="0.000058"/>
</return>
<msg time="2026-10-11T00:57:54.771222" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:57:54.770022" elapsed="0.001232"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:54.771519" elapsed="0.000244"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:57:54.768595" elapsed="0.003219"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:54.772766" 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-10-11T00:57:54.772158" elapsed="0.000643"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:54.773946" 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-10-11T00:57:54.773528" elapsed="0.000454"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:54.774061" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:57:54.774240" 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-10-11T00:57:54.773058" elapsed="0.001214"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:54.774542" elapsed="0.000234"/>
</kw>
<var name="${key}">ROUTE_KEY</var>
<var name="${value}">AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</var>
<status status="PASS" start="2026-10-11T00:57:54.771955" elapsed="0.002876"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:57:54.768252" elapsed="0.006625"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:57:54.774929" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T00:57:54.775126" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:57:54.765611" elapsed="0.009549"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:54.764990" elapsed="0.010211"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:54.775467" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:54.775233" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:54.764950" elapsed="0.010615"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:54.776548" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-lin...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:54.775791" elapsed="0.000795"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:57:54.776646" 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/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-10-11T00:57:54.757545" elapsed="0.019241"/>
</kw>
<msg time="2026-10-11T00:57:54.776855" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:54.747451" elapsed="0.029511"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:57:54.782933" 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/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-10-11T00:57:54.789067" 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/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-10-11T00:57:54.795018" elapsed="0.000052"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:54.795297" 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-10-11T00:57:54.795573" 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-10-11T00:57:54.796066" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:54.795844" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:54.795825" elapsed="0.000344"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:54.796390" elapsed="0.000044"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:54.796666" 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-10-11T00:57:54.796903" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:57:54.795789" elapsed="0.001180"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:57:54.795666" elapsed="0.001335"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:54.797233" elapsed="0.000025"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:54.797325" elapsed="0.000021"/>
</return>
<msg time="2026-10-11T00:57:54.797501" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-lin...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T00:57:54.745999" elapsed="0.051538"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:54.799135" 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-10-11T00:57:54.798860" elapsed="0.000358">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-10-11T00:57:54.799333" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:54.798356" elapsed="0.001009"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:54.799835" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:54.799474" elapsed="0.000434"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:54.800592" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:54.800202" elapsed="0.000425"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:54.799940" elapsed="0.000732"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:54.799449" elapsed="0.001250"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:54.801443" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:54.800934" elapsed="0.000544"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:57:54.801541" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:57:54.801715" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:57:54.797909" elapsed="0.003838"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:54.803319" 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-10-11T00:57:54.803063" elapsed="0.000338">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-10-11T00:57:54.803542" 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-10-11T00:57:54.802594" elapsed="0.000980"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:57:54.803799" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-10-11T00:57:54.803662" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:54.803638" 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-10-11T00:57:54.804140" 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-10-11T00:57:54.804389" elapsed="0.000044"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:57:54.804491" elapsed="0.000020"/>
</return>
<msg time="2026-10-11T00:57:54.804666" 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-10-11T00:57:54.802144" elapsed="0.002554"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:54.806706" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:54.806373" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:54.807362" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:54.807058" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:57:54.815522" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i95srcw30m6z17a2l147cl1kz17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:54.815680" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:54.815803" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:54.807847" elapsed="0.008430">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:54.807524" elapsed="0.008856">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:54.816710" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:54.816484" elapsed="0.000308"/>
</branch>
<status status="FAIL" start="2026-10-11T00:57:54.807499" elapsed="0.009323">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:54.817304" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:54.817495" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:54.817447" elapsed="0.000101"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:54.817423" elapsed="0.000152"/>
</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-10-11T00:57:54.817777" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:57:54.817863" elapsed="0.000019"/>
</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-10-11T00:57:54.805364" elapsed="0.012628">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:54.818098" 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-10-11T00:57:54.728958" elapsed="0.089263">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:54.818583" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:54.818334" elapsed="0.000339"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:54.818313" elapsed="0.000391"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:54.818745" elapsed="0.000019"/>
</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-10-11T00:57:54.727515" elapsed="0.091355">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:55.854679" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:55.853925" elapsed="0.000816"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:55.856307" 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-10-11T00:57:55.855888" elapsed="0.000583">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-10-11T00:57:55.856665" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:55.855132" elapsed="0.001583"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:55.857853" 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-10-11T00:57:55.857133" elapsed="0.000776"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:55.858589" 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-10-11T00:57:55.858921" 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-10-11T00:57:55.858311" elapsed="0.000665"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:55.859970" 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-10-11T00:57:55.859475" elapsed="0.000668"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:55.862362" level="INFO">mapping: {'IP': '10.30.171.7', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:55.861811" elapsed="0.000677"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:57:55.863506" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:57:55.862893" elapsed="0.000668"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:55.864953" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:57:55.864306" elapsed="0.000689"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:55.866160" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:57:55.865721" elapsed="0.000474"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:55.866259" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T00:57:55.866468" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:57:55.865265" elapsed="0.001237"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:55.866737" elapsed="0.000238"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:57:55.863971" elapsed="0.003055"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:55.867769" 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-10-11T00:57:55.867373" elapsed="0.000431"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:55.868954" 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-10-11T00:57:55.868536" elapsed="0.000452"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:55.869065" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:57:55.869239" 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-10-11T00:57:55.868068" 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-10-11T00:57:55.869540" elapsed="0.000232"/>
</kw>
<var name="${key}">ROUTE_KEY</var>
<var name="${value}">AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</var>
<status status="PASS" start="2026-10-11T00:57:55.867188" elapsed="0.002636"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:57:55.863661" elapsed="0.006206"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:57:55.869919" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T00:57:55.870116" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:57:55.860907" elapsed="0.009243"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:55.860287" elapsed="0.009904"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:55.870455" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:55.870222" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:55.860247" elapsed="0.010307"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:55.871531" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-lin...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:55.870782" elapsed="0.000786"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:57:55.871629" 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/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-10-11T00:57:55.852650" elapsed="0.019117"/>
</kw>
<msg time="2026-10-11T00:57:55.871836" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:55.841989" elapsed="0.029953"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:57:55.878139" 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/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-10-11T00:57:55.884080" 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//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-10-11T00:57:55.889978" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:55.890255" 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-10-11T00:57:55.890536" 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-10-11T00:57:55.891085" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:55.890808" elapsed="0.000354"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:55.890787" elapsed="0.000402"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:55.891360" 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-10-11T00:57:55.891560" 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-10-11T00:57:55.891728" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:57:55.890751" elapsed="0.001025"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:57:55.890628" elapsed="0.001171"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:55.891954" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:55.892021" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T00:57:55.892150" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-lin...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T00:57:55.840602" elapsed="0.051573"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:55.893306" 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-10-11T00:57:55.893108" elapsed="0.000258">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-10-11T00:57:55.893466" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:55.892764" elapsed="0.000725"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:55.893819" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:55.893553" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:55.894347" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:55.894082" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:55.893895" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:55.893537" elapsed="0.000904"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:55.894950" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:55.894608" elapsed="0.000366"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:57:55.895020" elapsed="0.000044"/>
</return>
<msg time="2026-10-11T00:57:55.895161" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:57:55.892456" elapsed="0.002728"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:55.896283" 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-10-11T00:57:55.896090" elapsed="0.000251">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-10-11T00:57:55.896440" 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-10-11T00:57:55.895757" elapsed="0.000707"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:57:55.896627" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:57:55.896528" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:55.896511" elapsed="0.000191"/>
</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-10-11T00:57:55.896858" elapsed="0.000019"/>
</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-10-11T00:57:55.897047" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:57:55.897107" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:57:55.897229" 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-10-11T00:57:55.895452" elapsed="0.001800"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:55.898505" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:55.898266" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:55.898958" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:55.898742" elapsed="0.000255"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:57:55.908148" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i95srcw30m6z17a2l147cl1kz17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:55.908303" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:55.908457" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:55.899300" elapsed="0.009594">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:55.899073" elapsed="0.009923">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:55.909321" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:55.909097" elapsed="0.000325"/>
</branch>
<status status="FAIL" start="2026-10-11T00:57:55.899055" elapsed="0.010399">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:55.909930" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:55.910111" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:55.910066" elapsed="0.000097"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:55.910041" elapsed="0.000149"/>
</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-10-11T00:57:55.910389" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:57:55.910495" elapsed="0.000019"/>
</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-10-11T00:57:55.897544" elapsed="0.013080">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:55.910712" 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-10-11T00:57:55.823749" elapsed="0.087079">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:55.911200" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:55.910941" elapsed="0.000350"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:55.910919" elapsed="0.000402"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:55.911366" elapsed="0.000019"/>
</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-10-11T00:57:55.822299" elapsed="0.089213">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:56.946850" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:56.946138" elapsed="0.000773"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:56.948494" 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-10-11T00:57:56.948074" elapsed="0.000556">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-10-11T00:57:56.948819" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:56.947302" elapsed="0.001566"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:56.950003" 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-10-11T00:57:56.949280" elapsed="0.000805"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:56.950739" 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-10-11T00:57:56.951091" 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-10-11T00:57:56.950492" elapsed="0.000656"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:56.952136" 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-10-11T00:57:56.951622" elapsed="0.000610"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:56.954713" level="INFO">mapping: {'IP': '10.30.171.7', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:56.954150" elapsed="0.000658"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:57:56.955845" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:57:56.955242" elapsed="0.000658"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:56.957305" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:57:56.956668" elapsed="0.000692"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:56.958797" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:57:56.958336" elapsed="0.000496"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:56.958897" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T00:57:56.959096" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:57:56.957782" 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-10-11T00:57:56.959363" elapsed="0.000260"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:57:56.956338" elapsed="0.003337"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:56.960396" 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-10-11T00:57:56.960001" elapsed="0.000460"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:56.961600" 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-10-11T00:57:56.961159" elapsed="0.000476"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:56.961696" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:57:56.961871" 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-10-11T00:57:56.960704" elapsed="0.001199"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:56.962161" elapsed="0.000231"/>
</kw>
<var name="${key}">ROUTE_KEY</var>
<var name="${value}">AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</var>
<status status="PASS" start="2026-10-11T00:57:56.959816" elapsed="0.002657"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:57:56.956000" elapsed="0.006517"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:57:56.962569" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T00:57:56.962745" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:57:56.952973" elapsed="0.009806"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:56.952370" elapsed="0.010450"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:56.963083" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:56.962850" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:56.952331" elapsed="0.010849"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:56.964150" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-lin...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:56.963403" elapsed="0.000784"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:57:56.964247" 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//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-10-11T00:57:56.944932" elapsed="0.019519"/>
</kw>
<msg time="2026-10-11T00:57:56.964523" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:56.934845" elapsed="0.029785"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:57:56.970555" 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/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-10-11T00:57:56.976435" 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//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-10-11T00:57:56.982257" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:56.982531" 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-10-11T00:57:56.982787" 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-10-11T00:57:56.983275" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:56.983069" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:56.983049" 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-10-11T00:57:56.983616" 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-10-11T00:57:56.983881" elapsed="0.000031"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:56.984178" elapsed="0.000024"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:57:56.982998" elapsed="0.001240"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:57:56.982878" elapsed="0.001388"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:56.984432" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:56.984500" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:57:56.984610" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-lin...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T00:57:56.933452" elapsed="0.051183"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:56.985746" 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-10-11T00:57:56.985561" elapsed="0.000244">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-10-11T00:57:56.985888" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:56.985219" elapsed="0.000691"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:56.986243" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:56.985972" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:56.986941" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:56.986503" elapsed="0.000463"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:56.986318" elapsed="0.000682"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:56.985956" elapsed="0.001081"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:56.987561" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:56.987204" elapsed="0.000382"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:57:56.987631" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:56.987755" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:57:56.984900" elapsed="0.002877"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:56.988872" 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-10-11T00:57:56.988687" elapsed="0.000246">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-10-11T00:57:56.989028" 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-10-11T00:57:56.988347" elapsed="0.000705"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:57:56.989213" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-11T00:57:56.989116" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:56.989099" elapsed="0.000188"/>
</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-10-11T00:57:56.989458" 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-10-11T00:57:56.989636" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:57:56.989694" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:57:56.989817" 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-10-11T00:57:56.988040" elapsed="0.001800"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:56.991072" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:56.990837" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:56.991542" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:56.991309" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:57:56.998721" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i95srcw30m6z17a2l147cl1kz17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:56.998832" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:56.998924" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:56.991871" elapsed="0.007384">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:56.991641" elapsed="0.007687">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:56.999571" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:56.999387" elapsed="0.000243"/>
</branch>
<status status="FAIL" start="2026-10-11T00:57:56.991624" elapsed="0.008028">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:56.999986" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:57.000121" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:57.000088" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:57.000072" elapsed="0.000106"/>
</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-10-11T00:57:57.000322" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:57:57.000383" elapsed="0.000013"/>
</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-10-11T00:57:56.990129" elapsed="0.010365">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:57.000558" elapsed="0.000014"/>
</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-10-11T00:57:56.916377" elapsed="0.084265">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:57.000888" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:57.000723" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:57.000707" elapsed="0.000269"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:57.001006" elapsed="0.000025"/>
</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-10-11T00:57:56.914907" elapsed="0.086199">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:58.036773" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:58.036065" elapsed="0.000769"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:58.038375" 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-10-11T00:57:58.037965" elapsed="0.000575">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-10-11T00:57:58.038728" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:58.037219" elapsed="0.001558"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:58.039956" 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-10-11T00:57:58.039235" elapsed="0.000799"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:58.040681" 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-10-11T00:57:58.041038" 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-10-11T00:57:58.040437" elapsed="0.000659"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:58.042072" 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-10-11T00:57:58.041564" elapsed="0.000604"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:58.044269" level="INFO">mapping: {'IP': '10.30.171.7', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:58.043731" elapsed="0.000630"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:57:58.045369" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:57:58.044789" elapsed="0.000662"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:58.046809" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:57:58.046184" elapsed="0.000682"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:58.048125" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:57:58.047672" elapsed="0.000487"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:58.048222" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T00:57:58.048400" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:57:58.047215" elapsed="0.001243"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:58.048693" elapsed="0.000236"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:57:58.045863" elapsed="0.003116"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:58.049911" 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-10-11T00:57:58.049324" elapsed="0.000621"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:58.051147" 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-10-11T00:57:58.050669" elapsed="0.000515"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:58.051244" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:57:58.051449" 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-10-11T00:57:58.050210" 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-10-11T00:57:58.051716" elapsed="0.000229"/>
</kw>
<var name="${key}">ROUTE_KEY</var>
<var name="${value}">AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</var>
<status status="PASS" start="2026-10-11T00:57:58.049141" elapsed="0.002855"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:57:58.045551" elapsed="0.006572"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:57:58.052179" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T00:57:58.052358" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:57:58.042901" elapsed="0.009490"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:58.042306" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:58.052708" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:58.052497" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:58.042265" elapsed="0.010539"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:58.053898" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-lin...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:58.053095" elapsed="0.000853"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:57:58.054042" 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/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-10-11T00:57:58.034836" elapsed="0.019363"/>
</kw>
<msg time="2026-10-11T00:57:58.054266" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:58.024733" elapsed="0.029637"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:57:58.060319" 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/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-10-11T00:57:58.066289" 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//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-10-11T00:57:58.072211" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:58.072426" 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-10-11T00:57:58.072616" 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-10-11T00:57:58.072954" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:58.072806" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:58.072792" 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-10-11T00:57:58.073200" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:58.073380" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:58.073561" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:57:58.072768" elapsed="0.000840"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:57:58.072681" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:58.073785" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:58.073850" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:57:58.073961" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-lin...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T00:57:58.023310" elapsed="0.050676"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:58.075114" 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-10-11T00:57:58.074913" elapsed="0.000260">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-10-11T00:57:58.075256" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:58.074586" elapsed="0.000693"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:58.075615" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:58.075341" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:58.076150" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:58.075865" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:58.075690" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:58.075324" elapsed="0.000903"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:58.076741" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:58.076391" elapsed="0.000374"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:57:58.076809" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:58.076932" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:57:58.074267" elapsed="0.002687"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:58.078056" 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-10-11T00:57:58.077858" elapsed="0.000257">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-10-11T00:57:58.078199" 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-10-11T00:57:58.077536" elapsed="0.000685"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:57:58.078561" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:57:58.078456" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:58.078266" elapsed="0.000372"/>
</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-10-11T00:57:58.078795" elapsed="0.000020"/>
</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-10-11T00:57:58.078973" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:57:58.079046" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:57:58.079172" 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-10-11T00:57:58.077218" elapsed="0.001976"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:58.080455" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:58.080219" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:58.080906" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:58.080692" elapsed="0.000253"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:57:58.089062" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i95srcw30m6z17a2l147cl1kz17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:58.089177" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:58.089263" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:58.081246" elapsed="0.008361">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:58.081003" elapsed="0.008677">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:58.089912" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:58.089738" elapsed="0.000298"/>
</branch>
<status status="FAIL" start="2026-10-11T00:57:58.080987" elapsed="0.009088">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:58.090576" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:58.090741" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:58.090694" elapsed="0.000098"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:58.090672" elapsed="0.000147"/>
</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-10-11T00:57:58.091063" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:57:58.091154" 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-10-11T00:57:58.079487" elapsed="0.011797">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:58.091374" elapsed="0.000020"/>
</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-10-11T00:57:58.006338" elapsed="0.085176">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:58.091852" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:58.091626" elapsed="0.000319"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:58.091605" elapsed="0.000370"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:58.092031" 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-10-11T00:57:58.004875" elapsed="0.087277">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:59.129618" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:57:59.128887" elapsed="0.000791"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:59.131237" 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-10-11T00:57:59.130816" elapsed="0.000554">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-10-11T00:57:59.131591" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:59.130065" elapsed="0.001575"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:59.132759" 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-10-11T00:57:59.132050" elapsed="0.000765"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:57:59.133487" 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-10-11T00:57:59.133873" 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-10-11T00:57:59.133220" elapsed="0.000711"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:59.134909" 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-10-11T00:57:59.134392" elapsed="0.000633"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:59.137034" level="INFO">mapping: {'IP': '10.30.171.7', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:59.136565" elapsed="0.000528"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:57:59.137707" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:57:59.137340" elapsed="0.000401"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:59.138596" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:57:59.138196" elapsed="0.000434"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:59.139781" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:57:59.139321" elapsed="0.000494"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:59.139879" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T00:57:59.140072" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:57:59.138872" 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-10-11T00:57:59.140338" elapsed="0.000260"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:57:59.137992" elapsed="0.002658"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:57:59.141363" 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-10-11T00:57:59.140975" elapsed="0.000422"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:57:59.142558" 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-10-11T00:57:59.142117" elapsed="0.000476"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:57:59.142654" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:57:59.142827" 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-10-11T00:57:59.141670" elapsed="0.001189"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:57:59.143109" elapsed="0.000230"/>
</kw>
<var name="${key}">ROUTE_KEY</var>
<var name="${value}">AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</var>
<status status="PASS" start="2026-10-11T00:57:59.140789" elapsed="0.002602"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:57:59.137801" elapsed="0.005664"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:57:59.143519" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T00:57:59.143696" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:57:59.135751" elapsed="0.007979"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:59.135164" elapsed="0.008606"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:59.144028" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:59.143801" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:59.135125" elapsed="0.009000"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:57:59.145305" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-lin...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:57:59.144349" elapsed="0.000994"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:57:59.145405" elapsed="0.000069"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:57:59.127715" elapsed="0.017862"/>
</kw>
<msg time="2026-10-11T00:57:59.145646" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:57:59.117647" elapsed="0.028103"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:57:59.151645" 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//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-10-11T00:57:59.157525" 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//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-10-11T00:57:59.163291" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:59.163488" 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-10-11T00:57:59.163675" 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-10-11T00:57:59.164027" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:59.163867" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:59.163853" 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-10-11T00:57:59.164258" 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-10-11T00:57:59.164454" 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-10-11T00:57:59.164624" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:57:59.163828" elapsed="0.000843"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:57:59.163740" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:59.164865" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:59.164936" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:57:59.165057" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-lin...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T00:57:59.116229" elapsed="0.048854"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:59.166193" 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-10-11T00:57:59.166007" elapsed="0.000245">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-10-11T00:57:59.166335" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:57:59.165667" elapsed="0.000690"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:57:59.166690" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:59.166436" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:57:59.167218" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:57:59.166941" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T00:57:59.166764" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:59.166418" elapsed="0.000876"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:57:59.167806" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:57:59.167472" elapsed="0.000358"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:57:59.167875" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:57:59.168008" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:57:59.165347" elapsed="0.002685"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:57:59.169227" 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-10-11T00:57:59.168920" elapsed="0.000366">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-10-11T00:57:59.169370" 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-10-11T00:57:59.168598" elapsed="0.000794"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:57:59.169572" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:57:59.169473" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-11T00:57:59.169456" elapsed="0.000192"/>
</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-10-11T00:57:59.169804" elapsed="0.000019"/>
</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-10-11T00:57:59.169980" elapsed="0.000029"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:57:59.170050" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:57:59.170173" 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-10-11T00:57:59.168282" elapsed="0.001914"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:59.171425" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:59.171190" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:57:59.171875" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:57:59.171662" elapsed="0.000253"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:57:59.179206" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i95srcw30m6z17a2l147cl1kz17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:57:59.179349" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:59.179481" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:59.172215" elapsed="0.007620">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:59.171974" elapsed="0.007940">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:59.180179" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:59.179984" elapsed="0.000255"/>
</branch>
<status status="FAIL" start="2026-10-11T00:57:59.171957" elapsed="0.008304">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:59.180642" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:59.180767" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:57:59.180731" elapsed="0.000075"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:59.180714" elapsed="0.000112"/>
</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-10-11T00:57:59.181027" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:57:59.181116" elapsed="0.000019"/>
</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-10-11T00:57:59.170485" elapsed="0.010763">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:59.181341" elapsed="0.000020"/>
</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-10-11T00:57:59.096958" elapsed="0.084522">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:59.181829" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:57:59.181597" elapsed="0.000320"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:57:59.181575" elapsed="0.000371"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:57:59.181988" elapsed="0.000035"/>
</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-10-11T00:57:59.095544" elapsed="0.086582">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:58:00.220191" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:00.219390" elapsed="0.000869"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:00.222014" 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-10-11T00:58:00.221519" elapsed="0.000648">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-10-11T00:58:00.222373" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:00.220686" elapsed="0.001774"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:00.223702" 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-10-11T00:58:00.222890" elapsed="0.000872"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:00.224509" 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-10-11T00:58:00.224936" 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-10-11T00:58:00.224203" elapsed="0.000815"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:00.226096" 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-10-11T00:58:00.225533" elapsed="0.000678"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:00.228943" level="INFO">mapping: {'IP': '10.30.171.7', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:00.228345" elapsed="0.000725"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:58:00.230172" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:58:00.229539" elapsed="0.000691"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:00.231401" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:58:00.231002" elapsed="0.000458"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:00.232658" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:58:00.232163" elapsed="0.000530"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:00.232758" elapsed="0.000047"/>
</return>
<msg time="2026-10-11T00:58:00.232946" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:58:00.231707" 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-10-11T00:58:00.233238" elapsed="0.000277"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:58:00.230723" elapsed="0.002843"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:00.234285" 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-10-11T00:58:00.233894" elapsed="0.000426"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:00.235491" 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-10-11T00:58:00.235046" elapsed="0.000480"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:00.235587" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:58:00.235760" 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-10-11T00:58:00.234592" elapsed="0.001200"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:00.236042" elapsed="0.000233"/>
</kw>
<var name="${key}">ROUTE_KEY</var>
<var name="${value}">AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</var>
<status status="PASS" start="2026-10-11T00:58:00.233707" elapsed="0.002619"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:58:00.230342" elapsed="0.006028"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:58:00.236452" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T00:58:00.236633" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:58:00.227052" elapsed="0.009615"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:00.226370" elapsed="0.010337"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:00.236953" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:00.236739" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:00.226322" elapsed="0.010745"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:00.238066" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-lin...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:00.237298" elapsed="0.000806"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:00.238165" 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//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-10-11T00:58:00.218114" elapsed="0.020188"/>
</kw>
<msg time="2026-10-11T00:58:00.238371" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:00.207107" elapsed="0.031459"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:58:00.244943" 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//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-10-11T00:58:00.251272" 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//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-10-11T00:58:00.257227" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:00.257505" 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-10-11T00:58:00.257766" 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-10-11T00:58:00.258266" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:00.258053" elapsed="0.000284"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:00.258034" elapsed="0.000333"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:00.258613" 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-10-11T00:58:00.258870" 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-10-11T00:58:00.259118" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:58:00.257981" elapsed="0.001204"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:58:00.257857" elapsed="0.001361"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:00.259454" elapsed="0.000027"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:00.259548" elapsed="0.000020"/>
</return>
<msg time="2026-10-11T00:58:00.259704" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-lin...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T00:58:00.205547" elapsed="0.054192"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:00.261320" 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-10-11T00:58:00.261057" elapsed="0.000346">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-10-11T00:58:00.261544" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:00.260583" elapsed="0.000993"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:00.262038" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:00.261664" elapsed="0.000448"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:00.263056" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:00.262398" elapsed="0.000693"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:00.262144" elapsed="0.000994"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:00.261640" elapsed="0.001526"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:00.263894" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:00.263397" elapsed="0.000531"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:58:00.264008" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:58:00.264186" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:58:00.260131" elapsed="0.004086"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:00.265776" 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-10-11T00:58:00.265519" elapsed="0.000338">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-10-11T00:58:00.265975" 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-10-11T00:58:00.265044" elapsed="0.000980"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:58:00.266251" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-10-11T00:58:00.266114" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:00.266091" 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-10-11T00:58:00.266600" 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-10-11T00:58:00.266850" elapsed="0.000025"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:58:00.266931" elapsed="0.000019"/>
</return>
<msg time="2026-10-11T00:58:00.267118" 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-10-11T00:58:00.264597" elapsed="0.002554"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:00.268884" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:58:00.268569" elapsed="0.000384"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:00.269611" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:00.269287" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:00.277828" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i95srcw30m6z17a2l147cl1kz17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:00.278023" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:58:00.278148" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:58:00.270089" elapsed="0.008554">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:58:00.269750" elapsed="0.008998">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:58:00.279090" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:00.278831" elapsed="0.000351"/>
</branch>
<status status="FAIL" start="2026-10-11T00:58:00.269726" elapsed="0.009489">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:58:00.279725" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:00.279893" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:00.279846" elapsed="0.000101"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:00.279823" elapsed="0.000154"/>
</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-10-11T00:58:00.280217" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:58:00.280305" elapsed="0.000019"/>
</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-10-11T00:58:00.267561" elapsed="0.012895">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:58:00.280550" 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-10-11T00:58:00.187401" elapsed="0.093270">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:58:00.281030" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:00.280787" elapsed="0.000333"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:00.280765" elapsed="0.000386"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:00.281192" elapsed="0.000019"/>
</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-10-11T00:58:00.185727" elapsed="0.095586">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:58:01.317395" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:01.316685" elapsed="0.000801"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:01.319053" 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-10-11T00:58:01.318621" elapsed="0.000570">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-10-11T00:58:01.319381" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:01.317846" elapsed="0.001615"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:01.320591" 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-10-11T00:58:01.319851" elapsed="0.000796"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:01.321295" 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-10-11T00:58:01.321676" 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-10-11T00:58:01.321049" elapsed="0.000683"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:01.322718" 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-10-11T00:58:01.322194" elapsed="0.000619"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:01.324948" level="INFO">mapping: {'IP': '10.30.171.7', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:01.324438" elapsed="0.000626"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:58:01.326076" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:58:01.325489" elapsed="0.000642"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:01.327360" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:58:01.326869" elapsed="0.000526"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:01.328583" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:58:01.328111" elapsed="0.000507"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:01.328681" elapsed="0.000044"/>
</return>
<msg time="2026-10-11T00:58:01.328863" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:58:01.327658" elapsed="0.001237"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:01.329149" elapsed="0.000243"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:58:01.326570" elapsed="0.002895"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:01.330378" 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-10-11T00:58:01.329792" elapsed="0.000650"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:01.331653" 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-10-11T00:58:01.331151" elapsed="0.000539"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:01.331754" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:58:01.331930" 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-10-11T00:58:01.330686" elapsed="0.001276"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:01.332214" elapsed="0.000263"/>
</kw>
<var name="${key}">ROUTE_KEY</var>
<var name="${value}">AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</var>
<status status="PASS" start="2026-10-11T00:58:01.329607" elapsed="0.002923"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:58:01.326229" elapsed="0.006345"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:58:01.332626" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T00:58:01.332805" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:58:01.323617" elapsed="0.009221"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:01.322950" elapsed="0.009927"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:01.333141" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:01.332909" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:01.322911" elapsed="0.010328"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:01.334242" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-lin...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:01.333487" elapsed="0.000793"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:01.334340" 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/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-10-11T00:58:01.315503" elapsed="0.019009"/>
</kw>
<msg time="2026-10-11T00:58:01.334581" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:01.305263" elapsed="0.029423"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:58:01.340771" 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/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-10-11T00:58:01.346993" 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/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-10-11T00:58:01.352885" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:01.353160" 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-10-11T00:58:01.353436" 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-10-11T00:58:01.353915" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:01.353707" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:01.353688" elapsed="0.000346"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:01.354256" 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-10-11T00:58:01.354531" 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-10-11T00:58:01.354766" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:58:01.353653" elapsed="0.001178"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:58:01.353529" elapsed="0.001335"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:01.355092" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:01.355185" elapsed="0.000020"/>
</return>
<msg time="2026-10-11T00:58:01.355341" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-lin...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T00:58:01.303855" elapsed="0.051521"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:01.357002" 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-10-11T00:58:01.356724" 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-10-11T00:58:01.357204" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:01.356239" elapsed="0.000997"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:01.357707" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:01.357323" elapsed="0.000458"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:01.358469" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:01.358077" elapsed="0.000427"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:01.357812" elapsed="0.000737"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:01.357300" elapsed="0.001277"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:01.359294" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:01.358805" elapsed="0.000523"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:58:01.359391" elapsed="0.000059"/>
</return>
<msg time="2026-10-11T00:58:01.359588" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:58:01.355773" elapsed="0.003846"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:01.361160" 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-10-11T00:58:01.360885" elapsed="0.000358">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-10-11T00:58:01.361361" 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-10-11T00:58:01.360433" elapsed="0.000959"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:58:01.361880" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-10-11T00:58:01.361734" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:01.361479" elapsed="0.000528"/>
</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-10-11T00:58:01.362230" 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-10-11T00:58:01.362525" elapsed="0.000028"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:58:01.362610" elapsed="0.000020"/>
</return>
<msg time="2026-10-11T00:58:01.362786" 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-10-11T00:58:01.359970" elapsed="0.002848"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:01.364573" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:58:01.364237" elapsed="0.000396"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:01.365228" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:01.364903" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:01.374583" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i95srcw30m6z17a2l147cl1kz17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:01.374749" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:58:01.374871" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:58:01.365710" elapsed="0.009630">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:58:01.365366" elapsed="0.010099">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:58:01.375772" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:01.375549" elapsed="0.000305"/>
</branch>
<status status="FAIL" start="2026-10-11T00:58:01.365343" elapsed="0.010541">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:58:01.376373" elapsed="0.000051"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:01.376564" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:01.376516" elapsed="0.000102"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:01.376493" elapsed="0.000153"/>
</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-10-11T00:58:01.376846" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:58:01.376934" elapsed="0.000019"/>
</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-10-11T00:58:01.363225" elapsed="0.013863">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:58:01.377181" elapsed="0.000020"/>
</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-10-11T00:58:01.286747" elapsed="0.090555">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:58:01.377669" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:01.377438" elapsed="0.000320"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:01.377396" elapsed="0.000392"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:01.377830" elapsed="0.000018"/>
</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-10-11T00:58:01.285259" elapsed="0.092692">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:58:02.413756" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:02.413047" elapsed="0.000770"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:02.415447" 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-10-11T00:58:02.415025" elapsed="0.000562">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-10-11T00:58:02.415776" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:02.414254" elapsed="0.001572"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:02.416953" 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-10-11T00:58:02.416239" elapsed="0.000793"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:02.417679" 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-10-11T00:58:02.418063" 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-10-11T00:58:02.417434" elapsed="0.000686"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:02.419139" 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-10-11T00:58:02.418591" elapsed="0.000644"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:02.421332" level="INFO">mapping: {'IP': '10.30.171.7', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:02.420793" elapsed="0.000659"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:58:02.422475" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:58:02.421852" elapsed="0.000678"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:02.423625" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:58:02.423233" elapsed="0.000427"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:02.424854" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:58:02.424427" elapsed="0.000462"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:02.424953" elapsed="0.000059"/>
</return>
<msg time="2026-10-11T00:58:02.425153" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:58:02.423904" elapsed="0.001281"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:02.425441" elapsed="0.000246"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:58:02.422942" elapsed="0.002795"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:02.426489" 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-10-11T00:58:02.426077" elapsed="0.000447"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:02.427652" 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-10-11T00:58:02.427216" elapsed="0.000470"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:02.427747" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:58:02.427919" 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-10-11T00:58:02.426764" elapsed="0.001186"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:02.428198" elapsed="0.000447"/>
</kw>
<var name="${key}">ROUTE_KEY</var>
<var name="${value}">AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA==</var>
<status status="PASS" start="2026-10-11T00:58:02.425876" elapsed="0.002822"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:58:02.422632" elapsed="0.006111"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:58:02.428797" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T00:58:02.428989" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', 'ROUTE_KEY': 'AAUAFQcAAAAAAAAAAQECAwQAAQABBQYHCA=='}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:58:02.420000" elapsed="0.009024"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:02.419377" elapsed="0.009687"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:02.429309" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:02.429095" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:02.419335" elapsed="0.010070"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:02.430405" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-lin...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:02.429653" elapsed="0.000827"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:02.430542" 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//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-10-11T00:58:02.411840" elapsed="0.018841"/>
</kw>
<msg time="2026-10-11T00:58:02.430749" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:02.401564" elapsed="0.029289"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:58:02.436838" 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/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-10-11T00:58:02.442835" 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//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-10-11T00:58:02.448718" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:02.448988" 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-10-11T00:58:02.449247" 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-10-11T00:58:02.449744" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:02.449536" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:02.449518" 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-10-11T00:58:02.450081" 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-10-11T00:58:02.450335" 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-10-11T00:58:02.450585" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:58:02.449481" elapsed="0.001170"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:58:02.449338" elapsed="0.001345"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:02.450896" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:02.451005" elapsed="0.000021"/>
</return>
<msg time="2026-10-11T00:58:02.451161" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-linkstate%3Alinkstate-address-family,bgp-linkstate%3Alinkstate-subsequent-address-family/bgp-lin...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T00:58:02.400128" elapsed="0.051067"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:02.452799" 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-10-11T00:58:02.452526" elapsed="0.000356">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-10-11T00:58:02.453015" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:02.452047" elapsed="0.001000"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:02.453521" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:02.453135" elapsed="0.000462"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:02.454268" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:02.453877" elapsed="0.000425"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:02.453628" elapsed="0.000719"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:02.453111" elapsed="0.001264"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:02.455113" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:02.454627" elapsed="0.000520"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:58:02.455210" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:58:02.455381" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:58:02.451589" elapsed="0.003845"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:02.456984" 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-10-11T00:58:02.456701" elapsed="0.000366">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-10-11T00:58:02.457187" 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-10-11T00:58:02.456227" elapsed="0.000992"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:58:02.457467" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-10-11T00:58:02.457306" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:02.457283" elapsed="0.000291"/>
</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-10-11T00:58:02.457792" 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-10-11T00:58:02.458056" elapsed="0.000027"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:58:02.458139" elapsed="0.000018"/>
</return>
<msg time="2026-10-11T00:58:02.458309" 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-10-11T00:58:02.455783" elapsed="0.002557"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:02.460329" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:58:02.459765" elapsed="0.000627"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:02.461020" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:02.460693" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:02.469675" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i95srcw30m6z17a2l147cl1kz17.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:02.469846" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:58:02.469986" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:58:02.461504" elapsed="0.008959">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:58:02.461160" elapsed="0.009408">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:58:02.470872" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:02.470650" elapsed="0.000303"/>
</branch>
<status status="FAIL" start="2026-10-11T00:58:02.461137" elapsed="0.009867">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:58:02.471487" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:02.471652" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:02.471606" elapsed="0.000097"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:02.471585" elapsed="0.000145"/>
</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-10-11T00:58:02.471926" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:58:02.472029" elapsed="0.000019"/>
</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-10-11T00:58:02.458757" elapsed="0.013402">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:58:02.472249" 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-10-11T00:58:02.382873" elapsed="0.089492">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:58:02.472729" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:02.472501" elapsed="0.000317"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:02.472479" elapsed="0.000369"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:02.472889" elapsed="0.000019"/>
</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-10-11T00:58:02.381431" elapsed="0.091593">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:58:02.473149" 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.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:57:51.474550" elapsed="10.998721">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.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:58:02.475010" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:02.474529" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:02.474505" elapsed="0.000617"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:02.475322" elapsed="0.000412"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:02.479031" 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-10-11T00:58:02.478465" elapsed="0.000604"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-10-11T00:58:02.479308" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:02.479162" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:02.479138" elapsed="0.000249"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:02.480048" 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-10-11T00:58:02.479639" elapsed="0.000444"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:02.480720" 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-10-11T00:58:02.480317" elapsed="0.000439"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-10-11T00:58:02.481204" 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-10-11T00:58:02.480996" elapsed="0.000243"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:02.481873" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:02.481476" elapsed="0.000433"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:02.482545" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:02.482145" elapsed="0.000436"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-10-11T00:58:02.483289" 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.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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 of the current test case.</doc>
<status status="PASS" start="2026-10-11T00:58:02.482804" elapsed="0.000554"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:02.483998" 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-10-11T00:58:02.483649" elapsed="0.000417"/>
</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-10-11T00:58:02.478010" elapsed="0.006126"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:02.474231" elapsed="0.009969"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-10-11T00:58:02.473711" elapsed="0.010542"/>
</kw>
<doc>Check RIB for linkstate-route(s) and check all of their attributes.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-10-11T00:57:51.377443" elapsed="11.106859">... 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.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T00:58:02.486613" elapsed="0.000276"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:58:02.486239" elapsed="0.000736"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:02.488266" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:02.488145" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:02.488121" 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-10-11T00:58:02.490686" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:02.490603" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:02.490586" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:02.491713" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:02.491368" elapsed="0.000371"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:58:02.492169" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:58:02.491894" elapsed="0.000299"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:58:02.492233" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:58:02.492359" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:58:02.491008" elapsed="0.001374"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:02.494922" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:02.494838" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:02.494821" elapsed="0.000178"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:02.496066" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:02.495950" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:02.495933" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:02.496475" 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-10-11T00:58:02.496279" elapsed="0.000221"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:02.496810" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:02.496668" elapsed="0.000165"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:58:02.531573" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:58:02.497337" elapsed="0.035550"/>
</kw>
<msg time="2026-10-11T00:58:02.533056" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:58:02.533099" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:02.497005" elapsed="0.036129"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:58:02.560193" 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-10-11T00:58:02.533693" elapsed="0.026594"/>
</kw>
<msg time="2026-10-11T00:58:02.560457" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:58:02.560499" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:02.533304" elapsed="0.027230"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:02.560817" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:02.560603" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:02.560585" elapsed="0.000304"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:02.561316" 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-10-11T00:58:02.561090" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:02.561677" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:02.561474" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:02.561457" elapsed="0.000291"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:58:02.561778" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:02.564266" elapsed="0.000117"/>
</kw>
<msg time="2026-10-11T00:58:02.564483" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:02.563176" elapsed="0.001439"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:02.564974" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:02.565385" 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-10-11T00:58:02.562583" elapsed="0.003014"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:58:02.562096" elapsed="0.003560"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:58:02.495695" elapsed="0.070035"/>
</kw>
<msg time="2026-10-11T00:58:02.565810" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:02.565850" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:02.495152" elapsed="0.070733"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:58:02.566054" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:58:02.565954" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:02.565937" elapsed="0.000193"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:02.566497" 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-10-11T00:58:02.566804" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:58:02.566868" 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-10-11T00:58:02.494555" elapsed="0.072397"/>
</kw>
<msg time="2026-10-11T00:58:02.567056" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:02.567096" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:02.492728" elapsed="0.074403"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:02.567496" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:02.567199" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:02.567183" elapsed="0.000387"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:58:02.492584" elapsed="0.075007"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:58:02.492446" elapsed="0.075171"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:58:02.490298" elapsed="0.077366"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:58:02.487771" elapsed="0.079942"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:02.487194" elapsed="0.080558"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:58:02.485495" elapsed="0.082303"/>
</kw>
<kw name="Stop_Console_Tool" owner="BGPcliKeywords">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:02.568901" 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-10-11T00:58:02.568608" elapsed="0.000319"/>
</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-10-11T00:58:02.569102" elapsed="0.000188"/>
</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-10-11T00:58:02.568313" elapsed="0.001042"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<msg time="2026-10-11T00:58:04.570230" level="INFO">^C
[?2004h[jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T00:58:04.570501" level="INFO">${output} = ^C
[?2004h[jenkins@releng-26932-423-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-10-11T00:58:02.569529" elapsed="2.001034"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.571638" level="INFO">^C
[?2004h[jenkins@releng-26932-423-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-10-11T00:58:04.571061" elapsed="0.000676"/>
</kw>
<doc>Stop the tool if still running.</doc>
<status status="PASS" start="2026-10-11T00:58:02.568009" elapsed="2.003848"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:04.634725" level="INFO">Executing command 'cat bgp_peer.log'.</msg>
<msg time="2026-10-11T00:58:04.648482" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:58:04.648620" level="INFO">${output_log} = 2026-10-11 00:57:41,462 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:57:41,463 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 00:57:41,463 DEBUG BGP-Threa...</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-10-11T00:58:04.634534" elapsed="0.014122"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.649651" level="INFO">2026-10-11 00:57:41,462 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:57:41,463 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 00:57:41,463 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 00:57:41,463 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 00:57:41,463 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 00:57:41,464 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:57:41,466 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:57:41,467 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400020001010440040047400200b44700
2026-10-11 00:57:41,467 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:57:41,467 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 1
2026-10-11 00:57:41,467 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-10-11 00:57:41,467 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 00:57:41,467 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 00:57:41,467 INFO BGP-Thread-1 (job):   My BGP Identifier: 169782023
2026-10-11 00:57:41,467 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 00:57:41,467 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 00:57:41,467 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 00:57:41,467 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 00:57:41,467 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 00:57:41,468 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 00:57:41,468 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 1
2026-10-11 00:57:41,468 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, 0]
2026-10-11 00:57:41,468 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 00:57:41,468 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 00:57:41,468 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 00:57:41,468 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:57:41,468 DEBUG BGP-Thread-1 (job):   Length=53 (0x0035)
2026-10-11 00:57:41,468 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 00:57:41,468 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 00:57:41,468 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-10-11 00:57:41,468 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 00:57:41,468 DEBUG BGP-Thread-1 (job):   BGP Identifier=169782023 (0x0a1eab07)
2026-10-11 00:57:41,468 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=24 (0x18)
2026-10-11 00:57:41,468 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x02060104000100010206010440040047020641040000fbf0
2026-10-11 00:57:41,468 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff00350104fbf000b40a1eab071802060104000100010206010440040047020641040000fbf0'
2026-10-11 00:57:41,469 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff00350104fbf000b40a1eab071802060104000100010206010440040047020641040000fbf0
2026-10-11 00:57:41,470 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:57:41,470 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:57:41,471 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:57:41,471 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:57:41,471 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:57:41,471 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:57:41,471 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:57:41,471 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:57:41,471 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:57:41,471 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:57:41,471 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 00:57:41,471 INFO BGP-Thread-1 (job): Iteration: 0 - total remaining prefixes: 1
2026-10-11 00:57:41,471 DEBUG BGP-Thread-1 (job): ########## Iteration: 0 ##########
2026-10-11 00:57:41,472 DEBUG BGP-Thread-1 (job): Remaining prefixes: 1
2026-10-11 00:57:41,472 DEBUG BGP-Thread-1 (job): --- COMBINED SCENARIO ---
2026-10-11 00:57:41,472 DEBUG BGP-Thread-1 (job): Prefixes to be inserted in this iteration:
2026-10-11 00:57:41,472 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-10-11 00:57:41,472 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:57:41,472 DEBUG BGP-Thread-1 (job):   Prefix count: 1
2026-10-11 00:57:41,472 DEBUG BGP-Thread-1 (job):   Prefix indexes: [0]
2026-10-11 00:57:41,472 DEBUG BGP-Thread-1 (job):   Prefix list: [IPv4Address('8.0.1.0')]
2026-10-11 00:57:41,472 DEBUG BGP-Thread-1 (job): Prefixes to be withdrawn in this iteration:
2026-10-11 00:57:41,472 DEBUG BGP-Thread-1 (job):   Prefix slot index: 0
2026-10-11 00:57:41,472 DEBUG BGP-Thread-1 (job):   Prefix slot size: 1
2026-10-11 00:57:41,472 DEBUG BGP-Thread-1 (job):   Prefix count: 0
2026-10-11 00:57:41,472 DEBUG BGP-Thread-1 (job):   Prefix indexes: []
2026-10-11 00:57:41,472 DEBUG BGP-Thread-1 (job):   Prefix list: []
2026-10-11 00:57:41,473 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:57:41,473 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:57:41,473 DEBUG BGP-Thread-1 (job):   Length=80 (0x0050)
2026-10-11 00:57:41,473 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:57:41,473 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:57:41,473 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:57:41,473 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=57 (0x0039)
2026-10-11 00:57:41,473 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064800e2240044704c00002010000050015070000000000000001010203040001000105060708)
2026-10-11 00:57:41,473 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:57:41,473 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:57:41,473 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:57:41,473 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-10-11 00:57:41,473 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-10-11 00:57:41,473 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff005002000000394001010040020602010000fbf040050400000064800e2240044704c00002010000050015070000000000000001010203040001000105060708
2026-10-11 00:57:41,474 INFO BGP-Thread-1 (job): All update messages generated.
2026-10-11 00:57:41,474 INFO BGP-Thread-1 (job): Storing performance results.
2026-10-11 00:57:41,474 INFO BGP-Thread-1 (job): ########## Final results ##########
2026-10-11 00:57:41,474 INFO BGP-Thread-1 (job): Number of iterations: 1
2026-10-11 00:57:41,474 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the pre-fill phase: 0
2026-10-11 00:57:41,474 INFO BGP-Thread-1 (job): The pre-fill phase duration: 0s
2026-10-11 00:57:41,474 INFO BGP-Thread-1 (job): Number of UPDATE messages sent in the 2nd test phase: 1
2026-10-11 00:57:41,474 INFO BGP-Thread-1 (job): The 2nd test phase duration: 0.001847982406616211s
2026-10-11 00:57:41,474 INFO BGP-Thread-1 (job): Threshold for performance reporting: 1000
2026-10-11 00:57:41,474 INFO BGP-Thread-1 (job): Message generator performance results stored in totals-bgp.csv:
2026-10-11 00:57:41,474 INFO BGP-Thread-1 (job):   
2026-10-11 00:57:41,474 INFO BGP-Thread-1 (job):   
2026-10-11 00:57:41,475 INFO BGP-Thread-1 (job): Message generator performance results stored in performance-bgp.csv:
2026-10-11 00:57:41,475 INFO BGP-Thread-1 (job):   
2026-10-11 00:57:41,475 INFO BGP-Thread-1 (job):   
2026-10-11 00:57:41,475 INFO BGP-Thread-1 (job): Finally an END-OF-RIB is sent.
2026-10-11 00:57:41,475 DEBUG BGP-Thread-1 (job): UPDATE message encoding
2026-10-11 00:57:41,475 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:57:41,475 DEBUG BGP-Thread-1 (job):   Length=43 (0x002b)
2026-10-11 00:57:41,475 DEBUG BGP-Thread-1 (job):   Type=2 (0x02)
2026-10-11 00:57:41,475 DEBUG BGP-Thread-1 (job):   withdrawn_routes_length=0 (0x0000)
2026-10-11 00:57:41,475 DEBUG BGP-Thread-1 (job):   Withdrawn_Routes=[]/28 (0x)
2026-10-11 00:57:41,475 DEBUG BGP-Thread-1 (job):   Total Path Attributes Length=20 (0x0014)
2026-10-11 00:57:41,475 DEBUG BGP-Thread-1 (job):   Path Attributes=(0x4001010040020602010000fbf040050400000064)
2026-10-11 00:57:41,476 DEBUG BGP-Thread-1 (job):     Origin=IGP
2026-10-11 00:57:41,476 DEBUG BGP-Thread-1 (job):     AS path=64496
2026-10-11 00:57:41,476 DEBUG BGP-Thread-1 (job):     Next hop=192.0.2.1
2026-10-11 00:57:41,476 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-10-11 00:57:41,476 DEBUG BGP-Thread-1 (job):   Network Layer Reachability Information=[]/28 (0x)
2026-10-11 00:57:41,476 DEBUG BGP-Thread-1 (job): UPDATE message encoded: 0xffffffffffffffffffffffffffffffff002b02000000144001010040020602010000fbf040050400000064
2026-10-11 00:57:41,476 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:57:41,476 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:57:41,476 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:57:41,478 INFO BGP-Thread-1 (job): ... idle for 0.002s
2026-10-11 00:57:41,478 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.002s
2026-10-11 00:57:41,478 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03400447
2026-10-11 00:57:41,479 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:57:41,479 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:57:41,479 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 00:57:41,479 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:57:41,479 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:57:41,479 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:57:41,479 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:57:41,479 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:57:41,479 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:57:41,479 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:57:41,479 DEBUG BGP-Thread-1 (job): Allf False
2026-10-11 00:57:41,479 DEBUG BGP-Thread-1 (job): Message type: 0xb'02' (update)
2026-10-11 00:57:41,479 DEBUG BGP-Thread-1 (job): Withdrawn routes lenght: 0xb'0000' (0)
2026-10-11 00:57:41,479 DEBUG BGP-Thread-1 (job): Withdrawn routes: 0xb''
2026-10-11 00:57:41,480 DEBUG BGP-Thread-1 (job): Withdrawn routes prefix list: []
2026-10-11 00:57:41,480 DEBUG BGP-Thread-1 (job): Total path attribute lenght: 0xb'0006' (6)
2026-10-11 00:57:41,480 DEBUG BGP-Thread-1 (job): Path attributes: 0xb'800f03400447'
2026-10-11 00:57:41,480 DEBUG BGP-Thread-1 (job): Attribute type=15 (MP_UNREACH_NLRI, flags:0xb'80')
2026-10-11 00:57:41,480 DEBUG BGP-Thread-1 (job): Attribute value=0xb'400447'
2026-10-11 00:57:41,480 DEBUG BGP-Thread-1 (job):   Address Family Identifier=0xb'4004'
2026-10-11 00:57:41,480 DEBUG BGP-Thread-1 (job):   Subsequent Address Family Identifier=0xb'47'
2026-10-11 00:57:41,480 DEBUG BGP-Thread-1 (job):   Withdrawn Routes=0xb''
2026-10-11 00:57:41,480 DEBUG BGP-Thread-1 (job):   Withdrawn routes prefix list: []
2026-10-11 00:57:41,480 DEBUG BGP-Thread-1 (job): Calculated NLRI length: 0
2026-10-11 00:57:41,480 DEBUG BGP-Thread-1 (job): NLRI: 0xb''
2026-10-11 00:57:41,480 DEBUG BGP-Thread-1 (job): NLRI prefix list: []
2026-10-11 00:57:41,485 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-10-11T00:58:04.649052" elapsed="0.001025"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:04.651154" 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-10-11T00:58:04.650539" elapsed="0.000730"/>
</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-10-11T00:58:04.633811" elapsed="0.017585"/>
</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-10-11T00:58:04.654122" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:04.653287" elapsed="0.000961"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:04.653246" elapsed="0.001055"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:04.654660" elapsed="0.000652"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.660032" 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-10-11T00:58:04.659496" elapsed="0.000574"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-10-11T00:58:04.660315" elapsed="0.000047"/>
</return>
<status status="PASS" start="2026-10-11T00:58:04.660164" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:04.660140" elapsed="0.000324"/>
</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-10-11T00:58:04.660700" elapsed="0.000027"/>
</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-10-11T00:58:04.660972" elapsed="0.000027"/>
</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-10-11T00:58:04.661217" elapsed="0.000027"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:04.661474" elapsed="0.000027"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:04.661712" elapsed="0.000026"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message of the current test case.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:04.661965" elapsed="0.000027"/>
</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-10-11T00:58:04.662251" elapsed="0.000026"/>
</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-10-11T00:58:04.658906" elapsed="0.003445"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:04.652821" elapsed="0.009612"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-10-11T00:58:04.652021" elapsed="0.010468"/>
</kw>
<doc>Stop BGP peer &amp; store logs</doc>
<tag>critical</tag>
<status status="PASS" start="2026-10-11T00:58:02.484786" elapsed="2.177749"/>
</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-10-11T00:58:04.664638" elapsed="0.000282"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:58:04.664247" elapsed="0.000760"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:04.666562" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:04.666436" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:04.666391" 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-10-11T00:58:04.669592" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:04.669391" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:04.669368" elapsed="0.000312"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.670992" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:04.670520" elapsed="0.000508"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.671638" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:58:04.671248" elapsed="0.000423"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:58:04.671773" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:58:04.671971" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:58:04.669992" elapsed="0.002012"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:04.675705" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:04.675587" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:04.675561" elapsed="0.000232"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:04.677314" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:04.677197" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:04.677174" elapsed="0.000226"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:04.677890" 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-10-11T00:58:04.677649" elapsed="0.000274"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:04.678366" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:04.678171" elapsed="0.000227"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:58:04.714005" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:58:04.679129" elapsed="0.034970"/>
</kw>
<msg time="2026-10-11T00:58:04.714249" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:58:04.714289" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:04.678646" elapsed="0.035697"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:58:04.743855" 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-10-11T00:58:04.714900" elapsed="0.029086"/>
</kw>
<msg time="2026-10-11T00:58:04.744136" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:58:04.744176" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:04.714552" elapsed="0.029659"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:04.744515" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:04.744279" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:04.744261" elapsed="0.000327"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.745012" 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-10-11T00:58:04.744772" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:04.745340" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:04.745137" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:04.745121" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:58:04.745459" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:04.748077" elapsed="0.000117"/>
</kw>
<msg time="2026-10-11T00:58:04.748252" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:04.746978" 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-10-11T00:58:04.748711" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:04.749066" 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-10-11T00:58:04.746341" 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-10-11T00:58:04.745744" elapsed="0.003567"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:58:04.676814" elapsed="0.072629"/>
</kw>
<msg time="2026-10-11T00:58:04.749526" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:04.749566" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:04.676027" elapsed="0.073574"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:58:04.749753" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:58:04.749668" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:04.749651" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:04.750164" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:04.750495" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:58:04.750560" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:58:04.675166" elapsed="0.075477"/>
</kw>
<msg time="2026-10-11T00:58:04.750725" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:04.750764" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:04.672505" elapsed="0.078294"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:04.751126" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:04.750865" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:04.750849" elapsed="0.000348"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:58:04.672277" elapsed="0.078942"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:58:04.672076" elapsed="0.079172"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:58:04.668977" elapsed="0.082320"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:58:04.665795" elapsed="0.085551"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:04.665222" elapsed="0.086164"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:58:04.663740" elapsed="0.087714"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.752129" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.171.7 | 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-10-11T00:58:04.751641" elapsed="0.000514"/>
</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-10-11T00:58:04.765803" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:04.765503" elapsed="0.000325"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:04.766532" 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-10-11T00:58:04.766322" elapsed="0.000287">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-10-11T00:58:04.766695" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:04.766001" elapsed="0.000716"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.767218" 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-10-11T00:58:04.766891" elapsed="0.000352"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:04.767538" 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-10-11T00:58:04.767699" 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-10-11T00:58:04.767426" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.768153" 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-10-11T00:58:04.767919" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.769284" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', '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-10-11T00:58:04.769048" elapsed="0.000279"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.769776" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:58:04.769523" elapsed="0.000277"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.770468" 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-10-11T00:58:04.770181" elapsed="0.000311"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:04.771189" 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-10-11T00:58:04.771001" elapsed="0.000212"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:04.771257" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:58:04.771382" 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-10-11T00:58:04.770669" elapsed="0.000750"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:04.771588" elapsed="0.000184"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T00:58:04.770040" elapsed="0.001769"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.772320" 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-10-11T00:58:04.772054" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:04.773046" 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-10-11T00:58:04.772840" elapsed="0.000231"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:04.773118" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:58:04.773241" 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-10-11T00:58:04.772531" elapsed="0.000732"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:04.773441" elapsed="0.000167"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-10-11T00:58:04.771908" elapsed="0.001736"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.774154" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:58:04.773872" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:04.774846" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:58:04.774672" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:04.774914" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:58:04.775049" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:58:04.774347" elapsed="0.000725"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:04.775237" elapsed="0.000165"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:58:04.773741" elapsed="0.001712"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.775961" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:58:04.775682" elapsed="0.000304"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:04.776660" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:58:04.776485" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:04.776727" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:58:04.776848" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:58:04.776162" elapsed="0.000709"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:04.777050" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:58:04.775552" elapsed="0.001730"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:58:04.769845" elapsed="0.007472"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:58:04.777355" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:58:04.777503" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:58:04.768529" elapsed="0.008998"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:04.768257" elapsed="0.009299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:04.777732" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:04.777579" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:04.768240" elapsed="0.009561"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.778548" 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-10-11T00:58:04.777974" elapsed="0.000602"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:04.778620" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:58:04.764986" elapsed="0.013734"/>
</kw>
<msg time="2026-10-11T00:58:04.778768" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:04.760567" elapsed="0.018243"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:58:04.783195" 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/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-10-11T00:58:04.787388" 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/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-10-11T00:58:04.791588" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:04.791772" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:04.791966" 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-10-11T00:58:04.792306" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:04.792158" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:04.792145" 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-10-11T00:58:04.792549" 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-10-11T00:58:04.792731" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:04.792896" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:58:04.792120" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:58:04.792034" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:04.793167" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:04.793234" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:58:04.793344" 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-10-11T00:58:04.759929" elapsed="0.033440"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.794381" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:04.794159" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:04.807296" level="INFO">DELETE Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i95srcw30m6z17a2l147cl1kz17.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:04.807341" level="INFO">DELETE Response : url=http://10.30.170.173: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.171.7 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:04.807454" 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-10-11T00:58:04.794733" elapsed="0.012748"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:04.794502" elapsed="0.013015"/>
</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-10-11T00:58:04.807694" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:04.807541" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:04.794486" elapsed="0.013282"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.808985" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:04.808699" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:04.808458" elapsed="0.000599"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:04.808441" elapsed="0.000637"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.809687" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:04.809363" elapsed="0.000366"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:04.809126" elapsed="0.000634"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:04.809112" elapsed="0.000670"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.810326" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:04.809978" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:04.810648" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:04.810431" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.811168" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:04.810887" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:04.810721" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:04.810397" elapsed="0.000847"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.811768" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:04.811436" elapsed="0.000356"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:04.812077" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:04.811854" elapsed="0.000275"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.812589" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:04.812313" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:04.812150" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:04.811838" elapsed="0.000859"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:04.812844" elapsed="0.000307"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:58:04.813555" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:04.813314" elapsed="0.000265"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:58:04.813736" elapsed="0.000228"/>
</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-10-11T00:58:04.808112" elapsed="0.005909"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:58:04.814062" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:58:04.814234" 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-10-11T00:58:04.793624" elapsed="0.020634"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:58:04.814305" elapsed="0.000024"/>
</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-10-11T00:58:04.752367" elapsed="0.062032"/>
</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-10-11T00:58:04.815697" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:04.815339" elapsed="0.000415"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:04.815188" elapsed="0.000588"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:04.815919" elapsed="0.000289"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.818527" 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-10-11T00:58:04.818156" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-10-11T00:58:04.818721" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:58:04.818618" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:04.818601" elapsed="0.000194"/>
</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-10-11T00:58:04.818996" elapsed="0.000021"/>
</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-10-11T00:58:04.819181" elapsed="0.000018"/>
</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-10-11T00:58:04.819350" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:04.819532" elapsed="0.000019"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:04.819701" elapsed="0.000018"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<arg>${msg}${newline}${bugs}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message of the current test case.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:04.819869" elapsed="0.000018"/>
</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-10-11T00:58:04.820085" 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-10-11T00:58:04.817796" elapsed="0.002359"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:04.815009" elapsed="0.005191"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-10-11T00:58:04.814661" elapsed="0.005575"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-10-11T00:58:04.662975" elapsed="0.157294"/>
</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-10-11T00:58:04.821753" level="INFO">Executing command 'ps -elf | egrep python | egrep 'play.py' | egrep -v grep'.</msg>
<msg time="2026-10-11T00:58:04.845233" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-10-11T00:58:04.845325" 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-10-11T00:58:04.821643" elapsed="0.023705"/>
</kw>
<return>
<value>${processes}</value>
<status status="PASS" start="2026-10-11T00:58:04.845391" elapsed="0.000048"/>
</return>
<msg time="2026-10-11T00:58:04.845540" 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-10-11T00:58:04.821317" elapsed="0.024246"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.846003" level="INFO"/>
<arg>${processes}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:04.845759" elapsed="0.000282"/>
</kw>
<kw name="Kill_Remote_Processes" owner="KillPythonTool">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.846794" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:58:04.846863" 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-10-11T00:58:04.846552" elapsed="0.000333"/>
</kw>
<if>
<branch type="IF" condition="${arg_length} == 0">
<return>
<status status="PASS" start="2026-10-11T00:58:04.847047" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:58:04.846959" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:04.846932" elapsed="0.000188"/>
</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-10-11T00:58:04.847305" elapsed="0.000020"/>
</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-10-11T00:58:04.847532" elapsed="0.000020"/>
</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-10-11T00:58:04.847735" elapsed="0.000019"/>
</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-10-11T00:58:04.846262" elapsed="0.001549"/>
</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-10-11T00:58:04.821071" elapsed="0.026787"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:04.848072" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects </doc>
<status status="PASS" start="2026-10-11T00:58:04.848005" elapsed="0.000140"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-10-11T00:58:04.848289" elapsed="0.000335"/>
</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-10-11T00:58:04.820812" elapsed="0.027863"/>
</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-10-11T00:57:15.316666" elapsed="49.532036"/>
</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-10-11T00:58:04.877199" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:58:04.875604" elapsed="0.001638"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-10-11T00:58:04.875352" elapsed="0.001945"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.879601" 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-10-11T00:58:04.878263" elapsed="0.001364"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-10-11T00:58:04.879774" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:04.879696" elapsed="0.000116"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:04.879678" elapsed="0.000154"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.880350" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:58:04.880029" elapsed="0.000361"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.880849" 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-10-11T00:58:04.880572" elapsed="0.000301"/>
</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-10-11T00:58:04.881454" elapsed="0.000250"/>
</kw>
<msg time="2026-10-11T00:58:04.881790" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:04.881831" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:04.881053" elapsed="0.000799"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.882362" 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-10-11T00:58:04.882051" elapsed="0.000336"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.883295" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:58:04.883008" elapsed="0.000313"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.883729" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:58:04.883485" elapsed="0.000268"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.884229" 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-10-11T00:58:04.883932" elapsed="0.000323"/>
</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-10-11T00:58:04.885128" elapsed="0.000156"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.885757" level="INFO">${member_ip} = 10.30.170.173</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:04.885478" elapsed="0.000304"/>
</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-10-11T00:58:04.885978" elapsed="0.000322"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.887047" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:04.886769" elapsed="0.000308"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-11T00:58:04.887118" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:58:04.887245" 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-10-11T00:58:04.886500" elapsed="0.000768"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:04.887796" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x743447266090&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-10-11T00:58:04.887476" elapsed="0.000434"/>
</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-10-11T00:58:04.888095" elapsed="0.000149"/>
</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-10-11T00:58:04.884666" elapsed="0.003631"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:58:04.884493" elapsed="0.003842"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-10-11T00:58:04.884300" elapsed="0.004063"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.888924" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:58:04.888572" elapsed="0.000408"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.889536" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.173'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:58:04.889168" elapsed="0.000408"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.890118" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:58:04.889763" elapsed="0.000394"/>
</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-10-11T00:58:04.882623" elapsed="0.007586"/>
</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-10-11T00:58:04.877952" elapsed="0.012306"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:04.890678" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:04.890578" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:04.890549" elapsed="0.000191"/>
</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-10-11T00:58:04.891988" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:04.891647" elapsed="0.000367"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.892447" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:58:04.892169" elapsed="0.000304"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:58:04.892513" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:58:04.892639" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:58:04.891310" elapsed="0.001352"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:04.893570" level="INFO">${member_ip} = 10.30.170.173</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-10-11T00:58:04.893348" elapsed="0.000247"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:04.894316" 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-10-11T00:58:04.894422" 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-10-11T00:58:04.894173" elapsed="0.000276"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:04.897521" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:04.896969" elapsed="0.000634"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:04.896919" elapsed="0.000720"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:04.898325" 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-10-11T00:58:04.898561" 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-10-11T00:58:04.897886" elapsed="0.000725"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.899578" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.173" 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-10-11T00:58:04.898915" elapsed="0.000783"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:04.900847" 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-10-11T00:58:04.900008" elapsed="0.000890"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:58:04.902540" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:58:04.902707" 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-10-11T00:58:04.902202" elapsed="0.000548"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:04.903097" elapsed="0.000431"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:58:04.904609" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:58:05.275001" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 00:57:15 UTC 2026

  System load:  0.19               Processes:             120
  Usage of /:   14.2% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.173
  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.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:57:17 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:58:04.904346" elapsed="0.370732"/>
</kw>
<msg time="2026-10-11T00:58:05.275136" 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-10-11T00:58:04.903875" elapsed="0.371369"/>
</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-10-11T00:58:04.901327" elapsed="0.374030"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:05.276105" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-10-11T00:58:05.289116" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-10-11T00:58:05.289454" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T00:58:05.289562" 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-10-11T00:58:05.275707" elapsed="0.013902"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:58:05.289902" elapsed="0.000705"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:05.292204" 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-10-11T00:58:05.291498" elapsed="0.000951"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T00:58:05.292955" elapsed="0.000094"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:05.292662" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:05.292631" elapsed="0.000581"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:58:05.293615" elapsed="0.000105"/>
</return>
<status status="PASS" start="2026-10-11T00:58:05.293316" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:05.293294" elapsed="0.000592"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T00:58:05.293984" elapsed="0.000021"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:05.295754" elapsed="0.000580"/>
</kw>
<kw name="Open 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-10-11T00:58:05.296817" elapsed="0.000372"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:58:05.297582" elapsed="0.000284"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:58:05.294775" elapsed="0.003200"/>
</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-10-11T00:58:04.896119" elapsed="0.402005"/>
</kw>
<msg time="2026-10-11T00:58:05.298189" 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-10-11T00:58:04.895494" elapsed="0.402762"/>
</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-10-11T00:58:04.895080" elapsed="0.403272"/>
</kw>
<msg time="2026-10-11T00:58:05.298402" 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-10-11T00:58:04.894607" elapsed="0.403943"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:05.299465" elapsed="0.000637"/>
</kw>
<kw name="Open 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-10-11T00:58:05.300367" elapsed="0.000219"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:58:05.300794" elapsed="0.000123"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:58:05.298950" elapsed="0.002051"/>
</kw>
<msg time="2026-10-11T00:58:05.301114" 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-10-11T00:58:04.893795" elapsed="0.407350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:05.301804" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:05.301491" elapsed="0.000367"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-11T00:58:05.301911" elapsed="0.000060"/>
</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-10-11T00:58:04.893030" elapsed="0.409045"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:58:04.892851" elapsed="0.409269"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:58:04.892748" elapsed="0.409411"/>
</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-10-11T00:58:04.890963" elapsed="0.411259"/>
</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-10-11T00:58:05.302459" elapsed="0.000281"/>
</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-10-11T00:58:05.310474" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:05.310334" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:05.310309" elapsed="0.000252"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:05.311016" 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-10-11T00:58:05.311144" 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-10-11T00:58:05.310840" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:05.311784" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:05.311466" elapsed="0.000422"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:05.312503" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:05.312180" elapsed="0.000379"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:05.313557" 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-10-11T00:58:05.313299" elapsed="0.000391">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-10-11T00:58:05.313823" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T00:58:05.313880" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:05.312784" elapsed="0.001127"/>
</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-10-11T00:58:05.314337" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:05.314030" elapsed="0.000420"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:05.314006" elapsed="0.000476"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:05.315459" level="INFO">${ip_address} = 10.30.170.173</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-10-11T00:58:05.315119" elapsed="0.000367"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-10-11T00:58:05.315528" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:58:05.315650" level="INFO">${odl_ip} = 10.30.170.173</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-10-11T00:58:05.314740" elapsed="0.000932"/>
</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-10-11T00:58:05.315850" elapsed="0.000324"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:05.316498" level="INFO">index=4
host=10.30.170.173
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-10-11T00:58:05.316586" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.173
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-10-11T00:58:05.316387" elapsed="0.000223"/>
</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-10-11T00:58:05.316773" elapsed="0.000237"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-10-11T00:58:05.317397" level="INFO">Logging into '10.30.170.173:8101' as 'karaf'.</msg>
<msg time="2026-10-11T00:58:05.550251" 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-10-11T00:58:05.317202" elapsed="0.233128"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:05.551482" elapsed="0.000276"/>
</kw>
<kw name="Open 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-10-11T00:58:05.551960" elapsed="0.000142"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:58:05.552249" elapsed="0.000088"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:58:05.551128" elapsed="0.001256"/>
</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-10-11T00:58:05.550619" elapsed="0.001823"/>
</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-10-11T00:58:05.310015" elapsed="0.242474"/>
</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-10-11T00:58:05.303715" elapsed="0.248816"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:05.303171" elapsed="0.249442"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:58:05.302973" elapsed="0.249677"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-10-11T00:58:05.302806" elapsed="0.249873"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-10-11T00:58:04.877563" elapsed="0.675165"/>
</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-10-11T00:58:05.553571" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:05.553484" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:05.553465" elapsed="0.000169"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:05.555604" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:05.555522" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:05.555504" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:05.556524" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:05.556187" elapsed="0.000363"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:58:05.556982" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:58:05.556706" elapsed="0.000300"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:58:05.557046" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:58:05.557171" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:58:05.555871" elapsed="0.001322"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:05.559796" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:05.559711" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:05.559694" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:05.560955" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:05.560856" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:05.560839" elapsed="0.000178"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:05.561455" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:58:05.561173" elapsed="0.000308"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:05.561839" 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-10-11T00:58:05.561652" elapsed="0.000211"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:58:05.600637" 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-10-11T00:58:05.562554" elapsed="0.038204"/>
</kw>
<msg time="2026-10-11T00:58:05.600883" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:58:05.600924" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:05.562037" elapsed="0.038937"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:58:05.680825" 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-10-11T00:58:05.601713" elapsed="0.079274"/>
</kw>
<msg time="2026-10-11T00:58:05.681115" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:58:05.681156" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:05.601143" elapsed="0.080047"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:05.681596" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:05.681259" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:05.681240" elapsed="0.000523"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:05.682322" 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-10-11T00:58:05.681967" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:05.682735" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:05.682524" elapsed="0.000355"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:05.682506" elapsed="0.000397"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:58:05.682951" 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">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:05.684877" elapsed="0.000428"/>
</kw>
<kw name="Open 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-10-11T00:58:05.685711" elapsed="0.000279"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:58:05.686312" elapsed="0.000234"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:58:05.684158" elapsed="0.002471"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:58:05.683230" elapsed="0.003524"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:58:05.560654" elapsed="0.126176"/>
</kw>
<msg time="2026-10-11T00:58:05.686913" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:05.686968" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:05.560067" elapsed="0.126937"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:58:05.687158" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:58:05.687073" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:05.687055" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:05.687582" 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-10-11T00:58:05.687884" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:58:05.687978" 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-10-11T00:58:05.559478" elapsed="0.128587"/>
</kw>
<msg time="2026-10-11T00:58:05.688147" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:05.688188" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:05.557538" elapsed="0.130684"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:05.688641" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:05.688289" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:05.688273" elapsed="0.000441"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:58:05.557379" elapsed="0.131356"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:58:05.557239" elapsed="0.131522"/>
</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-10-11T00:58:05.555279" elapsed="0.133530"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-10-11T00:58:05.553296" elapsed="0.135562"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:05.552885" elapsed="0.136011"/>
</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-10-11T00:58:04.875087" elapsed="0.813867"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:05.689426" 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-10-11T00:58:05.689129" elapsed="0.000323"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:05.689939" level="INFO">${tools_system_conn_id} = 7</msg>
<arg>${tools_system_conn_id}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:58:05.689642" elapsed="0.000336"/>
</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-10-11T00:58:05.691661" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:58:05.691734" 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-10-11T00:58:05.691238" elapsed="0.000552"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:05.691965" elapsed="0.000288"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:58:05.693048" level="INFO">Logging into '10.30.171.7:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:58:06.308272" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Sun Oct 11 00:58:05 UTC 2026

  System load:  0.46               Processes:             106
  Usage of /:   20.0% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.7
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:57:16 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:58:05.692808" elapsed="0.615572"/>
</kw>
<msg time="2026-10-11T00:58:06.308479" 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-10-11T00:58:05.692436" elapsed="0.616115"/>
</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-10-11T00:58:05.690845" elapsed="0.617813"/>
</kw>
<msg time="2026-10-11T00:58:06.308722" 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-10-11T00:58:05.690487" elapsed="0.618292"/>
</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-10-11T00:58:05.690161" elapsed="0.618709"/>
</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-10-11T00:58:06.313196" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:06.312779" elapsed="0.000453"/>
</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-10-11T00:58:06.315138" level="INFO">Executing command 'cd '.' &amp;&amp; virtualenv /tmp/defaultvenv'.</msg>
<msg time="2026-10-11T00:58:06.672524" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:58:06.672773" level="INFO">${stdout} = created virtual environment CPython3.10.12.final.0-64 in 210ms
  creator CPython3Posix(dest=/tmp/defaultvenv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=b...</msg>
<msg time="2026-10-11T00:58:06.672869" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T00:58:06.672982" 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-10-11T00:58:06.314902" elapsed="0.358130"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:58:06.675247" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T00:58:06.674330" elapsed="0.001017"/>
</kw>
<msg time="2026-10-11T00:58:06.675578" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T00:58:06.675670" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:06.673532" elapsed="0.002185"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:06.677062" 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-10-11T00:58:06.676170" elapsed="0.000949"/>
</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-10-11T00:58:06.679305" level="INFO">created virtual environment CPython3.10.12.final.0-64 in 210ms
  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-10-11T00:58:06.678746" elapsed="0.000712"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:06.680510" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:06.679913" elapsed="0.000685"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:06.681596" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:06.681082" elapsed="0.000605"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T00:58:06.677949" elapsed="0.003850"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:06.677283" elapsed="0.004586"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:06.677240" elapsed="0.004709"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T00:58:06.682351" elapsed="0.000043"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:06.682069" elapsed="0.000430"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:06.682033" elapsed="0.000515"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:58:06.682819" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-10-11T00:58:06.682658" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:06.682626" elapsed="0.000435"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:06.683476" elapsed="0.000046"/>
</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-10-11T00:58:06.314204" elapsed="0.369490"/>
</kw>
<msg time="2026-10-11T00:58:06.683807" 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-10-11T00:58:06.313477" elapsed="0.370428"/>
</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-10-11T00:58:06.312075" elapsed="0.372072"/>
</kw>
<msg time="2026-10-11T00:58:06.684257" 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-10-11T00:58:06.310011" elapsed="0.374336"/>
</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-10-11T00:58:06.309557" elapsed="0.375033"/>
</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-10-11T00:58:06.693697" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:06.693037" elapsed="0.000720"/>
</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-10-11T00:58:06.697483" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate'.</msg>
<msg time="2026-10-11T00:58:08.627377" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:58:08.627758" level="INFO">${stdout} = Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Using cached pip-26.2.1-py3-none-any.whl (1.8 MB)
Installing collected packages: pip
  Att...</msg>
<msg time="2026-10-11T00:58:08.627986" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T00:58:08.628135" 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-10-11T00:58:06.696738" elapsed="1.931477"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:58:08.633553" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T00:58:08.632510" elapsed="0.001300"/>
</kw>
<msg time="2026-10-11T00:58:08.634142" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T00:58:08.634289" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:08.628951" elapsed="0.005414"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:08.637583" 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-10-11T00:58:08.635193" elapsed="0.002477"/>
</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-10-11T00:58:08.642890" level="INFO">Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Using cached pip-26.2.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.2.1</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:08.641637" elapsed="0.001488"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:08.645088" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:08.644099" elapsed="0.001185"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:08.647081" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:08.646233" elapsed="0.001048"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T00:58:08.639570" elapsed="0.007943"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:08.638049" elapsed="0.009681"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:08.638003" elapsed="0.009784"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T00:58:08.648219" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:08.648004" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:08.647965" elapsed="0.000630"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:58:08.648923" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-10-11T00:58:08.648705" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:08.648673" elapsed="0.000578"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:08.649641" elapsed="0.000046"/>
</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-10-11T00:58:06.695532" elapsed="1.954478"/>
</kw>
<msg time="2026-10-11T00:58:08.650120" 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-10-11T00:58:06.694138" elapsed="1.956082"/>
</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-10-11T00:58:06.691801" elapsed="1.958570"/>
</kw>
<msg time="2026-10-11T00:58:08.650532" 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-10-11T00:58:06.688513" elapsed="1.962111"/>
</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-10-11T00:58:06.687480" elapsed="1.963292"/>
</kw>
<msg time="2026-10-11T00:58:08.650862" 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-10-11T00:58:06.686636" elapsed="1.964342"/>
</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-10-11T00:58:06.685867" elapsed="1.965257"/>
</kw>
<msg time="2026-10-11T00:58:08.651204" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:06.684950" elapsed="1.966338"/>
</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-10-11T00:58:06.309175" elapsed="2.342312"/>
</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-10-11T00:58:08.661185" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:08.660542" elapsed="0.000701"/>
</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-10-11T00:58:08.664805" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate'.</msg>
<msg time="2026-10-11T00:58:09.369826" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:58:09.370213" 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-10-11T00:58:09.370311" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T00:58:09.370396" 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-10-11T00:58:08.664101" elapsed="0.706389"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:58:09.375350" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T00:58:09.374170" elapsed="0.001531"/>
</kw>
<msg time="2026-10-11T00:58:09.376029" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T00:58:09.376121" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:09.371074" elapsed="0.005095"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:09.378830" 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-10-11T00:58:09.376844" elapsed="0.002062"/>
</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-10-11T00:58:09.383451" 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-10-11T00:58:09.382722" elapsed="0.000883"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:09.385159" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:09.384485" elapsed="0.000806"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:09.387267" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:09.386143" elapsed="0.001304"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T00:58:09.380583" elapsed="0.007019"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:09.379261" elapsed="0.008539"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:09.379217" elapsed="0.008640"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T00:58:09.388176" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:09.387999" elapsed="0.000382"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:09.387962" elapsed="0.000541"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:58:09.388773" elapsed="0.000055"/>
</return>
<status status="PASS" start="2026-10-11T00:58:09.388615" elapsed="0.000416"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:09.388583" elapsed="0.000504"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:09.389476" 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-10-11T00:58:08.662916" elapsed="0.726820"/>
</kw>
<msg time="2026-10-11T00:58:09.389847" 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-10-11T00:58:08.661628" elapsed="0.728338"/>
</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-10-11T00:58:08.659382" elapsed="0.730765"/>
</kw>
<msg time="2026-10-11T00:58:09.390253" 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-10-11T00:58:08.656144" elapsed="0.734199"/>
</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-10-11T00:58:08.655085" elapsed="0.735499"/>
</kw>
<msg time="2026-10-11T00:58:09.390680" 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-10-11T00:58:08.654155" elapsed="0.736613"/>
</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-10-11T00:58:08.653357" elapsed="0.737600"/>
</kw>
<msg time="2026-10-11T00:58:09.391044" 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-10-11T00:58:08.652521" elapsed="0.738607"/>
</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-10-11T00:58:08.651893" elapsed="0.739393"/>
</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-10-11T00:58:09.400739" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:09.400088" elapsed="0.000709"/>
</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-10-11T00:58:09.404305" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==3.4.16; deactivate'.</msg>
<msg time="2026-10-11T00:58:10.763987" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:58:10.764365" 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-10-11T00:58:10.764520" 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-10-11T00:58:10.764620" 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-10-11T00:58:09.403613" elapsed="1.361057"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:58:10.769718" level="INFO">Length is 1862.</msg>
<msg time="2026-10-11T00:58:10.770690" 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-no2tu284/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-no2tu284/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-no2tu284/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-no2tu284/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())  # noqa: S102 # exec is intentional here
        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-10-11T00:58:10.768401" elapsed="0.002786">'  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-no2tu284/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-no2tu284/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-no2tu284/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-no2tu284/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())  # noqa: S102 # exec is intentional here
        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-10-11T00:58:10.771585" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-10-11T00:58:10.771687" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:10.765266" elapsed="0.006477"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:10.774509" 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-10-11T00:58:10.772275" elapsed="0.002293"/>
</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-10-11T00:58:10.779295" 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-10-11T00:58:10.778094" elapsed="0.001505"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:10.781157" 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-no2tu284/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-no2tu284/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-no2tu284/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-no2tu284/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())  # noqa: S102 # exec is intentional here
        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-10-11T00:58:10.780470" elapsed="0.000931"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:10.782975" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:10.782264" elapsed="0.000848"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T00:58:10.776110" elapsed="0.007145"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:10.774841" elapsed="0.008652"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:10.774797" elapsed="0.008757"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T00:58:10.783848" elapsed="0.000057"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:10.783671" elapsed="0.000404"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:10.783636" elapsed="0.000492"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:58:10.784395" elapsed="0.000121"/>
</return>
<status status="PASS" start="2026-10-11T00:58:10.784237" elapsed="0.000456"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:10.784205" elapsed="0.000543"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:10.785155" 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-10-11T00:58:09.402484" elapsed="1.382973"/>
</kw>
<msg time="2026-10-11T00:58:10.785570" 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-10-11T00:58:09.401168" elapsed="1.384502"/>
</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-10-11T00:58:09.398968" elapsed="1.386875"/>
</kw>
<msg time="2026-10-11T00:58:10.785969" 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-10-11T00:58:09.395768" elapsed="1.390291"/>
</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-10-11T00:58:09.394755" elapsed="1.391471"/>
</kw>
<msg time="2026-10-11T00:58:10.786319" 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-10-11T00:58:09.393934" elapsed="1.392468"/>
</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-10-11T00:58:09.393136" elapsed="1.393503"/>
</kw>
<msg time="2026-10-11T00:58:10.786723" 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-10-11T00:58:09.392292" elapsed="1.394515"/>
</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-10-11T00:58:09.391732" elapsed="1.395249"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:10.787869" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x74344431e990&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-10-11T00:58:10.787373" elapsed="0.000822"/>
</kw>
<kw name="Upload_Config_Files">
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T00:58:10.802124" level="INFO">[chan 5] Opened sftp connection (server version 3)</msg>
<msg time="2026-10-11T00:58:10.813243" 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-10-11T00:58:10.789205" elapsed="0.024158"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T00:58:10.823510" 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-10-11T00:58:10.813810" elapsed="0.009820"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T00:58:10.833523" 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-10-11T00:58:10.824067" elapsed="0.009575"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-10-11T00:58:10.844939" 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-10-11T00:58:10.845160" 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-10-11T00:58:10.834003" elapsed="0.011210"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:10.846356" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-10-11T00:58:10.858965" 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-10-11T00:58:10.846080" elapsed="0.013001"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:10.859847" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-10-11T00:58:10.908364" 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-10-11T00:58:10.859565" elapsed="0.048952"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:10.909237" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-10-11T00:58:10.956659" 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-10-11T00:58:10.908981" elapsed="0.047793"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:10.957525" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-10-11T00:58:11.004743" 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-10-11T00:58:10.957234" elapsed="0.047631"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:11.005621" level="INFO">Executing command 'cat bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-10-11T00:58:11.052811" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:58:11.053024" level="INFO">${stdout} = neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0.1/3...</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-10-11T00:58:11.005329" elapsed="0.047749"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:11.054153" level="INFO">neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
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-10-11T00:58:11.053619" elapsed="0.000637"/>
</kw>
<var name="${cfgfile}">bgp-flowspec-redirect.cfg</var>
<status status="PASS" start="2026-10-11T00:58:10.845664" elapsed="0.208660"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:11.055257" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-10-11T00:58:11.100348" 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-10-11T00:58:11.054986" elapsed="0.045510"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:11.101229" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-10-11T00:58:11.148571" 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-10-11T00:58:11.100951" elapsed="0.047752"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:11.149488" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-10-11T00:58:11.197065" 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-10-11T00:58:11.149178" elapsed="0.048023"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:11.197981" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-10-11T00:58:11.249979" 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-10-11T00:58:11.197693" elapsed="0.052418"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:11.250891" level="INFO">Executing command 'cat bgp-flowspec.cfg'.</msg>
<msg time="2026-10-11T00:58:11.301076" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:58:11.301293" level="INFO">${stdout} = neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0.1/3...</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-10-11T00:58:11.250603" elapsed="0.050746"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:11.302457" level="INFO">neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
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-10-11T00:58:11.301903" elapsed="0.000667"/>
</kw>
<var name="${cfgfile}">bgp-flowspec.cfg</var>
<status status="PASS" start="2026-10-11T00:58:11.054580" elapsed="0.248060"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:11.303666" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-10-11T00:58:11.352908" 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-10-11T00:58:11.303352" elapsed="0.049692"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:11.353840" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-10-11T00:58:11.405096" 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-10-11T00:58:11.353538" elapsed="0.051693"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:11.406016" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-10-11T00:58:11.457105" 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-10-11T00:58:11.405724" elapsed="0.051512"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:11.458013" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-10-11T00:58:11.509081" 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-10-11T00:58:11.457721" elapsed="0.051495"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:11.510009" level="INFO">Executing command 'cat bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-10-11T00:58:11.561057" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:58:11.561267" level="INFO">${stdout} = neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
local-as 64496;
peer-as 64496;
  family {
    ipv4 mpls-vpn;
  }
  static {
    route 1.1.1.0/24 {
      next-hop 10.0.255.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-10-11T00:58:11.509715" elapsed="0.051609"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:11.562457" level="INFO">neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
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-10-11T00:58:11.561860" elapsed="0.000700"/>
</kw>
<var name="${cfgfile}">bgp-l3vpn-ipv4.cfg</var>
<status status="PASS" start="2026-10-11T00:58:11.302861" elapsed="0.259770"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:11.563593" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' exa-md5.cfg'.</msg>
<msg time="2026-10-11T00:58:11.613058" 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-10-11T00:58:11.563279" elapsed="0.049912"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:11.614016" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' exa-md5.cfg'.</msg>
<msg time="2026-10-11T00:58:11.665130" 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-10-11T00:58:11.613684" elapsed="0.051579"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:11.666062" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exa-md5.cfg'.</msg>
<msg time="2026-10-11T00:58:11.717077" 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-10-11T00:58:11.665764" elapsed="0.051445"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:11.717996" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exa-md5.cfg'.</msg>
<msg time="2026-10-11T00:58:11.769193" 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-10-11T00:58:11.717705" elapsed="0.051622"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:11.770134" level="INFO">Executing command 'cat exa-md5.cfg'.</msg>
<msg time="2026-10-11T00:58:11.821090" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:58:11.821304" level="INFO">${stdout} = neighbor 10.30.170.173 {
  router-id 10.30.171.7;
  local-address 10.30.171.7;
  local-as 64496;
  peer-as 64496;
  md5-password topsecret;

  capability {
    route-refresh disable;
    add-path disa...</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-10-11T00:58:11.769831" elapsed="0.051530"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:11.822501" level="INFO">neighbor 10.30.170.173 {
  router-id 10.30.171.7;
  local-address 10.30.171.7;
  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-10-11T00:58:11.821928" elapsed="0.000676"/>
</kw>
<var name="${cfgfile}">exa-md5.cfg</var>
<status status="PASS" start="2026-10-11T00:58:11.562859" elapsed="0.259817"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:11.823640" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' exa.cfg'.</msg>
<msg time="2026-10-11T00:58:11.872951" 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-10-11T00:58:11.823328" elapsed="0.049756"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:11.873914" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' exa.cfg'.</msg>
<msg time="2026-10-11T00:58:11.925020" 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-10-11T00:58:11.873586" elapsed="0.051567"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:11.925943" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exa.cfg'.</msg>
<msg time="2026-10-11T00:58:11.977021" 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-10-11T00:58:11.925649" elapsed="0.051504"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:11.977960" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exa.cfg'.</msg>
<msg time="2026-10-11T00:58:12.029219" 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-10-11T00:58:11.977655" elapsed="0.051697"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:12.030156" level="INFO">Executing command 'cat exa.cfg'.</msg>
<msg time="2026-10-11T00:58:12.080890" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:58:12.081106" level="INFO">${stdout} = neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
local-as 64496;
peer-as 64496;
  capability {
    route-refresh disable;
    add-path disable;
  }

  family {
    ipv4 unica...</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-10-11T00:58:12.029855" elapsed="0.051308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.082274" level="INFO">neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
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.171.7;
    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-10-11T00:58:12.081701" elapsed="0.000674"/>
</kw>
<var name="${cfgfile}">exa.cfg</var>
<status status="PASS" start="2026-10-11T00:58:11.822930" elapsed="0.259548"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:12.083401" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' gobgp.cfg'.</msg>
<msg time="2026-10-11T00:58:12.129491" 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-10-11T00:58:12.083121" elapsed="0.046507"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:12.130437" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' gobgp.cfg'.</msg>
<msg time="2026-10-11T00:58:12.181071" 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-10-11T00:58:12.130107" elapsed="0.051104"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:12.182014" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' gobgp.cfg'.</msg>
<msg time="2026-10-11T00:58:12.233301" 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-10-11T00:58:12.181710" elapsed="0.051771"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:12.234233" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' gobgp.cfg'.</msg>
<msg time="2026-10-11T00:58:12.285518" 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-10-11T00:58:12.233962" elapsed="0.051689"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:12.286437" level="INFO">Executing command 'cat gobgp.cfg'.</msg>
<msg time="2026-10-11T00:58:12.337143" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:58:12.337357" level="INFO">${stdout} = [global.config]
    as = 64496
    router-id = "10.30.171.7"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.173"
        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-10-11T00:58:12.286134" elapsed="0.051321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.338554" level="INFO">[global.config]
    as = 64496
    router-id = "10.30.171.7"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.173"
        local-as = 64496
    [neighbors.transport.config]
        local-address = "10.30.171.7"
        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-10-11T00:58:12.337985" elapsed="0.000676"/>
</kw>
<var name="${cfgfile}">gobgp.cfg</var>
<status status="PASS" start="2026-10-11T00:58:12.082707" elapsed="0.256025"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-10-11T00:58:10.845331" elapsed="1.493463"/>
</for>
<doc>Uploads exabgp config files and needed scripts</doc>
<status status="PASS" start="2026-10-11T00:58:10.788666" elapsed="1.550281"/>
</kw>
<doc>Suite setup keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:04.874792" elapsed="7.464263"/>
</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-10-11T00:58:12.341930" elapsed="0.000452"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:58:12.341303" elapsed="0.001226"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:12.344686" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:12.344466" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.344394" elapsed="0.000437"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:12.349882" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:12.349668" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.349630" elapsed="0.000399"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.352156" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:12.351372" elapsed="0.000840"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.353202" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:58:12.352594" elapsed="0.000661"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:58:12.353344" elapsed="0.000095"/>
</return>
<msg time="2026-10-11T00:58:12.353745" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:58:12.350536" elapsed="0.003261"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:12.359637" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:12.359444" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.359375" elapsed="0.000400"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:12.362206" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:12.362020" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.361982" elapsed="0.000362"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:12.363146" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:58:12.362736" elapsed="0.000464"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:12.363969" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:12.363638" elapsed="0.000386"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:58:12.400173" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:58:12.365192" elapsed="0.035118"/>
</kw>
<msg time="2026-10-11T00:58:12.400547" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:58:12.400606" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:12.364380" elapsed="0.036275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:58:12.432908" 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-10-11T00:58:12.401390" elapsed="0.031617"/>
</kw>
<msg time="2026-10-11T00:58:12.433155" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:58:12.433196" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:12.400913" elapsed="0.032318"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.433535" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.433300" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.433281" elapsed="0.000327"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.434035" 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-10-11T00:58:12.433792" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.434360" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.434158" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.434141" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:58:12.434478" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:12.436954" elapsed="0.000237"/>
</kw>
<msg time="2026-10-11T00:58:12.437251" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:12.435878" 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-10-11T00:58:12.437721" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.438077" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:58:12.435252" 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-10-11T00:58:12.434759" elapsed="0.003560"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:58:12.361382" elapsed="0.077011"/>
</kw>
<msg time="2026-10-11T00:58:12.438531" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:12.438570" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:12.360138" elapsed="0.078468"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:58:12.438759" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:58:12.438674" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.438657" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.439183" 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-10-11T00:58:12.439515" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:58:12.439580" 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-10-11T00:58:12.358751" elapsed="0.080913"/>
</kw>
<msg time="2026-10-11T00:58:12.439747" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:12.439787" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:12.354593" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.440128" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.439906" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.439889" elapsed="0.000309"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:58:12.354240" elapsed="0.085980"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:58:12.353931" elapsed="0.086314"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:58:12.348982" elapsed="0.091310"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:58:12.343832" elapsed="0.096509"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:12.342895" elapsed="0.097487"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:58:12.340480" elapsed="0.100034"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.441117" level="INFO">&amp;{mapping} = { BGP_RIB=example-bgp-rib | IP=10.30.170.173 }</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-10-11T00:58:12.440701" elapsed="0.000442"/>
</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-10-11T00:58:12.451850" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:12.451548" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:12.452609" 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-10-11T00:58:12.452380" elapsed="0.000299">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-10-11T00:58:12.452763" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:12.452058" elapsed="0.000728"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.453290" 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-10-11T00:58:12.452985" elapsed="0.000330"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:12.453618" 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-10-11T00:58:12.453760" 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-10-11T00:58:12.453507" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.454266" 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-10-11T00:58:12.454049" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.455434" level="INFO">mapping: {'BGP_RIB': 'example-bgp-rib', 'IP': '10.30.170.173'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:12.455022" elapsed="0.000457"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.455936" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:58:12.455669" elapsed="0.000291"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.456563" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:58:12.456278" elapsed="0.000310"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:12.457332" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:58:12.457142" elapsed="0.000215"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:12.457402" elapsed="0.000044"/>
</return>
<msg time="2026-10-11T00:58:12.457545" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:58:12.456764" 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-10-11T00:58:12.457745" elapsed="0.000200"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:58:12.456141" elapsed="0.001841"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.458501" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:58:12.458215" elapsed="0.000310"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:12.459213" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:58:12.459035" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:12.459280" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:58:12.459401" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:58:12.458696" elapsed="0.000746"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:12.459616" elapsed="0.000165"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T00:58:12.458081" elapsed="0.001735"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:58:12.456004" elapsed="0.003844"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:58:12.459943" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:58:12.460070" level="INFO">${mapping_to_use} = {'BGP_RIB': 'example-bgp-rib', 'IP': '10.30.170.173'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:58:12.454640" elapsed="0.005454"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:12.454368" elapsed="0.005755"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.460300" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.460144" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.454351" elapsed="0.006017"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.461123" 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-10-11T00:58:12.460563" elapsed="0.000586"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:12.461193" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T00:58:12.451019" elapsed="0.010272"/>
</kw>
<msg time="2026-10-11T00:58:12.461340" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:12.446471" elapsed="0.014913"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T00:58:12.465624" 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/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-10-11T00:58:12.469873" 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/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-10-11T00:58:12.474095" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.474277" 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-10-11T00:58:12.474477" 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-10-11T00:58:12.474819" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.474671" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:12.474658" 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-10-11T00:58:12.475069" 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-10-11T00:58:12.475251" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.475447" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:58:12.474632" elapsed="0.000863"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:58:12.474543" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.475674" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:12.475740" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:58:12.475849" 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-10-11T00:58:12.445853" elapsed="0.030040"/>
</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-10-11T00:58:12.485268" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:12.484966" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:12.485973" 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-10-11T00:58:12.485791" elapsed="0.000240">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-10-11T00:58:12.486114" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:12.485472" elapsed="0.000664"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.486681" 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-10-11T00:58:12.486354" elapsed="0.000353"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:12.487007" 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-10-11T00:58:12.487125" 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-10-11T00:58:12.486897" elapsed="0.000256"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.487608" 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-10-11T00:58:12.487369" 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-10-11T00:58:12.487979" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.487713" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.488489" level="INFO">${mapping_to_use} = {'BGP_RIB': 'example-bgp-rib', 'IP': '10.30.170.173'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:12.488209" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:12.488054" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.487696" elapsed="0.000870"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.489244" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.173&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-10-11T00:58:12.488739" elapsed="0.000533"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:12.489315" 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/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-10-11T00:58:12.484442" elapsed="0.004988"/>
</kw>
<msg time="2026-10-11T00:58:12.489479" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:12.479900" elapsed="0.009622"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T00:58:12.493789" 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/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-10-11T00:58:12.498017" 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/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-10-11T00:58:12.503362" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.503570" 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-10-11T00:58:12.503785" 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-10-11T00:58:12.504143" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.503995" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:12.503981" 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-10-11T00:58:12.504373" 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-10-11T00:58:12.504574" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.504742" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:58:12.503956" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:58:12.503852" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.504978" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:12.505045" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:58:12.505151" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.173&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-10-11T00:58:12.479159" elapsed="0.026019"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:12.506317" 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-10-11T00:58:12.506126" elapsed="0.000250">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-10-11T00:58:12.506476" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:12.505781" elapsed="0.000718"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.506786" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.506564" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.507305" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:12.507045" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:12.506874" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.506548" elapsed="0.000832"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.507917" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:12.507559" elapsed="0.000383"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:58:12.507987" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:58:12.508109" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:58:12.505475" elapsed="0.002657"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.509377" 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.173</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:12.509157" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.509849" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.173&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-10-11T00:58:12.509632" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.510318" 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-10-11T00:58:12.510103" elapsed="0.000254"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.510780" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:12.510564" elapsed="0.000287"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:12.511604" 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-10-11T00:58:12.511441" elapsed="0.000188"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:58:12.511943" 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-10-11T00:58:12.511784" elapsed="0.000183"/>
</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-10-11T00:58:12.512131" elapsed="0.000155"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.512716" 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-10-11T00:58:12.512495" elapsed="0.000261"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:58:12.512793" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:58:12.512940" 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-10-11T00:58:12.511061" elapsed="0.001903"/>
</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-10-11T00:58:12.528259" level="INFO">PUT Request : url=http://10.30.170.173: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.173 
 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.173 
 headers={'User-Agent': 'python-requests/2.34.2', '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.173&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-10-11T00:58:12.528318" level="INFO">PUT Response : url=http://10.30.170.173: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.173 
 status=201, reason=Created 
 headers={'Set-Cookie': 'JSESSIONID=node05qyjd6e9gd4kd0gcztbjfjzf18.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Sat, 10-Oct-2026 00:58:12 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:12.528511" 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-10-11T00:58:12.513257" elapsed="0.015281"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:12.513026" elapsed="0.015553"/>
</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-10-11T00:58:12.528761" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.528603" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.513010" elapsed="0.015831"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.530278" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:12.529822" elapsed="0.000496"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:12.529580" elapsed="0.000775"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.529563" elapsed="0.000814"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.530977" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:12.530693" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:12.530451" elapsed="0.000599"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.530435" elapsed="0.000637"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.531619" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:12.531252" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.531940" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.531707" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.532460" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:12.532181" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:12.532015" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.531690" elapsed="0.000847"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.533062" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:12.532714" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.533364" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.533148" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.533939" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:12.533661" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:12.533493" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.533132" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:12.534161" elapsed="0.000307"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:58:12.534872" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:12.534630" elapsed="0.000268"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:58:12.535053" elapsed="0.000213"/>
</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-10-11T00:58:12.529194" elapsed="0.006127"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:58:12.535478" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:58:12.535379" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.535363" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.535702" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:58:12.535761" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T00:58:12.535933" 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-10-11T00:58:12.508453" elapsed="0.027505"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:58:12.536013" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:58:12.536133" 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-10-11T00:58:12.442040" elapsed="0.094115"/>
</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-10-11T00:58:12.536462" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.536238" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.536223" elapsed="0.000322"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:58:12.536574" elapsed="0.000024"/>
</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-10-11T00:58:12.441385" elapsed="0.095286"/>
</kw>
<doc>Configures bgp application peer. Openconfig is used for carbon and above.</doc>
<status status="PASS" start="2026-10-11T00:58:12.339181" elapsed="0.197588"/>
</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-10-11T00:58:12.538274" elapsed="0.000218"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:58:12.538022" 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-10-11T00:58:12.539461" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:12.539357" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.539339" elapsed="0.000184"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:12.541714" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:12.541632" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.541615" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.542707" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:12.542369" elapsed="0.000363"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.543173" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:58:12.542909" elapsed="0.000288"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:58:12.543237" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:58:12.543402" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:58:12.542000" elapsed="0.001441"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:12.546017" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:12.545933" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.545915" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:12.547132" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:12.547049" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.547032" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:12.547536" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:58:12.547342" elapsed="0.000218"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:12.547877" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:12.547727" elapsed="0.000175"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:58:12.582074" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:58:12.548397" elapsed="0.033776"/>
</kw>
<msg time="2026-10-11T00:58:12.582345" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:58:12.582387" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:12.548063" elapsed="0.034383"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:58:12.623290" 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-10-11T00:58:12.582977" elapsed="0.040422"/>
</kw>
<msg time="2026-10-11T00:58:12.623571" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:58:12.623612" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:12.582619" elapsed="0.041028"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.623945" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.623716" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.623698" elapsed="0.000318"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.624441" 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-10-11T00:58:12.624200" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.624774" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.624573" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.624556" elapsed="0.000288"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:58:12.624890" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:12.627321" elapsed="0.000261"/>
</kw>
<msg time="2026-10-11T00:58:12.627641" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:12.626259" 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-10-11T00:58:12.628104" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.628461" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:58:12.625655" 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-10-11T00:58:12.625166" 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-10-11T00:58:12.546772" elapsed="0.082037"/>
</kw>
<msg time="2026-10-11T00:58:12.628908" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:12.628949" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:12.546232" elapsed="0.082753"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:58:12.629138" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:58:12.629053" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.629036" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.629562" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.629881" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:58:12.629946" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:58:12.545632" elapsed="0.084398"/>
</kw>
<msg time="2026-10-11T00:58:12.630112" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:12.630152" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:12.543777" elapsed="0.086410"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.630558" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.630253" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.630237" elapsed="0.000393"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:58:12.543631" elapsed="0.087021"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:58:12.543490" elapsed="0.087189"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:58:12.541325" elapsed="0.089402"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:58:12.539106" elapsed="0.091671"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:12.538695" elapsed="0.092122"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:58:12.537660" elapsed="0.093220"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.631639" level="INFO">&amp;{mapping} = { IP=10.30.171.7 | 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-10-11T00:58:12.631064" 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-10-11T00:58:12.642292" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:12.641914" elapsed="0.000405"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:12.643099" 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-10-11T00:58:12.642817" elapsed="0.000343">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-10-11T00:58:12.643244" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:12.642496" elapsed="0.000770"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.643771" 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-10-11T00:58:12.643463" elapsed="0.000333"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:12.644094" 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-10-11T00:58:12.644256" 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-10-11T00:58:12.643984" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.644716" 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-10-11T00:58:12.644494" elapsed="0.000264"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.645844" level="INFO">mapping: {'IP': '10.30.171.7', '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-10-11T00:58:12.645442" elapsed="0.000462"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.646338" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:58:12.646084" elapsed="0.000278"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.646986" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:58:12.646702" elapsed="0.000308"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:12.647690" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:58:12.647509" elapsed="0.000205"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:12.647758" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:58:12.647957" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:58:12.647181" 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-10-11T00:58:12.648148" elapsed="0.000169"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:58:12.646569" elapsed="0.001784"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.648886" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:58:12.648603" elapsed="0.000308"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:12.649585" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:58:12.649391" elapsed="0.000218"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:12.649652" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:58:12.649776" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:58:12.649082" elapsed="0.000716"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:12.649980" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:58:12.648468" elapsed="0.001713"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.650690" 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-10-11T00:58:12.650422" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:12.651388" 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-10-11T00:58:12.651213" elapsed="0.000213"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:12.651470" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:58:12.651593" 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-10-11T00:58:12.650904" elapsed="0.000712"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:12.651780" elapsed="0.000185"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:58:12.650278" elapsed="0.001723"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.652528" 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-10-11T00:58:12.652245" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:12.653219" 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-10-11T00:58:12.653044" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:12.653286" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:58:12.653422" 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-10-11T00:58:12.652721" elapsed="0.000725"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:12.653612" elapsed="0.000199"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:58:12.652098" elapsed="0.001751"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.654362" 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-10-11T00:58:12.654095" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:12.655072" 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-10-11T00:58:12.654895" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:12.655139" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:58:12.655261" 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-10-11T00:58:12.654574" elapsed="0.000709"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:12.655464" elapsed="0.000164"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:58:12.653963" elapsed="0.001701"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.656334" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:58:12.655913" elapsed="0.000446"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:12.657044" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:58:12.656851" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:12.657111" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:58:12.657233" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:58:12.656546" elapsed="0.000709"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:12.657434" elapsed="0.000166"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:58:12.655762" elapsed="0.001875"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.658151" 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-10-11T00:58:12.657884" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:12.658849" 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-10-11T00:58:12.658674" elapsed="0.000216"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:12.658934" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:58:12.659058" 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-10-11T00:58:12.658345" elapsed="0.000735"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:12.659246" elapsed="0.000179"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:58:12.657735" elapsed="0.001727"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:58:12.646420" elapsed="0.013073"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:58:12.659530" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:58:12.659659" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', '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-10-11T00:58:12.645083" elapsed="0.014600"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:12.644818" elapsed="0.014893"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.659898" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.659733" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.644801" elapsed="0.015168"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.660731" 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-10-11T00:58:12.660130" elapsed="0.000627"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:12.660801" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T00:58:12.641381" elapsed="0.019539"/>
</kw>
<msg time="2026-10-11T00:58:12.660969" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:12.636929" elapsed="0.024116"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T00:58:12.665296" 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/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-10-11T00:58:12.669532" 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/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-10-11T00:58:12.673733" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.673929" 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-10-11T00:58:12.674115" 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-10-11T00:58:12.674465" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.674303" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:12.674290" 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-10-11T00:58:12.674696" 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-10-11T00:58:12.674891" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.675059" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:58:12.674266" elapsed="0.000839"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:58:12.674179" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.675280" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:12.675345" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:58:12.675471" 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-10-11T00:58:12.636312" elapsed="0.039184"/>
</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-10-11T00:58:12.684843" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:12.684539" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:12.685552" 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-10-11T00:58:12.685366" elapsed="0.000245">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-10-11T00:58:12.685726" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:12.685046" elapsed="0.000703"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.686249" 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-10-11T00:58:12.685940" elapsed="0.000334"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:12.686567" 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-10-11T00:58:12.686686" 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-10-11T00:58:12.686456" elapsed="0.000256"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.687139" 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-10-11T00:58:12.686920" elapsed="0.000264"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:58:12.687518" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.687247" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.688026" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', '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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:12.687743" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:12.687594" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.687227" elapsed="0.000876"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.688871" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:12.688266" elapsed="0.000634"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:12.688943" 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-10-11T00:58:12.684013" elapsed="0.005032"/>
</kw>
<msg time="2026-10-11T00:58:12.689093" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:12.679545" elapsed="0.009590"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T00:58:12.693397" 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/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-10-11T00:58:12.697620" 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/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-10-11T00:58:12.701980" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.702195" 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-10-11T00:58:12.702381" 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-10-11T00:58:12.702735" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.702589" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:12.702576" 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-10-11T00:58:12.703016" 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-10-11T00:58:12.703198" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.703368" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:58:12.702551" elapsed="0.000878"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:58:12.702462" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.703607" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:12.703672" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:58:12.703781" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-...</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-10-11T00:58:12.678803" elapsed="0.025004"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:12.704940" 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-10-11T00:58:12.704739" elapsed="0.000261">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-10-11T00:58:12.705083" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:12.704398" elapsed="0.000707"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.705387" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.705167" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.705925" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:12.705645" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:12.705477" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.705151" elapsed="0.000850"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.706515" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:12.706166" elapsed="0.000372"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:58:12.706582" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:58:12.706707" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:58:12.704096" elapsed="0.002633"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.707973" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:12.707734" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.708434" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T00:58:12.708209" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.708902" 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-10-11T00:58:12.708672" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.709380" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:12.709166" elapsed="0.000275"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:12.710155" 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-10-11T00:58:12.709998" elapsed="0.000181"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:58:12.710498" 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-10-11T00:58:12.710333" elapsed="0.000189"/>
</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-10-11T00:58:12.710686" elapsed="0.000153"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.711276" 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-10-11T00:58:12.711057" elapsed="0.000260"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:58:12.711355" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:58:12.711499" 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-10-11T00:58:12.709624" elapsed="0.001899"/>
</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-10-11T00:58:12.723694" level="INFO">PUT Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node05qyjd6e9gd4kd0gcztbjfjzf18.node0', 'Content-Length': '293', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T00:58:12.723746" level="INFO">PUT Response : url=http://10.30.170.173: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.171.7 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:12.723824" 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-10-11T00:58:12.711812" elapsed="0.012036"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:12.711584" elapsed="0.012319"/>
</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-10-11T00:58:12.724083" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.723927" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.711569" elapsed="0.012592"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.725493" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:12.725201" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:12.724959" elapsed="0.000606"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.724942" elapsed="0.000646"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.726152" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:12.725887" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:12.725637" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.725623" elapsed="0.000623"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.726777" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:12.726437" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.727088" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.726877" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.727604" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:12.727325" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:12.727161" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.726849" elapsed="0.000831"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.728196" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:12.727865" elapsed="0.000359"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.728514" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.728289" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.729063" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:12.728789" elapsed="0.000298"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:12.728622" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.728273" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:12.729284" elapsed="0.000305"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:58:12.729984" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:12.729751" elapsed="0.000258"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:58:12.730164" elapsed="0.000208"/>
</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-10-11T00:58:12.724656" elapsed="0.005788"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:58:12.730586" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:58:12.730504" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.730488" elapsed="0.000175"/>
</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-10-11T00:58:12.730808" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:58:12.730881" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:58:12.731042" 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-10-11T00:58:12.707041" elapsed="0.024025"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:58:12.731121" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:58:12.731242" 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-10-11T00:58:12.632543" elapsed="0.098722"/>
</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-10-11T00:58:12.731567" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.731349" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.731334" elapsed="0.000319"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:58:12.731683" elapsed="0.000025"/>
</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-10-11T00:58:12.631935" elapsed="0.099844"/>
</kw>
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="PASS" start="2026-10-11T00:58:12.537136" elapsed="0.194758"/>
</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-10-11T00:58:12.733497" elapsed="0.000198"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:58:12.733231" elapsed="0.000514"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:12.734657" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:12.734571" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.734553" elapsed="0.000167"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:12.736912" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:12.736812" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.736795" elapsed="0.000180"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.737892" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:12.737557" elapsed="0.000361"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.738330" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:58:12.738072" elapsed="0.000282"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:58:12.738441" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T00:58:12.738572" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:58:12.737181" elapsed="0.001414"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:12.741136" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:12.741053" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.741036" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:12.742282" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:12.742198" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.742181" elapsed="0.000274"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:12.742982" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:58:12.742607" elapsed="0.000400"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:12.743422" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:12.743212" elapsed="0.000235"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:58:12.779105" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:58:12.744953" elapsed="0.034304"/>
</kw>
<msg time="2026-10-11T00:58:12.779403" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:58:12.779464" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:12.743637" elapsed="0.035862"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:58:12.811188" 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-10-11T00:58:12.781026" elapsed="0.030318"/>
</kw>
<msg time="2026-10-11T00:58:12.811497" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:58:12.811538" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:12.779718" elapsed="0.031855"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.811946" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.811691" elapsed="0.000414"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.811672" elapsed="0.000458"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.812872" 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-10-11T00:58:12.812317" elapsed="0.000660"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.813287" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.813053" elapsed="0.000416"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.813036" elapsed="0.000459"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:58:12.813527" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:12.816055" elapsed="0.000233"/>
</kw>
<msg time="2026-10-11T00:58:12.816328" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:12.815568" elapsed="0.000820"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.816702" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.816936" 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-10-11T00:58:12.814689" 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-10-11T00:58:12.813801" elapsed="0.003399"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:58:12.741943" elapsed="0.075363"/>
</kw>
<msg time="2026-10-11T00:58:12.817389" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:12.817519" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:12.741352" elapsed="0.076204"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:58:12.817710" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:58:12.817625" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.817607" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.818147" 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-10-11T00:58:12.818501" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:58:12.818567" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:58:12.740755" elapsed="0.077896"/>
</kw>
<msg time="2026-10-11T00:58:12.818733" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:12.818772" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:12.738938" elapsed="0.079870"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.819117" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.818891" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.818874" elapsed="0.000313"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:58:12.738778" elapsed="0.080431"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:58:12.738641" elapsed="0.080593"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:58:12.736520" elapsed="0.082762"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:58:12.734303" elapsed="0.085029"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:12.733913" elapsed="0.085458"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:58:12.732895" elapsed="0.086561"/>
</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-10-11T00:58:12.836222" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:12.835802" elapsed="0.000449"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:12.837153" 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-10-11T00:58:12.836810" elapsed="0.000422">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-10-11T00:58:12.837383" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:12.836438" elapsed="0.000985"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.838001" 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-10-11T00:58:12.837601" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:12.838324" 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-10-11T00:58:12.838477" 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-10-11T00:58:12.838195" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.839035" 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-10-11T00:58:12.838732" elapsed="0.000345"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.840648" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:12.839979" elapsed="0.000833"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.841936" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:58:12.841107" elapsed="0.000926"/>
</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-10-11T00:58:12.842683" elapsed="0.000067"/>
</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-10-11T00:58:12.843034" elapsed="0.000126"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:58:12.843486" elapsed="0.000068"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:58:12.842393" elapsed="0.001202"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:58:12.842111" elapsed="0.001543"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:58:12.843749" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:58:12.843971" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:58:12.839454" elapsed="0.004541"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:12.839139" elapsed="0.004885"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.844199" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.844045" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.839122" elapsed="0.005145"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.845028" 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-10-11T00:58:12.844560" elapsed="0.000495"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:12.845098" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:58:12.835276" elapsed="0.009920"/>
</kw>
<msg time="2026-10-11T00:58:12.845244" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:12.830391" elapsed="0.014897"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:58:12.849568" 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/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-10-11T00:58:12.853833" 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_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-10-11T00:58:12.859206" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.859439" 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-10-11T00:58:12.859628" 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-10-11T00:58:12.859990" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.859820" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:12.859806" 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-10-11T00:58:12.860220" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.860402" 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-10-11T00:58:12.860591" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:58:12.859780" elapsed="0.000858"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:58:12.859694" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.860813" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:12.860894" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:58:12.861001" 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-10-11T00:58:12.829789" elapsed="0.031237"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:12.862148" 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-10-11T00:58:12.861954" elapsed="0.000254">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-10-11T00:58:12.862289" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:12.861613" elapsed="0.000699"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.862614" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.862375" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.863130" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:12.862868" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:12.862686" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.862358" elapsed="0.000847"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.863715" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:12.863367" elapsed="0.000373"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:58:12.863783" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:58:12.863921" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:58:12.861295" elapsed="0.002649"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:12.864992" 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-10-11T00:58:12.864834" elapsed="0.000206"/>
</kw>
<msg time="2026-10-11T00:58:12.865115" 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-10-11T00:58:12.864511" elapsed="0.000626"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T00:58:12.865298" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:12.865201" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.865183" elapsed="0.000203"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:12.865686" 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-10-11T00:58:12.865803" 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-10-11T00:58:12.865561" elapsed="0.000265"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T00:58:12.866225" 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-10-11T00:58:12.866038" elapsed="0.000211"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T00:58:12.866290" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:58:12.866429" 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-10-11T00:58:12.864194" elapsed="0.002259"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.867712" 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-10-11T00:58:12.867488" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.868179" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:12.867963" elapsed="0.000255"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:12.877124" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node05qyjd6e9gd4kd0gcztbjfjzf18.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:12.877269" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:58:12.877363" 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-10-11T00:58:12.868523" elapsed="0.008864"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:12.868277" elapsed="0.009171"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.877629" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.877473" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.868260" elapsed="0.009446"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.879285" 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-10-11T00:58:12.878651" elapsed="0.000680"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:12.878393" elapsed="0.000970"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.878376" elapsed="0.001010"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.879992" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:12.879706" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:12.879461" elapsed="0.000603"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.879445" elapsed="0.000642"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.880631" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:12.880269" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.880959" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.880718" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.881490" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:12.881201" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:12.881035" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.880702" elapsed="0.000865"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.882098" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:12.881743" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.882398" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.882186" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.882973" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:12.882696" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:12.882529" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.882169" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:12.883195" elapsed="0.000307"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:58:12.883904" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:12.883665" elapsed="0.000264"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:58:12.884086" elapsed="0.000210"/>
</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-10-11T00:58:12.878058" elapsed="0.006295"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:12.884512" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:12.884428" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.884397" elapsed="0.000174"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:12.885196" 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-10-11T00:58:12.884715" elapsed="0.000508"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:58:12.885269" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:58:12.885393" 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-10-11T00:58:12.866734" elapsed="0.018700"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:58:12.885490" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T00:58:12.885610" 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-10-11T00:58:12.822394" elapsed="0.063240"/>
</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-10-11T00:58:12.897660" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:12.896827" elapsed="0.000933"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:12.899093" 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-10-11T00:58:12.898811" elapsed="0.000341">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-10-11T00:58:12.899328" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:12.898037" elapsed="0.001412"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.900729" 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-10-11T00:58:12.899729" elapsed="0.001096"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:12.901566" 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-10-11T00:58:12.901805" 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-10-11T00:58:12.901090" elapsed="0.000826"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.902898" 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-10-11T00:58:12.902224" elapsed="0.000840"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:58:12.903880" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.903174" elapsed="0.000798"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.904820" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:12.904346" elapsed="0.000520"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:12.904028" elapsed="0.000887"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.903143" elapsed="0.001824"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.906211" 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-10-11T00:58:12.905195" elapsed="0.001119"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:12.906392" 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/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-10-11T00:58:12.895789" elapsed="0.010793"/>
</kw>
<msg time="2026-10-11T00:58:12.906632" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:12.891094" elapsed="0.015584"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:58:12.911152" 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/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-10-11T00:58:12.915515" 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_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-10-11T00:58:12.919785" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.919986" 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-10-11T00:58:12.920173" 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-10-11T00:58:12.920573" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.920400" elapsed="0.000369"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:12.920387" elapsed="0.000407"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.920973" 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-10-11T00:58:12.921156" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.921324" elapsed="0.000046"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:58:12.920359" elapsed="0.001059"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:58:12.920239" elapsed="0.001205"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:12.921602" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:12.921669" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:58:12.921774" 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-10-11T00:58:12.890366" elapsed="0.031433"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:12.921998" elapsed="0.000316"/>
</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-10-11T00:58:12.923292" 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-10-11T00:58:12.922998" elapsed="0.000321"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:12.923772" 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-10-11T00:58:12.923491" 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-10-11T00:58:12.923998" elapsed="0.000433"/>
</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-10-11T00:58:12.922615" elapsed="0.001873"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:12.922384" elapsed="0.002135"/>
</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-10-11T00:58:12.924718" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:12.924541" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.922368" elapsed="0.002419"/>
</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-10-11T00:58:12.886596" elapsed="0.038233"/>
</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-10-11T00:58:12.885929" elapsed="0.038985"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:12.885706" elapsed="0.039248"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.885690" elapsed="0.039284"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:58:12.925004" elapsed="0.000027"/>
</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-10-11T00:58:12.821783" elapsed="0.103320"/>
</kw>
<doc>Verify empty data on neon</doc>
<status status="PASS" start="2026-10-11T00:58:12.820242" elapsed="0.104913"/>
</kw>
<doc>Verfiy empty data response</doc>
<status status="PASS" start="2026-10-11T00:58:12.820019" elapsed="0.105176"/>
</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-10-11T00:58:12.819633" elapsed="0.105598"/>
</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-10-11T00:58:12.927003" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:12.926709" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.927473" 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-10-11T00:58:12.927227" elapsed="0.000288"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:58:12.930148" 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-10-11T00:58:12.928093" elapsed="0.002108"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:58:12.935513" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T00:58:12.935596" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T00:58:12.930432" elapsed="0.005188"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.936175" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T00:58:12.935954" elapsed="0.000264"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:12.935683" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:12.935666" elapsed="0.000605"/>
</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-10-11T00:58:12.927740" elapsed="0.008573"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:58:12.938392" level="INFO">env exabgp.tcp.port=1790 exabgp --debug bgp-l3vpn-ipv4.cfg</msg>
<msg time="2026-10-11T00:58:12.938488" 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-10-11T00:58:12.936486" elapsed="0.002026"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.938951" 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-10-11T00:58:12.938712" elapsed="0.000281"/>
</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-10-11T00:58:12.926380" elapsed="0.012663"/>
</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-10-11T00:58:12.940786" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:12.940487" elapsed="0.000324"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.941281" 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-10-11T00:58:12.941002" elapsed="0.000303"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:12.947567" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node05qyjd6e9gd4kd0gcztbjfjzf18.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:12.947672" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T00:58:12.947755" 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-10-11T00:58:12.941481" elapsed="0.006297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.948277" 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-10-11T00:58:12.948005" elapsed="0.000315"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T00:58:12.948868" 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-10-11T00:58:12.948509" elapsed="0.000418">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-10-11T00:58:12.940067" elapsed="0.008966">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:15.951670" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:15.950892" elapsed="0.000842"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:15.952870" 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-10-11T00:58:15.952172" elapsed="0.000753"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:15.963588" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node05qyjd6e9gd4kd0gcztbjfjzf18.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:15.963913" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1669'} 
 body={"bgp-rib:peer":[{"peer-id":"bgp://10.30.171.7","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","route-distinguisher":"1.2.3.4:1","prefix":"1.1.1.0/24","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","route-distinguisher":"1.2.3.4:1","prefix":"1.1.1.0/24","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-10-11T00:58:15.964225" 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-10-11T00:58:15.953280" elapsed="0.010999"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:15.965458" level="INFO">{"bgp-rib:peer":[{"peer-id":"bgp://10.30.171.7","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","route-distinguisher":"1.2.3.4:1","prefix":"1.1.1.0/24","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","route-distinguisher":"1.2.3.4:1","prefix":"1.1.1.0/24","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-10-11T00:58:15.964776" elapsed="0.000807"/>
</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-10-11T00:58:15.965993" elapsed="0.000804"/>
</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-10-11T00:58:15.949747" elapsed="0.017199"/>
</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-10-11T00:58:12.939604" elapsed="3.027449"/>
</kw>
<msg time="2026-10-11T00:58:15.967255" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:15.967343" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:12.939203" elapsed="3.028187"/>
</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-10-11T00:58:15.968156" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:15.967606" elapsed="0.000660"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:15.967561" elapsed="0.000756"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="PASS" start="2026-10-11T00:58:15.969121" elapsed="0.000069"/>
</return>
<status status="PASS" start="2026-10-11T00:58:15.968467" elapsed="0.000786"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:15.968395" elapsed="0.000907"/>
</if>
<var name="${idx}">0</var>
<status status="PASS" start="2026-10-11T00:58:12.926217" elapsed="3.043138"/>
</iter>
<var>${idx}</var>
<value>${connection_retries}</value>
<status status="PASS" start="2026-10-11T00:58:12.925867" elapsed="3.043585"/>
</for>
<kw name="Fail" owner="BuiltIn">
<arg>Unable to connect ExaBgp to ODL</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:15.969837" elapsed="0.000046"/>
</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-10-11T00:58:12.925538" elapsed="3.044464"/>
</kw>
<arg>${L3VPN_EXA_CFG}</arg>
<doc>Verifies initial test condition and starts the exabgp</doc>
<status status="PASS" start="2026-10-11T00:58:12.732543" elapsed="3.237579"/>
</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-10-11T00:58:16.005110" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:16.004651" elapsed="0.000496"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:16.006690" 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-10-11T00:58:16.006219" elapsed="0.000648">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-10-11T00:58:16.007061" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:16.005467" elapsed="0.001645"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.008249" 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-10-11T00:58:16.007534" elapsed="0.000772"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:16.008976" 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-10-11T00:58:16.009328" 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-10-11T00:58:16.008715" elapsed="0.000667"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.010401" 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-10-11T00:58:16.009909" elapsed="0.000617"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.012657" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:16.012115" elapsed="0.000633"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.013768" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:58:16.013173" elapsed="0.000671"/>
</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-10-11T00:58:16.014528" 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-10-11T00:58:16.014974" elapsed="0.000342"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:58:16.015731" elapsed="0.000045"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:58:16.014201" elapsed="0.001671"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:58:16.013951" elapsed="0.001984"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:58:16.016022" elapsed="0.000060"/>
</return>
<msg time="2026-10-11T00:58:16.016313" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:58:16.011286" elapsed="0.005079"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:16.010664" elapsed="0.005795"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:16.016868" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:16.016511" elapsed="0.000470"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.010624" elapsed="0.006400"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.018276" 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-10-11T00:58:16.017379" elapsed="0.000963"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:16.018467" 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/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-10-11T00:58:16.003642" elapsed="0.014974"/>
</kw>
<msg time="2026-10-11T00:58:16.018685" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:15.995329" elapsed="0.023419"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:58:16.024769" 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_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-10-11T00:58:16.030873" 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/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-10-11T00:58:16.036907" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:16.037218" 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-10-11T00:58:16.037499" 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-10-11T00:58:16.038004" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:16.037778" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:16.037759" 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-10-11T00:58:16.038330" 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-10-11T00:58:16.038608" 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-10-11T00:58:16.038862" elapsed="0.000027"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:58:16.037723" elapsed="0.001208"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:58:16.037592" elapsed="0.001371"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:16.039179" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:16.039273" elapsed="0.000021"/>
</return>
<msg time="2026-10-11T00:58:16.039448" 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-10-11T00:58:15.993950" elapsed="0.045534"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:16.041080" 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-10-11T00:58:16.040793" elapsed="0.000370">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-10-11T00:58:16.041281" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:16.040311" elapsed="0.001003"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:16.041744" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:16.041402" elapsed="0.000433"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.042522" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:16.042126" elapsed="0.000430"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:16.041868" elapsed="0.000733"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.041378" elapsed="0.001250"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.043352" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:16.042876" elapsed="0.000511"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:58:16.043470" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:58:16.043646" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:58:16.039884" elapsed="0.003794"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:16.045148" 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-10-11T00:58:16.044952" elapsed="0.000255">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-10-11T00:58:16.045293" 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-10-11T00:58:16.044574" elapsed="0.000742"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:58:16.045496" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:58:16.045379" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.045362" 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-10-11T00:58:16.045772" elapsed="0.000020"/>
</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-10-11T00:58:16.046011" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:58:16.046070" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:58:16.046195" 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-10-11T00:58:16.044074" elapsed="0.002144"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.047485" 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-10-11T00:58:16.047245" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.048135" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:16.047723" elapsed="0.000453"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:16.056072" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node05qyjd6e9gd4kd0gcztbjfjzf18.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:16.056182" level="INFO">GET Response : url=http://10.30.170.173: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","route-distinguisher":"1.2.3.4:1","prefix":"1.1.1.0/24","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-10-11T00:58:16.056279" 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-10-11T00:58:16.048486" elapsed="0.007818"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:16.048238" elapsed="0.008105"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:16.056547" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:16.056367" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.048221" elapsed="0.008404"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.057918" level="INFO">{"bgp-vpn-ipv4:vpn-ipv4-routes":{"vpn-route":[{"path-id":0,"route-key":"WAABAQIDBAABAQEB","route-distinguisher":"1.2.3.4:1","prefix":"1.1.1.0/24","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-10-11T00:58:16.057574" elapsed="0.000389"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:16.057311" elapsed="0.000683"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.057295" elapsed="0.000722"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.058602" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:16.058313" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:16.058066" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.058052" elapsed="0.000645"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.059253" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:16.058893" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:16.059575" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:16.059342" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.060092" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:16.059814" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:16.059649" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.059326" elapsed="0.000842"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.060706" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:16.060345" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:16.061022" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:16.060794" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.061579" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:16.061296" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:16.061125" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.060778" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:16.061802" elapsed="0.000305"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:58:16.062530" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:16.062271" elapsed="0.000284"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:58:16.062713" elapsed="0.000232"/>
</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-10-11T00:58:16.056977" elapsed="0.006025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:16.063145" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:16.063064" elapsed="0.000121"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.063047" elapsed="0.000158"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:16.063979" 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-10-11T00:58:16.063350" elapsed="0.000656"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:58:16.064053" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:58:16.064180" 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-10-11T00:58:16.046525" elapsed="0.017679"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:58:16.064258" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:58:16.064383" 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-10-11T00:58:15.976804" elapsed="0.087617"/>
</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-10-11T00:58:16.075378" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:16.075076" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:16.076139" 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-10-11T00:58:16.075918" elapsed="0.000340">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-10-11T00:58:16.076445" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:16.075584" elapsed="0.000886"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.077011" 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-10-11T00:58:16.076648" elapsed="0.000389"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:16.077314" 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-10-11T00:58:16.077458" 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-10-11T00:58:16.077206" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.077953" 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-10-11T00:58:16.077714" 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-10-11T00:58:16.078362" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:16.078059" elapsed="0.000381"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.079077" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:16.078615" elapsed="0.000487"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:16.078464" elapsed="0.000670"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.078041" elapsed="0.001113"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.079720" 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-10-11T00:58:16.079319" elapsed="0.000428"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:16.079791" 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/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-10-11T00:58:16.074556" elapsed="0.005353"/>
</kw>
<msg time="2026-10-11T00:58:16.079957" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:16.069966" elapsed="0.010035"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:58:16.084266" 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/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-10-11T00:58:16.088488" 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/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-10-11T00:58:16.092843" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:16.093029" 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-10-11T00:58:16.093214" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:16.093567" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:16.093417" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:16.093391" 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-10-11T00:58:16.093794" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:16.093990" 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-10-11T00:58:16.094188" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:58:16.093366" elapsed="0.000870"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:58:16.093278" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:16.094428" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:16.094496" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:58:16.094604" 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-10-11T00:58:16.069231" elapsed="0.025398"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:16.094797" elapsed="0.000327"/>
</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-10-11T00:58:16.096176" 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-10-11T00:58:16.095776" elapsed="0.000427"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:16.096746" 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-10-11T00:58:16.096356" elapsed="0.000416"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:58:16.096975" elapsed="0.000277"/>
</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-10-11T00:58:16.095397" elapsed="0.001910"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:16.095194" elapsed="0.002143"/>
</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-10-11T00:58:16.097553" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:16.097359" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.095177" elapsed="0.002446"/>
</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-10-11T00:58:16.065377" elapsed="0.032289"/>
</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-10-11T00:58:16.064709" elapsed="0.033021"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:16.064497" elapsed="0.033272"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.064481" elapsed="0.033309"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:58:16.097854" elapsed="0.000027"/>
</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-10-11T00:58:15.975356" elapsed="0.122599"/>
</kw>
<arg>${L3VPN_RSP}</arg>
<doc>Verifies expected response</doc>
<status status="PASS" start="2026-10-11T00:58:15.971660" elapsed="0.126349"/>
</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-10-11T00:58:15.970571" elapsed="0.127477"/>
</kw>
<kw name="Teardown_Simple" type="TEARDOWN">
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-10-11T00:58:16.099045" level="INFO">[?2004l00:58:13 | 2888   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:58:13 | 2888   | [01;34mversion      [0m | [1m4.2.17  [0m
00:58:13 | 2888   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
00:58:13 | 2888   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
00:58:13 | 2888   | [01;34minstallation [0m | [1m        [0m
00:58:13 | 2888   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:58:13 | 2888   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:58:13 | 2888   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:58:13 | 2888   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:58:13 | 2888   | [01;31mcli control  [0m | [1m - /run/[0m
00:58:13 | 2888   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:58:13 | 2888   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:58:13 | 2888   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:58:13 | 2888   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:58:13 | 2888   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:58:13 | 2888   | [01;31mcli control  [0m | [1m - /run/[0m
00:58:13 | 2888   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:58:13 | 2888   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:58:13 | 2888   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:58:13 | 2888   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:58:13 | 2888   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:58:13 | 2888   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:58:13 | 2888   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:58:13 | 2888   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:58:13 | 2888   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
00:58:13 | 2888   | configuration[0m | . router-id        | '10.30.171.7'[0m
00:58:13 | 2888   | configuration[0m | . local-address    | '10.30.171.7'[0m
00:58:13 | 2888   | configuration[0m | . local-as         | '64496'[0m
00:58:13 | 2888   | configuration[0m | . peer-as          | '64496'[0m
00:58:13 | 2888   | configuration[0m | &gt; family           | [0m
00:58:13 | 2888   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
00:58:13 | 2888   | configuration[0m | &lt; family           | [0m
00:58:13 | 2888   | configuration[0m | &gt; static           | [0m
00:58:13 | 2888   | configuration[0m | &gt; route            | '1.1.1.0/24'[0m
00:58:13 | 2888   | configuration[0m | . next-hop         | '10.0.255.254'[0m
00:58:13 | 2888   | configuration[0m | . rd               | '1.2.3.4:1'[0m
00:58:13 | 2888   | configuration[0m | . label            | '24005'[0m
00:58:13 | 2888   | configuration[0m | &lt; route            | [0m
00:58:13 | 2888   | configuration[0m | &lt; static           | [0m
00:58:13 | 2888   | configuration[0m | &lt; neighbor         | [0m
00:58:13 | 2888   | reactor      [0m | new peer: neighbor 10.30.170.173 local-ip 10.30.171.7 local-as 64496 peer-as 64496 router-id 10.30.171.7 family-allowed in-open[0m
00:58:13 | 2888   | [01;34mreactor      [0m | [1mloaded new configuration successfully[0m
00:58:13 | 2888   | reactor      [0m | initialising connection to peer-1[0m
00:58:13 | 2888   | outgoing-1   [0m | attempting connection to 10.30.170.173:1790[0m
00:58:13 | 2888   | outgoing-1   [0m | sending TCP payload (  49) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0031 0104 FBF0 00B4 0A1E AB07 1402 0601 0400 0100 8002 0641 0400 00FB F002 0206 00[0m
00:58:13 | 2888   | outgoing-1   [0m | &gt;&gt; OPEN version=4 asn=64496 hold_time=180 router_id=10.30.171.7 capabilities=[Multiprotocol(ipv4 mpls-vpn), Extended Message(65535), ASN4(64496)][0m
00:58:13 | 2888   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 00D9 01[0m
00:58:13 | 2888   | 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 0001 0500 0002 8600 0001 8100 4004 4700 0002 0400 0002 8000 0002 0500 0002 8100 0001 0100 0001 8500 0001 8400 0001 8600 0019 4600 0002 0100 0002 8500 0001 0400 0001 8000 4700[0m
00:58:13 | 2888   | outgoing-1   [0m | &lt;&lt; message of type OPEN[0m
00:58:13 | 2888   | 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 ipv4/unknown safi 5=0x0 ipv6/flow-vpn=0x0 ipv4/unknown safi 129=0x0 bgp-ls/bgp-ls=0x0 ipv6/nlri-mpls=0x0 ipv6/mpls-vpn=0x0 ipv6/unknown safi 5=0x0 ipv6/unknown safi 129=0x0 ipv4/unicast=0x0 ipv4/flow=0x0 ipv4/rtc=0x0 ipv4/flow-vpn=0x0 l2vpn/evpn=0x0 ipv6/unicast=0x0 ipv6/flow=0x0 ipv4/nlri-mpls=0x0 ipv4/mpls-vpn=0x0, ASN4(64496), Unassigned 71][0m
00:58:13 | 2888   | ka-outgoing-1[0m | receive-timer 60 second(s) left[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m--------------------------------------------------------------------[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1mthe connection can not carry the following family/families[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/nlri-mpls[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/unicast[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/unknown safi 5[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/unknown safi 129[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for l2vpn/evpn[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/flow[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/unknown safi 5[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/flow-vpn[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/flow[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/unicast[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/nlri-mpls[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/unknown safi 129[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/mpls-vpn[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/rtc[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/flow-vpn[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for bgp-ls/bgp-ls[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1mtherefore no routes of this kind can be announced on the connection[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m--------------------------------------------------------------------[0m
00:58:13 | 2888   | outgoing-1   [0m | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04[0m
00:58:13 | 2888   | outgoing-1   [0m | &gt;&gt; KEEPALIVE (OPENCONFIRM)[0m
00:58:13 | 2888   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04[0m
00:58:13 | 2888   | outgoing-1   [0m | &lt;&lt; message of type KEEPALIVE[0m
00:58:13 | 2888   | ka-outgoing-1[0m | receive-timer 180 second(s) left[0m
00:58:13 | 2888   | [01;34mreactor      [0m | [1mconnected to peer-1 with outgoing-1 10.30.171.7-10.30.170.173[0m
00:58:13 | 2888   | 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:58:13 | 2888   | outgoing-1   [0m | &gt;&gt; 1 UPDATE(s)[0m
00:58:13 | 2888   | outgoing-1   [0m | sending TCP payload (  30) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001E 0200 0000 0790 0F00 0300 0180[0m
00:58:13 | 2888   | outgoing-1   [0m | &gt;&gt; EOR ipv4 mpls-vpn[0m
00:58:13 | 2888   | peer-1       [0m | &gt;&gt; EOR(s)[0m
00:58:13 | 2888   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02[0m
00:58:13 | 2888   | outgoing-1   [0m | received complete TCP payload (   4) 0000 0000[0m
00:58:13 | 2888   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:58:13 | 2888   | parser       [0m | parsing UPDATE (   4) 0000 0000[0m
00:58:13 | 2888   | peer-1       [0m | &lt;&lt; UPDATE #1[0m
00:58:13 | 2888   | peer-1       [0m |    UPDATE #1 nlri  (   4) eor 1/1 (ipv4 unicast)[0m
00:58:13 | 2888   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02[0m
00:58:13 | 2888   | outgoing-1   [0m | received complete TCP payload (   4) 0000 0000[0m
00:58:13 | 2888   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:58:13 | 2888   | parser       [0m | parsing UPDATE (   4) 0000 0000[0m
00:58:13 | 2888   | peer-1       [0m | &lt;&lt; UPDATE #2[0m
00:58:13 | 2888   | peer-1       [0m |    UPDATE #2 nlri  (   4) eor 1/1 (ipv4 unicast)[0m
00:58:13 | 2888   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001D 02[0m
00:58:13 | 2888   | outgoing-1   [0m | received complete TCP payload (  10) 0000 0006 800F 0300 0180[0m
00:58:13 | 2888   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:58:13 | 2888   | parser       [0m | parsing UPDATE (  10) 0000 0006 800F 0300 0180[0m
00:58:13 | 2888   | routes       [0m | withdrawn NLRI none[0m
00:58:13 | 2888   | parser       [0m | attribute mp-unreach-nlri    flag 0x80 type 0x0f len 0x03 payload 0001 80[0m
00:58:13 | 2888   | routes       [0m | announced NLRI none[0m
00:58:13 | 2888   | peer-1       [0m | &lt;&lt; UPDATE #3[0m
00:58:13 | 2888   | peer-1       [0m |    UPDATE #3 nlri  (  11) eor 1/128 (ipv4 mpls-vpn)[0m
00:58:14 | 2888   | ka-outgoing-1[0m | receive-timer 179 second(s) left[0m
00:58:14 | 2888   | ka-outgoing-1[0m | send-timer 59 second(s) left[0m
00:58:15 | 2888   | ka-outgoing-1[0m | receive-timer 178 second(s) left[0m
00:58:15 | 2888   | ka-outgoing-1[0m | send-timer 58 second(s) left[0m
00:58:16 | 2888   | ka-outgoing-1[0m | receive-timer 177 second(s) left[0m
00:58:16 | 2888   | ka-outgoing-1[0m | send-timer 57 second(s) left[0m</msg>
<msg time="2026-10-11T00:58:16.099334" level="INFO">${output} = [?2004l00:58:13 | 2888   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:58:13 | 2888   | [01;34mversion      [0m | [1m4.2.17  [0m
00:58:13 | 2888   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-10-11T00:58:16.098916" elapsed="0.000447"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.099797" level="INFO">[?2004l00:58:13 | 2888   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
00:58:13 | 2888   | [01;34mversion      [0m | [1m4.2.17  [0m
00:58:13 | 2888   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
00:58:13 | 2888   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
00:58:13 | 2888   | [01;34minstallation [0m | [1m        [0m
00:58:13 | 2888   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
00:58:13 | 2888   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
00:58:13 | 2888   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:58:13 | 2888   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:58:13 | 2888   | [01;31mcli control  [0m | [1m - /run/[0m
00:58:13 | 2888   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:58:13 | 2888   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:58:13 | 2888   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:58:13 | 2888   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
00:58:13 | 2888   | [01;31mcli control  [0m | [1m - /run/1001/[0m
00:58:13 | 2888   | [01;31mcli control  [0m | [1m - /run/[0m
00:58:13 | 2888   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
00:58:13 | 2888   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
00:58:13 | 2888   | [01;31mcli control  [0m | [1m - /var/run/[0m
00:58:13 | 2888   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
00:58:13 | 2888   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
00:58:13 | 2888   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
00:58:13 | 2888   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
00:58:13 | 2888   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
00:58:13 | 2888   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
00:58:13 | 2888   | configuration[0m | . router-id        | '10.30.171.7'[0m
00:58:13 | 2888   | configuration[0m | . local-address    | '10.30.171.7'[0m
00:58:13 | 2888   | configuration[0m | . local-as         | '64496'[0m
00:58:13 | 2888   | configuration[0m | . peer-as          | '64496'[0m
00:58:13 | 2888   | configuration[0m | &gt; family           | [0m
00:58:13 | 2888   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
00:58:13 | 2888   | configuration[0m | &lt; family           | [0m
00:58:13 | 2888   | configuration[0m | &gt; static           | [0m
00:58:13 | 2888   | configuration[0m | &gt; route            | '1.1.1.0/24'[0m
00:58:13 | 2888   | configuration[0m | . next-hop         | '10.0.255.254'[0m
00:58:13 | 2888   | configuration[0m | . rd               | '1.2.3.4:1'[0m
00:58:13 | 2888   | configuration[0m | . label            | '24005'[0m
00:58:13 | 2888   | configuration[0m | &lt; route            | [0m
00:58:13 | 2888   | configuration[0m | &lt; static           | [0m
00:58:13 | 2888   | configuration[0m | &lt; neighbor         | [0m
00:58:13 | 2888   | reactor      [0m | new peer: neighbor 10.30.170.173 local-ip 10.30.171.7 local-as 64496 peer-as 64496 router-id 10.30.171.7 family-allowed in-open[0m
00:58:13 | 2888   | [01;34mreactor      [0m | [1mloaded new configuration successfully[0m
00:58:13 | 2888   | reactor      [0m | initialising connection to peer-1[0m
00:58:13 | 2888   | outgoing-1   [0m | attempting connection to 10.30.170.173:1790[0m
00:58:13 | 2888   | outgoing-1   [0m | sending TCP payload (  49) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0031 0104 FBF0 00B4 0A1E AB07 1402 0601 0400 0100 8002 0641 0400 00FB F002 0206 00[0m
00:58:13 | 2888   | outgoing-1   [0m | &gt;&gt; OPEN version=4 asn=64496 hold_time=180 router_id=10.30.171.7 capabilities=[Multiprotocol(ipv4 mpls-vpn), Extended Message(65535), ASN4(64496)][0m
00:58:13 | 2888   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 00D9 01[0m
00:58:13 | 2888   | 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 0001 0500 0002 8600 0001 8100 4004 4700 0002 0400 0002 8000 0002 0500 0002 8100 0001 0100 0001 8500 0001 8400 0001 8600 0019 4600 0002 0100 0002 8500 0001 0400 0001 8000 4700[0m
00:58:13 | 2888   | outgoing-1   [0m | &lt;&lt; message of type OPEN[0m
00:58:13 | 2888   | 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 ipv4/unknown safi 5=0x0 ipv6/flow-vpn=0x0 ipv4/unknown safi 129=0x0 bgp-ls/bgp-ls=0x0 ipv6/nlri-mpls=0x0 ipv6/mpls-vpn=0x0 ipv6/unknown safi 5=0x0 ipv6/unknown safi 129=0x0 ipv4/unicast=0x0 ipv4/flow=0x0 ipv4/rtc=0x0 ipv4/flow-vpn=0x0 l2vpn/evpn=0x0 ipv6/unicast=0x0 ipv6/flow=0x0 ipv4/nlri-mpls=0x0 ipv4/mpls-vpn=0x0, ASN4(64496), Unassigned 71][0m
00:58:13 | 2888   | ka-outgoing-1[0m | receive-timer 60 second(s) left[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m--------------------------------------------------------------------[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1mthe connection can not carry the following family/families[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/nlri-mpls[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/unicast[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/unknown safi 5[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/unknown safi 129[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for l2vpn/evpn[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/flow[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/unknown safi 5[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/flow-vpn[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/flow[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/unicast[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/nlri-mpls[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/unknown safi 129[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/mpls-vpn[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv4/rtc[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for ipv6/flow-vpn[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m - exabgp is not configured for bgp-ls/bgp-ls[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1mtherefore no routes of this kind can be announced on the connection[0m
00:58:13 | 2888   | [01;33moutgoing-1   [0m | [1m--------------------------------------------------------------------[0m
00:58:13 | 2888   | outgoing-1   [0m | sending TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04[0m
00:58:13 | 2888   | outgoing-1   [0m | &gt;&gt; KEEPALIVE (OPENCONFIRM)[0m
00:58:13 | 2888   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0013 04[0m
00:58:13 | 2888   | outgoing-1   [0m | &lt;&lt; message of type KEEPALIVE[0m
00:58:13 | 2888   | ka-outgoing-1[0m | receive-timer 180 second(s) left[0m
00:58:13 | 2888   | [01;34mreactor      [0m | [1mconnected to peer-1 with outgoing-1 10.30.171.7-10.30.170.173[0m
00:58:13 | 2888   | 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:58:13 | 2888   | outgoing-1   [0m | &gt;&gt; 1 UPDATE(s)[0m
00:58:13 | 2888   | outgoing-1   [0m | sending TCP payload (  30) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001E 0200 0000 0790 0F00 0300 0180[0m
00:58:13 | 2888   | outgoing-1   [0m | &gt;&gt; EOR ipv4 mpls-vpn[0m
00:58:13 | 2888   | peer-1       [0m | &gt;&gt; EOR(s)[0m
00:58:13 | 2888   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02[0m
00:58:13 | 2888   | outgoing-1   [0m | received complete TCP payload (   4) 0000 0000[0m
00:58:13 | 2888   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:58:13 | 2888   | parser       [0m | parsing UPDATE (   4) 0000 0000[0m
00:58:13 | 2888   | peer-1       [0m | &lt;&lt; UPDATE #1[0m
00:58:13 | 2888   | peer-1       [0m |    UPDATE #1 nlri  (   4) eor 1/1 (ipv4 unicast)[0m
00:58:13 | 2888   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 0017 02[0m
00:58:13 | 2888   | outgoing-1   [0m | received complete TCP payload (   4) 0000 0000[0m
00:58:13 | 2888   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:58:13 | 2888   | parser       [0m | parsing UPDATE (   4) 0000 0000[0m
00:58:13 | 2888   | peer-1       [0m | &lt;&lt; UPDATE #2[0m
00:58:13 | 2888   | peer-1       [0m |    UPDATE #2 nlri  (   4) eor 1/1 (ipv4 unicast)[0m
00:58:13 | 2888   | outgoing-1   [0m | received complete TCP payload (  19) FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 001D 02[0m
00:58:13 | 2888   | outgoing-1   [0m | received complete TCP payload (  10) 0000 0006 800F 0300 0180[0m
00:58:13 | 2888   | outgoing-1   [0m | &lt;&lt; message of type UPDATE[0m
00:58:13 | 2888   | parser       [0m | parsing UPDATE (  10) 0000 0006 800F 0300 0180[0m
00:58:13 | 2888   | routes       [0m | withdrawn NLRI none[0m
00:58:13 | 2888   | parser       [0m | attribute mp-unreach-nlri    flag 0x80 type 0x0f len 0x03 payload 0001 80[0m
00:58:13 | 2888   | routes       [0m | announced NLRI none[0m
00:58:13 | 2888   | peer-1       [0m | &lt;&lt; UPDATE #3[0m
00:58:13 | 2888   | peer-1       [0m |    UPDATE #3 nlri  (  11) eor 1/128 (ipv4 mpls-vpn)[0m
00:58:14 | 2888   | ka-outgoing-1[0m | receive-timer 179 second(s) left[0m
00:58:14 | 2888   | ka-outgoing-1[0m | send-timer 59 second(s) left[0m
00:58:15 | 2888   | ka-outgoing-1[0m | receive-timer 178 second(s) left[0m
00:58:15 | 2888   | ka-outgoing-1[0m | send-timer 58 second(s) left[0m
00:58:16 | 2888   | ka-outgoing-1[0m | receive-timer 177 second(s) left[0m
00:58:16 | 2888   | 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-10-11T00:58:16.099575" elapsed="0.000482"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.100885" 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-10-11T00:58:16.100580" 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-10-11T00:58:16.101065" 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-10-11T00:58:16.100249" elapsed="0.001080"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:58:16.232156" level="INFO">^C00:58:16 | 2888   | [00;31mreactor      [0m | [1m^C received[0m
00:58:16 | 2888   | [00;31mreactor      [0m | [1mperforming shutdown[0m
00:58:16 | 2888   | outgoing-1   [0m | stop, message [shutting down][0m
00:58:16 | 2888   | [01;33moutgoing-1   [0m | [1moutgoing-1 10.30.171.7-10.30.170.173, closing connection[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T00:58:16.232256" level="INFO">${output} = ^C00:58:16 | 2888   | [00;31mreactor      [0m | [1m^C received[0m
00:58:16 | 2888   | [00;31mreactor      [0m | [1mperforming shutdown[0m
00:58:16 | 2888   | 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-10-11T00:58:16.101517" elapsed="0.130767"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.232724" level="INFO">^C00:58:16 | 2888   | [00;31mreactor      [0m | [1m^C received[0m
00:58:16 | 2888   | [00;31mreactor      [0m | [1mperforming shutdown[0m
00:58:16 | 2888   | outgoing-1   [0m | stop, message [shutting down][0m
00:58:16 | 2888   | [01;33moutgoing-1   [0m | [1moutgoing-1 10.30.171.7-10.30.170.173, closing connection[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T00:58:16.232498" elapsed="0.000276"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:58:16.235306" 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-10-11T00:58:16.233385" elapsed="0.001974"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:58:16.236399" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T00:58:16.236494" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-423-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-10-11T00:58:16.235547" elapsed="0.000973"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.237078" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-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-10-11T00:58:16.236852" elapsed="0.000269"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:16.236581" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.236563" elapsed="0.000611"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-10-11T00:58:16.233017" elapsed="0.004199"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-10-11T00:58:16.098599" elapsed="0.138663"/>
</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-10-11T00:58:16.254162" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:16.253740" elapsed="0.000449"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:16.255090" 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-10-11T00:58:16.254749" elapsed="0.000417">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-10-11T00:58:16.255319" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:16.254349" elapsed="0.000993"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.255940" 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-10-11T00:58:16.255537" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:16.256265" 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-10-11T00:58:16.256384" 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-10-11T00:58:16.256137" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.256946" 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-10-11T00:58:16.256636" elapsed="0.000353"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.258701" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:16.257966" elapsed="0.000926"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.260058" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:58:16.259189" elapsed="0.000967"/>
</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-10-11T00:58:16.260838" elapsed="0.000069"/>
</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-10-11T00:58:16.261178" elapsed="0.000129"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T00:58:16.261595" elapsed="0.000070"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T00:58:16.260561" elapsed="0.001145"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T00:58:16.260236" elapsed="0.001531"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:58:16.261883" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T00:58:16.262092" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:58:16.257343" elapsed="0.004774"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:16.257050" elapsed="0.005096"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:16.262321" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:16.262169" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.257032" elapsed="0.005358"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.263316" 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-10-11T00:58:16.262719" elapsed="0.000626"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:16.263392" 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-10-11T00:58:16.253194" elapsed="0.010318"/>
</kw>
<msg time="2026-10-11T00:58:16.263560" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:16.248622" elapsed="0.014992"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:58:16.267927" 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/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-10-11T00:58:16.272181" 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/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-10-11T00:58:16.276416" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:16.276602" 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-10-11T00:58:16.276787" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:16.277173" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:16.276991" elapsed="0.000233"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:16.276977" 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-10-11T00:58:16.277422" 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-10-11T00:58:16.277609" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:16.277777" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:58:16.276952" elapsed="0.000887"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:58:16.276866" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:16.278020" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:16.278086" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:58:16.278194" 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-10-11T00:58:16.247994" elapsed="0.030224"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:16.279372" 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-10-11T00:58:16.279173" elapsed="0.000273">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-10-11T00:58:16.279530" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:16.278845" elapsed="0.000707"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:16.279867" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:16.279615" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.280375" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:16.280112" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:16.279942" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.279597" elapsed="0.000870"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.280985" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:16.280632" elapsed="0.000377"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:58:16.281054" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:58:16.281177" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:58:16.278499" elapsed="0.002700"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:16.282273" 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-10-11T00:58:16.282127" elapsed="0.000195"/>
</kw>
<msg time="2026-10-11T00:58:16.282402" 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-10-11T00:58:16.281790" elapsed="0.000650"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T00:58:16.282605" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:16.282505" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.282488" elapsed="0.000178"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:16.282960" 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-10-11T00:58:16.283073" 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-10-11T00:58:16.282833" elapsed="0.000264"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T00:58:16.283499" 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-10-11T00:58:16.283294" elapsed="0.000229"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T00:58:16.283566" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:58:16.283690" 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-10-11T00:58:16.281466" elapsed="0.002247"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.284974" 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-10-11T00:58:16.284740" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.285440" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:16.285209" elapsed="0.000272"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:16.293150" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node05qyjd6e9gd4kd0gcztbjfjzf18.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:16.293258" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:58:16.293342" 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-10-11T00:58:16.285771" elapsed="0.007596"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:16.285541" 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-10-11T00:58:16.293609" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:16.293453" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.285524" elapsed="0.008162"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.295120" 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-10-11T00:58:16.294641" elapsed="0.000524"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:16.294382" elapsed="0.000815"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.294365" elapsed="0.000855"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.295840" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:16.295550" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:16.295270" elapsed="0.000645"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.295255" elapsed="0.000682"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.296481" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:16.296114" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:16.296787" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:16.296570" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.297305" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:16.297043" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:16.296877" elapsed="0.000485"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.296554" elapsed="0.000827"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.297933" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:16.297583" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:16.298232" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:16.298021" elapsed="0.000263"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.298762" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:16.298502" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:16.298305" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.298005" elapsed="0.000848"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:16.299032" elapsed="0.000295"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:58:16.299737" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:16.299515" elapsed="0.000246"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:58:16.299938" elapsed="0.000210"/>
</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-10-11T00:58:16.294022" elapsed="0.006182"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:16.300347" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:16.300265" elapsed="0.000122"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.300249" elapsed="0.000174"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:16.301027" 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-10-11T00:58:16.300569" elapsed="0.000484"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:58:16.301100" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:58:16.301225" 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-10-11T00:58:16.284007" elapsed="0.017243"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:58:16.301305" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:58:16.301440" 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-10-11T00:58:16.240400" elapsed="0.061066"/>
</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-10-11T00:58:16.314650" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:16.313790" elapsed="0.000960"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:16.316032" 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-10-11T00:58:16.315839" elapsed="0.000251">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-10-11T00:58:16.316261" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:16.315032" elapsed="0.001326"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.317743" 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-10-11T00:58:16.316701" elapsed="0.001161"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:16.318454" 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-10-11T00:58:16.318687" 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-10-11T00:58:16.318115" elapsed="0.000669"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.319783" 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-10-11T00:58:16.319078" elapsed="0.000887"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:58:16.320750" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:16.320077" elapsed="0.000781"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.321783" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:16.321234" elapsed="0.000593"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:16.320914" elapsed="0.000964"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.320045" elapsed="0.001886"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.323097" 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-10-11T00:58:16.322157" elapsed="0.001038"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:16.323275" 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/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-10-11T00:58:16.312707" elapsed="0.010840"/>
</kw>
<msg time="2026-10-11T00:58:16.323599" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:16.308088" elapsed="0.015568"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:58:16.328035" 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/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-10-11T00:58:16.332348" 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/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-10-11T00:58:16.336940" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:16.337129" 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-10-11T00:58:16.337317" 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-10-11T00:58:16.337714" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:16.337563" elapsed="0.000361"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:16.337549" elapsed="0.000400"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:16.338113" 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-10-11T00:58:16.338297" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:16.338485" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:58:16.337521" elapsed="0.001015"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:58:16.337385" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:16.338713" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:16.338832" elapsed="0.000017"/>
</return>
<msg time="2026-10-11T00:58:16.338941" 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-10-11T00:58:16.307321" elapsed="0.031645"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:16.339138" elapsed="0.000337"/>
</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-10-11T00:58:16.340471" 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-10-11T00:58:16.340154" elapsed="0.000345"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:16.340955" 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-10-11T00:58:16.340652" 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-10-11T00:58:16.341167" elapsed="0.000437"/>
</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-10-11T00:58:16.339748" elapsed="0.001912"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:16.339546" elapsed="0.002144"/>
</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-10-11T00:58:16.341906" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:16.341713" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.339529" elapsed="0.002448"/>
</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-10-11T00:58:16.302448" elapsed="0.039572"/>
</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-10-11T00:58:16.301744" elapsed="0.040339"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:16.301539" elapsed="0.040584"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.301523" elapsed="0.040621"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:58:16.342173" elapsed="0.000026"/>
</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-10-11T00:58:16.239761" elapsed="0.102510"/>
</kw>
<doc>Verify empty data on neon</doc>
<status status="PASS" start="2026-10-11T00:58:16.238223" elapsed="0.104100"/>
</kw>
<doc>Verfiy empty data response</doc>
<status status="PASS" start="2026-10-11T00:58:16.237811" elapsed="0.104552"/>
</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-10-11T00:58:16.237451" elapsed="0.104948"/>
</kw>
<doc>Testcse teardown with data verification</doc>
<status status="PASS" start="2026-10-11T00:58:16.098233" elapsed="0.244239"/>
</kw>
<doc>Testing mpls vpn ipv4 routes reported to odl from exabgp</doc>
<status status="PASS" start="2026-10-11T00:58:12.732137" elapsed="3.610372"/>
</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-10-11T00:58:16.344341" elapsed="0.000226"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:58:16.344089" 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-10-11T00:58:16.345837" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:16.345733" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.345716" elapsed="0.000184"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:16.348134" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:16.348051" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.348034" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.349157" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:16.348784" elapsed="0.000398"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.349619" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:58:16.349339" elapsed="0.000305"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:58:16.349684" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:58:16.349810" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:58:16.348420" elapsed="0.001425"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:16.352375" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:16.352291" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.352274" elapsed="0.000179"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:16.353500" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:16.353393" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.353376" elapsed="0.000186"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:16.353895" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:58:16.353712" elapsed="0.000208"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:16.354225" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:16.354086" elapsed="0.000162"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:58:16.389485" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:58:16.354753" elapsed="0.034831"/>
</kw>
<msg time="2026-10-11T00:58:16.389747" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:58:16.389788" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:16.354422" elapsed="0.035413"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:58:16.419032" 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-10-11T00:58:16.390346" elapsed="0.028783"/>
</kw>
<msg time="2026-10-11T00:58:16.419276" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:58:16.419318" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:16.390007" elapsed="0.029346"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:16.419655" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:16.419445" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.419403" elapsed="0.000324"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.420153" 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-10-11T00:58:16.419928" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:16.420492" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:16.420273" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.420256" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:58:16.420594" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:16.423186" elapsed="0.000115"/>
</kw>
<msg time="2026-10-11T00:58:16.423358" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:16.421973" 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-10-11T00:58:16.423811" elapsed="0.000089"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:16.424194" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:58:16.421362" elapsed="0.003014"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:58:16.420892" elapsed="0.003567"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:58:16.353139" elapsed="0.071478"/>
</kw>
<msg time="2026-10-11T00:58:16.424717" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:16.424756" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:16.352607" elapsed="0.072185"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:58:16.424962" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:58:16.424877" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.424859" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:16.425363" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:16.425732" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:58:16.425796" 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-10-11T00:58:16.352007" elapsed="0.073891"/>
</kw>
<msg time="2026-10-11T00:58:16.425981" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:16.426020" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:16.350174" elapsed="0.075881"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:16.426342" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:16.426120" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.426104" elapsed="0.000379"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:58:16.350028" elapsed="0.076479"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:58:16.349892" elapsed="0.076641"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:58:16.347739" elapsed="0.078841"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:58:16.345286" elapsed="0.081344"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:16.344769" elapsed="0.081900"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:58:16.343709" elapsed="0.083005"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T00:58:16.437666" 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-10-11T00:58:16.426913" elapsed="0.010807"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:16.439043" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-10-11T00:58:16.482281" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:58:16.482384" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T00:58:16.482445" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T00:58:16.482483" 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-10-11T00:58:16.438883" elapsed="0.043621"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.483272" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T00:58:16.483029" elapsed="0.000284"/>
</kw>
<msg time="2026-10-11T00:58:16.483397" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T00:58:16.483453" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:16.482681" elapsed="0.000793"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.484015" 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-10-11T00:58:16.483653" elapsed="0.000386"/>
</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-10-11T00:58:16.484423" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:16.484108" elapsed="0.000375"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.484090" elapsed="0.000416"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-10-11T00:58:16.484630" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:58:16.484555" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.484541" elapsed="0.000166"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-10-11T00:58:16.484786" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:16.484756" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:16.484742" elapsed="0.000112"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:16.485004" elapsed="0.000020"/>
</kw>
<msg time="2026-10-11T00:58:16.485124" 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-10-11T00:58:16.438450" elapsed="0.046697"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-10-11T00:58:16.485278" elapsed="0.000022"/>
</return>
<status status="PASS" start="2026-10-11T00:58:16.485208" elapsed="0.000118"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:16.485193" elapsed="0.000155"/>
</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-10-11T00:58:16.485534" elapsed="0.000020"/>
</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-10-11T00:58:16.437981" elapsed="0.047628"/>
</kw>
<kw name="Read" owner="SSHLibrary">
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-10-11T00:58:16.485764" elapsed="0.000127"/>
</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-10-11T00:58:16.487434" level="INFO">${command} = python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:16.487137" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:16.487890" level="INFO">python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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-10-11T00:58:16.487661" elapsed="0.000271"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:58:16.523083" level="INFO">python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --peerport=1790 --debug --allf --wfr 1 &amp;&gt; play.py.out</msg>
<msg time="2026-10-11T00:58:16.523171" level="INFO">${output} = python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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-10-11T00:58:16.488086" elapsed="0.035110"/>
</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-10-11T00:58:16.486763" elapsed="0.036489"/>
</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-10-11T00:58:22.525179" 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-10-11T00:58:16.524881" elapsed="6.000973">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-10-11T00:58:22.526205" 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-10-11T00:58:16.524581" elapsed="6.001777">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-10-11T00:58:16.524196" elapsed="6.002302"/>
</kw>
<msg time="2026-10-11T00:58:22.526608" 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-10-11T00:58:16.523801" elapsed="6.002831"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-10-11T00:58:22.526819" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-10-11T00:58:22.526727" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:22.526698" elapsed="0.000210"/>
</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-10-11T00:58:22.527135" elapsed="0.000025"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:22.527318" elapsed="0.000019"/>
</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-10-11T00:58:16.523527" elapsed="6.003866"/>
</kw>
<doc>Starts bgp peer and verifies that the peer runs.</doc>
<status status="PASS" start="2026-10-11T00:58:16.486455" elapsed="6.041078"/>
</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-10-11T00:58:16.486067" elapsed="6.041509"/>
</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-10-11T00:58:16.342947" elapsed="6.184742"/>
</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-10-11T00:58:22.529580" elapsed="0.000255"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:58:22.529305" 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-10-11T00:58:22.530908" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:22.530808" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:22.530788" elapsed="0.000184"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:22.533436" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:22.533330" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:22.533312" elapsed="0.000189"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:22.534451" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:22.534101" elapsed="0.000376"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:58:22.534918" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:58:22.534636" elapsed="0.000307"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:58:22.534983" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:58:22.535113" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:58:22.533720" elapsed="0.001416"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:22.537863" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:22.537777" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:22.537745" elapsed="0.000182"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:22.539011" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:22.538927" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:22.538910" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:22.539398" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:58:22.539225" elapsed="0.000221"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:22.539772" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:22.539616" elapsed="0.000180"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:58:22.575902" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:58:22.540288" elapsed="0.035711"/>
</kw>
<msg time="2026-10-11T00:58:22.576154" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:58:22.576196" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:22.539956" elapsed="0.036276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:58:22.616629" 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-10-11T00:58:22.576785" elapsed="0.039947"/>
</kw>
<msg time="2026-10-11T00:58:22.616896" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:58:22.616936" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:22.576403" elapsed="0.040568"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:22.617248" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:22.617040" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:22.617023" elapsed="0.000332"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:22.617812" 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-10-11T00:58:22.617564" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:22.618146" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:22.617943" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:22.617926" elapsed="0.000290"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:58:22.618246" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:22.620829" elapsed="0.000240"/>
</kw>
<msg time="2026-10-11T00:58:22.621129" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:22.619695" 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-10-11T00:58:22.621601" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:22.621958" 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-10-11T00:58:22.619062" 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-10-11T00:58:22.618563" elapsed="0.003639"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:58:22.538651" elapsed="0.083624"/>
</kw>
<msg time="2026-10-11T00:58:22.622357" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:22.622396" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:22.538080" elapsed="0.084375"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:58:22.622697" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:58:22.622525" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:22.622507" elapsed="0.000285"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:22.623122" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:22.623469" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:58:22.623535" 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-10-11T00:58:22.537474" elapsed="0.086146"/>
</kw>
<msg time="2026-10-11T00:58:22.623703" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:22.623742" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:22.535495" elapsed="0.088299"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:22.624085" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:22.623862" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:22.623846" elapsed="0.000309"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:58:22.535332" elapsed="0.088845"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:58:22.535187" elapsed="0.089018"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:58:22.533027" elapsed="0.091225"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:58:22.530524" elapsed="0.093778"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:22.530043" elapsed="0.094299"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:58:22.528926" elapsed="0.095462"/>
</kw>
<kw name="Play_To_Odl_Non_Removal_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:22.625219" 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-10-11T00:58:22.625379" 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-10-11T00:58:22.625032" elapsed="0.000436"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:58:22.625618" elapsed="0.003585"/>
</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-10-11T00:58:22.629354" elapsed="0.002135"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:58:22.632082" 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-10-11T00:58:22.631679" elapsed="0.000429"/>
</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-10-11T00:58:22.648267" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:22.647958" elapsed="0.000336"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:22.649014" 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-10-11T00:58:22.648813" elapsed="0.000267">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-10-11T00:58:22.649165" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:22.648473" elapsed="0.000715"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:22.649691" 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-10-11T00:58:22.649364" elapsed="0.000353"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:22.650006" 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-10-11T00:58:22.650127" 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-10-11T00:58:22.649897" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:22.650586" 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-10-11T00:58:22.650350" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:22.651550" 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-10-11T00:58:22.651304" elapsed="0.000288"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:58:22.652028" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:58:22.651782" elapsed="0.000270"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:22.652830" 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-10-11T00:58:22.652367" elapsed="0.000488"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:22.654017" 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-10-11T00:58:22.653483" elapsed="0.000624"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:22.654190" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T00:58:22.654402" 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-10-11T00:58:22.653028" elapsed="0.001415"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:22.654616" elapsed="0.000332"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T00:58:22.652233" elapsed="0.002753"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:22.655678" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:58:22.655218" elapsed="0.000485"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:22.656894" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:58:22.656352" elapsed="0.000631"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:22.657063" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:58:22.657272" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:58:22.655922" 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-10-11T00:58:22.657492" elapsed="0.000316"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:58:22.655086" elapsed="0.002761"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:58:22.652095" elapsed="0.005784"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:58:22.657917" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:58:22.658045" 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-10-11T00:58:22.650960" elapsed="0.007108"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:22.650689" elapsed="0.007408"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:22.658271" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:22.658119" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:22.650671" elapsed="0.007668"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:22.659162" 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-10-11T00:58:22.658617" elapsed="0.000572"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:22.659232" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T00:58:22.647401" elapsed="0.011930"/>
</kw>
<msg time="2026-10-11T00:58:22.659379" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:22.642783" elapsed="0.016657"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T00:58:22.663860" 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/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-10-11T00:58:22.668093" 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/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-10-11T00:58:22.672314" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:22.672513" 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-10-11T00:58:22.672697" 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-10-11T00:58:22.673088" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:22.672936" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:22.672923" 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-10-11T00:58:22.673319" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:22.673517" 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-10-11T00:58:22.673686" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:58:22.672897" elapsed="0.000836"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:58:22.672807" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:22.673922" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:22.673989" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:58:22.674097" 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-10-11T00:58:22.642160" elapsed="0.031962"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:22.675242" 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-10-11T00:58:22.675051" elapsed="0.000250">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-10-11T00:58:22.675383" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:22.674711" elapsed="0.000709"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:22.675707" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:22.675485" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:22.676227" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:22.675966" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:22.675794" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:22.675468" elapsed="0.000834"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:22.676828" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:22.676480" elapsed="0.000372"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:58:22.676896" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:58:22.677019" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:58:22.674394" elapsed="0.002648"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:22.678158" 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-10-11T00:58:22.677958" elapsed="0.000259">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-10-11T00:58:22.678301" 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-10-11T00:58:22.677609" elapsed="0.000715"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:58:22.678502" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:58:22.678387" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:22.678370" elapsed="0.000209"/>
</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-10-11T00:58:22.678736" elapsed="0.000034"/>
</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-10-11T00:58:22.678930" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:58:22.679021" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:58:22.679148" 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-10-11T00:58:22.677293" elapsed="0.001879"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:22.680431" 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-10-11T00:58:22.680191" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:22.680904" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:22.680671" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:22.689720" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node05qyjd6e9gd4kd0gcztbjfjzf18.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:22.689871" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:58:22.689976" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:58:22.681236" elapsed="0.009081">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:58:22.681004" elapsed="0.009389">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:58:22.690608" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:22.690449" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-10-11T00:58:22.680988" elapsed="0.009699">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:58:22.691113" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:22.691233" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:22.691200" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:22.691184" elapsed="0.000107"/>
</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-10-11T00:58:22.691452" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:58:22.691515" 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-10-11T00:58:22.679475" elapsed="0.012135">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:58:22.691676" elapsed="0.000014"/>
</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-10-11T00:58:22.634667" elapsed="0.057107">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:58:22.692059" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:22.691891" elapsed="0.000233"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:22.691874" elapsed="0.000272"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:22.692175" elapsed="0.000014"/>
</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="FAIL" start="2026-10-11T00:58:22.634032" elapsed="0.058233">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T00:58:24.727829" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:24.727073" elapsed="0.000823"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:24.729494" 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-10-11T00:58:24.729040" elapsed="0.000601">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-10-11T00:58:24.729853" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:24.728262" elapsed="0.001642"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.731045" 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-10-11T00:58:24.730297" elapsed="0.000804"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:24.731784" 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-10-11T00:58:24.732071" 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-10-11T00:58:24.731508" elapsed="0.000618"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.733113" 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-10-11T00:58:24.732599" elapsed="0.000609"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.735725" 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-10-11T00:58:24.734795" elapsed="0.001044"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.736869" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:58:24.736245" elapsed="0.000678"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.738773" 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-10-11T00:58:24.737678" elapsed="0.001151"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:24.741468" 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-10-11T00:58:24.740241" elapsed="0.001426"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:24.741872" elapsed="0.000075"/>
</return>
<msg time="2026-10-11T00:58:24.742348" 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-10-11T00:58:24.739219" elapsed="0.003182"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:24.742859" elapsed="0.000729"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T00:58:24.737342" elapsed="0.006331"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.745506" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:58:24.744310" elapsed="0.001254"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:24.748195" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:58:24.747006" elapsed="0.001385"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:24.748593" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T00:58:24.748902" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:58:24.745976" elapsed="0.002960"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:24.749171" elapsed="0.000461"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:58:24.744009" elapsed="0.005676"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:58:24.737025" elapsed="0.012720"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:58:24.749801" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T00:58:24.749980" 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-10-11T00:58:24.733982" elapsed="0.016031"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:24.733356" elapsed="0.016696"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:24.750295" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:24.750083" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:24.733309" elapsed="0.017082"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.751611" 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-10-11T00:58:24.750792" elapsed="0.000857"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:24.751710" 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/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-10-11T00:58:24.725884" elapsed="0.025986"/>
</kw>
<msg time="2026-10-11T00:58:24.751937" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:24.715631" elapsed="0.036368"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T00:58:24.757937" 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_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-10-11T00:58:24.763817" 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_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-10-11T00:58:24.769759" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:24.770015" 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-10-11T00:58:24.770318" 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-10-11T00:58:24.770836" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:24.770613" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:24.770594" elapsed="0.000343"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:24.771160" 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-10-11T00:58:24.771436" 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-10-11T00:58:24.771679" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:58:24.770558" elapsed="0.001201"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:58:24.770430" elapsed="0.001361"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:24.772007" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:24.772100" elapsed="0.000020"/>
</return>
<msg time="2026-10-11T00:58:24.772250" 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-10-11T00:58:24.714208" elapsed="0.058077"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:24.773867" 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-10-11T00:58:24.773591" 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-10-11T00:58:24.774068" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:24.773116" elapsed="0.000984"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:24.774520" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:24.774189" elapsed="0.000404"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.775524" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:24.774887" elapsed="0.000673"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:24.774624" elapsed="0.000982"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:24.774165" elapsed="0.001468"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.776347" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:24.775876" elapsed="0.000505"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:58:24.776466" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:58:24.776639" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:58:24.772681" elapsed="0.003990"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:24.778216" 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-10-11T00:58:24.777960" elapsed="0.000338">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-10-11T00:58:24.778435" 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-10-11T00:58:24.777487" elapsed="0.000981"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T00:58:24.778699" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-10-11T00:58:24.778560" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:24.778534" 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-10-11T00:58:24.779040" elapsed="0.000067"/>
</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-10-11T00:58:24.779338" elapsed="0.000026"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T00:58:24.779440" elapsed="0.000021"/>
</return>
<msg time="2026-10-11T00:58:24.779617" 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-10-11T00:58:24.777039" elapsed="0.002610"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.781356" 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-10-11T00:58:24.781046" elapsed="0.000391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.782030" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:24.781714" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:24.790008" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node05qyjd6e9gd4kd0gcztbjfjzf18.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:24.790157" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T00:58:24.790244" 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-10-11T00:58:24.782509" elapsed="0.007759"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:24.782170" elapsed="0.008137"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:24.790507" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:24.790330" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:24.782146" elapsed="0.008468"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.792380" 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-10-11T00:58:24.791919" elapsed="0.000547"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:24.791567" elapsed="0.000944"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:24.791543" elapsed="0.000999"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.793337" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:24.792965" elapsed="0.000429"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:24.792612" elapsed="0.000850"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:24.792592" elapsed="0.000901"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.794237" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:24.793757" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:24.794682" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:24.794360" elapsed="0.000407"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.795393" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:24.795028" elapsed="0.000420"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:24.794798" elapsed="0.000696"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:24.794337" elapsed="0.001183"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.796244" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:24.795781" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:24.796684" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:24.796366" elapsed="0.000445"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.797463" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:24.797077" elapsed="0.000422"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:24.796843" elapsed="0.000702"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:24.796343" elapsed="0.001229"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:24.797792" elapsed="0.002221"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:58:24.800591" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:24.800248" elapsed="0.000377"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:58:24.800897" elapsed="0.000301"/>
</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-10-11T00:58:24.791074" elapsed="0.010203"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:24.801504" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:24.801364" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:24.801341" elapsed="0.000246"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:24.802638" 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-10-11T00:58:24.801804" elapsed="0.000873"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T00:58:24.802755" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:58:24.802935" 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-10-11T00:58:24.780053" elapsed="0.022917"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:58:24.803046" elapsed="0.000034"/>
</return>
<msg time="2026-10-11T00:58:24.803213" 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-10-11T00:58:24.697519" elapsed="0.105727"/>
</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-10-11T00:58:24.814636" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:24.814310" elapsed="0.000353"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:24.815374" 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-10-11T00:58:24.815155" elapsed="0.000361">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-10-11T00:58:24.815678" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:24.814834" elapsed="0.000868"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.816197" 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-10-11T00:58:24.815891" elapsed="0.000330"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:24.816517" 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-10-11T00:58:24.816644" 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-10-11T00:58:24.816390" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.817129" 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-10-11T00:58:24.816908" elapsed="0.000268"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:58:24.817556" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:24.817237" elapsed="0.000374"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.818243" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:24.817794" elapsed="0.000475"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:24.817633" elapsed="0.000669"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:24.817220" elapsed="0.001101"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.818909" 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-10-11T00:58:24.818509" elapsed="0.000428"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:24.818981" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T00:58:24.813805" elapsed="0.005276"/>
</kw>
<msg time="2026-10-11T00:58:24.819133" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:24.809263" elapsed="0.009914"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T00:58:24.823612" 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/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-10-11T00:58:24.827849" 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/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-10-11T00:58:24.832186" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:24.832372" 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-10-11T00:58:24.832579" 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-10-11T00:58:24.832939" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:24.832790" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:24.832776" 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-10-11T00:58:24.833202" 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-10-11T00:58:24.833387" 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-10-11T00:58:24.833573" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:58:24.832748" elapsed="0.000873"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:58:24.832647" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:24.833813" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:24.833882" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:58:24.834006" 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-10-11T00:58:24.808541" elapsed="0.025491"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:24.834204" elapsed="0.000333"/>
</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-10-11T00:58:24.835556" 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-10-11T00:58:24.835189" elapsed="0.000395"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:24.836104" 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-10-11T00:58:24.835749" elapsed="0.000381"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:58:24.836316" elapsed="0.000303"/>
</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-10-11T00:58:24.834823" elapsed="0.001852"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:24.834607" elapsed="0.002098"/>
</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-10-11T00:58:24.836919" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:24.836739" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:24.834591" elapsed="0.002397"/>
</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-10-11T00:58:24.804608" elapsed="0.032424"/>
</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-10-11T00:58:24.803660" elapsed="0.033437"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:24.803347" elapsed="0.033789"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:24.803326" elapsed="0.033831"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:58:24.837187" elapsed="0.000026"/>
</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-10-11T00:58:24.695918" elapsed="0.141366"/>
</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-10-11T00:58:22.632296" elapsed="2.205039"/>
</kw>
<arg>rt_constrain_type_0</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<status status="PASS" start="2026-10-11T00:58:22.624639" elapsed="2.212753"/>
</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-10-11T00:58:22.528105" elapsed="2.309403"/>
</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-10-11T00:58:24.839392" elapsed="0.000220"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:58:24.838961" elapsed="0.000726"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:24.840781" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:24.840680" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:24.840662" elapsed="0.000182"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:24.843055" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:24.842972" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:24.842955" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.844041" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:24.843701" elapsed="0.000366"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.844505" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:58:24.844225" elapsed="0.000305"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:58:24.844571" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:58:24.844699" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:58:24.843324" elapsed="0.001398"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:24.847247" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:24.847163" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:24.847145" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:24.848353" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:24.848270" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:24.848253" elapsed="0.000186"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:24.848799" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:58:24.848596" elapsed="0.000227"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:24.849132" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:24.848991" elapsed="0.000164"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:58:24.885543" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:58:24.849668" elapsed="0.035980"/>
</kw>
<msg time="2026-10-11T00:58:24.885822" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:58:24.885866" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:24.849316" elapsed="0.036586"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:58:24.922643" 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-10-11T00:58:24.886458" elapsed="0.036296"/>
</kw>
<msg time="2026-10-11T00:58:24.922904" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:58:24.922945" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:24.886081" elapsed="0.036901"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:24.923267" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:24.923052" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:24.923034" elapsed="0.000306"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.923790" 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-10-11T00:58:24.923548" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:24.924122" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:24.923918" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:24.923901" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:58:24.924260" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:24.926813" elapsed="0.000245"/>
</kw>
<msg time="2026-10-11T00:58:24.927116" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:24.925665" elapsed="0.001585"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:24.927607" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:24.927961" elapsed="0.000192"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:58:24.925053" 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-10-11T00:58:24.924569" elapsed="0.003770"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:58:24.848016" elapsed="0.080422"/>
</kw>
<msg time="2026-10-11T00:58:24.928522" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:24.928561" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:24.847480" elapsed="0.081118"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:58:24.928765" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:58:24.928666" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:24.928648" elapsed="0.000195"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:24.929168" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:24.929497" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:58:24.929561" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:58:24.846879" elapsed="0.082766"/>
</kw>
<msg time="2026-10-11T00:58:24.929739" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:24.929781" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:24.845063" elapsed="0.084753"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:24.930103" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:24.929883" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:24.929867" elapsed="0.000307"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:58:24.844918" elapsed="0.085277"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:58:24.844780" elapsed="0.085441"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:58:24.842660" elapsed="0.087607"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:58:24.840293" elapsed="0.090023"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:24.839877" elapsed="0.090478"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:58:24.838575" elapsed="0.091826"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:24.931282" 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-10-11T00:58:24.931454" 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-10-11T00:58:24.931141" elapsed="0.000339"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:58:24.931863" 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-10-11T00:58:24.931675" elapsed="0.000213"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:24.932189" 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-10-11T00:58:24.932307" 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-10-11T00:58:24.932054" elapsed="0.000277"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:58:24.932678" 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-10-11T00:58:24.932510" elapsed="0.000192"/>
</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-10-11T00:58:24.932965" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:24.932777" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:24.932760" elapsed="0.000272"/>
</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-10-11T00:58:24.943937" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:24.943608" elapsed="0.000356"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:24.944653" 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-10-11T00:58:24.944464" elapsed="0.000252">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-10-11T00:58:24.944816" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:24.944126" elapsed="0.000713"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.945331" 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-10-11T00:58:24.945022" elapsed="0.000334"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:24.945656" 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-10-11T00:58:24.945805" 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-10-11T00:58:24.945546" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.946261" 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-10-11T00:58:24.946029" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.947253" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T00:58:24.947023" elapsed="0.000272"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.947761" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:58:24.947491" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.948364" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:58:24.948100" elapsed="0.000287"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:24.949255" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:58:24.948900" elapsed="0.000379"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:24.949325" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:58:24.949475" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:58:24.948574" elapsed="0.000925"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:24.949670" elapsed="0.000190"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T00:58:24.947964" elapsed="0.001964"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.950453" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:58:24.950166" elapsed="0.000312"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:24.951331" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:58:24.950975" elapsed="0.000381"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:24.951401" elapsed="0.000049"/>
</return>
<msg time="2026-10-11T00:58:24.951549" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:58:24.950648" elapsed="0.000924"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:24.951753" elapsed="0.000167"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:58:24.950031" elapsed="0.001927"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:58:24.947828" elapsed="0.004161"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:58:24.952026" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:58:24.952153" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:58:24.946634" elapsed="0.005542"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:24.946365" elapsed="0.005841"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:24.952384" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:24.952228" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:24.946347" elapsed="0.006136"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.953165" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:24.952653" elapsed="0.000539"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:24.953237" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T00:58:24.943060" elapsed="0.010275"/>
</kw>
<msg time="2026-10-11T00:58:24.953383" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:24.938402" elapsed="0.015050"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T00:58:24.957954" 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/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-10-11T00:58:24.962231" 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/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-10-11T00:58:24.966491" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:24.966677" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:24.966908" 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-10-11T00:58:24.967251" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:24.967104" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:24.967091" 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-10-11T00:58:24.967545" 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-10-11T00:58:24.967746" 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-10-11T00:58:24.967914" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:58:24.967064" elapsed="0.000898"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:58:24.966976" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:24.968140" elapsed="0.000017"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:24.968205" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:58:24.968313" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:24.937814" elapsed="0.030523"/>
</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-10-11T00:58:24.977536" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:24.977219" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:24.978233" 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-10-11T00:58:24.978064" elapsed="0.000228">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-10-11T00:58:24.978375" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:24.977743" elapsed="0.000654"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.978957" 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-10-11T00:58:24.978595" elapsed="0.000387"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:24.979266" 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-10-11T00:58:24.979386" 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-10-11T00:58:24.979157" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.979875" 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-10-11T00:58:24.979642" 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-10-11T00:58:24.980275" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:24.980022" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.980800" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', '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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:24.980523" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:24.980350" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:24.980003" elapsed="0.000874"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.981448" 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-10-11T00:58:24.981049" elapsed="0.000428"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:24.981521" 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/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-10-11T00:58:24.976699" elapsed="0.004924"/>
</kw>
<msg time="2026-10-11T00:58:24.981674" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:24.972223" elapsed="0.009494"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T00:58:24.986109" 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/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-10-11T00:58:24.990319" elapsed="0.000023"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-10-11T00:58:24.994535" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:24.994720" 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-10-11T00:58:24.994943" 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-10-11T00:58:24.995285" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:24.995136" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:24.995123" 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-10-11T00:58:24.995532" 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-10-11T00:58:24.995715" 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-10-11T00:58:24.995898" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:58:24.995097" elapsed="0.000848"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:58:24.995009" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:24.996153" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:24.996221" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:58:24.996339" 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-10-11T00:58:24.971522" elapsed="0.024845"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:24.997514" 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-10-11T00:58:24.997306" elapsed="0.000268">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-10-11T00:58:24.997657" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:24.996979" elapsed="0.000700"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:24.997980" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:24.997756" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.998499" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:24.998220" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:24.998052" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:24.997737" elapsed="0.000838"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:24.999086" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:24.998750" elapsed="0.000359"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:58:24.999154" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:58:24.999277" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:58:24.996664" elapsed="0.002636"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:25.000636" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:25.000401" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:25.001095" 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-10-11T00:58:25.000884" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:25.001574" 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-10-11T00:58:25.001339" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:25.002031" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:25.001817" elapsed="0.000253"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:25.002813" 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-10-11T00:58:25.002622" elapsed="0.000215"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:58:25.003132" 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-10-11T00:58:25.002992" elapsed="0.000163"/>
</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-10-11T00:58:25.003316" elapsed="0.000168"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:25.003947" 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-10-11T00:58:25.003711" elapsed="0.000277"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:58:25.004025" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:58:25.004152" 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-10-11T00:58:25.002250" elapsed="0.001926"/>
</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-10-11T00:58:25.020131" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node05qyjd6e9gd4kd0gcztbjfjzf18.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-10-11T00:58:25.020193" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:25.020274" 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-10-11T00:58:25.004484" elapsed="0.015814"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:25.004237" elapsed="0.016102"/>
</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-10-11T00:58:25.020548" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:25.020364" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:25.004221" elapsed="0.016408"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:25.021878" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:25.021590" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:25.021326" elapsed="0.000623"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:25.021309" elapsed="0.000662"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:25.022541" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:25.022258" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:25.022020" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:25.022005" elapsed="0.000629"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:25.023166" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:25.022826" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:25.023488" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:25.023254" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:25.023997" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:25.023736" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:25.023561" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:25.023238" elapsed="0.000835"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:25.024598" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:25.024248" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:25.024913" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:25.024685" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:25.025434" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:25.025150" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:25.024987" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:25.024668" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:25.025698" elapsed="0.000307"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:58:25.026390" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:25.026168" elapsed="0.000263"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:58:25.026589" elapsed="0.000226"/>
</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-10-11T00:58:25.020969" elapsed="0.005903"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:58:25.027019" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:58:25.026937" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:25.026920" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:25.027243" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:58:25.027302" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:58:25.027476" 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-10-11T00:58:24.999616" elapsed="0.027885"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:58:25.027561" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:58:25.027681" 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-10-11T00:58:24.933919" elapsed="0.093784"/>
</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-10-11T00:58:25.028009" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:25.027804" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:25.027788" elapsed="0.000303"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:58:25.028121" elapsed="0.000023"/>
</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-10-11T00:58:24.933251" elapsed="0.094966"/>
</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-10-11T00:58:25.032228" level="INFO">${update} = </msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:58:25.029127" elapsed="0.003128"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<msg time="2026-10-11T00:58:25.032805" level="FAIL"> == </msg>
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="FAIL" start="2026-10-11T00:58:25.032437" elapsed="0.000426"> == </status>
</kw>
<return>
<value>${update}</value>
<status status="NOT RUN" start="2026-10-11T00:58:25.032913" elapsed="0.000015"/>
</return>
<doc>Returns hex update message.</doc>
<status status="FAIL" start="2026-10-11T00:58:25.028867" elapsed="0.004145"> == </status>
</kw>
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:27.038359" level="INFO">${update} = ffffffffffffffffffffffffffffffff0053020000003c4001010040020040050400000064800e200001800c00000000000000000a00fffe007005dc510001010203040001010101c010080002fbf000000065</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:58:27.034331" elapsed="0.004138"/>
</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-10-11T00:58:27.038908" elapsed="0.000735"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:58:27.039767" elapsed="0.000070"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T00:58:27.033672" elapsed="0.006335"/>
</kw>
<msg time="2026-10-11T00:58:27.040156" 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-10-11T00:58:25.028403" elapsed="2.011806"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.042614" level="INFO">Length is 166.</msg>
<msg time="2026-10-11T00:58:27.042794" 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-10-11T00:58:27.042020" elapsed="0.000825"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.043783" level="INFO">Length is 166.</msg>
<msg time="2026-10-11T00:58:27.043936" 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-10-11T00:58:27.043208" elapsed="0.000776"/>
</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-10-11T00:58:27.044398" elapsed="0.000646"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:27.046010" 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-10-11T00:58:27.045381" elapsed="0.000685"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:27.046793" 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-10-11T00:58:27.046393" elapsed="0.000453"/>
</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-10-11T00:58:27.047252" elapsed="0.000649"/>
</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-10-11T00:58:27.040695" elapsed="0.007328"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:58:27.048340" elapsed="0.002975"/>
</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-10-11T00:58:27.083775" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:27.083015" elapsed="0.000821"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:27.085079" 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-10-11T00:58:27.084821" elapsed="0.000345">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-10-11T00:58:27.085282" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:27.084194" elapsed="0.001119"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.086028" 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-10-11T00:58:27.085581" elapsed="0.000482"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:27.086468" 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-10-11T00:58:27.086642" 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-10-11T00:58:27.086296" elapsed="0.000380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.087266" 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-10-11T00:58:27.086965" 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-10-11T00:58:27.088833" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T00:58:27.088288" elapsed="0.000603"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.089510" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:58:27.089140" elapsed="0.000404"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.090627" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:58:27.090013" elapsed="0.000648"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:27.092196" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:58:27.091558" elapsed="0.000745"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:27.092513" elapsed="0.000044"/>
</return>
<msg time="2026-10-11T00:58:27.092765" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:58:27.090963" elapsed="0.001835"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:27.093080" elapsed="0.000452"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T00:58:27.089823" elapsed="0.003763"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.094522" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:58:27.093932" elapsed="0.000624"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:27.096107" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:58:27.095365" elapsed="0.000848"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:27.096391" elapsed="0.000088"/>
</return>
<msg time="2026-10-11T00:58:27.096670" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:58:27.094810" elapsed="0.001906"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:27.096950" elapsed="0.000410"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:58:27.093745" elapsed="0.003697"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:58:27.089608" elapsed="0.007881"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:58:27.097542" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T00:58:27.097735" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:58:27.087808" elapsed="0.009960"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:27.087429" elapsed="0.010379"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.098051" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:27.097840" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.087384" elapsed="0.010763"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.099110" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:27.098369" elapsed="0.000777"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:27.099205" 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/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-10-11T00:58:27.081822" elapsed="0.017520"/>
</kw>
<msg time="2026-10-11T00:58:27.099437" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:27.071787" elapsed="0.027715"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T00:58:27.105503" 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/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-10-11T00:58:27.111163" 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/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-10-11T00:58:27.115373" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.115610" 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-10-11T00:58:27.115810" 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-10-11T00:58:27.116149" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:27.116002" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:27.115988" 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-10-11T00:58:27.116377" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.116576" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.116754" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:58:27.115963" elapsed="0.000839"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:58:27.115877" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.116976" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:27.117041" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:58:27.117148" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:27.070320" elapsed="0.046852"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.118176" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:27.117954" elapsed="0.000265"/>
</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-10-11T00:58:27.128381" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node05qyjd6e9gd4kd0gcztbjfjzf18.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:27.128447" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:27.128527" 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-10-11T00:58:27.118522" elapsed="0.010029"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:27.118279" elapsed="0.010309"/>
</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-10-11T00:58:27.128776" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:27.128611" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.118262" elapsed="0.010588"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.130582" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:27.130152" elapsed="0.000489"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:27.129764" elapsed="0.000925"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.129737" elapsed="0.001002"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.131577" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:27.131165" elapsed="0.000473"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:27.130813" elapsed="0.000870"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.130791" elapsed="0.000940"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.132524" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:27.132002" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.132971" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:27.132660" elapsed="0.000426"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.133755" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:27.133351" elapsed="0.000440"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:27.133119" elapsed="0.000717"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.132634" elapsed="0.001229"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.134600" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:27.134113" elapsed="0.000523"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.135034" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:27.134738" elapsed="0.000369"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.135765" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:27.135365" elapsed="0.000434"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:27.135137" elapsed="0.000708"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.134700" elapsed="0.001171"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:27.136074" elapsed="0.000424"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:58:27.137053" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:27.136746" 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-10-11T00:58:27.137302" elapsed="0.000320"/>
</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-10-11T00:58:27.129340" elapsed="0.008379"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:58:27.137781" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T00:58:27.138034" 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-10-11T00:58:27.117421" elapsed="0.020648"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:58:27.138137" elapsed="0.000036"/>
</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-10-11T00:58:27.053545" elapsed="0.084731"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:27.052590" elapsed="0.085756"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T00:58:27.051794" elapsed="0.086649"/>
</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-10-11T00:58:27.142459" level="INFO">${update} = ffffffffffffffffffffffffffffffff0045020000002e4001010040020040050400000064800f12000180708000000001010203040001010101c010080002fbf000000065</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:58:27.139721" elapsed="0.002780"/>
</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-10-11T00:58:27.142774" elapsed="0.000424"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:58:27.143261" elapsed="0.000040"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T00:58:27.139324" elapsed="0.004108"/>
</kw>
<msg time="2026-10-11T00:58:27.143533" 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-10-11T00:58:27.138732" elapsed="0.004836"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.144756" level="INFO">Length is 138.</msg>
<msg time="2026-10-11T00:58:27.144853" 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-10-11T00:58:27.144356" elapsed="0.000528"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.145445" level="INFO">Length is 138.</msg>
<msg time="2026-10-11T00:58:27.145541" 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-10-11T00:58:27.145106" elapsed="0.000466"/>
</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-10-11T00:58:27.145845" elapsed="0.000370"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:27.146652" 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-10-11T00:58:27.146442" elapsed="0.000243"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:27.147106" 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-10-11T00:58:27.146901" elapsed="0.000278"/>
</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-10-11T00:58:27.147456" elapsed="0.000383"/>
</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-10-11T00:58:27.143869" elapsed="0.004046"/>
</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-10-11T00:58:27.167522" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:27.167202" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:27.168247" 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-10-11T00:58:27.168048" elapsed="0.000258">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-10-11T00:58:27.168389" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:27.167725" elapsed="0.000702"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.168929" 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-10-11T00:58:27.168605" elapsed="0.000349"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:27.169230" 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-10-11T00:58:27.169356" 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-10-11T00:58:27.169121" elapsed="0.000259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.169823" 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-10-11T00:58:27.169592" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.170801" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T00:58:27.170558" elapsed="0.000285"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.171268" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:58:27.171020" elapsed="0.000271"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.172097" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:58:27.171623" elapsed="0.000499"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:27.173181" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:58:27.172749" elapsed="0.000471"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:27.173333" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T00:58:27.173530" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:58:27.172295" elapsed="0.001259"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:27.173736" elapsed="0.000274"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T00:58:27.171489" elapsed="0.002559"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.174857" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:58:27.174281" elapsed="0.000601"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:27.175937" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:58:27.175493" elapsed="0.000483"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:27.176085" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:58:27.176261" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:58:27.175056" elapsed="0.001228"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:27.176505" elapsed="0.000290"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:58:27.174148" elapsed="0.002686"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:58:27.171334" elapsed="0.005531"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:58:27.176903" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:58:27.177031" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:58:27.170176" elapsed="0.006878"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:27.169925" elapsed="0.007158"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.177255" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:27.177105" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.169908" elapsed="0.007416"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.179331" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:27.177545" elapsed="0.001813"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:27.179428" 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-10-11T00:58:27.166654" elapsed="0.012878"/>
</kw>
<msg time="2026-10-11T00:58:27.179581" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:27.161954" elapsed="0.017683"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T00:58:27.183946" 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/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-10-11T00:58:27.188211" 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/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-10-11T00:58:27.192490" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.192676" 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-10-11T00:58:27.192876" 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-10-11T00:58:27.193215" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:27.193068" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:27.193054" 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-10-11T00:58:27.193458" 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-10-11T00:58:27.193642" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.193858" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:58:27.193030" elapsed="0.000877"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:58:27.192942" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.194084" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:27.194150" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:58:27.194260" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:27.161014" elapsed="0.033270"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.195319" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:27.195096" elapsed="0.000266"/>
</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-10-11T00:58:27.222755" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node05qyjd6e9gd4kd0gcztbjfjzf18.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:27.223042" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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+xml', 'Content-Length': '585'} 
 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-path xmlns:a="urn:opendaylight:params:xml:ns:yang:bgp-rib" xmlns:b="urn:opendaylight:params:xml:ns:yang:bgp-types" xmlns:c="urn:opendaylight:params:xml:ns:yang:bgp-vpn-ipv4"&gt;/a:application-rib[a:id='10.30.170.173']/a:tables[a:afi='b:ipv4-address-family'][a:safi='b:mpls-labeled-vpn-subsequent-address-family']/c:vpn-ipv4-routes&lt;/error-path&gt;&lt;error-message&gt;Data does not exist&lt;/error-message&gt;&lt;error-tag&gt;data-missing&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-10-11T00:58:27.223179" level="INFO">${response} = None</msg>
<msg time="2026-10-11T00:58:27.223220" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:27.195665" elapsed="0.027925">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:27.195437" elapsed="0.028232">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:27.223875" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:27.223717" elapsed="0.000214"/>
</branch>
<status status="FAIL" start="2026-10-11T00:58:27.195419" elapsed="0.028534">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:27.225213" 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-10-11T00:58:27.224936" elapsed="0.000310">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-10-11T00:58:27.224677" elapsed="0.000628">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-10-11T00:58:27.224660" elapsed="0.000675">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-10-11T00:58:27.225942" 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-10-11T00:58:27.225662" elapsed="0.000310">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-10-11T00:58:27.225398" elapsed="0.000662">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-10-11T00:58:27.225382" elapsed="0.000709">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.226657" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:27.226288" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.226977" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:27.226761" elapsed="0.000269"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.227664" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:27.227219" elapsed="0.000471"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:27.227052" elapsed="0.000685"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.226743" elapsed="0.001016"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.228286" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:27.227942" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.228610" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:27.228375" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.229134" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:27.228867" elapsed="0.000292"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:27.228687" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.228358" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:27.229359" elapsed="0.000311"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:58:27.230072" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:27.229849" elapsed="0.000247"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-10-11T00:58:27.230430" 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-10-11T00:58:27.230253" elapsed="0.000209">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-10-11T00:58:27.224290" elapsed="0.006292">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-10-11T00:58:27.230636" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:58:27.230903" level="INFO">${response_text} = None</msg>
<msg time="2026-10-11T00:58:27.230930" 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-10-11T00:58:27.194534" elapsed="0.036423">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-10-11T00:58:27.231014" elapsed="0.000025"/>
</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-10-11T00:58:27.149262" elapsed="0.081890">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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:27.148725" elapsed="0.082482"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T00:58:27.148193" elapsed="0.083067"/>
</kw>
<arg>l3vpn_rt_arg</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<arg>False</arg>
<status status="PASS" start="2026-10-11T00:58:24.930776" elapsed="2.300528"/>
</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-10-11T00:58:24.837930" elapsed="2.393472"/>
</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-10-11T00:58:27.232917" elapsed="0.000198"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:58:27.232634" 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-10-11T00:58:27.234475" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:27.234372" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.234354" elapsed="0.000185"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:27.236721" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:27.236628" elapsed="0.000135"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.236609" elapsed="0.000174"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.237690" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:27.237350" elapsed="0.000379"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.238145" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:58:27.237885" elapsed="0.000283"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:58:27.238208" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:58:27.238332" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:58:27.236992" elapsed="0.001362"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:27.240923" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:27.240840" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.240822" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:27.242073" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:27.241992" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.241974" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:27.242475" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:58:27.242283" elapsed="0.000217"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:27.242819" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:27.242666" elapsed="0.000177"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:58:27.278658" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:58:27.243334" elapsed="0.035433"/>
</kw>
<msg time="2026-10-11T00:58:27.278920" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:58:27.278961" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:27.243002" elapsed="0.035994"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:58:27.337793" 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-10-11T00:58:27.279532" elapsed="0.058362"/>
</kw>
<msg time="2026-10-11T00:58:27.338040" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:58:27.338081" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:27.279166" elapsed="0.058950"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.338393" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:27.338184" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.338165" elapsed="0.000325"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.339007" 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-10-11T00:58:27.338679" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.339333" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:27.339132" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.339115" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:58:27.339486" 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-10-11T00:58:27.342092" elapsed="0.000132"/>
</kw>
<msg time="2026-10-11T00:58:27.342281" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:27.340877" 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-10-11T00:58:27.342810" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.343146" 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-10-11T00:58:27.340256" 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-10-11T00:58:27.339787" elapsed="0.003747"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:58:27.241689" elapsed="0.101923"/>
</kw>
<msg time="2026-10-11T00:58:27.343693" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:27.343750" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:27.241138" elapsed="0.102646"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:58:27.343937" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:58:27.343853" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.343835" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.344341" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.344681" elapsed="0.000038"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:58:27.344762" 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-10-11T00:58:27.240539" elapsed="0.104308"/>
</kw>
<msg time="2026-10-11T00:58:27.344929" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:27.344969" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:27.238721" elapsed="0.106282"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.345292" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:27.345069" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.345053" elapsed="0.000309"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:58:27.238557" elapsed="0.106827"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:58:27.238401" elapsed="0.107109"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:58:27.236316" elapsed="0.109247"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:58:27.233997" elapsed="0.111621"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:27.233368" elapsed="0.112290"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:58:27.232179" elapsed="0.113540"/>
</kw>
<kw name="Kill_BGP_Speaker" owner="BGPSpeaker">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.346905" 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-10-11T00:58:27.346571" elapsed="0.000359"/>
</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-10-11T00:58:27.347084" elapsed="0.000185"/>
</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-10-11T00:58:27.346275" elapsed="0.001047"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T00:58:27.372155" level="INFO">^C
[?2004h[jenkins@releng-26932-423-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-10-11T00:58:27.347922" elapsed="0.024289"/>
</kw>
<msg time="2026-10-11T00:58:27.372294" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:27.372333" level="INFO">${message} = ^C
[?2004h[jenkins@releng-26932-423-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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:27.347505" elapsed="0.024881"/>
</kw>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:27.373024" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-10-11T00:58:27.385193" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:58:27.385280" level="INFO">${output_log} = 2026-10-11 00:58:16,617 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:58:16,617 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 00:58:16,617 DEBUG BGP-Threa...</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-10-11T00:58:27.372912" elapsed="0.012392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.385767" level="INFO">2026-10-11 00:58:16,617 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:58:16,617 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 00:58:16,617 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 00:58:16,617 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 00:58:16,617 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 00:58:16,619 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:58:16,621 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:58:16,621 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00d90104fbf000b4c0000202bc02ba41040000fbf0060002000104000100010104000100040104000100850104000200040104000100810104000100840104000200810104000200800104000100860104000200860104000200850104000200050104000100800104000100050104400400470104001900460104000200014046003c00010500000286000001810040044700000204000002800000020500000281000001010000018500000184000001860000194600000201000002850000010400000180004700
2026-10-11 00:58:16,621 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:58:16,621 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-10-11 00:58:16,621 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-10-11 00:58:16,621 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 00:58:16,622 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 00:58:16,622 INFO BGP-Thread-1 (job):   My BGP Identifier: 169782023
2026-10-11 00:58:16,622 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 00:58:16,622 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 00:58:16,622 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 00:58:16,622 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 00:58:16,622 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 00:58:16,622 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 00:58:16,622 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-10-11 00:58:16,622 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-10-11 00:58:16,622 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 00:58:16,622 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 00:58:16,622 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 00:58:16,622 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:58:16,622 DEBUG BGP-Thread-1 (job):   Length=125 (0x007d)
2026-10-11 00:58:16,622 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 00:58:16,623 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 00:58:16,623 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-10-11 00:58:16,623 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 00:58:16,623 DEBUG BGP-Thread-1 (job):   BGP Identifier=169782023 (0x0a1eab07)
2026-10-11 00:58:16,623 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=96 (0x60)
2026-10-11 00:58:16,623 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x02060104000100010206010400020001020601044004004702060104001900460206010400010005020601040002000502060104000100810206010400020081020601040001008002060104000200800206010400010084020641040000fbf0
2026-10-11 00:58:16,623 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff007d0104fbf000b40a1eab076002060104000100010206010400020001020601044004004702060104001900460206010400010005020601040002000502060104000100810206010400020081020601040001008002060104000200800206010400010084020641040000fbf0'
2026-10-11 00:58:16,623 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff007d0104fbf000b40a1eab076002060104000100010206010400020001020601044004004702060104001900460206010400010005020601040002000502060104000100810206010400020081020601040001008002060104000200800206010400010084020641040000fbf0
2026-10-11 00:58:16,625 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:58:16,625 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:58:16,625 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:58:16,625 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:58:16,625 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:58:16,626 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:58:16,626 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:58:16,626 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:58:16,626 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:58:16,626 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:58:16,626 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 00:58:16,626 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:16,626 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:16,626 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:16,639 INFO BGP-Thread-1 (job): ... idle for 0.013s
2026-10-11 00:58:16,640 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.013s
2026-10-11 00:58:16,640 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000105
2026-10-11 00:58:16,640 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:16,640 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:16,640 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 00:58:16,640 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:58:16,640 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:58:16,640 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:58:16,640 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:58:16,640 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:58:16,640 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:58:16,640 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:58:16,640 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 00:58:16,640 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 00:58:16,641 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000181
2026-10-11 00:58:16,641 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:16,641 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:16,641 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 00:58:16,641 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:58:16,641 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:58:16,641 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:58:16,641 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:58:16,641 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:58:16,641 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:58:16,641 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:58:16,641 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 00:58:16,641 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 00:58:16,642 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03400447
2026-10-11 00:58:16,642 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:16,642 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:16,642 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 00:58:16,642 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:58:16,642 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:58:16,642 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:58:16,642 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:58:16,642 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:58:16,642 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:58:16,642 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:58:16,642 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 00:58:16,642 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 00:58:16,642 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000280
2026-10-11 00:58:16,643 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:16,643 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:16,643 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 00:58:16,643 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:58:16,643 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:58:16,643 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:58:16,643 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:58:16,643 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:58:16,643 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:58:16,643 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:58:16,643 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 00:58:16,643 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 00:58:16,643 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000205
2026-10-11 00:58:16,644 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:16,644 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:16,644 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 00:58:16,644 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:58:16,644 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:58:16,644 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:58:16,644 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:58:16,644 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:58:16,644 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:58:16,644 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:58:16,644 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 00:58:16,644 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 00:58:16,644 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000281
2026-10-11 00:58:16,644 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:16,645 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:16,645 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 00:58:16,645 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:58:16,645 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:58:16,645 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:58:16,645 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:58:16,645 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:58:16,645 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:58:16,645 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:58:16,645 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 00:58:16,645 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 00:58:16,645 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 00:58:16,645 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:16,645 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:16,645 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 00:58:16,646 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:58:16,646 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:58:16,646 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:58:16,646 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:58:16,646 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:58:16,646 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:58:16,646 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:58:16,646 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 00:58:16,646 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 00:58:16,646 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000184
2026-10-11 00:58:16,646 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:16,646 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:16,646 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 00:58:16,646 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:58:16,646 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:58:16,647 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:58:16,647 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:58:16,647 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:58:16,647 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:58:16,647 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:58:16,647 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 00:58:16,647 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 00:58:16,647 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03001946
2026-10-11 00:58:16,647 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:16,647 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:16,647 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 00:58:16,647 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:58:16,647 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:58:16,647 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:58:16,647 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:58:16,648 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:58:16,648 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:58:16,648 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:58:16,648 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 00:58:16,648 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 00:58:16,648 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000201
2026-10-11 00:58:16,648 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:16,648 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:16,648 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 00:58:16,648 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:58:16,648 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:58:16,648 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:58:16,648 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:58:16,648 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:58:16,648 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:58:16,649 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:58:16,649 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 00:58:16,649 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 00:58:16,649 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000180
2026-10-11 00:58:16,649 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:16,649 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:16,649 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 00:58:16,649 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:58:16,649 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:58:16,649 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:58:16,649 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:58:16,649 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:58:16,649 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:58:16,649 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:58:16,650 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 00:58:16,650 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 00:58:16,650 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:16,650 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:16,650 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:17,651 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:17,651 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.014s
2026-10-11 00:58:17,651 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:17,651 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:17,651 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:18,653 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:18,653 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 2.015s
2026-10-11 00:58:18,653 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:18,653 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:18,653 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:19,654 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:19,654 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 3.016s
2026-10-11 00:58:19,655 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:19,655 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:19,655 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:20,656 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:20,656 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 4.017s
2026-10-11 00:58:20,656 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:20,656 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:20,656 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:21,658 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:21,658 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 5.018s
2026-10-11 00:58:21,658 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:21,658 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:21,658 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:22] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:22,659 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:22,660 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.020s
2026-10-11 00:58:22,660 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0002fbf000000065
2026-10-11 00:58:22,660 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:22,660 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:22,660 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:23,661 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:23,662 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 7.021s
2026-10-11 00:58:23,662 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:23,662 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:23,662 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:24,663 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:24,663 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.022s
2026-10-11 00:58:24,664 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:24,664 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:24,664 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:25] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:25,046 INFO BGP-Thread-1 (job): ... idle for 0.382s
2026-10-11 00:58:25,046 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.404s
2026-10-11 00:58:25,046 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0053020000003c4001010040020040050400000064800e200001800c00000000000000000a00fffe007005dc510001010203040001010101c010080002fbf000000065
2026-10-11 00:58:25,046 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:25,046 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:25,046 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0053' (83)
2026-10-11 00:58:25,046 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:58:25,046 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:58:25,046 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:58:25,046 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:58:25,047 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:58:25,047 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:58:25,047 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:58:25,047 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 00:58:25,047 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 00:58:25,047 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:25,047 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:25,047 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:26,048 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:26,048 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 9.405s
2026-10-11 00:58:26,049 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:26,049 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:26,049 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:27] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:27,050 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:27,050 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.406s
2026-10-11 00:58:27,050 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:27,050 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:27,050 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:27] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:27,138 INFO BGP-Thread-1 (job): ... idle for 0.087s
2026-10-11 00:58:27,138 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.493s
2026-10-11 00:58:27,138 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e4001010040020040050400000064800f12000180708000000001010203040001010101c010080002fbf000000065
2026-10-11 00:58:27,138 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:27,138 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:27,138 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-10-11 00:58:27,138 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:58:27,138 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:58:27,138 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:58:27,139 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:58:27,139 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:58:27,139 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:58:27,139 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:58:27,139 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 00:58:27,139 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 00:58:27,139 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:27,139 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:27,139 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:27] "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-10-11T00:58:27.385526" elapsed="0.000524"/>
</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-10-11T00:58:27.372591" elapsed="0.013511"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<status status="PASS" start="2026-10-11T00:58:27.386247" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:58:27.386159" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.386142" elapsed="0.000180"/>
</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-10-11T00:58:27.386529" elapsed="0.000020"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was not seen within timeout period.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.386716" elapsed="0.000020"/>
</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-10-11T00:58:27.345971" elapsed="0.040817"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:27.390165" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-10-11T00:58:27.435683" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:58:27.435781" level="INFO">${output_log} = 2026-10-11 00:58:16,617 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:58:16,617 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 00:58:16,617 DEBUG BGP-Threa...</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-10-11T00:58:27.390054" elapsed="0.045751"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.436233" level="INFO">2026-10-11 00:58:16,617 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:58:16,617 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 00:58:16,617 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 00:58:16,617 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 00:58:16,617 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 00:58:16,619 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:58:16,621 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:58:16,621 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00d90104fbf000b4c0000202bc02ba41040000fbf0060002000104000100010104000100040104000100850104000200040104000100810104000100840104000200810104000200800104000100860104000200860104000200850104000200050104000100800104000100050104400400470104001900460104000200014046003c00010500000286000001810040044700000204000002800000020500000281000001010000018500000184000001860000194600000201000002850000010400000180004700
2026-10-11 00:58:16,621 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:58:16,621 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-10-11 00:58:16,621 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-10-11 00:58:16,621 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 00:58:16,622 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 00:58:16,622 INFO BGP-Thread-1 (job):   My BGP Identifier: 169782023
2026-10-11 00:58:16,622 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 00:58:16,622 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 00:58:16,622 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 00:58:16,622 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 00:58:16,622 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 00:58:16,622 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 00:58:16,622 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-10-11 00:58:16,622 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-10-11 00:58:16,622 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 00:58:16,622 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 00:58:16,622 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 00:58:16,622 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:58:16,622 DEBUG BGP-Thread-1 (job):   Length=125 (0x007d)
2026-10-11 00:58:16,622 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 00:58:16,623 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 00:58:16,623 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-10-11 00:58:16,623 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 00:58:16,623 DEBUG BGP-Thread-1 (job):   BGP Identifier=169782023 (0x0a1eab07)
2026-10-11 00:58:16,623 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=96 (0x60)
2026-10-11 00:58:16,623 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x02060104000100010206010400020001020601044004004702060104001900460206010400010005020601040002000502060104000100810206010400020081020601040001008002060104000200800206010400010084020641040000fbf0
2026-10-11 00:58:16,623 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff007d0104fbf000b40a1eab076002060104000100010206010400020001020601044004004702060104001900460206010400010005020601040002000502060104000100810206010400020081020601040001008002060104000200800206010400010084020641040000fbf0'
2026-10-11 00:58:16,623 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff007d0104fbf000b40a1eab076002060104000100010206010400020001020601044004004702060104001900460206010400010005020601040002000502060104000100810206010400020081020601040001008002060104000200800206010400010084020641040000fbf0
2026-10-11 00:58:16,625 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:58:16,625 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:58:16,625 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:58:16,625 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:58:16,625 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:58:16,626 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:58:16,626 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:58:16,626 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:58:16,626 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:58:16,626 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:58:16,626 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 00:58:16,626 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:16,626 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:16,626 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:16,639 INFO BGP-Thread-1 (job): ... idle for 0.013s
2026-10-11 00:58:16,640 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.013s
2026-10-11 00:58:16,640 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000105
2026-10-11 00:58:16,640 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:16,640 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:16,640 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 00:58:16,640 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:58:16,640 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:58:16,640 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:58:16,640 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:58:16,640 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:58:16,640 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:58:16,640 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:58:16,640 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 00:58:16,640 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 00:58:16,641 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000181
2026-10-11 00:58:16,641 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:16,641 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:16,641 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 00:58:16,641 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:58:16,641 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:58:16,641 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:58:16,641 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:58:16,641 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:58:16,641 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:58:16,641 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:58:16,641 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 00:58:16,641 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 00:58:16,642 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03400447
2026-10-11 00:58:16,642 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:16,642 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:16,642 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 00:58:16,642 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:58:16,642 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:58:16,642 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:58:16,642 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:58:16,642 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:58:16,642 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:58:16,642 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:58:16,642 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 00:58:16,642 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 00:58:16,642 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000280
2026-10-11 00:58:16,643 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:16,643 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:16,643 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 00:58:16,643 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:58:16,643 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:58:16,643 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:58:16,643 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:58:16,643 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:58:16,643 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:58:16,643 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:58:16,643 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 00:58:16,643 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 00:58:16,643 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000205
2026-10-11 00:58:16,644 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:16,644 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:16,644 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 00:58:16,644 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:58:16,644 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:58:16,644 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:58:16,644 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:58:16,644 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:58:16,644 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:58:16,644 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:58:16,644 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 00:58:16,644 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 00:58:16,644 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000281
2026-10-11 00:58:16,644 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:16,645 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:16,645 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 00:58:16,645 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:58:16,645 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:58:16,645 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:58:16,645 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:58:16,645 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:58:16,645 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:58:16,645 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:58:16,645 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 00:58:16,645 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 00:58:16,645 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 00:58:16,645 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:16,645 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:16,645 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 00:58:16,646 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:58:16,646 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:58:16,646 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:58:16,646 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:58:16,646 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:58:16,646 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:58:16,646 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:58:16,646 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 00:58:16,646 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 00:58:16,646 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000184
2026-10-11 00:58:16,646 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:16,646 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:16,646 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 00:58:16,646 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:58:16,646 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:58:16,647 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:58:16,647 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:58:16,647 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:58:16,647 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:58:16,647 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:58:16,647 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 00:58:16,647 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 00:58:16,647 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03001946
2026-10-11 00:58:16,647 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:16,647 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:16,647 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 00:58:16,647 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:58:16,647 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:58:16,647 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:58:16,647 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:58:16,648 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:58:16,648 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:58:16,648 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:58:16,648 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 00:58:16,648 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 00:58:16,648 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000201
2026-10-11 00:58:16,648 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:16,648 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:16,648 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 00:58:16,648 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:58:16,648 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:58:16,648 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:58:16,648 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:58:16,648 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:58:16,648 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:58:16,649 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:58:16,649 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 00:58:16,649 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 00:58:16,649 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000180
2026-10-11 00:58:16,649 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:16,649 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:16,649 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 00:58:16,649 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:58:16,649 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:58:16,649 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:58:16,649 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:58:16,649 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:58:16,649 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:58:16,649 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:58:16,650 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 00:58:16,650 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 00:58:16,650 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:16,650 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:16,650 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:17,651 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:17,651 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.014s
2026-10-11 00:58:17,651 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:17,651 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:17,651 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:18,653 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:18,653 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 2.015s
2026-10-11 00:58:18,653 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:18,653 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:18,653 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:19,654 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:19,654 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 3.016s
2026-10-11 00:58:19,655 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:19,655 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:19,655 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:20,656 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:20,656 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 4.017s
2026-10-11 00:58:20,656 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:20,656 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:20,656 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:21,658 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:21,658 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 5.018s
2026-10-11 00:58:21,658 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:21,658 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:21,658 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:22] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:22,659 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:22,660 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.020s
2026-10-11 00:58:22,660 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0002fbf000000065
2026-10-11 00:58:22,660 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:22,660 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:22,660 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:23,661 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:23,662 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 7.021s
2026-10-11 00:58:23,662 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:23,662 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:23,662 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:24,663 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:24,663 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.022s
2026-10-11 00:58:24,664 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:24,664 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:24,664 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:25] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:25,046 INFO BGP-Thread-1 (job): ... idle for 0.382s
2026-10-11 00:58:25,046 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.404s
2026-10-11 00:58:25,046 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0053020000003c4001010040020040050400000064800e200001800c00000000000000000a00fffe007005dc510001010203040001010101c010080002fbf000000065
2026-10-11 00:58:25,046 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:25,046 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:25,046 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0053' (83)
2026-10-11 00:58:25,046 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:58:25,046 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:58:25,046 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:58:25,046 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:58:25,047 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:58:25,047 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:58:25,047 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:58:25,047 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 00:58:25,047 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 00:58:25,047 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:25,047 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:25,047 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:26,048 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:26,048 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 9.405s
2026-10-11 00:58:26,049 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:26,049 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:26,049 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:27] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:27,050 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:27,050 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.406s
2026-10-11 00:58:27,050 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:27,050 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:27,050 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:27] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:27,138 INFO BGP-Thread-1 (job): ... idle for 0.087s
2026-10-11 00:58:27,138 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.493s
2026-10-11 00:58:27,138 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0045020000002e4001010040020040050400000064800f12000180708000000001010203040001010101c010080002fbf000000065
2026-10-11 00:58:27,138 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:27,138 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:27,138 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0045' (69)
2026-10-11 00:58:27,138 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 00:58:27,138 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 00:58:27,138 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 00:58:27,139 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 00:58:27,139 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 00:58:27,139 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 00:58:27,139 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 00:58:27,139 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 00:58:27,139 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 00:58:27,139 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:27,139 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:27,139 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:27] "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-10-11T00:58:27.436008" elapsed="0.000536"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:27.437083" 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-10-11T00:58:27.436745" elapsed="0.000391"/>
</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-10-11T00:58:27.389670" elapsed="0.047521"/>
</kw>
<doc>Abort the Python speaker</doc>
<status status="PASS" start="2026-10-11T00:58:27.231769" elapsed="0.205514"/>
</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-10-11T00:58:27.438838" elapsed="0.000603"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:58:27.438554" elapsed="0.000943"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:27.440693" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:27.440605" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.440585" elapsed="0.000187"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:27.442808" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:27.442722" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.442695" elapsed="0.000177"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.443802" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:27.443456" elapsed="0.000371"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.444246" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:58:27.443984" elapsed="0.000287"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:58:27.444311" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:58:27.444455" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:58:27.443079" elapsed="0.001400"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:27.447015" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:27.446933" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.446915" elapsed="0.000162"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:27.448119" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:27.448037" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.448020" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:27.448519" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:58:27.448327" elapsed="0.000216"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:27.448859" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:27.448724" elapsed="0.000158"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:58:27.485517" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:58:27.449369" elapsed="0.036247"/>
</kw>
<msg time="2026-10-11T00:58:27.485798" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:58:27.485840" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:27.449042" elapsed="0.036833"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:58:27.526750" 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-10-11T00:58:27.486382" elapsed="0.040471"/>
</kw>
<msg time="2026-10-11T00:58:27.527003" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:58:27.527044" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:27.486044" elapsed="0.041036"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.527391" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:27.527147" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.527129" elapsed="0.000363"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.527915" 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-10-11T00:58:27.527676" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.528363" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:27.528042" elapsed="0.000395"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.528025" elapsed="0.000436"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:58:27.528491" 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-10-11T00:58:27.530894" elapsed="0.000111"/>
</kw>
<msg time="2026-10-11T00:58:27.531061" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:27.529879" elapsed="0.001312"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.531616" elapsed="0.000094"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.531983" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:58:27.529253" 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-10-11T00:58:27.528788" 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-10-11T00:58:27.447784" elapsed="0.084512"/>
</kw>
<msg time="2026-10-11T00:58:27.532377" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:27.532437" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:27.447230" elapsed="0.085245"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:58:27.532628" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:58:27.532543" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.532525" elapsed="0.000317"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.533181" 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-10-11T00:58:27.533506" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:58:27.533571" 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-10-11T00:58:27.446638" elapsed="0.087018"/>
</kw>
<msg time="2026-10-11T00:58:27.533757" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:27.533797" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:27.444821" elapsed="0.089012"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.534124" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:27.533900" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.533884" elapsed="0.000311"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:58:27.444661" elapsed="0.089556"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:58:27.444526" elapsed="0.089718"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:58:27.442401" elapsed="0.091891"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:58:27.440327" elapsed="0.094014"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:27.439912" elapsed="0.094468"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:58:27.438195" elapsed="0.096345"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.535240" level="INFO">&amp;{mapping} = { IP=10.30.171.7 | 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-10-11T00:58:27.534841" elapsed="0.000424"/>
</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-10-11T00:58:27.549101" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:27.548798" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:27.549834" 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-10-11T00:58:27.549627" elapsed="0.000274">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-10-11T00:58:27.549985" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:27.549289" elapsed="0.000719"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.550510" 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-10-11T00:58:27.550185" elapsed="0.000350"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:27.550831" 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-10-11T00:58:27.550954" 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-10-11T00:58:27.550720" elapsed="0.000259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.551394" 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-10-11T00:58:27.551177" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.552362" level="INFO">mapping: {'IP': '10.30.171.7', '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-10-11T00:58:27.552132" elapsed="0.000284"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.552858" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:58:27.552597" elapsed="0.000284"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.553474" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:58:27.553195" elapsed="0.000303"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:27.554174" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:58:27.553995" elapsed="0.000203"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:27.554241" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:58:27.554364" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:58:27.553670" elapsed="0.000715"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:27.554569" elapsed="0.000297"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:58:27.553060" elapsed="0.001843"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.555417" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:58:27.555136" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:27.556118" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:58:27.555942" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:27.556184" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:58:27.556306" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:58:27.555615" elapsed="0.000713"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:27.556508" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:58:27.555003" elapsed="0.001718"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:58:27.552924" elapsed="0.003861"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:58:27.556826" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:58:27.556954" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:58:27.551788" elapsed="0.005189"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:27.551514" elapsed="0.005492"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.557182" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:27.557028" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.551497" elapsed="0.005755"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.557952" 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-10-11T00:58:27.557428" elapsed="0.000551"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:27.558023" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T00:58:27.548247" elapsed="0.009875"/>
</kw>
<msg time="2026-10-11T00:58:27.558170" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:27.543565" elapsed="0.014648"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T00:58:27.562622" 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/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-10-11T00:58:27.566876" 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/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-10-11T00:58:27.571102" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.571286" 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-10-11T00:58:27.571485" 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-10-11T00:58:27.571842" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:27.571680" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:27.571666" 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-10-11T00:58:27.572075" 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-10-11T00:58:27.572258" 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-10-11T00:58:27.572441" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:58:27.571641" elapsed="0.000849"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:58:27.571552" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.572720" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:27.572790" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:58:27.572902" 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-10-11T00:58:27.542934" elapsed="0.029993"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.573974" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:27.573724" 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-10-11T00:58:27.591363" level="INFO">DELETE Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node05qyjd6e9gd4kd0gcztbjfjzf18.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:27.591430" level="INFO">DELETE Response : url=http://10.30.170.173: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.171.7 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:27.591513" 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-10-11T00:58:27.574307" elapsed="0.017229"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:27.574077" elapsed="0.017497"/>
</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-10-11T00:58:27.591769" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:27.591597" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.574061" elapsed="0.017783"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.593042" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:27.592768" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:27.592514" elapsed="0.000599"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.592497" elapsed="0.000638"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.593716" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:27.593435" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:27.593184" elapsed="0.000605"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.593169" elapsed="0.000642"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.594332" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:27.593989" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.594656" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:27.594436" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.595166" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:27.594906" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:27.594741" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.594419" elapsed="0.000822"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.595788" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:27.595433" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.596085" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:27.595874" elapsed="0.000261"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.596598" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:27.596321" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:27.596157" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.595858" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:27.596869" elapsed="0.000294"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:58:27.597569" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:27.597327" elapsed="0.000268"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:58:27.597764" elapsed="0.000213"/>
</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-10-11T00:58:27.592168" elapsed="0.005864"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:58:27.598073" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:58:27.598245" 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-10-11T00:58:27.573166" elapsed="0.025102"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:58:27.598315" elapsed="0.000024"/>
</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-10-11T00:58:27.535487" elapsed="0.062937"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-10-11T00:58:27.437625" elapsed="0.160895"/>
</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-10-11T00:58:27.600524" elapsed="0.000224"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:58:27.600066" elapsed="0.000734"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:27.601696" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:27.601609" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.601592" elapsed="0.000180"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:27.603798" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:27.603716" elapsed="0.000122"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.603685" elapsed="0.000173"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.604788" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:27.604453" elapsed="0.000360"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.605226" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:58:27.604968" elapsed="0.000281"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:58:27.605289" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:58:27.605429" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:58:27.604080" elapsed="0.001373"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:27.607979" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:27.607896" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.607878" elapsed="0.000162"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:27.609080" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:27.608997" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.608980" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:27.609484" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:58:27.609291" elapsed="0.000218"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:27.609825" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:27.609675" elapsed="0.000173"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:58:27.661336" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:58:27.610338" elapsed="0.051131"/>
</kw>
<msg time="2026-10-11T00:58:27.661759" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:58:27.661801" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:27.610008" elapsed="0.051829"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:58:27.699031" 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-10-11T00:58:27.662492" elapsed="0.036639"/>
</kw>
<msg time="2026-10-11T00:58:27.699279" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:58:27.699320" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:27.662010" elapsed="0.037346"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.699658" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:27.699447" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.699427" elapsed="0.000319"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.700154" 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-10-11T00:58:27.699931" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.700495" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:27.700277" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.700261" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:58:27.700596" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:27.703054" elapsed="0.000116"/>
</kw>
<msg time="2026-10-11T00:58:27.703225" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:27.701964" 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-10-11T00:58:27.703823" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.704174" 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-10-11T00:58:27.701347" elapsed="0.003013"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:58:27.700887" 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-10-11T00:58:27.608742" elapsed="0.095768"/>
</kw>
<msg time="2026-10-11T00:58:27.704592" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:27.704633" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:27.608192" elapsed="0.096476"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:58:27.704953" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:58:27.704865" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.704843" elapsed="0.000188"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.705348" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.705674" elapsed="0.000038"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:58:27.705755" 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-10-11T00:58:27.607600" elapsed="0.098240"/>
</kw>
<msg time="2026-10-11T00:58:27.705922" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:27.705960" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:27.605793" elapsed="0.100203"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.706320" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:27.706095" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.706078" elapsed="0.000312"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:58:27.605636" elapsed="0.100885"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:58:27.605498" elapsed="0.101052"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:58:27.603401" elapsed="0.103198"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:58:27.601344" elapsed="0.105304"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:27.600952" elapsed="0.105735"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:58:27.599423" elapsed="0.107333"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.707323" level="INFO">&amp;{mapping} = { IP=10.30.170.173 | 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-10-11T00:58:27.706939" elapsed="0.000409"/>
</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-10-11T00:58:27.721093" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:27.720787" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:27.721817" 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-10-11T00:58:27.721622" elapsed="0.000259">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-10-11T00:58:27.721964" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:27.721281" elapsed="0.000705"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.722483" 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-10-11T00:58:27.722161" elapsed="0.000347"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:27.722802" 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-10-11T00:58:27.722926" 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-10-11T00:58:27.722677" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.723362" 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-10-11T00:58:27.723147" elapsed="0.000271"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.724317" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T00:58:27.724088" elapsed="0.000270"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.724811" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:58:27.724551" elapsed="0.000284"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.725424" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:58:27.725143" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:27.726146" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:58:27.725967" elapsed="0.000203"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:27.726213" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:58:27.726337" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:58:27.725623" elapsed="0.000736"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:27.726585" elapsed="0.000188"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T00:58:27.725010" elapsed="0.001800"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.727311" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:58:27.727042" elapsed="0.000294"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:27.728026" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:58:27.727848" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:27.728093" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:58:27.728214" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:58:27.727524" elapsed="0.000712"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:27.728401" elapsed="0.000181"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:58:27.726909" elapsed="0.001709"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:58:27.724877" elapsed="0.003773"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:58:27.728687" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T00:58:27.728830" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:58:27.723748" elapsed="0.005105"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:27.723480" elapsed="0.005401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.729053" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:27.728903" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.723463" elapsed="0.005658"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.729808" 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-10-11T00:58:27.729282" elapsed="0.000552"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:27.729878" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T00:58:27.720253" elapsed="0.009723"/>
</kw>
<msg time="2026-10-11T00:58:27.730023" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:27.715636" elapsed="0.014429"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T00:58:27.734445" 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/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-10-11T00:58:27.738717" 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/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-10-11T00:58:27.743015" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.743234" 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-10-11T00:58:27.743435" 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-10-11T00:58:27.743790" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:27.743629" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:27.743616" 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-10-11T00:58:27.744021" 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-10-11T00:58:27.744203" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.744368" elapsed="0.000017"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:58:27.743591" elapsed="0.000838"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:58:27.743503" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.744608" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:27.744674" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:58:27.744800" 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-10-11T00:58:27.715008" elapsed="0.029817"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.745853" 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.173</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:27.745611" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:27.770935" level="INFO">DELETE Request : url=http://10.30.170.173: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.173 
 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.173 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node05qyjd6e9gd4kd0gcztbjfjzf18.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:27.771027" level="INFO">DELETE Response : url=http://10.30.170.173: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.173 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:27.771204" 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-10-11T00:58:27.746183" elapsed="0.025070"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:27.745956" elapsed="0.025370"/>
</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-10-11T00:58:27.771652" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:27.771374" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.745939" elapsed="0.025803"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.772963" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:27.772671" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:27.772422" elapsed="0.000615"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.772389" elapsed="0.000671"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.773637" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:27.773350" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:27.773108" elapsed="0.000614"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.773094" elapsed="0.000652"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.774273" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:27.773926" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.774630" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:27.774396" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.775151" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:27.774884" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:27.774716" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.774378" elapsed="0.000850"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.775771" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:27.775420" elapsed="0.000377"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.776072" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:27.775860" elapsed="0.000263"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.776589" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:27.776310" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:27.776145" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.775843" elapsed="0.000824"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:27.776827" elapsed="0.000293"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:58:27.777521" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:27.777283" elapsed="0.000263"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:58:27.777717" elapsed="0.000214"/>
</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-10-11T00:58:27.772068" elapsed="0.005920"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:58:27.778029" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:58:27.778204" 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-10-11T00:58:27.745057" elapsed="0.033172"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:58:27.778275" elapsed="0.000026"/>
</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-10-11T00:58:27.707570" elapsed="0.070803"/>
</kw>
<doc>Revert the BGP configuration to the original state: without application peer</doc>
<status status="PASS" start="2026-10-11T00:58:27.598863" elapsed="0.179619"/>
</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-10-11T00:58:27.783689" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:27.783391" elapsed="0.000336"/>
</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-10-11T00:58:27.785033" level="INFO">Executing command 'cd '.' &amp;&amp; rm -rf /tmp/defaultvenv'.</msg>
<msg time="2026-10-11T00:58:27.837732" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:58:27.837872" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T00:58:27.837926" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T00:58:27.837975" 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-10-11T00:58:27.784878" elapsed="0.053125"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.839081" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T00:58:27.838751" elapsed="0.000388"/>
</kw>
<msg time="2026-10-11T00:58:27.839256" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T00:58:27.839310" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:27.838248" elapsed="0.001090"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.840098" 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-10-11T00:58:27.839604" elapsed="0.000528"/>
</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-10-11T00:58:27.841431" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:27.841108" elapsed="0.000380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.842119" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:27.841817" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.842767" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:27.842455" elapsed="0.000369"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T00:58:27.840622" elapsed="0.002271"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:27.840231" elapsed="0.002705"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.840205" elapsed="0.002763"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T00:58:27.843144" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:27.843038" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.843016" elapsed="0.000212"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:58:27.843383" elapsed="0.000054"/>
</return>
<status status="PASS" start="2026-10-11T00:58:27.843290" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.843272" elapsed="0.000237"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.843733" elapsed="0.000028"/>
</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-10-11T00:58:27.784369" elapsed="0.059496"/>
</kw>
<msg time="2026-10-11T00:58:27.843927" 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-10-11T00:58:27.783890" elapsed="0.060113"/>
</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-10-11T00:58:27.782907" elapsed="0.061191"/>
</kw>
<msg time="2026-10-11T00:58:27.844158" 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-10-11T00:58:27.781474" elapsed="0.062754"/>
</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-10-11T00:58:27.781130" elapsed="0.063191"/>
</kw>
<doc>Deletes a directory with virtual env.</doc>
<status status="PASS" start="2026-10-11T00:58:27.779255" elapsed="0.065129"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-10-11T00:58:27.844604" elapsed="0.000418"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:27.845318" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects </doc>
<status status="PASS" start="2026-10-11T00:58:27.845227" elapsed="0.000213"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-10-11T00:58:27.779012" elapsed="0.066498"/>
</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-10-11T00:58:04.849344" elapsed="22.996203"/>
</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-10-11T00:58:27.882707" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:58:27.880979" elapsed="0.001772"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-10-11T00:58:27.880629" elapsed="0.002179"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.885078" 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-10-11T00:58:27.883787" elapsed="0.001317"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-10-11T00:58:27.885253" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:27.885174" elapsed="0.000116"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.885156" elapsed="0.000154"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.885842" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:58:27.885510" elapsed="0.000372"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.886355" 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-10-11T00:58:27.886045" 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-10-11T00:58:27.886904" elapsed="0.000249"/>
</kw>
<msg time="2026-10-11T00:58:27.887239" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:27.887281" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:27.886561" elapsed="0.000742"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.887817" 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-10-11T00:58:27.887492" elapsed="0.000350"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.888704" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:58:27.888450" elapsed="0.000281"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.889114" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:58:27.888876" elapsed="0.000263"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.889596" 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-10-11T00:58:27.889313" elapsed="0.000308"/>
</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-10-11T00:58:27.890482" elapsed="0.000158"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.891086" level="INFO">${member_ip} = 10.30.170.173</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:27.890811" elapsed="0.000300"/>
</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-10-11T00:58:27.891276" elapsed="0.000181"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.892331" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:27.891910" elapsed="0.000447"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-11T00:58:27.892399" elapsed="0.000046"/>
</return>
<msg time="2026-10-11T00:58:27.892545" 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-10-11T00:58:27.891633" elapsed="0.000935"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:27.893067" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x74344724b810&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-10-11T00:58:27.892755" elapsed="0.000429"/>
</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-10-11T00:58:27.893345" elapsed="0.000163"/>
</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-10-11T00:58:27.890030" elapsed="0.003533"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:58:27.889861" elapsed="0.003740"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-10-11T00:58:27.889669" elapsed="0.003960"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.894173" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:58:27.893824" elapsed="0.000389"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.894770" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.173'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:58:27.894397" elapsed="0.000412"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.895329" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:58:27.894994" elapsed="0.000374"/>
</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-10-11T00:58:27.888063" elapsed="0.007376"/>
</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-10-11T00:58:27.883460" elapsed="0.012031"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:27.895638" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:27.895550" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.895533" elapsed="0.000177"/>
</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-10-11T00:58:27.896937" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:27.896604" elapsed="0.000359"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.897375" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:58:27.897117" elapsed="0.000282"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:58:27.897456" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:58:27.897586" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:58:27.896288" elapsed="0.001324"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:27.898460" level="INFO">${member_ip} = 10.30.170.173</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-10-11T00:58:27.898239" elapsed="0.000246"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:27.899185" 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-10-11T00:58:27.899275" 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-10-11T00:58:27.899048" elapsed="0.000251"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:27.902133" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:27.901600" elapsed="0.000612"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:27.901581" elapsed="0.000667"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:27.902930" 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-10-11T00:58:27.903146" 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-10-11T00:58:27.902506" elapsed="0.000688"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.904486" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.173" 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-10-11T00:58:27.903720" elapsed="0.000887"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:27.905753" 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-10-11T00:58:27.904910" elapsed="0.000892"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:58:27.907543" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:58:27.907724" 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-10-11T00:58:27.907203" elapsed="0.000564"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:27.908096" elapsed="0.000485"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:58:27.909676" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:58:28.592228" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 00:58:28 UTC 2026

  System load:  0.16               Processes:             121
  Usage of /:   14.2% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.173
  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.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:58:05 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:58:27.909438" elapsed="0.682955"/>
</kw>
<msg time="2026-10-11T00:58:28.592493" 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-10-11T00:58:27.908970" elapsed="0.683693"/>
</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-10-11T00:58:27.906219" elapsed="0.686677"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:28.593841" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-10-11T00:58:28.607517" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-10-11T00:58:28.607772" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T00:58:28.607916" 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-10-11T00:58:28.593311" elapsed="0.014675"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:58:28.608461" elapsed="0.000918"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:28.611228" 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-10-11T00:58:28.610397" elapsed="0.001037"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T00:58:28.612038" elapsed="0.000100"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:28.611684" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:28.611645" elapsed="0.000671"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T00:58:28.612840" elapsed="0.000119"/>
</return>
<status status="PASS" start="2026-10-11T00:58:28.612528" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:28.612402" elapsed="0.000736"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T00:58:28.613218" elapsed="0.000021"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:28.615140" elapsed="0.000673"/>
</kw>
<kw name="Open 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-10-11T00:58:28.616269" elapsed="0.000465"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:58:28.617123" elapsed="0.000344"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:58:28.614025" elapsed="0.003541"/>
</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-10-11T00:58:27.900940" elapsed="0.716798"/>
</kw>
<msg time="2026-10-11T00:58:28.617810" 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-10-11T00:58:27.900321" elapsed="0.717565"/>
</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-10-11T00:58:27.899939" elapsed="0.718052"/>
</kw>
<msg time="2026-10-11T00:58:28.618045" 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-10-11T00:58:27.899470" elapsed="0.718637"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:28.619112" elapsed="0.000502"/>
</kw>
<kw name="Open 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-10-11T00:58:28.619905" elapsed="0.000196"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:58:28.620312" elapsed="0.000157"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:58:28.618607" elapsed="0.001931"/>
</kw>
<msg time="2026-10-11T00:58:28.620659" 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-10-11T00:58:27.898683" elapsed="0.722024"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:28.621362" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:28.621036" elapsed="0.000402"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-11T00:58:28.621496" elapsed="0.000041"/>
</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-10-11T00:58:27.897931" elapsed="0.723713"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:58:27.897768" elapsed="0.723943"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:58:27.897658" elapsed="0.724103"/>
</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-10-11T00:58:27.895948" elapsed="0.725892"/>
</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-10-11T00:58:28.622069" elapsed="0.000415"/>
</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-10-11T00:58:28.631028" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:28.630897" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:28.630869" elapsed="0.000253"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:28.631620" 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-10-11T00:58:28.631773" 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-10-11T00:58:28.631440" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:28.632447" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:28.632092" elapsed="0.000417"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:28.633128" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:28.632809" elapsed="0.000377"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:28.634234" 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-10-11T00:58:28.633980" elapsed="0.000396">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-10-11T00:58:28.634540" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T00:58:28.634600" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:28.633440" elapsed="0.001191"/>
</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-10-11T00:58:28.635067" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:28.634748" elapsed="0.000418"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:28.634722" elapsed="0.000476"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:28.636174" level="INFO">${ip_address} = 10.30.170.173</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-10-11T00:58:28.635869" elapsed="0.000341"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-10-11T00:58:28.636273" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:58:28.636473" level="INFO">${odl_ip} = 10.30.170.173</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-10-11T00:58:28.635493" elapsed="0.001014"/>
</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-10-11T00:58:28.636785" elapsed="0.000469"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:28.637747" level="INFO">index=4
host=10.30.170.173
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-10-11T00:58:28.637878" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.173
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-10-11T00:58:28.637588" elapsed="0.000326"/>
</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-10-11T00:58:28.638154" elapsed="0.000366"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-10-11T00:58:28.639111" level="INFO">Logging into '10.30.170.173:8101' as 'karaf'.</msg>
<msg time="2026-10-11T00:58:28.868552" 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-10-11T00:58:28.638821" elapsed="0.229910"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:28.870564" 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-10-11T00:58:28.871133" elapsed="0.000158"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:58:28.871459" 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-10-11T00:58:28.870162" elapsed="0.001448"/>
</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-10-11T00:58:28.869172" elapsed="0.002484"/>
</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-10-11T00:58:28.630533" elapsed="0.241187"/>
</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-10-11T00:58:28.623585" elapsed="0.248182"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:28.622970" elapsed="0.248847"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:58:28.622758" elapsed="0.249097"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-10-11T00:58:28.622564" elapsed="0.249326"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-10-11T00:58:27.883063" elapsed="0.988884"/>
</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-10-11T00:58:28.872844" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:28.872749" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:28.872727" elapsed="0.000186"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:28.874953" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:28.874866" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:28.874848" elapsed="0.000169"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:28.875915" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:28.875561" elapsed="0.000381"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:58:28.876368" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:58:28.876100" elapsed="0.000292"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:58:28.876450" elapsed="0.000032"/>
</return>
<msg time="2026-10-11T00:58:28.876586" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:58:28.875232" elapsed="0.001378"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:28.879072" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:28.878987" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:28.878969" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:28.880211" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:28.880125" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:28.880108" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:28.880736" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:58:28.880447" elapsed="0.000315"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:28.881119" 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-10-11T00:58:28.880929" elapsed="0.000214"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:58:28.922092" 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-10-11T00:58:28.881838" elapsed="0.040382"/>
</kw>
<msg time="2026-10-11T00:58:28.922352" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:58:28.922394" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:28.881303" elapsed="0.041146"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:58:28.998793" 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-10-11T00:58:28.923157" elapsed="0.075826"/>
</kw>
<msg time="2026-10-11T00:58:28.999112" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:58:28.999154" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:28.922625" elapsed="0.076567"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:28.999600" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:28.999261" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:28.999242" elapsed="0.000540"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.000334" 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-10-11T00:58:28.999970" elapsed="0.000464"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.000864" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:29.000496" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.000480" elapsed="0.000553"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:58:29.001065" 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">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:29.003067" 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-10-11T00:58:29.003892" elapsed="0.000268"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T00:58:29.004495" elapsed="0.000231"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T00:58:29.002309" elapsed="0.002502"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:58:29.001353" elapsed="0.003582"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:58:28.879919" elapsed="0.125094"/>
</kw>
<msg time="2026-10-11T00:58:29.005096" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:29.005137" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:28.879290" elapsed="0.125883"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:58:29.005330" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:58:29.005243" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.005225" 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-10-11T00:58:29.005777" 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-10-11T00:58:29.006080" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:58:29.006144" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:58:28.878751" elapsed="0.127478"/>
</kw>
<msg time="2026-10-11T00:58:29.006312" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:29.006351" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:28.876960" elapsed="0.129426"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.006824" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:29.006585" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.006568" elapsed="0.000329"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:58:28.876814" elapsed="0.130104"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:58:28.876659" elapsed="0.130286"/>
</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-10-11T00:58:28.874612" elapsed="0.132380"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-10-11T00:58:28.872549" elapsed="0.134526"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:28.872110" elapsed="0.135005"/>
</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-10-11T00:58:27.880327" elapsed="1.126836"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:29.007654" 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-10-11T00:58:29.007340" elapsed="0.000338"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.008174" level="INFO">${mininet_conn_id} = 7</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:58:29.007886" elapsed="0.000326"/>
</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-10-11T00:58:29.009778" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T00:58:29.009850" 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-10-11T00:58:29.009484" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:29.010027" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T00:58:29.011103" level="INFO">Logging into '10.30.171.7:22' as 'jenkins'.</msg>
<msg time="2026-10-11T00:58:29.397511" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Sun Oct 11 00:58:05 UTC 2026

  System load:  0.46               Processes:             106
  Usage of /:   20.0% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.7
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:58:06 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T00:58:29.010875" elapsed="0.386715"/>
</kw>
<msg time="2026-10-11T00:58:29.397648" 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-10-11T00:58:29.010488" elapsed="0.387223"/>
</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-10-11T00:58:29.009096" elapsed="0.388691"/>
</kw>
<msg time="2026-10-11T00:58:29.397831" 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-10-11T00:58:29.008736" elapsed="0.389136"/>
</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-10-11T00:58:29.008396" elapsed="0.389542"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:29.398345" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7434454c3b10&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-10-11T00:58:29.398125" elapsed="0.000626"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T00:58:29.409954" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-10-11T00:58:29.423301" 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-10-11T00:58:29.398944" elapsed="0.024440"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T00:58:29.425179" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-10-11T00:58:29.468503" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T00:58:29.468646" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T00:58:29.468720" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T00:58:29.468773" 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-10-11T00:58:29.424963" elapsed="0.043840"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.469911" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T00:58:29.469552" elapsed="0.000418"/>
</kw>
<msg time="2026-10-11T00:58:29.470090" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T00:58:29.470146" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:29.469052" elapsed="0.001123"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.470947" 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-10-11T00:58:29.470440" elapsed="0.000540"/>
</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-10-11T00:58:29.471525" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:29.471136" elapsed="0.000472"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.471107" elapsed="0.000537"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-10-11T00:58:29.471834" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-10-11T00:58:29.471730" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.471709" elapsed="0.000236"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-10-11T00:58:29.472055" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:29.472013" elapsed="0.000092"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:29.471993" elapsed="0.000139"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.472337" elapsed="0.000026"/>
</kw>
<msg time="2026-10-11T00:58:29.472529" 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-10-11T00:58:29.424394" elapsed="0.048168"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-10-11T00:58:29.472763" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-10-11T00:58:29.472648" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.472627" elapsed="0.000233"/>
</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-10-11T00:58:29.473095" elapsed="0.000026"/>
</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-10-11T00:58:29.423808" elapsed="0.049389"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.475728" level="INFO">${EVPN_CONF_URL} = /rests/data/bgp-rib:application-rib=10.30.170.173/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 the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:58:29.473467" elapsed="0.002320"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.478240" 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 the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:58:29.476051" elapsed="0.002248"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.480852" 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 the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:58:29.478581" elapsed="0.002329"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.491727" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:29.491271" elapsed="0.000493"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:29.492770" 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-10-11T00:58:29.492447" elapsed="0.000418">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-10-11T00:58:29.492984" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:29.491985" elapsed="0.001030"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.493715" 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-10-11T00:58:29.493253" elapsed="0.000498"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:29.494136" 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-10-11T00:58:29.494308" 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-10-11T00:58:29.493983" elapsed="0.000397"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.495017" 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-10-11T00:58:29.494707" 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-10-11T00:58:29.495542" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:29.495160" elapsed="0.000457"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.496486" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:29.495873" elapsed="0.000649"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:29.495649" elapsed="0.000920"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.495136" elapsed="0.001461"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.497379" 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-10-11T00:58:29.496844" elapsed="0.000595"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:29.497503" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T00:58:29.497700" 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-10-11T00:58:29.490796" elapsed="0.006940"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.498377" 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 the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T00:58:29.498000" elapsed="0.000453"/>
</kw>
<doc>Initialize SetupUtils. Suite setup keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:27.880062" elapsed="1.618464"/>
</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-10-11T00:58:29.500436" elapsed="0.000309"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:58:29.500045" 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-10-11T00:58:29.502375" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:29.502248" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.502222" 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-10-11T00:58:29.505307" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:29.505192" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.505169" elapsed="0.000225"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.506704" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:29.506221" elapsed="0.000509"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.507147" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:58:29.506884" elapsed="0.000287"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:58:29.507211" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:58:29.507336" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:58:29.505724" 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-10-11T00:58:29.510063" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:29.509977" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.509959" elapsed="0.000168"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:29.511189" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:29.511105" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.511088" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:29.511592" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:58:29.511398" elapsed="0.000218"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:29.511935" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:29.511798" elapsed="0.000160"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:58:29.547883" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:58:29.512499" elapsed="0.035483"/>
</kw>
<msg time="2026-10-11T00:58:29.548135" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:58:29.548177" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:29.512149" elapsed="0.036065"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:58:29.580012" 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-10-11T00:58:29.548761" elapsed="0.031349"/>
</kw>
<msg time="2026-10-11T00:58:29.580259" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:58:29.580300" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:29.548384" elapsed="0.031951"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.580638" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:29.580428" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.580387" elapsed="0.000336"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.581133" 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-10-11T00:58:29.580908" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.581471" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:29.581255" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.581238" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:58:29.581572" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:29.584045" elapsed="0.000116"/>
</kw>
<msg time="2026-10-11T00:58:29.584217" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:29.582944" 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-10-11T00:58:29.584691" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.585027" 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-10-11T00:58:29.582330" elapsed="0.003012"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:58:29.581869" elapsed="0.003533"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:58:29.510850" elapsed="0.074645"/>
</kw>
<msg time="2026-10-11T00:58:29.585577" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:29.585616" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:29.510281" elapsed="0.075371"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:58:29.585821" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:58:29.585735" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.585716" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.586215" elapsed="0.000022"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.586537" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:58:29.586601" 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-10-11T00:58:29.509639" elapsed="0.077073"/>
</kw>
<msg time="2026-10-11T00:58:29.586835" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:29.586875" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:29.507718" elapsed="0.079192"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.587197" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:29.586978" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.586962" elapsed="0.000305"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:58:29.507564" elapsed="0.079724"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:58:29.507421" elapsed="0.079894"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:58:29.504787" elapsed="0.082575"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:58:29.501877" elapsed="0.085641"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:29.501246" elapsed="0.086317"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:58:29.499507" elapsed="0.088104"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.588197" level="INFO">&amp;{mapping} = { BGP_RIB_OPENCONFIG=example-bgp-rib | IP=10.30.170.173 }</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-10-11T00:58:29.587808" elapsed="0.000414"/>
</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-10-11T00:58:29.599919" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:29.599597" elapsed="0.000349"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:29.600630" 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-10-11T00:58:29.600439" elapsed="0.000265">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-10-11T00:58:29.600790" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:29.600106" elapsed="0.000706"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.601297" 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-10-11T00:58:29.600986" elapsed="0.000337"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:29.601616" 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-10-11T00:58:29.601757" 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-10-11T00:58:29.601506" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.602197" 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-10-11T00:58:29.601977" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.603159" level="INFO">mapping: {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.173'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:29.602924" elapsed="0.000277"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.603645" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:58:29.603379" elapsed="0.000290"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.604266" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:58:29.603998" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:29.604989" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:58:29.604803" elapsed="0.000210"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:29.605091" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T00:58:29.605222" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:58:29.604480" elapsed="0.000765"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:29.605427" elapsed="0.000177"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:58:29.603866" elapsed="0.001775"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.606156" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:58:29.605884" elapsed="0.000297"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:29.606898" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:58:29.606697" elapsed="0.000225"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:29.606967" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:58:29.607092" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:58:29.606352" elapsed="0.000763"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:29.607280" elapsed="0.000181"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T00:58:29.605753" elapsed="0.001746"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:58:29.603726" elapsed="0.003805"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:58:29.607569" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T00:58:29.607709" level="INFO">${mapping_to_use} = {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.173'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T00:58:29.602571" elapsed="0.005163"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:29.602303" elapsed="0.005460"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.607940" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:29.607787" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.602285" elapsed="0.005726"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.608878" 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-10-11T00:58:29.608171" elapsed="0.000734"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:29.608951" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:58:29.599080" elapsed="0.009972"/>
</kw>
<msg time="2026-10-11T00:58:29.609101" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:29.594660" elapsed="0.014485"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:58:29.613344" 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/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-10-11T00:58:29.617511" 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/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-10-11T00:58:29.621665" elapsed="0.000049"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.621910" 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-10-11T00:58:29.622096" 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-10-11T00:58:29.622457" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:29.622295" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:29.622281" 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-10-11T00:58:29.622702" 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-10-11T00:58:29.622886" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.623052" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:58:29.622255" elapsed="0.000846"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:58:29.622165" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.623279" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:29.623346" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:58:29.623473" 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-10-11T00:58:29.594043" elapsed="0.029457"/>
</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-10-11T00:58:29.632633" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:29.632311" elapsed="0.000349"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:29.633342" 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-10-11T00:58:29.633171" elapsed="0.000230">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-10-11T00:58:29.633502" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:29.632850" elapsed="0.000676"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.634019" 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-10-11T00:58:29.633708" elapsed="0.000337"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:29.634321" 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-10-11T00:58:29.634457" 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-10-11T00:58:29.634213" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.634918" 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-10-11T00:58:29.634696" elapsed="0.000268"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:58:29.635278" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:29.635026" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.635795" level="INFO">${mapping_to_use} = {'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.173'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:29.635518" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:29.635355" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.635009" elapsed="0.000898"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.636587" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.173&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-10-11T00:58:29.636074" elapsed="0.000542"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:29.636661" 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/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-10-11T00:58:29.631807" elapsed="0.004969"/>
</kw>
<msg time="2026-10-11T00:58:29.636825" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:29.627383" elapsed="0.009486"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:58:29.641200" 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/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-10-11T00:58:29.645398" 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/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-10-11T00:58:29.649579" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.649771" 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-10-11T00:58:29.649954" 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-10-11T00:58:29.650291" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:29.650146" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:29.650133" 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-10-11T00:58:29.650534" 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-10-11T00:58:29.650733" 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-10-11T00:58:29.650898" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:58:29.650108" elapsed="0.000838"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:58:29.650020" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.651120" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:29.651185" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:58:29.651293" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.173&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-10-11T00:58:29.626647" elapsed="0.024674"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:29.652487" 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-10-11T00:58:29.652282" elapsed="0.000265">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-10-11T00:58:29.652631" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:29.651959" elapsed="0.000694"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.652950" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:29.652728" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.653472" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:29.653193" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:29.653023" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.652711" elapsed="0.000837"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.654062" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:29.653725" elapsed="0.000361"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:58:29.654132" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:58:29.654255" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:58:29.651643" elapsed="0.002635"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.655527" 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.173</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:29.655289" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.655985" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.173&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-10-11T00:58:29.655771" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.656446" 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-10-11T00:58:29.656216" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.656906" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:29.656690" elapsed="0.000256"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:29.657663" 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-10-11T00:58:29.657499" elapsed="0.000204"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:58:29.658000" 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-10-11T00:58:29.657857" elapsed="0.000167"/>
</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-10-11T00:58:29.658185" elapsed="0.000155"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.658786" 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-10-11T00:58:29.658549" elapsed="0.000278"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:58:29.658865" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:58:29.658992" 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-10-11T00:58:29.657130" elapsed="0.001885"/>
</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-10-11T00:58:29.680038" level="INFO">PUT Request : url=http://10.30.170.173: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.173 
 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.173 
 headers={'User-Agent': 'python-requests/2.34.2', '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.173&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-10-11T00:58:29.680124" level="INFO">PUT Response : url=http://10.30.170.173: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.173 
 status=201, reason=Created 
 headers={'Set-Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Sat, 10-Oct-2026 00:58:29 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:29.680223" 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-10-11T00:58:29.659306" elapsed="0.020941"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:29.659076" elapsed="0.021212"/>
</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-10-11T00:58:29.680494" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:29.680313" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.659061" elapsed="0.021514"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.681751" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:29.681460" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:29.681206" elapsed="0.000617"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.681189" elapsed="0.000656"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.682395" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:29.682130" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:29.681894" elapsed="0.000590"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.681879" elapsed="0.000627"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.683045" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:29.682700" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.683346" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:29.683134" elapsed="0.000265"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.683875" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:29.683601" elapsed="0.000299"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:29.683437" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.683117" elapsed="0.000835"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.684474" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:29.684126" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.684787" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:29.684561" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.685287" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:29.685025" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:29.684861" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.684545" elapsed="0.000818"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:29.685523" elapsed="0.000308"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:58:29.686219" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:29.685995" elapsed="0.000248"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T00:58:29.686398" elapsed="0.000227"/>
</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-10-11T00:58:29.680916" elapsed="0.005776"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:58:29.686837" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:58:29.686754" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.686736" elapsed="0.000180"/>
</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-10-11T00:58:29.687061" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:58:29.687122" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:58:29.687279" 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-10-11T00:58:29.654587" elapsed="0.032717"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:58:29.687393" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T00:58:29.687537" 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-10-11T00:58:29.589059" elapsed="0.098501"/>
</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-10-11T00:58:29.687866" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:29.687647" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.687632" elapsed="0.000319"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:58:29.687982" elapsed="0.000024"/>
</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-10-11T00:58:29.588473" elapsed="0.099608"/>
</kw>
<doc>Configures bgp application peer. Openconfig is used for carbon and above.</doc>
<status status="PASS" start="2026-10-11T00:58:29.498609" elapsed="0.189572"/>
</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-10-11T00:58:29.690027" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:58:29.689543" 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-10-11T00:58:29.691258" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:29.691173" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.691155" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:29.693604" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:29.693520" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.693502" elapsed="0.000168"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.694591" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:29.694253" elapsed="0.000364"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.695048" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:58:29.694787" elapsed="0.000285"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:58:29.695112" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:58:29.695238" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:58:29.693895" elapsed="0.001366"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:29.697812" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:29.697728" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.697710" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:29.698933" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:29.698849" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.698832" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:29.699309" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:58:29.699142" elapsed="0.000191"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:29.699652" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:29.699516" elapsed="0.000172"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:58:29.734451" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:58:29.700174" elapsed="0.034374"/>
</kw>
<msg time="2026-10-11T00:58:29.734717" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:58:29.734759" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:29.699847" elapsed="0.034947"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:58:29.774429" 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-10-11T00:58:29.735301" elapsed="0.039246"/>
</kw>
<msg time="2026-10-11T00:58:29.774713" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:58:29.774755" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:29.734963" elapsed="0.039828"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.775070" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:29.774861" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.774843" elapsed="0.000298"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.775574" 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-10-11T00:58:29.775323" elapsed="0.000321"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.775918" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:29.775718" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.775700" elapsed="0.000289"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:58:29.776019" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:29.778503" elapsed="0.000247"/>
</kw>
<msg time="2026-10-11T00:58:29.778809" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:29.777366" elapsed="0.001575"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.779249" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.779612" 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-10-11T00:58:29.776784" 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-10-11T00:58:29.776292" elapsed="0.003578"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:58:29.698582" elapsed="0.081360"/>
</kw>
<msg time="2026-10-11T00:58:29.780023" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:29.780062" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:29.698026" elapsed="0.082071"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:58:29.780249" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:58:29.780164" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.780147" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.780691" 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-10-11T00:58:29.781120" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:58:29.781188" 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-10-11T00:58:29.697427" elapsed="0.083847"/>
</kw>
<msg time="2026-10-11T00:58:29.781357" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:29.781397" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:29.695609" elapsed="0.085847"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.781759" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:29.781525" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.781509" elapsed="0.000320"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:58:29.695464" elapsed="0.086426"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:58:29.695309" elapsed="0.086613"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:58:29.693208" elapsed="0.088764"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:58:29.690922" elapsed="0.091100"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:29.690513" elapsed="0.091549"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:58:29.689094" elapsed="0.093015"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.782902" level="INFO">&amp;{mapping} = { IP=10.30.171.7 | 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-10-11T00:58:29.782290" elapsed="0.000639"/>
</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-10-11T00:58:29.793237" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:29.792937" elapsed="0.000327"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:29.793963" 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-10-11T00:58:29.793763" elapsed="0.000265">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-10-11T00:58:29.794113" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:29.793436" elapsed="0.000700"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.794640" 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-10-11T00:58:29.794308" elapsed="0.000357"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:29.795034" 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-10-11T00:58:29.795163" 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-10-11T00:58:29.794924" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.795614" 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-10-11T00:58:29.795383" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.796742" level="INFO">mapping: {'IP': '10.30.171.7', '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-10-11T00:58:29.796317" elapsed="0.000469"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.797212" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T00:58:29.796964" elapsed="0.000272"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.797858" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:58:29.797576" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:29.798568" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:58:29.798368" elapsed="0.000224"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:29.798637" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:58:29.798774" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:58:29.798055" elapsed="0.000742"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:29.798963" elapsed="0.000170"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T00:58:29.797440" elapsed="0.001729"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.799736" 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-10-11T00:58:29.799450" elapsed="0.000311"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:29.800433" 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-10-11T00:58:29.800235" elapsed="0.000224"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:29.800503" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:58:29.800626" 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-10-11T00:58:29.799930" elapsed="0.000718"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:29.800826" elapsed="0.000165"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T00:58:29.799302" elapsed="0.001727"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.801540" 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-10-11T00:58:29.801257" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:29.802230" 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-10-11T00:58:29.802056" elapsed="0.000197"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:29.802297" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:58:29.802433" 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-10-11T00:58:29.801745" elapsed="0.000712"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:29.802620" elapsed="0.000175"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T00:58:29.801128" elapsed="0.001703"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.803321" 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-10-11T00:58:29.803056" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:29.804021" 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-10-11T00:58:29.803845" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:29.804087" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:58:29.804209" 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-10-11T00:58:29.803528" elapsed="0.000703"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:29.804393" elapsed="0.000180"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T00:58:29.802928" elapsed="0.001682"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.805114" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T00:58:29.804849" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:29.805821" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T00:58:29.805629" elapsed="0.000216"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:29.805889" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:58:29.806011" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T00:58:29.805304" elapsed="0.000730"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:29.806196" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T00:58:29.804718" elapsed="0.001679"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.807073" 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-10-11T00:58:29.806642" elapsed="0.000455"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T00:58:29.807775" 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-10-11T00:58:29.807587" elapsed="0.000212"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T00:58:29.807843" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:58:29.807965" 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-10-11T00:58:29.807265" elapsed="0.000722"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T00:58:29.808148" elapsed="0.000163"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T00:58:29.806513" elapsed="0.001834"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T00:58:29.797280" elapsed="0.011099"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T00:58:29.808460" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:58:29.808594" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', '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-10-11T00:58:29.795977" elapsed="0.012640"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:29.795728" elapsed="0.012917"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.808828" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:29.808667" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.795711" elapsed="0.013185"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.809635" 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-10-11T00:58:29.809052" elapsed="0.000609"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:29.809732" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:58:29.792422" elapsed="0.017409"/>
</kw>
<msg time="2026-10-11T00:58:29.809878" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:29.788064" elapsed="0.021857"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:58:29.814051" 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/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-10-11T00:58:29.818195" 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/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-10-11T00:58:29.822333" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.822527" 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-10-11T00:58:29.822719" 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-10-11T00:58:29.823053" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:29.822908" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:29.822895" 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-10-11T00:58:29.823278" 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-10-11T00:58:29.823472" 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-10-11T00:58:29.823638" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:58:29.822871" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:58:29.822785" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.823870" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:29.823969" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T00:58:29.824080" 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-10-11T00:58:29.787472" elapsed="0.036633"/>
</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-10-11T00:58:29.833238" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:29.832934" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:29.833966" 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-10-11T00:58:29.833797" elapsed="0.000228">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-10-11T00:58:29.834108" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:29.833440" elapsed="0.000690"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.834651" 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-10-11T00:58:29.834301" elapsed="0.000388"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:29.834961" 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-10-11T00:58:29.835081" 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-10-11T00:58:29.834854" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.835540" 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-10-11T00:58:29.835300" 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-10-11T00:58:29.835918" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:29.835656" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.836401" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', '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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:29.836138" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:29.835992" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.835639" elapsed="0.000854"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.837285" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflecto...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:29.836652" elapsed="0.000661"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:29.837356" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:58:29.832416" elapsed="0.005057"/>
</kw>
<msg time="2026-10-11T00:58:29.837555" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:29.827896" elapsed="0.009703"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T00:58:29.841758" 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/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-10-11T00:58:29.845897" 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/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-10-11T00:58:29.850022" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.850203" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.850382" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.850741" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:29.850585" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-10-11T00:58:29.850572" 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-10-11T00:58:29.850968" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.851145" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.851307" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T00:58:29.850547" elapsed="0.000806"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T00:58:29.850461" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.851541" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T00:58:29.851606" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T00:58:29.851736" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflecto...</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-10-11T00:58:29.827175" elapsed="0.024588"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:29.852871" 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-10-11T00:58:29.852670" elapsed="0.000289">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-10-11T00:58:29.853044" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:29.852329" elapsed="0.000738"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.853349" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:29.853129" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.853886" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:29.853605" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:29.853437" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.853112" elapsed="0.000850"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.854472" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:29.854123" elapsed="0.000372"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T00:58:29.854540" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:58:29.854663" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T00:58:29.852031" elapsed="0.002666"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.856078" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:29.855856" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.856548" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T00:58:29.856313" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.857025" 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-10-11T00:58:29.856806" elapsed="0.000259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.857486" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:29.857254" elapsed="0.000272"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:29.858233" 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-10-11T00:58:29.858077" elapsed="0.000180"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T00:58:29.858574" 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-10-11T00:58:29.858430" elapsed="0.000168"/>
</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-10-11T00:58:29.858772" elapsed="0.000154"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.859339" 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-10-11T00:58:29.859119" elapsed="0.000259"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T00:58:29.859432" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:58:29.859560" 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-10-11T00:58:29.857719" elapsed="0.001865"/>
</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-10-11T00:58:29.872396" level="INFO">PUT Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '1088', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T00:58:29.872512" level="INFO">PUT Response : url=http://10.30.170.173: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.171.7 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:29.872594" 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-10-11T00:58:29.859885" elapsed="0.012733"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:29.859644" elapsed="0.013013"/>
</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-10-11T00:58:29.872849" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:29.872694" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.859629" elapsed="0.013299"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.874104" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:29.873827" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:29.873548" elapsed="0.000626"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.873531" elapsed="0.000666"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.874777" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:29.874496" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:29.874245" elapsed="0.000603"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.874230" elapsed="0.000641"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.875381" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:29.875044" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.875708" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:29.875487" elapsed="0.000272"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.876200" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:29.875943" elapsed="0.000281"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:29.875781" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.875470" elapsed="0.000805"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.876804" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:29.876460" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.877097" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:29.876891" elapsed="0.000256"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.877609" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T00:58:29.877332" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:29.877169" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.876875" elapsed="0.000820"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:29.877844" elapsed="0.000286"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T00:58:29.878521" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T00:58:29.878287" 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-10-11T00:58:29.878761" elapsed="0.000214"/>
</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-10-11T00:58:29.873246" elapsed="0.005784"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T00:58:29.879170" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:58:29.879088" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.879072" elapsed="0.000175"/>
</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-10-11T00:58:29.879389" elapsed="0.000035"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T00:58:29.879466" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T00:58:29.879623" 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-10-11T00:58:29.855147" elapsed="0.024500"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:58:29.879744" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:58:29.879868" 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-10-11T00:58:29.783778" elapsed="0.096113"/>
</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-10-11T00:58:29.880172" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:29.879974" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.879959" elapsed="0.000294"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T00:58:29.880283" elapsed="0.000023"/>
</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-10-11T00:58:29.783170" elapsed="0.097207"/>
</kw>
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="PASS" start="2026-10-11T00:58:29.688545" elapsed="0.191943"/>
</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-10-11T00:58:29.882255" elapsed="0.000342"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:58:29.882006" elapsed="0.000645"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:29.883697" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:29.883592" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.883574" elapsed="0.000189"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:29.885756" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:29.885663" elapsed="0.000135"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.885646" elapsed="0.000175"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.886729" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:29.886378" elapsed="0.000376"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.887161" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:58:29.886905" elapsed="0.000279"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:58:29.887224" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T00:58:29.887346" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:58:29.886024" elapsed="0.001344"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:29.889978" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:29.889895" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.889877" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:29.891072" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:29.890990" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.890974" elapsed="0.000158"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:29.891465" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:58:29.891277" elapsed="0.000213"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:29.891796" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:29.891651" elapsed="0.000169"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:58:29.926279" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:58:29.892299" elapsed="0.034074"/>
</kw>
<msg time="2026-10-11T00:58:29.926544" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:58:29.926585" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:29.891975" elapsed="0.034645"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:58:29.956321" 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-10-11T00:58:29.927131" elapsed="0.029341"/>
</kw>
<msg time="2026-10-11T00:58:29.956622" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:58:29.956663" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:29.926796" elapsed="0.029914"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.956982" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:29.956779" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.956761" elapsed="0.000292"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.957469" 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-10-11T00:58:29.957231" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.957806" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:29.957593" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.957576" elapsed="0.000301"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:58:29.957907" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:29.960355" elapsed="0.000136"/>
</kw>
<msg time="2026-10-11T00:58:29.960548" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:29.959258" elapsed="0.001433"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.960993" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.961326" 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-10-11T00:58:29.958662" 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-10-11T00:58:29.958177" elapsed="0.003554"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:58:29.890737" elapsed="0.071067"/>
</kw>
<msg time="2026-10-11T00:58:29.961885" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:29.961924" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:29.890190" elapsed="0.071769"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:58:29.962112" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:58:29.962028" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.962010" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.962528" 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-10-11T00:58:29.962843" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:58:29.962906" 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-10-11T00:58:29.889596" elapsed="0.073395"/>
</kw>
<msg time="2026-10-11T00:58:29.963074" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:29.963114" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:29.887716" elapsed="0.075433"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:29.963513" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:29.963214" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:29.963199" elapsed="0.000386"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:58:29.887564" elapsed="0.076042"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:58:29.887428" elapsed="0.076204"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:58:29.885360" elapsed="0.078331"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:58:29.883215" elapsed="0.080571"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:29.882820" elapsed="0.081008"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:58:29.881643" elapsed="0.082231"/>
</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-10-11T00:58:29.966631" level="INFO">${command} = python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:29.965194" elapsed="0.001464"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:29.967083" level="INFO">python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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-10-11T00:58:29.966867" elapsed="0.000258"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:58:29.971284" level="INFO">python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --peerport=1790 --debug --evpn --wfr 1 &amp;&gt; play.py.out</msg>
<msg time="2026-10-11T00:58:29.971371" level="INFO">${output} =  python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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-10-11T00:58:29.967279" elapsed="0.004117"/>
</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-10-11T00:58:29.964821" elapsed="0.006645"/>
</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-10-11T00:58:35.973316" 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-10-11T00:58:29.973019" elapsed="6.000968">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-10-11T00:58:35.974302" elapsed="0.000029"/>
</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-10-11T00:58:29.972744" elapsed="6.001715">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-10-11T00:58:29.972353" elapsed="6.002222"/>
</kw>
<msg time="2026-10-11T00:58:35.974699" 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-10-11T00:58:29.971983" elapsed="6.002742"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-10-11T00:58:35.974892" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-10-11T00:58:35.974815" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:35.974788" elapsed="0.000186"/>
</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-10-11T00:58:35.975197" elapsed="0.000024"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:35.975377" elapsed="0.000019"/>
</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-10-11T00:58:29.971710" elapsed="6.003761"/>
</kw>
<doc>Starts bgp peer and verifies that the peer runs.</doc>
<status status="PASS" start="2026-10-11T00:58:29.964499" elapsed="6.011021"/>
</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-10-11T00:58:29.964056" elapsed="6.011505"/>
</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-10-11T00:58:29.880799" elapsed="6.094887"/>
</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-10-11T00:58:35.977690" elapsed="0.000215"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:58:35.977402" 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-10-11T00:58:35.978915" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:35.978814" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:35.978795" elapsed="0.000185"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:35.981219" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:35.981133" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:35.981115" elapsed="0.000221"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:35.982288" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:35.981952" elapsed="0.000363"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:58:35.982791" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:58:35.982508" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:58:35.982856" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:58:35.982985" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:58:35.981571" elapsed="0.001437"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:35.985580" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:35.985493" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:35.985475" elapsed="0.000185"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:35.986861" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:35.986742" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:35.986725" elapsed="0.000296"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:35.987581" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:58:35.987179" elapsed="0.000475"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:35.988249" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:35.988019" elapsed="0.000288"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:58:36.025025" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:58:35.989894" elapsed="0.035260"/>
</kw>
<msg time="2026-10-11T00:58:36.025281" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:58:36.025372" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:35.988708" elapsed="0.036782"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:58:36.060323" 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-10-11T00:58:36.027105" elapsed="0.033366"/>
</kw>
<msg time="2026-10-11T00:58:36.060593" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:58:36.060697" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:36.025905" elapsed="0.034863"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:36.061362" elapsed="0.000088"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:36.061061" elapsed="0.000456"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:36.061041" elapsed="0.000534"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:36.062264" 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-10-11T00:58:36.061777" elapsed="0.000601"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:36.062882" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:36.062566" elapsed="0.000447"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:36.062547" elapsed="0.000521"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:58:36.063102" 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-10-11T00:58:36.066851" elapsed="0.000246"/>
</kw>
<msg time="2026-10-11T00:58:36.067139" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:36.066112" elapsed="0.001088"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:36.067497" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:36.067720" 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-10-11T00:58:36.065345" elapsed="0.002589"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:58:36.063383" elapsed="0.004630"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:58:35.986437" elapsed="0.081726"/>
</kw>
<msg time="2026-10-11T00:58:36.068247" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:36.068287" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:35.985815" elapsed="0.082506"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:58:36.068523" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:58:36.068389" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:36.068372" 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-10-11T00:58:36.069000" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:36.069376" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:58:36.069460" 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-10-11T00:58:35.985186" elapsed="0.084361"/>
</kw>
<msg time="2026-10-11T00:58:36.069645" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:36.069686" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:35.983348" elapsed="0.086374"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:36.070013" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:36.069789" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:36.069773" elapsed="0.000310"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:58:35.983202" elapsed="0.086902"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:58:35.983058" elapsed="0.087073"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:58:35.980831" elapsed="0.089349"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:58:35.978531" elapsed="0.091698"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:35.978110" elapsed="0.092159"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:58:35.977039" elapsed="0.093276"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:36.078817" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:36.078976" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:36.079091" 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-10-11T00:58:36.070760" elapsed="0.008357"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:36.079321" elapsed="0.000442"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:36.087723" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:36.087875" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:58:36.087970" 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-10-11T00:58:36.079931" elapsed="0.008064"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:36.088942" 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-10-11T00:58:36.088672" elapsed="0.000298"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:36.089366" 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-10-11T00:58:36.089124" elapsed="0.000269"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:58:36.089599" elapsed="0.000299"/>
</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-10-11T00:58:36.088209" elapsed="0.001748"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:36.070475" elapsed="0.019533"/>
</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-10-11T00:58:35.976522" elapsed="0.113523"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:36.090769" 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-10-11T00:58:36.090986" 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-10-11T00:58:36.090601" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:36.091320" 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-10-11T00:58:36.091451" 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-10-11T00:58:36.091180" elapsed="0.000297"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:36.091792" 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-10-11T00:58:36.091908" 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-10-11T00:58:36.091652" elapsed="0.000281"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:58:36.092277" 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-10-11T00:58:36.092098" elapsed="0.000203"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:36.092628" 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-10-11T00:58:36.092744" 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-10-11T00:58:36.092480" elapsed="0.000288"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:58:36.093093" 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-10-11T00:58:36.092928" elapsed="0.000189"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:36.093565" 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-10-11T00:58:36.093315" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:36.094078" 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-10-11T00:58:36.093856" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:36.094552" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:36.094316" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:36.095024" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:36.094804" elapsed="0.000263"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:58:36.095209" elapsed="0.003238"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:36.110880" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T00:58:36.110940" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:36.111039" 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-10-11T00:58:36.098628" elapsed="0.012435"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:36.111603" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:36.111278" elapsed="0.000381"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:36.118094" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:36.118291" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:36.118469" 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-10-11T00:58:36.111819" elapsed="0.006679"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:36.119206" 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-10-11T00:58:36.118810" elapsed="0.000441"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:36.126445" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:36.126676" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:36.126786" 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-10-11T00:58:36.120323" elapsed="0.006492"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:36.127392" 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-10-11T00:58:36.127056" elapsed="0.000399"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:36.127637" elapsed="0.000361"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:36.130542" level="INFO">${update} = </msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:58:36.128155" elapsed="0.002415"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<msg time="2026-10-11T00:58:36.131132" level="FAIL"> == </msg>
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="FAIL" start="2026-10-11T00:58:36.130746" elapsed="0.000463"> == </status>
</kw>
<return>
<value>${update}</value>
<status status="NOT RUN" start="2026-10-11T00:58:36.131268" elapsed="0.000027"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="FAIL" start="2026-10-11T00:58:36.119965" elapsed="0.011438"> == </status>
</kw>
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:38.142911" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:38.143216" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:38.143460" 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-10-11T00:58:38.133084" elapsed="0.010432"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:38.144769" 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-10-11T00:58:38.144022" elapsed="0.000849"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:38.145236" elapsed="0.000801"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:38.149947" level="INFO">${update} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:58:38.146367" elapsed="0.003640"/>
</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-10-11T00:58:38.150395" elapsed="0.000705"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:58:38.151201" elapsed="0.000074"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:58:38.132137" elapsed="0.019344"/>
</kw>
<msg time="2026-10-11T00:58:38.151665" 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-10-11T00:58:36.119466" elapsed="2.032253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:38.152702" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:38.152159" elapsed="0.000635"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:58:38.154697" level="INFO">Length is 148.</msg>
<msg time="2026-10-11T00:58:38.154859" 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-10-11T00:58:38.154071" elapsed="0.000838"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:58:38.155819" level="INFO">Length is 148.</msg>
<msg time="2026-10-11T00:58:38.156068" 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-10-11T00:58:38.155261" elapsed="0.000857"/>
</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-10-11T00:58:38.156555" elapsed="0.000615"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:38.158397" 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-10-11T00:58:38.157529" elapsed="0.000950"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:38.159163" 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-10-11T00:58:38.158824" elapsed="0.000391"/>
</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-10-11T00:58:38.159662" elapsed="0.000593"/>
</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-10-11T00:58:38.153270" elapsed="0.007109"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:58:38.160740" elapsed="0.002757"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:38.172081" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:38.172358" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:38.172643" 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-10-11T00:58:38.164670" elapsed="0.008029"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:38.173933" 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-10-11T00:58:38.173163" elapsed="0.000869"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:38.174397" elapsed="0.000775"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:38.183769" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:38.184003" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:38.184209" 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-10-11T00:58:38.175557" elapsed="0.008706"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:38.185373" 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-10-11T00:58:38.184768" elapsed="0.000732"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:38.185881" elapsed="0.000756"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T00:58:38.187141" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:38.186800" elapsed="0.000435"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:38.186755" elapsed="0.000526"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:38.196907" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:38.197001" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:38.197201" 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-10-11T00:58:38.187727" elapsed="0.009526"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:58:38.164003" elapsed="0.033386"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:38.207931" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:38.208162" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:38.208348" 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-10-11T00:58:38.199560" elapsed="0.008841"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:38.209566" 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-10-11T00:58:38.208930" elapsed="0.000753"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:38.210044" elapsed="0.000761"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:38.213913" level="INFO">${update} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:58:38.211134" elapsed="0.002846"/>
</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-10-11T00:58:38.214393" elapsed="0.000697"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:58:38.215186" elapsed="0.000070"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:58:38.198841" elapsed="0.016610"/>
</kw>
<msg time="2026-10-11T00:58:38.215645" 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-10-11T00:58:38.197858" elapsed="0.017840"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:38.216683" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:38.216142" elapsed="0.000636"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:58:38.218627" level="INFO">Length is 136.</msg>
<msg time="2026-10-11T00:58:38.218781" 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-10-11T00:58:38.218053" elapsed="0.000778"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:58:38.219764" level="INFO">Length is 136.</msg>
<msg time="2026-10-11T00:58:38.219918" 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-10-11T00:58:38.219175" elapsed="0.000792"/>
</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-10-11T00:58:38.220369" elapsed="0.000635"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:38.221713" 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-10-11T00:58:38.221330" elapsed="0.000435"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:38.222448" 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-10-11T00:58:38.222078" elapsed="0.000423"/>
</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-10-11T00:58:38.222920" elapsed="0.000639"/>
</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-10-11T00:58:38.217246" elapsed="0.006529"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:38.232917" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:38.233158" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:38.233367" 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-10-11T00:58:38.224999" elapsed="0.008456"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:38.234608" 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-10-11T00:58:38.233939" elapsed="0.000768"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:38.235070" elapsed="0.000767"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:38.243175" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:38.243403" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:38.243683" 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-10-11T00:58:38.236188" elapsed="0.007551"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:38.244856" 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-10-11T00:58:38.244196" elapsed="0.000754"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:38.245308" elapsed="0.000765"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T00:58:38.246619" elapsed="0.000063"/>
</return>
<status status="PASS" start="2026-10-11T00:58:38.246232" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:38.246189" elapsed="0.000609"/>
</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-10-11T00:58:38.247127" elapsed="0.000041"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:58:38.224294" elapsed="0.023005"/>
</kw>
<arg>route_es_arb</arg>
<status status="PASS" start="2026-10-11T00:58:36.090283" elapsed="2.157107"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:35.976031" elapsed="2.271616"/>
</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-10-11T00:58:38.251628" elapsed="0.000437"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:58:38.251035" elapsed="0.001140"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:38.254239" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:38.254044" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:38.254004" elapsed="0.000376"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:38.257653" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:38.257513" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:38.257488" elapsed="0.000258"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:38.259185" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:38.258699" elapsed="0.000524"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:58:38.259897" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:58:38.259475" elapsed="0.000458"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:58:38.259993" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T00:58:38.260181" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:58:38.258110" elapsed="0.002105"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:38.264296" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:38.264171" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:38.264145" 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-10-11T00:58:38.266153" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:38.265987" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:38.265961" elapsed="0.000416"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:38.267154" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:58:38.266644" elapsed="0.000592"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:38.268086" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:38.267766" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:58:38.303716" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:58:38.270326" elapsed="0.033514"/>
</kw>
<msg time="2026-10-11T00:58:38.303969" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:58:38.304058" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:38.268657" elapsed="0.035470"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:58:38.338160" 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-10-11T00:58:38.305753" elapsed="0.032532"/>
</kw>
<msg time="2026-10-11T00:58:38.338422" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:58:38.338512" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:38.304545" elapsed="0.034036"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:38.339191" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:38.338887" elapsed="0.000434"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:38.338866" elapsed="0.000512"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:38.340073" 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-10-11T00:58:38.339594" elapsed="0.000591"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:38.340677" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:38.340352" elapsed="0.000453"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:38.340334" elapsed="0.000527"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:58:38.340895" 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-10-11T00:58:38.344449" elapsed="0.000122"/>
</kw>
<msg time="2026-10-11T00:58:38.344624" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:38.343914" 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-10-11T00:58:38.344921" elapsed="0.000056"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:38.345170" 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-10-11T00:58:38.343150" elapsed="0.002234"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:58:38.341192" elapsed="0.004458"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:58:38.265548" elapsed="0.080255"/>
</kw>
<msg time="2026-10-11T00:58:38.345890" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:38.345931" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:38.264655" elapsed="0.081313"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:58:38.346125" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:58:38.346037" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:38.346019" elapsed="0.000184"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:38.346670" 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-10-11T00:58:38.347059" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:58:38.347125" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:58:38.263741" elapsed="0.083469"/>
</kw>
<msg time="2026-10-11T00:58:38.347293" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:38.347333" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:38.260781" elapsed="0.086587"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:38.347731" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:38.347495" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:38.347477" elapsed="0.000325"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:58:38.260539" elapsed="0.087285"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:58:38.260291" elapsed="0.087562"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:58:38.257061" elapsed="0.090842"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:58:38.253455" elapsed="0.094498"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:38.252535" elapsed="0.095458"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:58:38.250220" elapsed="0.097821"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:38.354112" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:38.354241" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:38.354327" 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-10-11T00:58:38.348465" elapsed="0.005887"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:38.354548" elapsed="0.000590"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:38.360383" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:38.360689" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:58:38.360850" 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-10-11T00:58:38.355303" elapsed="0.005572"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:38.361769" 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-10-11T00:58:38.361493" elapsed="0.000304"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:38.362198" 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-10-11T00:58:38.361956" elapsed="0.000270"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:58:38.362435" 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-10-11T00:58:38.361085" elapsed="0.001734"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:38.348177" elapsed="0.014696"/>
</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-10-11T00:58:38.249210" elapsed="0.113702"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:38.363605" 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-10-11T00:58:38.363759" 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-10-11T00:58:38.363440" elapsed="0.000347"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:38.371859" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:38.371542" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:38.372623" 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-10-11T00:58:38.372384" elapsed="0.000310">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-10-11T00:58:38.372781" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:38.372052" elapsed="0.000753"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:38.373294" 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-10-11T00:58:38.372980" elapsed="0.000340"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:38.373624" 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-10-11T00:58:38.373739" 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-10-11T00:58:38.373502" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:38.374179" 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-10-11T00:58:38.373961" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:58:38.374609" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:38.374292" elapsed="0.000372"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:38.375100" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:38.374837" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:38.374688" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:38.374271" elapsed="0.000951"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:38.375806" 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-10-11T00:58:38.375388" elapsed="0.000445"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:38.375881" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T00:58:38.376013" 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-10-11T00:58:38.371104" elapsed="0.004934"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:38.376343" 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-10-11T00:58:38.376475" 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-10-11T00:58:38.376203" elapsed="0.000297"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:38.376812" 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-10-11T00:58:38.376923" 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-10-11T00:58:38.376675" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:38.377358" 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-10-11T00:58:38.377142" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:38.377839" 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-10-11T00:58:38.377626" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:38.378284" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:38.378073" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:38.378751" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:38.378527" elapsed="0.000265"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:58:38.378933" elapsed="0.002548"/>
</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-10-11T00:58:38.381642" elapsed="0.002203"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:38.389944" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:38.390076" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:38.390198" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T00:58:38.384801" elapsed="0.005765">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:38.390766" elapsed="0.000021"/>
</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-10-11T00:58:38.390984" elapsed="0.000023"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T00:58:38.384483" elapsed="0.006614">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:40.401444" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:40.401768" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:40.401987" 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-10-11T00:58:40.392738" elapsed="0.009305"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T00:58:40.403077" 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-10-11T00:58:40.403324" 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-10-11T00:58:40.402477" elapsed="0.000972"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:40.405743" 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-10-11T00:58:40.404859" elapsed="0.000947"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:40.406964" 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-10-11T00:58:40.406149" elapsed="0.000875"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:58:40.407463" elapsed="0.000650"/>
</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-10-11T00:58:40.403930" elapsed="0.004309"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T00:58:40.391785" elapsed="0.016563"/>
</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-10-11T00:58:38.384044" elapsed="2.024430"/>
</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-10-11T00:58:40.408832" elapsed="0.003482"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:40.422850" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:40.423220" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:40.423462" 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-10-11T00:58:40.414491" elapsed="0.009029"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:40.423958" elapsed="0.000894"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:40.432900" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:40.433186" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:58:40.433449" 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-10-11T00:58:40.425221" elapsed="0.008291"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:40.435741" 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-10-11T00:58:40.435078" elapsed="0.000728"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:40.437171" 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-10-11T00:58:40.436170" elapsed="0.001062"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T00:58:40.438331" 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-10-11T00:58:40.438785" 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-10-11T00:58:40.437696" elapsed="0.001243">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-10-11T00:58:40.434056" elapsed="0.005159">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-10-11T00:58:40.413837" elapsed="0.025762">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-10-11T00:58:42.449714" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:42.449993" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:42.450206" 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-10-11T00:58:42.441039" elapsed="0.009223"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:42.450733" elapsed="0.000900"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:42.460094" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:42.460350" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:58:42.460642" 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-10-11T00:58:42.452006" elapsed="0.008692"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:42.462729" 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-10-11T00:58:42.462130" elapsed="0.000658"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:42.463677" 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-10-11T00:58:42.463125" elapsed="0.000610"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:58:42.464138" elapsed="0.000694"/>
</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-10-11T00:58:42.461194" elapsed="0.003760"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:42.440207" elapsed="0.024855"/>
</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-10-11T00:58:40.412868" elapsed="2.052272"/>
</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-10-11T00:58:42.466239" elapsed="0.003342"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:42.478702" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:42.478971" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:42.479272" 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-10-11T00:58:42.472073" elapsed="0.007253"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:42.479787" elapsed="0.000866"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:42.488624" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:42.488857" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:58:42.489060" 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-10-11T00:58:42.481014" elapsed="0.008100"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:42.491134" 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-10-11T00:58:42.490581" elapsed="0.000612"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:42.492080" 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-10-11T00:58:42.491573" elapsed="0.000564"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:58:42.492597" 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-10-11T00:58:42.489625" elapsed="0.003707"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:42.470958" elapsed="0.022511"/>
</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-10-11T00:58:42.470044" elapsed="0.023522"/>
</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-10-11T00:58:42.465528" elapsed="0.028153"/>
</kw>
<arg>route_es_arb</arg>
<status status="PASS" start="2026-10-11T00:58:38.363114" elapsed="4.130702"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:38.248228" elapsed="4.245795"/>
</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-10-11T00:58:42.497968" elapsed="0.000431"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:58:42.497366" elapsed="0.001207"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:42.500665" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:42.500404" elapsed="0.000360"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:42.500360" elapsed="0.000450"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:42.505859" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:42.505664" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:42.505622" elapsed="0.000382"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.508132" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:42.507329" elapsed="0.000860"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.509164" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:58:42.508579" elapsed="0.000639"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:58:42.509306" elapsed="0.000071"/>
</return>
<msg time="2026-10-11T00:58:42.509666" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:58:42.506506" elapsed="0.003279"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:42.514752" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:42.514618" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:42.514590" elapsed="0.000256"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:42.516686" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:42.516500" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:42.516474" elapsed="0.000439"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:42.517721" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:58:42.517139" elapsed="0.000668"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:42.518706" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:42.518332" elapsed="0.000460"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:58:42.555375" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:58:42.521054" elapsed="0.034615"/>
</kw>
<msg time="2026-10-11T00:58:42.555888" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:58:42.555981" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:42.519248" elapsed="0.036807"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:58:42.588375" 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-10-11T00:58:42.557912" elapsed="0.030766"/>
</kw>
<msg time="2026-10-11T00:58:42.588893" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:58:42.588986" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:42.556568" elapsed="0.032490"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:42.589883" elapsed="0.000071"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:42.589399" elapsed="0.000622"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:42.589361" elapsed="0.000720"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.590917" 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-10-11T00:58:42.590275" elapsed="0.000760"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:42.591520" elapsed="0.000083"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:42.591206" elapsed="0.000464"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:42.591187" elapsed="0.000539"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:58:42.591787" 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-10-11T00:58:42.597226" elapsed="0.000131"/>
</kw>
<msg time="2026-10-11T00:58:42.597465" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:42.595003" elapsed="0.002532"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:42.597788" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:42.597995" 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-10-11T00:58:42.594190" elapsed="0.004019"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:58:42.592147" elapsed="0.006142"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:58:42.516048" elapsed="0.082419"/>
</kw>
<msg time="2026-10-11T00:58:42.598569" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:42.598610" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:42.515072" elapsed="0.083575"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:58:42.598805" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:58:42.598717" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:42.598699" elapsed="0.000183"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:42.599273" elapsed="0.000082"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:42.599765" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:58:42.599832" 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-10-11T00:58:42.514142" elapsed="0.085777"/>
</kw>
<msg time="2026-10-11T00:58:42.600003" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:42.600044" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:42.510599" elapsed="0.089481"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:42.600369" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:42.600148" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:42.600131" elapsed="0.000531"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:58:42.510224" elapsed="0.090460"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:58:42.509898" elapsed="0.090816"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:58:42.504881" elapsed="0.095883"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:58:42.499832" elapsed="0.100981"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:42.498905" elapsed="0.101947"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:58:42.496614" elapsed="0.104284"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:42.606754" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:42.606895" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:42.606997" 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-10-11T00:58:42.601304" elapsed="0.005718"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:42.607195" elapsed="0.000408"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:42.613635" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:42.613737" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:58:42.613828" 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-10-11T00:58:42.607765" elapsed="0.006087"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:42.614730" 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-10-11T00:58:42.614453" elapsed="0.000304"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:42.615144" 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-10-11T00:58:42.614908" elapsed="0.000290"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:58:42.615383" elapsed="0.000308"/>
</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-10-11T00:58:42.614056" elapsed="0.001690"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:42.601035" elapsed="0.014758"/>
</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-10-11T00:58:42.495619" elapsed="0.120210"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:42.616520" 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-10-11T00:58:42.616681" 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-10-11T00:58:42.616355" elapsed="0.000353"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:42.617009" 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-10-11T00:58:42.617125" 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-10-11T00:58:42.616872" elapsed="0.000278"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:42.617465" 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-10-11T00:58:42.617594" 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-10-11T00:58:42.617313" elapsed="0.000306"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:58:42.617959" 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-10-11T00:58:42.617781" elapsed="0.000203"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:42.618283" 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-10-11T00:58:42.618399" 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-10-11T00:58:42.618147" elapsed="0.000292"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:58:42.618779" 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-10-11T00:58:42.618611" elapsed="0.000193"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.619219" 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-10-11T00:58:42.618997" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.619706" 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-10-11T00:58:42.619475" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.620161" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a62900041700021999999900010501010101000007d000202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:42.619944" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.620669" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c001946041700021999999900010501010101000007d000202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:42.620437" elapsed="0.000273"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:58:42.620851" elapsed="0.002447"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:42.633348" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T00:58:42.633424" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:42.633518" 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-10-11T00:58:42.623483" elapsed="0.010074"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.634039" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:42.633765" elapsed="0.000313"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:42.642893" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:42.643016" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:42.643109" 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-10-11T00:58:42.634231" elapsed="0.008902"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.643650" 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-10-11T00:58:42.643335" elapsed="0.000359"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:42.651756" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:42.651864" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:42.651949" 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-10-11T00:58:42.644617" elapsed="0.007356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.652523" 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-10-11T00:58:42.652222" elapsed="0.000357"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:42.652748" elapsed="0.000325"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:42.655754" level="INFO">${update} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a62900041700021999999900010501010101000007d000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:58:42.653222" elapsed="0.002560"/>
</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-10-11T00:58:42.655943" elapsed="0.000314"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:58:42.656302" elapsed="0.000033"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:58:42.644279" elapsed="0.012154"/>
</kw>
<msg time="2026-10-11T00:58:42.656508" 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-10-11T00:58:42.643877" elapsed="0.012654"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.656965" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a62900041700021999999900010501010101000007d000202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:42.656743" elapsed="0.000264"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.657823" level="INFO">Length is 148.</msg>
<msg time="2026-10-11T00:58:42.657892" 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-10-11T00:58:42.657586" elapsed="0.000328"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.658299" level="INFO">Length is 148.</msg>
<msg time="2026-10-11T00:58:42.658366" 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-10-11T00:58:42.658069" elapsed="0.000319"/>
</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-10-11T00:58:42.658608" elapsed="0.000269"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:42.659178" 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-10-11T00:58:42.659024" elapsed="0.000177"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:42.659508" 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-10-11T00:58:42.659342" elapsed="0.000189"/>
</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-10-11T00:58:42.659723" elapsed="0.000260"/>
</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-10-11T00:58:42.657219" elapsed="0.002818"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:58:42.660175" elapsed="0.002160"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:42.668773" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:42.668881" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:42.668968" 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-10-11T00:58:42.662860" elapsed="0.006131"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.669495" 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-10-11T00:58:42.669195" elapsed="0.000359"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:42.669752" elapsed="0.000333"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:42.676023" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:42.676129" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:42.676224" 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-10-11T00:58:42.670245" elapsed="0.006003"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.676772" 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-10-11T00:58:42.676476" elapsed="0.000340"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:42.676980" elapsed="0.000321"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T00:58:42.677560" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:42.677374" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:42.677354" elapsed="0.000269"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:42.684293" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:42.684334" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:42.684444" 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-10-11T00:58:42.677769" elapsed="0.006702"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:58:42.662571" elapsed="0.021959"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:42.691357" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:42.691481" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:42.691580" 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-10-11T00:58:42.685463" elapsed="0.006142"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.692179" 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-10-11T00:58:42.691825" elapsed="0.000414"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:42.692492" elapsed="0.000465"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:42.695604" level="INFO">${update} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c001946041700021999999900010501010101000007d000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:58:42.693164" elapsed="0.002479"/>
</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-10-11T00:58:42.695907" elapsed="0.000432"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:58:42.696400" elapsed="0.000072"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:58:42.685140" elapsed="0.011451"/>
</kw>
<msg time="2026-10-11T00:58:42.696691" 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-10-11T00:58:42.684725" elapsed="0.011998"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.697310" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c001946041700021999999900010501010101000007d000202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:42.697004" elapsed="0.000363"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.698514" level="INFO">Length is 136.</msg>
<msg time="2026-10-11T00:58:42.698624" 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-10-11T00:58:42.698159" elapsed="0.000495"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.699186" level="INFO">Length is 136.</msg>
<msg time="2026-10-11T00:58:42.699280" 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-10-11T00:58:42.698871" elapsed="0.000438"/>
</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-10-11T00:58:42.699600" elapsed="0.000372"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:42.700381" 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-10-11T00:58:42.700175" elapsed="0.000258"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:42.700852" 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-10-11T00:58:42.700648" 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-10-11T00:58:42.701135" elapsed="0.000388"/>
</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-10-11T00:58:42.697700" elapsed="0.003914"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:42.708021" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:42.708123" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:42.708206" 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-10-11T00:58:42.702336" elapsed="0.005894"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.708746" 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-10-11T00:58:42.708458" elapsed="0.000330"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:42.708949" elapsed="0.000446"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:42.715253" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:42.715394" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:42.715566" 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-10-11T00:58:42.709655" elapsed="0.005946"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.716314" 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-10-11T00:58:42.715932" elapsed="0.000443"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:42.716643" elapsed="0.000463"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T00:58:42.717432" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-10-11T00:58:42.717203" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:42.717178" elapsed="0.000376"/>
</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-10-11T00:58:42.717763" elapsed="0.000028"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:58:42.701928" elapsed="0.015944"/>
</kw>
<arg>route_es_as</arg>
<status status="PASS" start="2026-10-11T00:58:42.616061" elapsed="0.101868"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:42.494645" elapsed="0.223417"/>
</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-10-11T00:58:42.720906" elapsed="0.000278"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:58:42.720552" elapsed="0.000702"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:42.722581" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:42.722440" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:42.722388" 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-10-11T00:58:42.725095" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:42.725013" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:42.724995" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.726086" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:42.725759" elapsed="0.000353"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.726558" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:58:42.726266" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:58:42.726624" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:58:42.726751" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:58:42.725366" elapsed="0.001408"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:42.729495" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:42.729386" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:42.729369" 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-10-11T00:58:42.730755" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:42.730641" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:42.730623" elapsed="0.000284"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:42.731425" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:58:42.731060" elapsed="0.000426"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:42.732082" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:42.731855" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:58:42.767707" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:58:42.733670" elapsed="0.034159"/>
</kw>
<msg time="2026-10-11T00:58:42.767959" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:58:42.768048" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:42.732468" elapsed="0.035667"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:58:42.802365" 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-10-11T00:58:42.769734" elapsed="0.032822"/>
</kw>
<msg time="2026-10-11T00:58:42.802680" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:58:42.802768" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:42.768556" elapsed="0.034281"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:42.803452" elapsed="0.000067"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:42.803129" elapsed="0.000471"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:42.803109" elapsed="0.000548"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.804326" 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-10-11T00:58:42.803848" elapsed="0.000605"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:42.804930" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:42.804637" elapsed="0.000422"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:42.804619" elapsed="0.000497"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:58:42.805150" 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-10-11T00:58:42.808806" elapsed="0.000123"/>
</kw>
<msg time="2026-10-11T00:58:42.808971" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:42.808232" elapsed="0.000803"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:42.809278" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:42.809605" 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-10-11T00:58:42.807499" elapsed="0.002321"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:58:42.805462" elapsed="0.004437"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:58:42.730318" elapsed="0.079729"/>
</kw>
<msg time="2026-10-11T00:58:42.810131" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:42.810170" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:42.729726" elapsed="0.080477"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:58:42.810357" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:58:42.810272" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:42.810254" elapsed="0.000197"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:42.810853" 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-10-11T00:58:42.811237" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:58:42.811303" 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-10-11T00:58:42.729102" elapsed="0.082287"/>
</kw>
<msg time="2026-10-11T00:58:42.811504" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:42.811559" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:42.727132" elapsed="0.084462"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:42.811886" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:42.811662" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:42.811646" elapsed="0.000315"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:58:42.726986" elapsed="0.084996"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:58:42.726829" elapsed="0.085182"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:58:42.724721" elapsed="0.087340"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:58:42.722061" elapsed="0.090092"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:42.721492" elapsed="0.090702"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:58:42.720034" elapsed="0.092207"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:42.819920" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:42.820040" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:42.820135" 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-10-11T00:58:42.812687" elapsed="0.007472"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:42.820338" elapsed="0.000391"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:42.827676" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:42.827778" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:58:42.827872" 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-10-11T00:58:42.820893" elapsed="0.007004"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:42.828794" 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-10-11T00:58:42.828511" elapsed="0.000310"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:42.829205" 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-10-11T00:58:42.828972" elapsed="0.000259"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:58:42.829449" elapsed="0.000291"/>
</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-10-11T00:58:42.828105" elapsed="0.001692"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:42.812379" elapsed="0.017467"/>
</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-10-11T00:58:42.719138" elapsed="0.110744"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:42.830531" 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-10-11T00:58:42.830687" 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-10-11T00:58:42.830365" elapsed="0.000349"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.838764" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:42.838392" elapsed="0.000399"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:42.839593" 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-10-11T00:58:42.839303" elapsed="0.000365">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-10-11T00:58:42.839754" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:42.838950" elapsed="0.000827"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.840261" 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-10-11T00:58:42.839952" elapsed="0.000334"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:42.840591" 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-10-11T00:58:42.840706" 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-10-11T00:58:42.840468" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.841148" 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-10-11T00:58:42.840928" elapsed="0.000265"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:58:42.841529" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:42.841255" elapsed="0.000342"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.842028" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:42.841767" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:42.841620" elapsed="0.000464"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:42.841237" elapsed="0.000866"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.842675" 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-10-11T00:58:42.842266" elapsed="0.000435"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:42.842745" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:58:42.842870" 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-10-11T00:58:42.837972" elapsed="0.004922"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:42.843196" 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-10-11T00:58:42.843311" 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-10-11T00:58:42.843058" elapsed="0.000278"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:42.843658" 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-10-11T00:58:42.843769" 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-10-11T00:58:42.843513" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.844208" 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-10-11T00:58:42.843992" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.844729" 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-10-11T00:58:42.844498" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.845176" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a62900041700021999999900010501010101000007d000202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:42.844964" elapsed="0.000252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:42.845645" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c001946041700021999999900010501010101000007d000202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:42.845418" elapsed="0.000268"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:58:42.845824" elapsed="0.002238"/>
</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-10-11T00:58:42.848207" elapsed="0.002131"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:42.856519" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:42.856639" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:42.856728" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T00:58:42.851283" elapsed="0.005803">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:42.857270" elapsed="0.000020"/>
</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-10-11T00:58:42.857499" elapsed="0.000023"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T00:58:42.850983" elapsed="0.006647">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:44.868038" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:44.868287" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:44.868558" 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-10-11T00:58:44.858850" elapsed="0.009769"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T00:58:44.869646" 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-10-11T00:58:44.869948" 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-10-11T00:58:44.869059" elapsed="0.000985"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:44.872279" 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-10-11T00:58:44.871389" elapsed="0.000949"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:44.873562" 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-10-11T00:58:44.872725" elapsed="0.000898"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:58:44.874034" elapsed="0.000664"/>
</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-10-11T00:58:44.870542" elapsed="0.004283"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T00:58:44.858076" elapsed="0.016856"/>
</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-10-11T00:58:42.850563" elapsed="2.024458"/>
</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-10-11T00:58:44.875340" elapsed="0.002954"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:44.889621" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:44.889850" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:44.890037" 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-10-11T00:58:44.880327" elapsed="0.009762"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:44.890498" elapsed="0.000776"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:44.899025" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:44.899266" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:58:44.899542" 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-10-11T00:58:44.891682" elapsed="0.007918"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:44.901540" 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-10-11T00:58:44.900951" elapsed="0.000651"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:44.902902" 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-10-11T00:58:44.901940" elapsed="0.001023"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T00:58:44.904092" 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-10-11T00:58:44.904500" 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-10-11T00:58:44.903471" elapsed="0.001192">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-10-11T00:58:44.900055" elapsed="0.004876">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-10-11T00:58:44.879730" elapsed="0.025438">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-10-11T00:58:46.915298" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:46.915613" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:46.915814" 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-10-11T00:58:46.906361" elapsed="0.009508"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:46.916267" elapsed="0.000844"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:46.924967" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:46.925193" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:58:46.925514" 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-10-11T00:58:46.917527" elapsed="0.008046"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:46.927536" 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-10-11T00:58:46.926935" elapsed="0.000663"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:46.928479" 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-10-11T00:58:46.927935" 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-10-11T00:58:46.928967" elapsed="0.000670"/>
</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-10-11T00:58:46.926032" elapsed="0.003729"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:46.905712" elapsed="0.024155"/>
</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-10-11T00:58:44.878816" elapsed="2.051126"/>
</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-10-11T00:58:46.931099" elapsed="0.003852"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:46.944944" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:46.945174" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:46.945382" 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-10-11T00:58:46.937399" elapsed="0.008073"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:46.945893" elapsed="0.000809"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:46.954830" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:46.955057" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:58:46.955265" 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-10-11T00:58:46.947064" elapsed="0.008256"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:46.957349" 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-10-11T00:58:46.956811" elapsed="0.000627"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:46.958313" 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-10-11T00:58:46.957803" elapsed="0.000567"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:58:46.958832" elapsed="0.000651"/>
</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-10-11T00:58:46.955849" elapsed="0.003785"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:46.936341" elapsed="0.023399"/>
</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-10-11T00:58:46.935447" elapsed="0.024368"/>
</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-10-11T00:58:46.930303" elapsed="0.029686"/>
</kw>
<arg>route_es_as</arg>
<status status="PASS" start="2026-10-11T00:58:42.830068" elapsed="4.130019"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:42.718497" elapsed="4.241794"/>
</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-10-11T00:58:46.964399" elapsed="0.000502"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:58:46.963841" elapsed="0.001170"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:46.967160" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:46.966957" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:46.966909" elapsed="0.000396"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:46.972021" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:46.971835" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:46.971796" elapsed="0.000365"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:46.974242" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:46.973516" elapsed="0.000783"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:58:46.975283" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:58:46.974700" elapsed="0.000637"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:58:46.975456" elapsed="0.000090"/>
</return>
<msg time="2026-10-11T00:58:46.975773" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:58:46.972679" elapsed="0.003144"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:46.980977" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:46.980860" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:46.980835" elapsed="0.000231"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:46.982729" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:46.982567" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:46.982542" elapsed="0.000399"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:46.983690" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:58:46.983156" elapsed="0.000614"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:46.984624" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:46.984257" elapsed="0.000447"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:58:47.041823" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:58:46.986942" elapsed="0.055011"/>
</kw>
<msg time="2026-10-11T00:58:47.042086" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:58:47.042177" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:46.985149" elapsed="0.057102"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:58:47.084591" 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-10-11T00:58:47.043901" elapsed="0.040817"/>
</kw>
<msg time="2026-10-11T00:58:47.084839" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:58:47.084926" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:47.042691" elapsed="0.042306"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:47.085626" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:47.085285" elapsed="0.000471"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:47.085265" elapsed="0.000545"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:47.086510" 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-10-11T00:58:47.086002" elapsed="0.000655"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:47.087112" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:47.086823" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:47.086804" elapsed="0.000494"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:58:47.087331" 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-10-11T00:58:47.090839" elapsed="0.000116"/>
</kw>
<msg time="2026-10-11T00:58:47.090995" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:47.090307" 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-10-11T00:58:47.091288" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:47.091653" 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-10-11T00:58:47.089592" elapsed="0.002279"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:58:47.087649" elapsed="0.004302"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:58:46.982113" elapsed="0.109988"/>
</kw>
<msg time="2026-10-11T00:58:47.092184" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:47.092223" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:46.981280" elapsed="0.110978"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:58:47.092427" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:58:47.092326" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:47.092309" 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-10-11T00:58:47.092903" 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-10-11T00:58:47.093286" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:58:47.093351" 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-10-11T00:58:46.980442" elapsed="0.113026"/>
</kw>
<msg time="2026-10-11T00:58:47.093571" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:47.093611" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:46.976626" elapsed="0.117020"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:47.093935" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:47.093713" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:47.093697" elapsed="0.000308"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:58:46.976253" elapsed="0.117773"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:58:46.975933" elapsed="0.118123"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:58:46.971134" elapsed="0.122972"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:58:46.966326" elapsed="0.127829"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:46.965384" elapsed="0.128810"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:58:46.963025" elapsed="0.131214"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:47.102818" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:47.102957" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:47.103044" 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-10-11T00:58:47.094673" elapsed="0.008395"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:47.103241" elapsed="0.000372"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:47.110395" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:47.110533" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:58:47.110626" 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-10-11T00:58:47.103774" elapsed="0.006877"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:47.111509" 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-10-11T00:58:47.111235" elapsed="0.000302"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:47.111922" 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-10-11T00:58:47.111690" elapsed="0.000257"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:58:47.112128" elapsed="0.000276"/>
</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-10-11T00:58:47.110857" elapsed="0.001620"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:47.094371" elapsed="0.018166"/>
</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-10-11T00:58:46.962028" elapsed="0.150545"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:47.113251" 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-10-11T00:58:47.113394" 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-10-11T00:58:47.113104" elapsed="0.000331"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:47.113750" 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-10-11T00:58:47.113866" 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-10-11T00:58:47.113612" elapsed="0.000279"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:47.114190" 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-10-11T00:58:47.114305" 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-10-11T00:58:47.114054" elapsed="0.000276"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:58:47.114693" 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-10-11T00:58:47.114517" elapsed="0.000201"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:47.115048" 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-10-11T00:58:47.115168" 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-10-11T00:58:47.114911" elapsed="0.000281"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:58:47.115547" 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-10-11T00:58:47.115352" elapsed="0.000220"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:47.115988" 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-10-11T00:58:47.115766" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:47.116460" 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-10-11T00:58:47.116232" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:47.116923" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000101f20cdd809ff7001600202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:47.116709" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:47.117363" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000101f20cdd809ff7001600202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:47.117153" elapsed="0.000251"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:58:47.117570" elapsed="0.002336"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:47.132006" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T00:58:47.132065" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:47.132148" 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-10-11T00:58:47.120077" elapsed="0.012094"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:47.132692" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:47.132380" elapsed="0.000351"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:47.141013" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:47.141149" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:47.141244" 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-10-11T00:58:47.132887" elapsed="0.008381"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:47.141789" 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-10-11T00:58:47.141511" elapsed="0.000322"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:47.148487" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:47.148614" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:47.148700" 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-10-11T00:58:47.142748" elapsed="0.005976"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:47.149202" 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-10-11T00:58:47.148928" elapsed="0.000318"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:47.149426" elapsed="0.000344"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:47.152032" level="INFO">${update} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000101f20cdd809ff7001600202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:58:47.149920" elapsed="0.002140"/>
</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-10-11T00:58:47.152218" elapsed="0.000344"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:58:47.152605" elapsed="0.000028"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:58:47.142422" elapsed="0.010283"/>
</kw>
<msg time="2026-10-11T00:58:47.152774" 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-10-11T00:58:47.142015" elapsed="0.010782"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:47.153209" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000101f20cdd809ff7001600202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:47.152994" elapsed="0.000255"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:58:47.154071" level="INFO">Length is 148.</msg>
<msg time="2026-10-11T00:58:47.154139" 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-10-11T00:58:47.153836" elapsed="0.000324"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:58:47.154582" level="INFO">Length is 148.</msg>
<msg time="2026-10-11T00:58:47.154648" 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-10-11T00:58:47.154314" 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-10-11T00:58:47.154848" elapsed="0.000259"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:47.155424" 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-10-11T00:58:47.155253" elapsed="0.000196"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:47.155790" 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-10-11T00:58:47.155604" 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-10-11T00:58:47.155992" elapsed="0.000269"/>
</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-10-11T00:58:47.153481" elapsed="0.002833"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:58:47.156468" elapsed="0.002112"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:47.165205" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:47.165317" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:47.165403" 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-10-11T00:58:47.159069" elapsed="0.006380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:47.165944" 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-10-11T00:58:47.165672" elapsed="0.000316"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:47.166148" elapsed="0.000338"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:47.171400" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:47.171540" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:47.171633" 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-10-11T00:58:47.166663" elapsed="0.004994"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:47.172137" 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-10-11T00:58:47.171862" elapsed="0.000318"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:47.172339" elapsed="0.000349"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T00:58:47.172899" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:47.172754" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:47.172737" elapsed="0.000221"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:47.184397" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:47.184459" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:47.184592" 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-10-11T00:58:47.173105" elapsed="0.011511"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:58:47.158777" elapsed="0.025898"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:47.190743" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:47.190845" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:47.190928" 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-10-11T00:58:47.185581" elapsed="0.005371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:47.191618" 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-10-11T00:58:47.191177" elapsed="0.000501"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:47.191903" elapsed="0.002145"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:47.196723" level="INFO">${update} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000101f20cdd809ff7001600202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:58:47.194259" elapsed="0.002502"/>
</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-10-11T00:58:47.196979" elapsed="0.000462"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:58:47.197518" elapsed="0.000039"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:58:47.185247" elapsed="0.012412"/>
</kw>
<msg time="2026-10-11T00:58:47.197758" 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-10-11T00:58:47.184852" elapsed="0.012938"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:47.198369" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000101f20cdd809ff7001600202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:47.198065" elapsed="0.000385"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:58:47.199586" level="INFO">Length is 136.</msg>
<msg time="2026-10-11T00:58:47.199681" 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-10-11T00:58:47.199211" elapsed="0.000501"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:58:47.200243" level="INFO">Length is 136.</msg>
<msg time="2026-10-11T00:58:47.200336" 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-10-11T00:58:47.199926" elapsed="0.000439"/>
</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-10-11T00:58:47.200659" elapsed="0.000368"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:47.201457" 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-10-11T00:58:47.201229" elapsed="0.000262"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:47.201911" 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-10-11T00:58:47.201708" elapsed="0.000234"/>
</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-10-11T00:58:47.202188" elapsed="0.000440"/>
</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-10-11T00:58:47.198755" elapsed="0.003948"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:47.208582" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:47.208718" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:47.208805" 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-10-11T00:58:47.203435" elapsed="0.005393"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:47.209457" 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-10-11T00:58:47.209034" elapsed="0.000509"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:47.209767" elapsed="0.000444"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:47.215289" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:47.215458" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:47.215605" 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-10-11T00:58:47.210451" elapsed="0.005187"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:47.216303" 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-10-11T00:58:47.215923" elapsed="0.000439"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:47.216625" elapsed="0.000446"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T00:58:47.217367" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-10-11T00:58:47.217166" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:47.217141" elapsed="0.000368"/>
</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-10-11T00:58:47.217714" elapsed="0.000028"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:58:47.203011" elapsed="0.014812"/>
</kw>
<arg>route_es_lacp</arg>
<status status="PASS" start="2026-10-11T00:58:47.112807" elapsed="0.105071"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:46.960917" elapsed="0.257079"/>
</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-10-11T00:58:47.220490" elapsed="0.000289"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:58:47.220125" elapsed="0.000724"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:47.266274" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:47.266073" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:47.221954" elapsed="0.044409"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:47.268687" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:47.268602" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:47.268584" elapsed="0.000165"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:47.269774" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:47.269350" elapsed="0.000451"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:58:47.270227" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:58:47.269956" elapsed="0.000295"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:58:47.270290" elapsed="0.000033"/>
</return>
<msg time="2026-10-11T00:58:47.270442" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:58:47.268973" 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-10-11T00:58:47.273113" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:47.273028" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:47.273010" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:47.274344" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:47.274229" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:47.274211" elapsed="0.000327"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:47.275054" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:58:47.274692" elapsed="0.000423"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:47.275735" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:47.275486" elapsed="0.000307"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:58:47.318355" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:58:47.277314" elapsed="0.041195"/>
</kw>
<msg time="2026-10-11T00:58:47.318636" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:58:47.318736" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:47.276102" elapsed="0.042703"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:58:47.351934" 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-10-11T00:58:47.320379" elapsed="0.031685"/>
</kw>
<msg time="2026-10-11T00:58:47.352184" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:58:47.352271" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:47.319188" elapsed="0.033152"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:47.352970" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:47.352672" elapsed="0.000427"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:47.352652" elapsed="0.000503"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:47.353862" 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-10-11T00:58:47.353344" elapsed="0.000631"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:47.354450" elapsed="0.000092"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:47.354140" elapsed="0.000468"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:47.354121" elapsed="0.000542"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:58:47.354697" 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-10-11T00:58:47.358286" elapsed="0.000133"/>
</kw>
<msg time="2026-10-11T00:58:47.358460" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:47.357841" elapsed="0.000698"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:47.358774" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:47.358981" 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-10-11T00:58:47.356947" elapsed="0.002246"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:58:47.354987" elapsed="0.004284"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:58:47.273943" elapsed="0.085567"/>
</kw>
<msg time="2026-10-11T00:58:47.359597" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:47.359636" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:47.273328" elapsed="0.086343"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:58:47.359860" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:58:47.359774" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:47.359756" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:47.360317" 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-10-11T00:58:47.360746" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:58:47.360812" 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-10-11T00:58:47.272736" elapsed="0.088162"/>
</kw>
<msg time="2026-10-11T00:58:47.360981" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:47.361020" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:47.270896" elapsed="0.090159"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:47.361341" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:47.361121" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:47.361105" elapsed="0.000366"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:58:47.270749" elapsed="0.090757"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:58:47.270595" elapsed="0.090942"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:58:47.268201" elapsed="0.093386"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:58:47.221630" elapsed="0.140009"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:47.221054" elapsed="0.140624"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:58:47.219640" elapsed="0.142086"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:47.369487" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:47.369657" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:47.369756" 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-10-11T00:58:47.362129" elapsed="0.007651"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:47.369955" elapsed="0.000365"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:47.375881" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:47.375981" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:58:47.376072" 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-10-11T00:58:47.370514" elapsed="0.005582"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:47.377021" 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-10-11T00:58:47.376753" elapsed="0.000294"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:47.377624" 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-10-11T00:58:47.377199" 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-10-11T00:58:47.377836" elapsed="0.000281"/>
</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-10-11T00:58:47.376331" elapsed="0.001841"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:47.361862" elapsed="0.016359"/>
</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-10-11T00:58:47.218927" elapsed="0.159331"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:47.378928" 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-10-11T00:58:47.379077" 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-10-11T00:58:47.378777" elapsed="0.000326"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:47.387174" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:47.386866" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:47.387920" 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-10-11T00:58:47.387713" elapsed="0.000282">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-10-11T00:58:47.388080" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:47.387360" elapsed="0.000742"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:47.388614" 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-10-11T00:58:47.388275" elapsed="0.000364"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:47.388913" 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-10-11T00:58:47.389029" 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-10-11T00:58:47.388805" elapsed="0.000249"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:47.389481" 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-10-11T00:58:47.389250" 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-10-11T00:58:47.389853" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:47.389600" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:47.390339" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:47.390077" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:47.389928" elapsed="0.000466"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:47.389583" elapsed="0.000846"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:47.390991" 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-10-11T00:58:47.390607" elapsed="0.000410"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:47.391093" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:58:47.391222" 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-10-11T00:58:47.386433" elapsed="0.004813"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:47.391586" 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-10-11T00:58:47.391700" 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-10-11T00:58:47.391434" elapsed="0.000290"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:47.392021" 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-10-11T00:58:47.392131" 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-10-11T00:58:47.391885" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:47.392598" 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-10-11T00:58:47.392348" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:47.393052" 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-10-11T00:58:47.392840" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:47.393541" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000101f20cdd809ff7001600202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:47.393288" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:47.393984" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000101f20cdd809ff7001600202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:47.393773" elapsed="0.000251"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:58:47.394161" elapsed="0.002588"/>
</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-10-11T00:58:47.396894" elapsed="0.002171"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:47.405868" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:47.405971" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:47.406060" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T00:58:47.400007" elapsed="0.006432">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:47.406662" elapsed="0.000021"/>
</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-10-11T00:58:47.406873" elapsed="0.000022"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T00:58:47.399704" elapsed="0.007285">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:49.417162" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:49.417462" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:49.417696" 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-10-11T00:58:49.408277" elapsed="0.009474"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T00:58:49.418719" 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-10-11T00:58:49.418954" 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-10-11T00:58:49.418128" elapsed="0.000919"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:49.421281" 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-10-11T00:58:49.420385" elapsed="0.000958"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:49.422642" 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-10-11T00:58:49.421743" elapsed="0.000958"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:58:49.423111" elapsed="0.000694"/>
</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-10-11T00:58:49.419543" elapsed="0.004387"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T00:58:49.407540" elapsed="0.016499"/>
</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-10-11T00:58:47.399263" elapsed="2.024865"/>
</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-10-11T00:58:49.424525" elapsed="0.003392"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:49.437740" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:49.437968" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:49.438222" 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-10-11T00:58:49.429964" elapsed="0.008312"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:49.438726" elapsed="0.000814"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:49.448078" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:49.448320" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:58:49.448609" 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-10-11T00:58:49.439905" elapsed="0.008760"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:49.450956" 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-10-11T00:58:49.450024" elapsed="0.000994"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:49.452336" 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-10-11T00:58:49.451362" elapsed="0.001033"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T00:58:49.453594" 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-10-11T00:58:49.453978" 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-10-11T00:58:49.452874" elapsed="0.001247">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-10-11T00:58:49.449121" elapsed="0.005271">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-10-11T00:58:49.429289" elapsed="0.025403">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-10-11T00:58:51.464635" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:51.464884" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:51.465082" 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-10-11T00:58:51.455951" elapsed="0.009186"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:51.465592" elapsed="0.000796"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:51.474315" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:51.474612" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:58:51.474823" 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-10-11T00:58:51.466809" elapsed="0.008069"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:51.476860" 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-10-11T00:58:51.476254" elapsed="0.000666"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:51.477883" 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-10-11T00:58:51.477258" elapsed="0.000687"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:58:51.478358" elapsed="0.000675"/>
</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-10-11T00:58:51.475342" elapsed="0.003816"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:51.455225" elapsed="0.024039"/>
</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-10-11T00:58:49.428375" elapsed="2.050966"/>
</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-10-11T00:58:51.480505" elapsed="0.003396"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:51.493255" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:51.493549" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:51.493742" 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-10-11T00:58:51.485997" elapsed="0.007798"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:51.494178" elapsed="0.001161"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:51.503098" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:51.503324" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:58:51.503593" 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-10-11T00:58:51.495755" elapsed="0.007895"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:51.505665" 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-10-11T00:58:51.505073" elapsed="0.000652"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:51.506637" 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-10-11T00:58:51.506071" 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-10-11T00:58:51.507109" elapsed="0.000667"/>
</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-10-11T00:58:51.504107" elapsed="0.003795"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:51.485281" elapsed="0.022730"/>
</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-10-11T00:58:51.484372" elapsed="0.023716"/>
</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-10-11T00:58:51.479752" elapsed="0.028445"/>
</kw>
<arg>route_es_lacp</arg>
<status status="PASS" start="2026-10-11T00:58:47.378460" elapsed="4.129832"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:47.218340" elapsed="4.290208"/>
</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-10-11T00:58:51.512268" elapsed="0.000500"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:58:51.511705" elapsed="0.001174"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:51.515059" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:51.514853" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:51.514809" elapsed="0.000399"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:51.519809" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:51.519624" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:51.519586" elapsed="0.000363"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.522048" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:51.521261" elapsed="0.000845"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.523093" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:58:51.522505" elapsed="0.000642"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:58:51.523237" elapsed="0.000066"/>
</return>
<msg time="2026-10-11T00:58:51.523575" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:58:51.520439" elapsed="0.003190"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:51.528772" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:51.528654" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:51.528629" elapsed="0.000232"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:51.530521" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:51.530308" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:51.530284" elapsed="0.000451"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:51.531468" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:58:51.530949" elapsed="0.000602"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:51.532401" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:51.532085" elapsed="0.000443"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:58:51.567790" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:58:51.534618" elapsed="0.033297"/>
</kw>
<msg time="2026-10-11T00:58:51.568042" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:58:51.568131" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:51.532953" elapsed="0.035249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:58:51.600480" 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-10-11T00:58:51.569828" elapsed="0.030778"/>
</kw>
<msg time="2026-10-11T00:58:51.600725" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:58:51.600812" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:51.568637" elapsed="0.032245"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:51.601506" elapsed="0.000067"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:51.601173" elapsed="0.000466"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:51.601151" elapsed="0.000544"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.602358" 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-10-11T00:58:51.601883" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:51.602964" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:51.602673" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:51.602655" elapsed="0.000493"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:58:51.603181" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:51.606744" elapsed="0.000115"/>
</kw>
<msg time="2026-10-11T00:58:51.606899" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:51.606228" 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-10-11T00:58:51.607196" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:51.607518" 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-10-11T00:58:51.605514" elapsed="0.002221"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:58:51.603493" elapsed="0.004321"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:58:51.529906" elapsed="0.078058"/>
</kw>
<msg time="2026-10-11T00:58:51.608047" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:51.608087" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:51.529074" elapsed="0.079048"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:58:51.608276" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:58:51.608191" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:51.608174" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:51.608767" 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-10-11T00:58:51.609146" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:58:51.609244" 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-10-11T00:58:51.528219" elapsed="0.081114"/>
</kw>
<msg time="2026-10-11T00:58:51.609458" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:51.609501" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:51.524374" elapsed="0.085162"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:51.609825" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:51.609604" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:51.609588" elapsed="0.000307"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:58:51.524054" elapsed="0.085863"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:58:51.523737" elapsed="0.086207"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:58:51.518920" elapsed="0.091074"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:58:51.514181" elapsed="0.095864"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:51.513228" elapsed="0.096857"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:58:51.510857" elapsed="0.099276"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:51.616281" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:51.616388" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:51.616509" 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-10-11T00:58:51.610562" elapsed="0.005972"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:51.616708" elapsed="0.000338"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:51.622587" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:51.622691" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:58:51.622784" 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-10-11T00:58:51.617207" elapsed="0.005601"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:51.623665" 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-10-11T00:58:51.623391" elapsed="0.000301"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:51.624071" 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-10-11T00:58:51.623843" elapsed="0.000254"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:58:51.624281" elapsed="0.000306"/>
</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-10-11T00:58:51.623012" elapsed="0.001632"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:51.610266" elapsed="0.014460"/>
</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-10-11T00:58:51.509858" elapsed="0.114904"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:51.625476" 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-10-11T00:58:51.625618" 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-10-11T00:58:51.625304" elapsed="0.000341"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:51.625949" 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-10-11T00:58:51.626064" 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-10-11T00:58:51.625812" elapsed="0.000277"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:51.626397" 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-10-11T00:58:51.626542" 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-10-11T00:58:51.626260" elapsed="0.000307"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:58:51.626906" 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-10-11T00:58:51.626732" elapsed="0.000199"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:51.627227" 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-10-11T00:58:51.627341" 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-10-11T00:58:51.627093" elapsed="0.000272"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:58:51.627716" 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-10-11T00:58:51.627550" elapsed="0.000191"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.628163" 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-10-11T00:58:51.627945" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.628645" 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-10-11T00:58:51.628405" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.629101" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000102f20cdd809ff7001400202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:51.628888" elapsed="0.000254"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.629572" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000102f20cdd809ff7001400202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:51.629333" elapsed="0.000279"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:58:51.629750" elapsed="0.002403"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:51.642302" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T00:58:51.642362" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:51.642480" 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-10-11T00:58:51.632326" elapsed="0.010179"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.642986" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:51.642713" elapsed="0.000312"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:51.650294" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:51.650401" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:51.650529" 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-10-11T00:58:51.643180" elapsed="0.007374"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.651030" 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-10-11T00:58:51.650759" elapsed="0.000315"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:51.657745" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:51.657853" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:51.657938" 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-10-11T00:58:51.652117" elapsed="0.005845"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.658475" 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-10-11T00:58:51.658168" elapsed="0.000380"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:51.658711" elapsed="0.000325"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:51.661767" level="INFO">${update} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000102f20cdd809ff7001400202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:58:51.659185" elapsed="0.002610"/>
</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-10-11T00:58:51.661954" elapsed="0.000311"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:58:51.662309" elapsed="0.000028"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:58:51.651675" elapsed="0.010757"/>
</kw>
<msg time="2026-10-11T00:58:51.662519" 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-10-11T00:58:51.651253" elapsed="0.011290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.662968" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000102f20cdd809ff7001400202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:51.662752" elapsed="0.000257"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.663817" level="INFO">Length is 148.</msg>
<msg time="2026-10-11T00:58:51.663886" 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-10-11T00:58:51.663579" elapsed="0.000329"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.664295" level="INFO">Length is 148.</msg>
<msg time="2026-10-11T00:58:51.664362" 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-10-11T00:58:51.664064" elapsed="0.000320"/>
</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-10-11T00:58:51.664601" elapsed="0.000262"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:51.665162" 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-10-11T00:58:51.665010" elapsed="0.000176"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:51.665505" 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-10-11T00:58:51.665325" 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-10-11T00:58:51.665707" elapsed="0.000260"/>
</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-10-11T00:58:51.663219" elapsed="0.002801"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:58:51.666158" elapsed="0.002411"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:51.674193" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:51.674300" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:51.674386" 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-10-11T00:58:51.669055" elapsed="0.005372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.674929" 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-10-11T00:58:51.674654" elapsed="0.000319"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:51.675137" elapsed="0.000358"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:51.680871" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:51.681007" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:51.681102" 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-10-11T00:58:51.675655" elapsed="0.005472"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.681653" 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-10-11T00:58:51.681340" elapsed="0.000358"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:51.681863" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T00:58:51.682396" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:51.682249" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:51.682231" elapsed="0.000292"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:51.694021" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:51.694063" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:51.694151" 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-10-11T00:58:51.682671" elapsed="0.011504"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:58:51.668764" elapsed="0.025470"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:51.701247" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:51.701350" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:51.701477" 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-10-11T00:58:51.695147" elapsed="0.006356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.701982" 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-10-11T00:58:51.701709" elapsed="0.000316"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:51.702200" elapsed="0.000484"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:51.705466" level="INFO">${update} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000102f20cdd809ff7001400202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:58:51.702889" elapsed="0.002617"/>
</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-10-11T00:58:51.705724" elapsed="0.000422"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:58:51.706205" elapsed="0.000038"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:58:51.694843" elapsed="0.011499"/>
</kw>
<msg time="2026-10-11T00:58:51.706478" 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-10-11T00:58:51.694432" elapsed="0.012081"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.707133" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000102f20cdd809ff7001400202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:51.706832" elapsed="0.000359"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.708318" level="INFO">Length is 136.</msg>
<msg time="2026-10-11T00:58:51.708438" 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-10-11T00:58:51.707989" elapsed="0.000497"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.709025" level="INFO">Length is 136.</msg>
<msg time="2026-10-11T00:58:51.709118" 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-10-11T00:58:51.708708" elapsed="0.000440"/>
</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-10-11T00:58:51.709429" elapsed="0.000381"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:51.710223" 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-10-11T00:58:51.710016" elapsed="0.000240"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:51.710694" 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-10-11T00:58:51.710487" elapsed="0.000239"/>
</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-10-11T00:58:51.710985" elapsed="0.000362"/>
</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-10-11T00:58:51.707528" elapsed="0.003930"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:51.718267" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:51.718437" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:51.718576" 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-10-11T00:58:51.712180" elapsed="0.006429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.719293" 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-10-11T00:58:51.718905" elapsed="0.000447"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:51.719623" elapsed="0.000452"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:51.726022" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:51.726166" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:51.726293" 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-10-11T00:58:51.720302" elapsed="0.006025"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.727041" 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-10-11T00:58:51.726659" elapsed="0.000442"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:51.727325" elapsed="0.000485"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T00:58:51.728158" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-10-11T00:58:51.727951" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:51.727924" elapsed="0.000340"/>
</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-10-11T00:58:51.728503" elapsed="0.000029"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:58:51.711770" elapsed="0.016846"/>
</kw>
<arg>route_es_lan</arg>
<status status="PASS" start="2026-10-11T00:58:51.624996" elapsed="0.103676"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:51.508950" elapsed="0.219839"/>
</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-10-11T00:58:51.731029" elapsed="0.000277"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:58:51.730681" elapsed="0.000694"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:51.732901" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:51.732780" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:51.732755" 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-10-11T00:58:51.735840" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:51.735724" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:51.735700" elapsed="0.000228"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.737204" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:51.736749" elapsed="0.000491"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.737853" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:58:51.737488" elapsed="0.000398"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:58:51.737942" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T00:58:51.738117" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:58:51.736216" elapsed="0.001933"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:51.741266" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:51.741182" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:51.741164" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:51.742496" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:51.742348" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:51.742331" elapsed="0.000317"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:51.743141" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:58:51.742800" elapsed="0.000404"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:51.743800" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:51.743579" elapsed="0.000278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:58:51.778759" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:58:51.745315" elapsed="0.033565"/>
</kw>
<msg time="2026-10-11T00:58:51.779016" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:58:51.779106" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:51.744159" elapsed="0.035017"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:58:51.812947" 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-10-11T00:58:51.780765" elapsed="0.032306"/>
</kw>
<msg time="2026-10-11T00:58:51.813192" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:58:51.813279" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:51.779594" elapsed="0.033755"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:51.813997" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:51.813698" elapsed="0.000425"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:51.813648" elapsed="0.000530"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.814869" 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-10-11T00:58:51.814369" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:51.815468" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:51.815146" elapsed="0.000451"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:51.815127" elapsed="0.000640"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:58:51.815803" 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-10-11T00:58:51.819183" elapsed="0.000115"/>
</kw>
<msg time="2026-10-11T00:58:51.819337" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:51.818757" elapsed="0.000638"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:51.819769" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:51.819975" 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-10-11T00:58:51.817995" elapsed="0.002190"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:58:51.816081" elapsed="0.004185"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:58:51.742064" elapsed="0.078364"/>
</kw>
<msg time="2026-10-11T00:58:51.820524" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:51.820563" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:51.741506" elapsed="0.079093"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:58:51.820752" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:58:51.820666" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:51.820649" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:51.821203" 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-10-11T00:58:51.821684" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:58:51.821751" 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-10-11T00:58:51.740894" elapsed="0.080942"/>
</kw>
<msg time="2026-10-11T00:58:51.821919" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:51.821959" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:51.738639" elapsed="0.083356"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:51.822281" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:51.822061" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:51.822045" elapsed="0.000306"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:58:51.738403" elapsed="0.083969"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:58:51.738212" elapsed="0.084186"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:58:51.735284" elapsed="0.087192"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:58:51.732391" elapsed="0.090136"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:51.731622" elapsed="0.090944"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:58:51.730166" elapsed="0.092446"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:51.828865" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:51.828968" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:51.829062" 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-10-11T00:58:51.823040" elapsed="0.006046"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:51.829264" elapsed="0.000371"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:51.835441" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:51.835558" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:58:51.835649" 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-10-11T00:58:51.829795" elapsed="0.005878"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:51.836530" 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-10-11T00:58:51.836255" elapsed="0.000303"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:51.836941" 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-10-11T00:58:51.836708" elapsed="0.000259"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:58:51.837152" elapsed="0.000304"/>
</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-10-11T00:58:51.835876" elapsed="0.001637"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:51.822772" elapsed="0.014790"/>
</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-10-11T00:58:51.729574" elapsed="0.108022"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:51.838219" 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-10-11T00:58:51.838338" 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-10-11T00:58:51.838078" elapsed="0.000287"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.847755" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:51.847435" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:51.848491" 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-10-11T00:58:51.848264" elapsed="0.000299">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-10-11T00:58:51.848650" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:51.847942" elapsed="0.000731"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.849189" 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-10-11T00:58:51.848878" elapsed="0.000337"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:51.849537" 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-10-11T00:58:51.849652" 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-10-11T00:58:51.849381" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.850086" 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-10-11T00:58:51.849870" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:58:51.850481" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:51.850197" elapsed="0.000338"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.850964" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:51.850704" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:51.850557" elapsed="0.000463"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:51.850180" elapsed="0.000860"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.851606" 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-10-11T00:58:51.851203" elapsed="0.000430"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:51.851677" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:58:51.851803" 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-10-11T00:58:51.846993" elapsed="0.004834"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:51.852131" 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-10-11T00:58:51.852245" 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-10-11T00:58:51.851993" elapsed="0.000276"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:51.852597" 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-10-11T00:58:51.852707" 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-10-11T00:58:51.852458" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.853141" 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-10-11T00:58:51.852924" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.853628" 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-10-11T00:58:51.853382" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.854109" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000102f20cdd809ff7001400202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:51.853895" elapsed="0.000254"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:51.854585" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000102f20cdd809ff7001400202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:51.854338" elapsed="0.000288"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:58:51.854764" elapsed="0.002394"/>
</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-10-11T00:58:51.857315" elapsed="0.002302"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:51.865317" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:51.865441" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:51.865553" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T00:58:51.860550" elapsed="0.005351">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:51.866083" elapsed="0.000021"/>
</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-10-11T00:58:51.866299" elapsed="0.000022"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T00:58:51.860206" elapsed="0.006225">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:53.877296" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:53.877618" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:53.877843" 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-10-11T00:58:53.867676" elapsed="0.010222"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T00:58:53.878865" 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-10-11T00:58:53.879097" 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-10-11T00:58:53.878276" elapsed="0.000916"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:53.881562" 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-10-11T00:58:53.880675" elapsed="0.000949"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:53.882810" 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-10-11T00:58:53.881963" elapsed="0.000906"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:58:53.883278" elapsed="0.000676"/>
</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-10-11T00:58:53.879776" elapsed="0.004305"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T00:58:53.866891" elapsed="0.017295"/>
</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-10-11T00:58:51.859811" elapsed="2.024466"/>
</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-10-11T00:58:53.884694" elapsed="0.003119"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:53.896213" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:53.896506" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:53.896697" 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-10-11T00:58:53.889843" elapsed="0.006908"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:53.897133" elapsed="0.000817"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:53.905595" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:53.905833" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:58:53.906044" 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-10-11T00:58:53.898306" elapsed="0.007792"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:53.908034" 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-10-11T00:58:53.907497" elapsed="0.000595"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:53.909368" 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-10-11T00:58:53.908474" elapsed="0.001003"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T00:58:53.910528" 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-10-11T00:58:53.910967" 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-10-11T00:58:53.909887" elapsed="0.001227">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-10-11T00:58:53.906606" elapsed="0.004781">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-10-11T00:58:53.889184" elapsed="0.022498">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-10-11T00:58:55.921565" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:55.921815" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:55.922038" 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-10-11T00:58:55.912903" elapsed="0.009190"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:55.922538" elapsed="0.000790"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:55.930954" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:55.931183" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:58:55.931390" 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-10-11T00:58:55.923793" elapsed="0.007707"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:55.933445" 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-10-11T00:58:55.932862" elapsed="0.000647"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:55.934483" 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-10-11T00:58:55.933918" 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-10-11T00:58:55.934950" elapsed="0.000707"/>
</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-10-11T00:58:55.931962" elapsed="0.003819"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:55.912156" elapsed="0.023730"/>
</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-10-11T00:58:53.888271" elapsed="2.047690"/>
</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-10-11T00:58:55.937066" elapsed="0.003268"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:55.948933" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:55.949162" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:55.949350" 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-10-11T00:58:55.942385" elapsed="0.007068"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:55.949843" elapsed="0.000808"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:55.958207" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:55.958495" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:58:55.958704" 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-10-11T00:58:55.951010" elapsed="0.007750"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:55.960749" 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-10-11T00:58:55.960166" elapsed="0.000643"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:55.961714" 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-10-11T00:58:55.961145" elapsed="0.000627"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:58:55.962179" elapsed="0.000680"/>
</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-10-11T00:58:55.959216" elapsed="0.003767"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:55.941737" elapsed="0.021353"/>
</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-10-11T00:58:55.940845" elapsed="0.022322"/>
</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-10-11T00:58:55.936319" elapsed="0.026953"/>
</kw>
<arg>route_es_lan</arg>
<status status="PASS" start="2026-10-11T00:58:51.837777" elapsed="4.125588"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:51.729026" elapsed="4.234581"/>
</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-10-11T00:58:55.967398" elapsed="0.000839"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:58:55.966843" elapsed="0.001508"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:55.970956" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:55.970734" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:55.970354" elapsed="0.000747"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:55.975702" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:55.975513" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:55.975472" elapsed="0.000368"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:55.977991" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:55.977213" elapsed="0.000834"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:58:55.979155" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:58:55.978484" elapsed="0.000725"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:58:55.979301" elapsed="0.000072"/>
</return>
<msg time="2026-10-11T00:58:55.979694" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:58:55.976307" elapsed="0.003439"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:55.984322" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:55.984202" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:55.984178" 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-10-11T00:58:55.986048" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:55.985888" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:55.985863" elapsed="0.000396"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:55.986996" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:58:55.986508" elapsed="0.000570"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:55.987925" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:55.987607" elapsed="0.000398"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:58:56.024912" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:58:55.990135" elapsed="0.034903"/>
</kw>
<msg time="2026-10-11T00:58:56.025178" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:58:56.025265" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:55.988465" elapsed="0.036870"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:58:56.064941" 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-10-11T00:58:56.026907" elapsed="0.038169"/>
</kw>
<msg time="2026-10-11T00:58:56.065207" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:58:56.065302" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:56.025748" elapsed="0.039626"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:56.066011" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:56.065704" elapsed="0.000439"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:56.065683" elapsed="0.000517"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:56.066914" 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-10-11T00:58:56.066394" elapsed="0.000636"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:56.067649" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:56.067198" elapsed="0.000582"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:56.067179" elapsed="0.000657"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:58:56.067870" 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-10-11T00:58:56.071601" elapsed="0.000122"/>
</kw>
<msg time="2026-10-11T00:58:56.071764" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:56.070968" elapsed="0.000857"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:56.072060" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:56.072265" 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-10-11T00:58:56.070152" elapsed="0.002349"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:58:56.068188" elapsed="0.004394"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:58:55.985488" elapsed="0.087244"/>
</kw>
<msg time="2026-10-11T00:58:56.072816" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:56.072855" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:55.984658" elapsed="0.088233"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:58:56.073045" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:58:56.072959" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:56.072942" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:56.073554" 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-10-11T00:58:56.073932" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:58:56.073998" 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-10-11T00:58:55.983801" elapsed="0.090282"/>
</kw>
<msg time="2026-10-11T00:58:56.074167" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:56.074206" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:55.980548" elapsed="0.093693"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:56.074569" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:56.074308" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:56.074292" elapsed="0.000349"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:58:55.980172" elapsed="0.094491"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:58:55.979853" elapsed="0.094839"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:58:55.974815" elapsed="0.099927"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:58:55.969754" elapsed="0.105038"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:55.968801" elapsed="0.106031"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:58:55.966033" elapsed="0.108845"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:56.081309" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:56.081451" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:56.081580" 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-10-11T00:58:56.075279" elapsed="0.006327"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:56.081784" elapsed="0.000344"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:56.087315" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:56.087445" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:58:56.087539" 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-10-11T00:58:56.082297" elapsed="0.005266"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:56.088432" 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-10-11T00:58:56.088152" elapsed="0.000309"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:56.088842" 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-10-11T00:58:56.088614" elapsed="0.000254"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:58:56.089053" elapsed="0.000275"/>
</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-10-11T00:58:56.087770" elapsed="0.001614"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:56.075009" elapsed="0.014448"/>
</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-10-11T00:58:55.964870" elapsed="0.124622"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:56.090171" 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-10-11T00:58:56.090314" 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-10-11T00:58:56.090024" elapsed="0.000317"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:56.090665" 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-10-11T00:58:56.090781" 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-10-11T00:58:56.090528" elapsed="0.000278"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:56.091104" 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-10-11T00:58:56.091276" 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-10-11T00:58:56.090969" elapsed="0.000332"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:58:56.091671" 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-10-11T00:58:56.091493" elapsed="0.000202"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:56.092195" 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-10-11T00:58:56.092314" 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-10-11T00:58:56.091859" elapsed="0.000505"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:58:56.092730" 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-10-11T00:58:56.092559" elapsed="0.000195"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:56.093172" 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-10-11T00:58:56.092950" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:56.093655" 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-10-11T00:58:56.093437" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:56.094100" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000103f20cdd809ff70007d0202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:56.093890" elapsed="0.000250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:56.094566" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000103f20cdd809ff70007d0202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:56.094329" elapsed="0.000278"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:58:56.094746" elapsed="0.002459"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:56.106609" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T00:58:56.106670" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:56.106761" 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-10-11T00:58:56.097368" elapsed="0.009416"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:56.107270" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:56.106993" elapsed="0.000321"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:56.114198" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:56.114311" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:56.114468" 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-10-11T00:58:56.107498" elapsed="0.006997"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:56.114975" 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-10-11T00:58:56.114700" elapsed="0.000319"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:56.120826" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:56.120933" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:56.121019" 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-10-11T00:58:56.115932" elapsed="0.005111"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:56.121556" 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-10-11T00:58:56.121248" elapsed="0.000353"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:56.121766" elapsed="0.000322"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:56.124507" level="INFO">${update} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000103f20cdd809ff70007d0202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:58:56.122238" elapsed="0.002297"/>
</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-10-11T00:58:56.124694" elapsed="0.000310"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:58:56.125048" elapsed="0.000028"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:58:56.115628" elapsed="0.009521"/>
</kw>
<msg time="2026-10-11T00:58:56.125218" 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-10-11T00:58:56.115203" elapsed="0.010038"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:56.125695" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000103f20cdd809ff70007d0202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:56.125474" elapsed="0.000263"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:58:56.126548" level="INFO">Length is 148.</msg>
<msg time="2026-10-11T00:58:56.126617" 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-10-11T00:58:56.126276" elapsed="0.000363"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:58:56.127022" level="INFO">Length is 148.</msg>
<msg time="2026-10-11T00:58:56.127089" 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-10-11T00:58:56.126795" elapsed="0.000316"/>
</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-10-11T00:58:56.127291" elapsed="0.000295"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:56.127891" 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-10-11T00:58:56.127734" elapsed="0.000180"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:56.128205" 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-10-11T00:58:56.128055" elapsed="0.000173"/>
</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-10-11T00:58:56.128436" elapsed="0.000264"/>
</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-10-11T00:58:56.125949" elapsed="0.002804"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:58:56.128922" elapsed="0.002251"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:56.137001" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:56.137111" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:56.137207" 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-10-11T00:58:56.131694" elapsed="0.005538"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:56.137750" 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-10-11T00:58:56.137471" elapsed="0.000323"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:56.137956" elapsed="0.000324"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:56.142819" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:56.142928" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:56.143022" 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-10-11T00:58:56.138464" elapsed="0.004583"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:56.143572" 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-10-11T00:58:56.143259" elapsed="0.000358"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:56.143781" elapsed="0.000323"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T00:58:56.144321" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:56.144173" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:56.144154" elapsed="0.000226"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:56.150473" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:56.150516" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:56.150606" 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-10-11T00:58:56.144551" elapsed="0.006079"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:58:56.131374" elapsed="0.019315"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:56.155923" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:56.156026" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:56.156110" 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-10-11T00:58:56.151649" elapsed="0.004484"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:56.156650" 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-10-11T00:58:56.156340" elapsed="0.000353"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:56.156856" elapsed="0.000318"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:56.159613" level="INFO">${update} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000103f20cdd809ff70007d0202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:58:56.157322" elapsed="0.002318"/>
</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-10-11T00:58:56.159796" elapsed="0.000312"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:58:56.160153" elapsed="0.000028"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:58:56.151303" elapsed="0.008951"/>
</kw>
<msg time="2026-10-11T00:58:56.160324" 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-10-11T00:58:56.150897" elapsed="0.009450"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:56.160801" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000103f20cdd809ff70007d0202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:56.160579" elapsed="0.000264"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:58:56.161647" level="INFO">Length is 136.</msg>
<msg time="2026-10-11T00:58:56.161715" 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-10-11T00:58:56.161386" elapsed="0.000351"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:58:56.162133" level="INFO">Length is 136.</msg>
<msg time="2026-10-11T00:58:56.162200" 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-10-11T00:58:56.161899" elapsed="0.000323"/>
</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-10-11T00:58:56.162442" elapsed="0.000274"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:56.163011" 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-10-11T00:58:56.162861" elapsed="0.000174"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:58:56.163327" 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-10-11T00:58:56.163176" elapsed="0.000174"/>
</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-10-11T00:58:56.163557" elapsed="0.000262"/>
</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-10-11T00:58:56.161047" elapsed="0.002826"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:56.168281" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:56.168384" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:56.168540" 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-10-11T00:58:56.164384" elapsed="0.004181"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:56.169050" 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-10-11T00:58:56.168769" elapsed="0.000325"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:56.169262" elapsed="0.000351"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:56.173707" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:56.173809" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:56.173902" 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-10-11T00:58:56.169774" elapsed="0.004152"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:56.174446" 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-10-11T00:58:56.174132" elapsed="0.000359"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:56.174654" elapsed="0.000330"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T00:58:56.175202" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:58:56.175052" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:56.175034" elapsed="0.000243"/>
</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-10-11T00:58:56.175452" elapsed="0.000020"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:58:56.164090" elapsed="0.011443"/>
</kw>
<arg>route_es_mac</arg>
<status status="PASS" start="2026-10-11T00:58:56.089725" elapsed="0.085849"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:55.963996" elapsed="0.211666"/>
</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-10-11T00:58:56.177381" elapsed="0.000226"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:58:56.177123" 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-10-11T00:58:56.178565" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:56.178476" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:56.178458" elapsed="0.000170"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:56.180685" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:56.180602" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:56.180584" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:56.181663" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:58:56.181315" elapsed="0.000373"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:58:56.182103" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:58:56.181845" elapsed="0.000282"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:58:56.182166" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:58:56.182297" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:58:56.180952" elapsed="0.001368"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:58:56.185016" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:56.184931" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:56.184914" 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-10-11T00:58:56.186280" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:58:56.186167" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:56.186149" elapsed="0.000323"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:58:56.186974" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:58:56.186626" elapsed="0.000409"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:58:56.187641" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:56.187390" elapsed="0.000308"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:58:56.226921" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:58:56.189156" elapsed="0.037888"/>
</kw>
<msg time="2026-10-11T00:58:56.227167" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:58:56.227255" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:56.187999" elapsed="0.039326"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:58:56.265729" 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-10-11T00:58:56.228928" elapsed="0.036927"/>
</kw>
<msg time="2026-10-11T00:58:56.265976" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:58:56.266062" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:56.227750" elapsed="0.038380"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:56.266740" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:56.266446" elapsed="0.000421"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:56.266393" elapsed="0.000529"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:56.267608" 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-10-11T00:58:56.267113" elapsed="0.000606"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:56.268168" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:56.267884" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:56.267865" elapsed="0.000482"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:58:56.268379" elapsed="0.000062"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:58:56.271955" elapsed="0.000119"/>
</kw>
<msg time="2026-10-11T00:58:56.272112" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:58:56.271482" elapsed="0.000688"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:56.272533" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:56.272742" 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-10-11T00:58:56.270717" elapsed="0.002238"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:58:56.268693" elapsed="0.004341"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:58:56.185870" elapsed="0.087313"/>
</kw>
<msg time="2026-10-11T00:58:56.273270" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:56.273310" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:56.185267" elapsed="0.088078"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:58:56.273529" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:58:56.273442" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:56.273422" 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-10-11T00:58:56.274022" 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-10-11T00:58:56.274433" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:58:56.274502" 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-10-11T00:58:56.184643" elapsed="0.089945"/>
</kw>
<msg time="2026-10-11T00:58:56.274672" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:58:56.274711" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:56.182687" elapsed="0.092059"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:58:56.275034" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:56.274813" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:56.274796" elapsed="0.000309"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:58:56.182542" elapsed="0.092585"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:58:56.182367" elapsed="0.092788"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:58:56.180285" elapsed="0.094918"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:58:56.178198" elapsed="0.097054"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:58:56.177807" elapsed="0.097484"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:58:56.176783" elapsed="0.098554"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:56.282142" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:56.282246" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:56.282336" 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-10-11T00:58:56.275874" elapsed="0.006485"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:56.282566" elapsed="0.000522"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:56.287934" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:56.288036" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:58:56.288128" 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-10-11T00:58:56.283250" elapsed="0.004902"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:56.289016" 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-10-11T00:58:56.288767" elapsed="0.000277"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:56.289492" 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-10-11T00:58:56.289227" 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-10-11T00:58:56.289703" elapsed="0.000278"/>
</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-10-11T00:58:56.288356" elapsed="0.001680"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:56.275605" elapsed="0.014479"/>
</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-10-11T00:58:56.176323" elapsed="0.113796"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:56.290774" 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-10-11T00:58:56.290899" 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-10-11T00:58:56.290633" elapsed="0.000292"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:56.299027" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:56.298722" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:58:56.299763" 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-10-11T00:58:56.299561" elapsed="0.000274">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-10-11T00:58:56.299918" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:58:56.299215" elapsed="0.000726"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:58:56.300446" 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-10-11T00:58:56.300115" elapsed="0.000357"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:56.300747" 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-10-11T00:58:56.300863" 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-10-11T00:58:56.300639" elapsed="0.000248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:56.301300" 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-10-11T00:58:56.301084" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:58:56.301685" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:58:56.301428" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:58:56.302167" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:58:56.301907" elapsed="0.000283"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:56.301761" elapsed="0.000461"/>
</branch>
<status status="PASS" start="2026-10-11T00:58:56.301388" elapsed="0.000854"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:58:56.302814" 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-10-11T00:58:56.302433" elapsed="0.000407"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:58:56.302883" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:58:56.303009" 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-10-11T00:58:56.298277" elapsed="0.004789"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:56.303375" 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-10-11T00:58:56.303514" 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-10-11T00:58:56.303235" elapsed="0.000304"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:58:56.303839" 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-10-11T00:58:56.303950" 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-10-11T00:58:56.303702" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:56.304395" 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-10-11T00:58:56.304170" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:56.304880" 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-10-11T00:58:56.304665" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:56.305330" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000103f20cdd809ff70007d0202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:56.305117" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:58:56.305824" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000103f20cdd809ff70007d0202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:58:56.305610" elapsed="0.000255"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:58:56.306004" elapsed="0.002460"/>
</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-10-11T00:58:56.308620" elapsed="0.002344"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:56.316310" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:56.316456" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:56.316548" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T00:58:56.311900" elapsed="0.005003">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:56.317085" elapsed="0.000021"/>
</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-10-11T00:58:56.317333" elapsed="0.000023"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T00:58:56.311599" elapsed="0.005876">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:58.326677" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:58.326945" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:58:58.327152" 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-10-11T00:58:58.318843" elapsed="0.008363"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T00:58:58.328186" 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-10-11T00:58:58.328467" 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-10-11T00:58:58.327641" elapsed="0.000923"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:58.330804" 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-10-11T00:58:58.329903" elapsed="0.000963"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:58.332044" 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-10-11T00:58:58.331206" elapsed="0.000897"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:58:58.332561" elapsed="0.000626"/>
</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-10-11T00:58:58.329009" elapsed="0.004302"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T00:58:58.317995" elapsed="0.015480"/>
</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-10-11T00:58:56.311161" elapsed="2.022410"/>
</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-10-11T00:58:58.333897" elapsed="0.003372"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:58.347034" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:58.347263" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:58:58.347521" 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-10-11T00:58:58.339308" elapsed="0.008269"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:58:58.348034" elapsed="0.001254"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:58:58.356512" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:58:58.356757" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:58:58.356971" 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-10-11T00:58:58.349711" elapsed="0.007314"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:58.358985" 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-10-11T00:58:58.358442" elapsed="0.000603"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:58:58.360328" 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-10-11T00:58:58.359404" elapsed="0.001026"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T00:58:58.361490" 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-10-11T00:58:58.361882" 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-10-11T00:58:58.360847" elapsed="0.001183">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-10-11T00:58:58.357540" elapsed="0.004764">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-10-11T00:58:58.338709" elapsed="0.023889">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-10-11T00:59:00.372662" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:00.372927" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:00.373164" 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-10-11T00:59:00.364055" elapsed="0.009166"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:00.373698" elapsed="0.000873"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:00.382201" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:00.382490" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:00.382699" 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-10-11T00:59:00.374936" elapsed="0.007818"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:00.384731" 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-10-11T00:59:00.384116" elapsed="0.000674"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:00.385687" 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-10-11T00:59:00.385127" elapsed="0.000618"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:00.386150" elapsed="0.000840"/>
</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-10-11T00:59:00.383213" elapsed="0.003901"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:00.363246" elapsed="0.023973"/>
</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-10-11T00:58:58.337784" elapsed="2.049512"/>
</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-10-11T00:59:00.388393" elapsed="0.003617"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:00.405083" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:00.405311" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:00.405578" 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-10-11T00:59:00.396695" elapsed="0.008937"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:00.406014" elapsed="0.000795"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:00.414464" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:00.414690" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:00.414892" 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-10-11T00:59:00.407166" elapsed="0.007779"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:00.416926" 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-10-11T00:59:00.416349" elapsed="0.000636"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:00.417870" 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-10-11T00:59:00.417318" elapsed="0.000610"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:00.418326" elapsed="0.000655"/>
</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-10-11T00:59:00.415398" elapsed="0.003706"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:00.395988" elapsed="0.023222"/>
</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-10-11T00:59:00.392514" elapsed="0.026771"/>
</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-10-11T00:59:00.387700" elapsed="0.031693"/>
</kw>
<arg>route_es_mac</arg>
<status status="PASS" start="2026-10-11T00:58:56.290302" elapsed="4.129231"/>
</kw>
<status status="PASS" start="2026-10-11T00:58:56.175908" elapsed="4.243825"/>
</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-10-11T00:59:00.423669" elapsed="0.000441"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:59:00.423071" elapsed="0.001151"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:00.426293" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:00.426086" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:00.426042" elapsed="0.000446"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:00.431289" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:00.431106" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:00.431068" elapsed="0.000411"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.433526" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:59:00.432769" elapsed="0.000814"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.434547" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:59:00.433919" elapsed="0.000681"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:59:00.434688" elapsed="0.000067"/>
</return>
<msg time="2026-10-11T00:59:00.434974" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:59:00.431938" elapsed="0.003087"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:00.439515" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:00.439364" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:00.439340" 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-10-11T00:59:00.441226" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:00.441067" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:00.441042" elapsed="0.000435"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:59:00.442185" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:59:00.441694" elapsed="0.000573"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:59:00.443163" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:59:00.442843" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:59:00.482589" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:59:00.445328" elapsed="0.037379"/>
</kw>
<msg time="2026-10-11T00:59:00.482830" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:59:00.482918" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:00.443705" elapsed="0.039295"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:59:00.517308" 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-10-11T00:59:00.484628" elapsed="0.032843"/>
</kw>
<msg time="2026-10-11T00:59:00.517595" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:59:00.517684" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:00.483391" elapsed="0.034364"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:00.518343" elapsed="0.000097"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:00.518047" elapsed="0.000461"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:00.518027" elapsed="0.000537"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.519237" 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-10-11T00:59:00.518756" elapsed="0.000595"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:00.519851" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:00.519560" elapsed="0.000420"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:00.519540" elapsed="0.000495"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:59:00.520068" 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-10-11T00:59:00.523728" elapsed="0.000241"/>
</kw>
<msg time="2026-10-11T00:59:00.524010" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:59:00.523111" elapsed="0.000962"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:00.524306" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:00.524545" 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-10-11T00:59:00.522295" elapsed="0.002464"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:59:00.520348" elapsed="0.004489"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:59:00.440669" elapsed="0.084319"/>
</kw>
<msg time="2026-10-11T00:59:00.525072" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:00.525112" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:00.439817" elapsed="0.085330"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:59:00.525301" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:59:00.525215" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:00.525198" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:00.525814" 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-10-11T00:59:00.526196" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:59:00.526294" 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-10-11T00:59:00.438966" elapsed="0.087417"/>
</kw>
<msg time="2026-10-11T00:59:00.526498" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:00.526540" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:00.435812" elapsed="0.090765"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:00.526867" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:00.526645" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:00.526629" elapsed="0.000311"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:59:00.435490" elapsed="0.091472"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:59:00.435130" elapsed="0.091861"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:59:00.430455" elapsed="0.096586"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:59:00.425514" elapsed="0.101579"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:00.424596" elapsed="0.102538"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:59:00.422273" elapsed="0.104910"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:00.533800" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:00.533913" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:00.534009" 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-10-11T00:59:00.527622" elapsed="0.006412"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:00.534208" elapsed="0.000381"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:00.540445" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:00.540547" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:00.540641" 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-10-11T00:59:00.534751" elapsed="0.005915"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:00.541523" 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-10-11T00:59:00.541250" elapsed="0.000300"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:00.541931" 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-10-11T00:59:00.541702" elapsed="0.000255"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:00.542141" elapsed="0.000306"/>
</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-10-11T00:59:00.540871" elapsed="0.001633"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:00.527315" elapsed="0.015272"/>
</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-10-11T00:59:00.421291" elapsed="0.121333"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:00.543295" 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-10-11T00:59:00.543467" 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-10-11T00:59:00.543147" elapsed="0.000348"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:00.543796" 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-10-11T00:59:00.543912" 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-10-11T00:59:00.543659" elapsed="0.000278"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:00.544236" 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-10-11T00:59:00.544350" 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-10-11T00:59:00.544100" elapsed="0.000275"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:59:00.544735" 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-10-11T00:59:00.544559" elapsed="0.000201"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:00.545058" 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-10-11T00:59:00.545173" 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-10-11T00:59:00.544923" elapsed="0.000275"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:59:00.545546" 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-10-11T00:59:00.545357" elapsed="0.000214"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.545984" 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-10-11T00:59:00.545766" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.546462" 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-10-11T00:59:00.546228" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.546910" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a6290004170002199999990001042b2b2b2b000007d000202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:00.546698" elapsed="0.000252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.547348" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c00194604170002199999990001042b2b2b2b000007d000202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:00.547139" elapsed="0.000249"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:00.547548" elapsed="0.002719"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:00.561350" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T00:59:00.561438" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:00.561534" 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-10-11T00:59:00.550488" elapsed="0.011070"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.562045" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:00.561769" elapsed="0.000315"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:00.569284" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:00.569393" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:00.569523" 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-10-11T00:59:00.562240" elapsed="0.007307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.570025" 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-10-11T00:59:00.569751" elapsed="0.000318"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:00.576363" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:00.576502" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:00.576590" 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-10-11T00:59:00.570996" elapsed="0.005618"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.577094" 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-10-11T00:59:00.576819" elapsed="0.000350"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:00.577334" elapsed="0.000353"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:00.580327" level="INFO">${update} = ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a6290004170002199999990001042b2b2b2b000007d000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:59:00.577838" elapsed="0.002517"/>
</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-10-11T00:59:00.580593" elapsed="0.000429"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:59:00.581084" elapsed="0.000041"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:59:00.570688" elapsed="0.010540"/>
</kw>
<msg time="2026-10-11T00:59:00.581326" 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-10-11T00:59:00.570252" elapsed="0.011108"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.581979" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a6290004170002199999990001042b2b2b2b000007d000202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:00.581676" elapsed="0.000361"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.583163" level="INFO">Length is 148.</msg>
<msg time="2026-10-11T00:59:00.583259" 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-10-11T00:59:00.582834" elapsed="0.000457"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.583864" level="INFO">Length is 148.</msg>
<msg time="2026-10-11T00:59:00.583957" 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-10-11T00:59:00.583546" elapsed="0.000441"/>
</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-10-11T00:59:00.584240" elapsed="0.000397"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:00.585055" 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-10-11T00:59:00.584841" elapsed="0.000247"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:00.585528" 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-10-11T00:59:00.585285" elapsed="0.000276"/>
</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-10-11T00:59:00.585810" elapsed="0.000369"/>
</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-10-11T00:59:00.582327" elapsed="0.003929"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:00.586485" elapsed="0.002434"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:00.595162" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:00.595312" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:00.595471" 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-10-11T00:59:00.589442" elapsed="0.006065"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.596171" 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-10-11T00:59:00.595792" elapsed="0.000440"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:00.596493" elapsed="0.000449"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:00.603018" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:00.603210" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:00.603344" 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-10-11T00:59:00.597164" elapsed="0.006215"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.604094" 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-10-11T00:59:00.603711" elapsed="0.000445"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:00.604380" elapsed="0.000477"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T00:59:00.605156" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:00.604952" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:00.604928" elapsed="0.000310"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:00.613202" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:00.613262" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:00.613385" 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-10-11T00:59:00.605468" elapsed="0.007993"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:59:00.589114" elapsed="0.024433"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:00.620891" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:00.621034" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:00.621152" 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-10-11T00:59:00.614803" elapsed="0.006383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.621901" 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-10-11T00:59:00.621514" elapsed="0.000447"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:00.622189" elapsed="0.000479"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:00.625231" level="INFO">${update} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c00194604170002199999990001042b2b2b2b000007d000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:59:00.622874" elapsed="0.002396"/>
</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-10-11T00:59:00.625529" elapsed="0.000430"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:59:00.626020" elapsed="0.000038"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:59:00.614344" elapsed="0.011816"/>
</kw>
<msg time="2026-10-11T00:59:00.626259" 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-10-11T00:59:00.613794" elapsed="0.012498"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.626959" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c00194604170002199999990001042b2b2b2b000007d000202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:00.626652" elapsed="0.000365"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.628142" level="INFO">Length is 136.</msg>
<msg time="2026-10-11T00:59:00.628238" 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-10-11T00:59:00.627813" elapsed="0.000456"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.628844" level="INFO">Length is 136.</msg>
<msg time="2026-10-11T00:59:00.628939" 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-10-11T00:59:00.628522" elapsed="0.000447"/>
</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-10-11T00:59:00.629223" elapsed="0.000401"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:00.630037" 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-10-11T00:59:00.629831" elapsed="0.000239"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:00.630501" 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-10-11T00:59:00.630267" elapsed="0.000267"/>
</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-10-11T00:59:00.630783" elapsed="0.000366"/>
</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-10-11T00:59:00.627305" elapsed="0.003922"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:00.638158" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:00.638302" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:00.638461" 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-10-11T00:59:00.631979" elapsed="0.006518"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.639162" 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-10-11T00:59:00.638784" elapsed="0.000438"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:00.639479" elapsed="0.000448"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:00.647050" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:00.647191" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:00.647318" 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-10-11T00:59:00.640149" elapsed="0.007203"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.648061" 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-10-11T00:59:00.647682" elapsed="0.000439"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:00.648348" elapsed="0.000481"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T00:59:00.649169" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-10-11T00:59:00.648924" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:00.648900" elapsed="0.000379"/>
</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-10-11T00:59:00.649520" elapsed="0.000029"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:59:00.631566" elapsed="0.018067"/>
</kw>
<arg>route_es_rou</arg>
<status status="PASS" start="2026-10-11T00:59:00.542850" elapsed="0.106839"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:00.420314" elapsed="0.229497"/>
</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-10-11T00:59:00.652511" elapsed="0.000276"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:59:00.652131" elapsed="0.000727"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:00.654119" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:00.653998" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:00.653973" 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-10-11T00:59:00.657029" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:00.656913" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:00.656889" elapsed="0.000228"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.658389" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:59:00.657940" elapsed="0.000516"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.659035" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:59:00.658673" elapsed="0.000396"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:59:00.659124" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T00:59:00.659300" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:59:00.657433" elapsed="0.001898"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:00.662869" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:00.662785" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:00.662767" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:00.664062" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:00.663949" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:00.663932" elapsed="0.000280"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:59:00.664741" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:59:00.664364" elapsed="0.000435"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:59:00.665363" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:59:00.665142" elapsed="0.000305"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:59:00.694138" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:59:00.666912" elapsed="0.027349"/>
</kw>
<msg time="2026-10-11T00:59:00.694385" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:59:00.694505" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:00.665750" elapsed="0.028826"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:59:00.727333" 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-10-11T00:59:00.696141" elapsed="0.031350"/>
</kw>
<msg time="2026-10-11T00:59:00.727612" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:59:00.727700" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:00.694969" elapsed="0.032799"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:00.728350" elapsed="0.000127"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:00.728056" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:00.728036" elapsed="0.000565"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.729266" 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-10-11T00:59:00.728790" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:00.729874" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:00.729585" elapsed="0.000415"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:00.729565" elapsed="0.000491"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:59:00.730090" 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-10-11T00:59:00.733498" elapsed="0.000119"/>
</kw>
<msg time="2026-10-11T00:59:00.733657" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:59:00.732993" elapsed="0.000723"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:00.733949" elapsed="0.000020"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:00.734155" 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-10-11T00:59:00.732256" elapsed="0.002112"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:59:00.730366" elapsed="0.004138"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:59:00.663666" elapsed="0.070989"/>
</kw>
<msg time="2026-10-11T00:59:00.734738" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:00.734777" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:00.663084" elapsed="0.071728"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:59:00.734965" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:59:00.734880" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:00.734863" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:00.735472" 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-10-11T00:59:00.735865" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:59:00.735931" 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-10-11T00:59:00.662497" elapsed="0.073520"/>
</kw>
<msg time="2026-10-11T00:59:00.736101" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:00.736140" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:00.659824" elapsed="0.076352"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:00.736657" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:00.736242" elapsed="0.000466"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:00.736226" elapsed="0.000504"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:59:00.659625" elapsed="0.077126"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:59:00.659396" elapsed="0.077382"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:59:00.656507" elapsed="0.080321"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:59:00.653645" elapsed="0.083233"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:00.653068" elapsed="0.083850"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:59:00.651651" elapsed="0.085314"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:00.743643" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:00.743749" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:00.743844" 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-10-11T00:59:00.737395" elapsed="0.006473"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:00.744041" elapsed="0.000339"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:00.750379" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:00.750514" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:00.750607" 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-10-11T00:59:00.744570" elapsed="0.006062"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:00.751492" 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-10-11T00:59:00.751217" elapsed="0.000302"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:00.751897" 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-10-11T00:59:00.751670" elapsed="0.000252"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:00.752104" elapsed="0.000274"/>
</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-10-11T00:59:00.750838" elapsed="0.001618"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:00.737127" elapsed="0.015379"/>
</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-10-11T00:59:00.650771" elapsed="0.101771"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:00.753168" 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-10-11T00:59:00.753291" 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-10-11T00:59:00.753022" elapsed="0.000296"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.761283" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:59:00.760983" elapsed="0.000326"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:59:00.762008" 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-10-11T00:59:00.761810" elapsed="0.000266">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-10-11T00:59:00.762161" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:59:00.761489" elapsed="0.000698"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.762729" 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-10-11T00:59:00.762393" elapsed="0.000362"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:00.763030" 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-10-11T00:59:00.763145" 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-10-11T00:59:00.762922" elapsed="0.000248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.763613" 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-10-11T00:59:00.763364" 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-10-11T00:59:00.763977" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:00.763721" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.764485" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:59:00.764198" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:00.764051" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:00.763703" elapsed="0.000858"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.765102" 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-10-11T00:59:00.764725" elapsed="0.000403"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:59:00.765172" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:59:00.765296" 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-10-11T00:59:00.760563" elapsed="0.004757"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:00.765651" 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-10-11T00:59:00.765764" 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-10-11T00:59:00.765510" elapsed="0.000278"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:00.766083" 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-10-11T00:59:00.766191" 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-10-11T00:59:00.765949" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.766650" 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-10-11T00:59:00.766426" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.767097" 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-10-11T00:59:00.766888" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.767603" level="INFO">ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a6290004170002199999990001042b2b2b2b000007d000202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:00.767363" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:00.768046" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c00194604170002199999990001042b2b2b2b000007d000202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:00.767834" elapsed="0.000253"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:00.768225" elapsed="0.002832"/>
</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-10-11T00:59:00.771213" elapsed="0.001925"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:00.778903" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:00.779005" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:00.779093" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T00:59:00.774073" elapsed="0.005400">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:00.779654" elapsed="0.000021"/>
</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-10-11T00:59:00.779864" elapsed="0.000021"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T00:59:00.773772" elapsed="0.006205">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:02.791162" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:02.791520" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:02.791736" 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-10-11T00:59:02.781589" elapsed="0.010202"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T00:59:02.792794" 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-10-11T00:59:02.793038" 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-10-11T00:59:02.792180" elapsed="0.000950"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:02.795583" 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-10-11T00:59:02.794657" elapsed="0.000987"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:02.796820" 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-10-11T00:59:02.795985" elapsed="0.000894"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:02.797289" elapsed="0.000736"/>
</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-10-11T00:59:02.793640" elapsed="0.004510"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T00:59:02.780646" elapsed="0.017611"/>
</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-10-11T00:59:00.773333" elapsed="2.025012"/>
</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-10-11T00:59:02.798725" elapsed="0.003374"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:02.811550" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:02.811782" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:02.811992" 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-10-11T00:59:02.804159" elapsed="0.007886"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:02.812486" elapsed="0.000776"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:02.823470" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:02.823716" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:02.823928" 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-10-11T00:59:02.813675" elapsed="0.010309"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:02.825935" 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-10-11T00:59:02.825351" elapsed="0.000644"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:02.827287" 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-10-11T00:59:02.826332" elapsed="0.001014"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T00:59:02.828511" 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-10-11T00:59:02.828979" 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-10-11T00:59:02.827856" elapsed="0.001278">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-10-11T00:59:02.824495" elapsed="0.004964">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-10-11T00:59:02.803558" elapsed="0.026150">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-10-11T00:59:04.839793" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:04.840047" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:04.840248" 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-10-11T00:59:04.830953" elapsed="0.009348"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:04.840759" elapsed="0.000862"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:04.850374" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:04.850673" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:04.850879" 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-10-11T00:59:04.841991" elapsed="0.008942"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:04.852902" 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-10-11T00:59:04.852301" elapsed="0.000661"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:04.853945" 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-10-11T00:59:04.853370" 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-10-11T00:59:04.854466" elapsed="0.000629"/>
</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-10-11T00:59:04.851393" elapsed="0.003825"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:04.830208" elapsed="0.025115"/>
</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-10-11T00:59:02.802633" elapsed="2.052767"/>
</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-10-11T00:59:04.856563" elapsed="0.003562"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:04.868848" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:04.869075" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:04.869282" 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-10-11T00:59:04.862227" elapsed="0.007109"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:04.869777" elapsed="0.000811"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:04.877820" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:04.878045" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:04.878245" 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-10-11T00:59:04.870948" elapsed="0.007351"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:04.880299" 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-10-11T00:59:04.879766" elapsed="0.000592"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:04.881250" 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-10-11T00:59:04.880745" 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-10-11T00:59:04.881761" elapsed="0.000610"/>
</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-10-11T00:59:04.878815" elapsed="0.003738"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:04.861571" elapsed="0.021093"/>
</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-10-11T00:59:04.860650" elapsed="0.022092"/>
</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-10-11T00:59:04.855815" elapsed="0.027035"/>
</kw>
<arg>route_es_rou</arg>
<status status="PASS" start="2026-10-11T00:59:00.752725" elapsed="4.130219"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:00.650161" elapsed="4.232988"/>
</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-10-11T00:59:04.887178" elapsed="0.000515"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:59:04.886620" elapsed="0.001185"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:04.890017" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:04.889804" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:04.889756" elapsed="0.000410"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:04.895152" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:04.894965" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:04.894926" elapsed="0.000369"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:04.897401" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:59:04.896675" elapsed="0.000838"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:59:04.898500" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:59:04.897861" elapsed="0.000696"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:59:04.898646" elapsed="0.000069"/>
</return>
<msg time="2026-10-11T00:59:04.898938" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:59:04.895818" elapsed="0.003171"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:04.903997" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:04.903879" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:04.903854" elapsed="0.000231"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:04.905766" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:04.905604" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:04.905579" elapsed="0.000401"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:59:04.906722" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:59:04.906192" elapsed="0.000611"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:59:04.907654" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:59:04.907289" elapsed="0.000445"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:59:04.943519" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:59:04.909916" elapsed="0.033728"/>
</kw>
<msg time="2026-10-11T00:59:04.943771" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:59:04.943879" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:04.908160" elapsed="0.035790"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:59:04.978742" 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-10-11T00:59:04.945564" elapsed="0.033306"/>
</kw>
<msg time="2026-10-11T00:59:04.978992" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:59:04.979080" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:04.944335" elapsed="0.034815"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:04.979773" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:04.979471" elapsed="0.000431"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:04.979450" elapsed="0.000507"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:04.980654" 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-10-11T00:59:04.980147" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:04.981232" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:04.980941" elapsed="0.000421"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:04.980922" elapsed="0.000535"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:59:04.981494" 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-10-11T00:59:04.986669" elapsed="0.000124"/>
</kw>
<msg time="2026-10-11T00:59:04.986834" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:59:04.984645" elapsed="0.002252"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:04.987131" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:04.987340" 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-10-11T00:59:04.983856" elapsed="0.003737"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:59:04.981810" elapsed="0.005863"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:59:04.905154" elapsed="0.082669"/>
</kw>
<msg time="2026-10-11T00:59:04.987905" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:04.987944" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:04.904297" elapsed="0.083682"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:59:04.988137" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:59:04.988048" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:04.988030" elapsed="0.000183"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:04.988651" 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-10-11T00:59:04.989027" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:59:04.989094" 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-10-11T00:59:04.903479" elapsed="0.085700"/>
</kw>
<msg time="2026-10-11T00:59:04.989262" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:04.989302" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:04.899820" elapsed="0.089516"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:04.989666" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:04.989427" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:04.989387" elapsed="0.000349"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:59:04.899489" elapsed="0.090268"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:59:04.899098" elapsed="0.090688"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:59:04.894254" elapsed="0.095582"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:59:04.889167" elapsed="0.100717"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:04.888204" elapsed="0.101720"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:59:04.885794" elapsed="0.104175"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:04.995199" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:04.995308" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:04.995465" 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-10-11T00:59:04.990361" elapsed="0.005131"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:04.995666" elapsed="0.000340"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:05.002899" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:05.003001" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:05.003092" 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-10-11T00:59:04.996167" elapsed="0.006949"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:05.003976" 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-10-11T00:59:05.003735" elapsed="0.000268"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:05.004380" 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-10-11T00:59:05.004155" elapsed="0.000266"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:05.004619" elapsed="0.000274"/>
</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-10-11T00:59:05.003321" elapsed="0.001628"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:04.990097" elapsed="0.014900"/>
</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-10-11T00:59:04.884798" elapsed="0.120234"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:05.005737" 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-10-11T00:59:05.005877" 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-10-11T00:59:05.005586" elapsed="0.000318"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:05.006207" 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-10-11T00:59:05.006323" 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-10-11T00:59:05.006071" elapsed="0.000277"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:05.006680" 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-10-11T00:59:05.006796" 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-10-11T00:59:05.006538" elapsed="0.000282"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:59:05.007156" 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-10-11T00:59:05.006982" elapsed="0.000198"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:05.007503" 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-10-11T00:59:05.007617" 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-10-11T00:59:05.007344" elapsed="0.000321"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:59:05.007996" 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-10-11T00:59:05.007831" elapsed="0.000190"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:05.008469" 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-10-11T00:59:05.008223" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:05.008926" 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-10-11T00:59:05.008711" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:05.009372" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001000000000000000000000000000a05dc10</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:05.009161" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:05.009845" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001000000000000000000000000000a05dc10</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:05.009631" elapsed="0.000254"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:05.010023" elapsed="0.002932"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:05.024146" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T00:59:05.024206" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:05.024297" 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-10-11T00:59:05.013126" elapsed="0.011194"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:05.024835" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:05.024560" elapsed="0.000314"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:05.031187" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:05.031295" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:05.031452" 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-10-11T00:59:05.025030" elapsed="0.006449"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:05.031966" 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-10-11T00:59:05.031693" elapsed="0.000317"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:05.038697" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:05.038803" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:05.038889" 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-10-11T00:59:05.032921" elapsed="0.005992"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:05.039391" 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-10-11T00:59:05.039119" elapsed="0.000353"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:05.039641" elapsed="0.000322"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:05.042360" level="INFO">${update} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001000000000000000000000000000a05dc10</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:59:05.040113" elapsed="0.002274"/>
</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-10-11T00:59:05.042577" elapsed="0.000311"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:59:05.042931" elapsed="0.000028"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:59:05.032616" elapsed="0.010417"/>
</kw>
<msg time="2026-10-11T00:59:05.043101" 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-10-11T00:59:05.032196" elapsed="0.010928"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:05.043585" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001000000000000000000000000000a05dc10</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:05.043331" elapsed="0.000295"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:05.044400" level="INFO">Length is 152.</msg>
<msg time="2026-10-11T00:59:05.044507" 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-10-11T00:59:05.044165" elapsed="0.000365"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:05.044913" level="INFO">Length is 152.</msg>
<msg time="2026-10-11T00:59:05.044980" 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-10-11T00:59:05.044687" elapsed="0.000315"/>
</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-10-11T00:59:05.045188" elapsed="0.000290"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:05.045782" 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-10-11T00:59:05.045627" elapsed="0.000178"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:05.046097" 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-10-11T00:59:05.045948" elapsed="0.000171"/>
</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-10-11T00:59:05.046305" elapsed="0.000289"/>
</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-10-11T00:59:05.043837" elapsed="0.002810"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:05.046820" elapsed="0.002214"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:05.055318" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:05.055460" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:05.055549" 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-10-11T00:59:05.049569" elapsed="0.006004"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:05.056063" 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-10-11T00:59:05.055790" elapsed="0.000318"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:05.056274" elapsed="0.000360"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:05.062295" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:05.062426" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:05.062537" 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-10-11T00:59:05.056799" elapsed="0.005763"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:05.063056" 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-10-11T00:59:05.062782" elapsed="0.000317"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:05.063265" elapsed="0.000352"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T00:59:05.063834" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:05.063686" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:05.063668" elapsed="0.000225"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:05.070518" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:05.070561" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:05.070655" 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-10-11T00:59:05.064041" elapsed="0.006639"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:59:05.049220" elapsed="0.021519"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:05.077112" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:05.077258" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:05.077377" 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-10-11T00:59:05.071694" elapsed="0.005760"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:05.078132" 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-10-11T00:59:05.077748" elapsed="0.000445"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:05.078456" elapsed="0.000451"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:05.081509" level="INFO">${update} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001000000000000000000000000000a05dc10</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:59:05.079119" elapsed="0.002429"/>
</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-10-11T00:59:05.081767" elapsed="0.000426"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:59:05.082253" elapsed="0.000038"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:59:05.071319" elapsed="0.011073"/>
</kw>
<msg time="2026-10-11T00:59:05.082538" 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-10-11T00:59:05.070924" elapsed="0.011647"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:05.083159" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001000000000000000000000000000a05dc10</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:05.082859" elapsed="0.000359"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:05.084340" level="INFO">Length is 140.</msg>
<msg time="2026-10-11T00:59:05.084472" 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-10-11T00:59:05.084015" elapsed="0.000491"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:05.085045" level="INFO">Length is 140.</msg>
<msg time="2026-10-11T00:59:05.085139" 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-10-11T00:59:05.084725" elapsed="0.000444"/>
</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-10-11T00:59:05.085463" elapsed="0.000367"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:05.086240" 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-10-11T00:59:05.086033" elapsed="0.000239"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:05.086710" 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-10-11T00:59:05.086505" 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-10-11T00:59:05.086998" elapsed="0.000361"/>
</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-10-11T00:59:05.083553" elapsed="0.003918"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:05.094222" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:05.094324" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:05.094479" 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-10-11T00:59:05.088186" elapsed="0.006319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:05.095145" 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-10-11T00:59:05.094763" elapsed="0.000442"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:05.095467" elapsed="0.000453"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:05.101623" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:05.101764" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:05.101892" 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-10-11T00:59:05.096144" elapsed="0.005782"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:05.102642" 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-10-11T00:59:05.102224" elapsed="0.000480"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:05.102934" elapsed="0.000445"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T00:59:05.103720" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-10-11T00:59:05.103512" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:05.103485" elapsed="0.000341"/>
</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-10-11T00:59:05.104034" elapsed="0.000027"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:59:05.087778" elapsed="0.016366"/>
</kw>
<arg>route_eth_arb</arg>
<status status="PASS" start="2026-10-11T00:59:05.005259" elapsed="0.098940"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:04.883788" elapsed="0.220529"/>
</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-10-11T00:59:05.107025" elapsed="0.000274"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:59:05.106677" elapsed="0.000691"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:05.108680" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:05.108558" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:05.108533" 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-10-11T00:59:05.111592" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:05.111474" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:05.111448" elapsed="0.000219"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:05.112581" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:59:05.112232" elapsed="0.000374"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:59:05.113016" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:59:05.112758" elapsed="0.000282"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:59:05.113079" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:59:05.113204" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:59:05.111875" elapsed="0.001352"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:05.115869" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:05.115785" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:05.115768" 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-10-11T00:59:05.117115" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:05.117002" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:05.116984" elapsed="0.000281"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:59:05.117796" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:59:05.117450" elapsed="0.000405"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:59:05.118449" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:59:05.118200" elapsed="0.000309"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:59:05.153058" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:59:05.119965" elapsed="0.033218"/>
</kw>
<msg time="2026-10-11T00:59:05.153306" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:59:05.153427" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:05.118811" elapsed="0.034700"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:59:05.190704" 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-10-11T00:59:05.155080" elapsed="0.035750"/>
</kw>
<msg time="2026-10-11T00:59:05.190950" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:59:05.191037" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:05.153902" elapsed="0.037205"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:05.191729" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:05.191394" elapsed="0.000463"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:05.191374" elapsed="0.000538"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:05.192610" 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-10-11T00:59:05.192107" elapsed="0.000616"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:05.193184" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:05.192895" elapsed="0.000417"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:05.192876" elapsed="0.000492"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:59:05.193401" elapsed="0.000062"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:59:05.196979" elapsed="0.000118"/>
</kw>
<msg time="2026-10-11T00:59:05.197136" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:59:05.196505" elapsed="0.000690"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:05.197526" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:05.197738" 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-10-11T00:59:05.195764" elapsed="0.002184"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:59:05.193722" elapsed="0.004305"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:59:05.116716" elapsed="0.081459"/>
</kw>
<msg time="2026-10-11T00:59:05.198260" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:05.198299" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:05.116119" elapsed="0.082216"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:59:05.198519" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:59:05.198418" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:05.198385" elapsed="0.000246"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:05.199011" 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-10-11T00:59:05.199394" elapsed="0.000104"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:59:05.199544" 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-10-11T00:59:05.115499" elapsed="0.084132"/>
</kw>
<msg time="2026-10-11T00:59:05.199715" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:05.199754" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:05.113586" elapsed="0.086203"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:05.200075" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:05.199855" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:05.199839" elapsed="0.000306"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:59:05.113430" elapsed="0.086737"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:59:05.113274" elapsed="0.086919"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:59:05.111035" elapsed="0.089207"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:59:05.108163" elapsed="0.092128"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:05.107612" elapsed="0.092719"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:59:05.106159" elapsed="0.094218"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:05.207716" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:05.207824" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:05.207918" 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-10-11T00:59:05.200809" elapsed="0.007133"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:05.208116" elapsed="0.000373"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:05.214860" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:05.214963" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:05.215056" 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-10-11T00:59:05.208651" elapsed="0.006430"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:05.215963" 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-10-11T00:59:05.215709" elapsed="0.000281"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:05.216422" 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-10-11T00:59:05.216174" elapsed="0.000289"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:05.216649" elapsed="0.000276"/>
</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-10-11T00:59:05.215287" elapsed="0.001693"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:05.200541" elapsed="0.016487"/>
</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-10-11T00:59:05.105273" elapsed="0.111792"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:05.217727" 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-10-11T00:59:05.217855" 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-10-11T00:59:05.217579" elapsed="0.000302"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:59:05.225882" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:59:05.225579" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:59:05.226636" 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-10-11T00:59:05.226389" elapsed="0.000318">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-10-11T00:59:05.226792" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:59:05.226069" elapsed="0.000745"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:05.227297" 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-10-11T00:59:05.226990" elapsed="0.000331"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:05.227632" 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-10-11T00:59:05.227805" 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-10-11T00:59:05.227520" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:05.228252" 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-10-11T00:59:05.228036" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:59:05.228651" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:05.228358" elapsed="0.000345"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:59:05.229134" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:59:05.228874" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:05.228726" elapsed="0.000464"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:05.228341" elapsed="0.000869"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:59:05.229786" 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-10-11T00:59:05.229377" elapsed="0.000435"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:59:05.229855" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:59:05.229980" 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-10-11T00:59:05.225134" elapsed="0.004900"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:05.230347" 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-10-11T00:59:05.230490" 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-10-11T00:59:05.230207" elapsed="0.000308"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:05.230819" 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-10-11T00:59:05.230929" 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-10-11T00:59:05.230681" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:05.231374" 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-10-11T00:59:05.231154" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:05.231865" 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-10-11T00:59:05.231651" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:05.232308" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001000000000000000000000000000a05dc10</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:05.232097" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:05.232777" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001000000000000000000000000000a05dc10</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:05.232564" elapsed="0.000254"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:05.232955" elapsed="0.002132"/>
</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-10-11T00:59:05.235231" elapsed="0.002343"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:05.244870" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:05.244972" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:05.245058" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T00:59:05.238508" elapsed="0.006926">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:05.245661" elapsed="0.000021"/>
</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-10-11T00:59:05.245876" elapsed="0.000022"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T00:59:05.238172" elapsed="0.007819">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:07.256491" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:07.256762" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:07.256968" 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-10-11T00:59:07.247252" elapsed="0.009770"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T00:59:07.258005" 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-10-11T00:59:07.258234" 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-10-11T00:59:07.257435" elapsed="0.000890"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:07.260678" 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-10-11T00:59:07.259732" elapsed="0.001006"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:07.261949" 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-10-11T00:59:07.261083" elapsed="0.000926"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:07.262450" elapsed="0.000638"/>
</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-10-11T00:59:07.258828" elapsed="0.004385"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T00:59:07.246490" elapsed="0.016829"/>
</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-10-11T00:59:05.237769" elapsed="2.025672"/>
</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-10-11T00:59:07.263848" elapsed="0.003389"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:07.278363" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:07.278668" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:07.278863" 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-10-11T00:59:07.269286" elapsed="0.009698"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:07.279382" elapsed="0.000831"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:07.289029" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:07.289271" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:07.289553" 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-10-11T00:59:07.280625" elapsed="0.008986"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:07.291587" 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-10-11T00:59:07.290987" elapsed="0.000660"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:07.292969" 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-10-11T00:59:07.291989" elapsed="0.001040"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T00:59:07.294087" 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-10-11T00:59:07.294585" 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-10-11T00:59:07.293487" elapsed="0.001256">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-10-11T00:59:07.290069" elapsed="0.004954">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-10-11T00:59:07.268682" elapsed="0.026580">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-10-11T00:59:09.306199" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:09.306517" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:09.306723" 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-10-11T00:59:09.296557" elapsed="0.010221"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:09.307173" elapsed="0.000851"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:09.316644" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:09.316873" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:09.317080" 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-10-11T00:59:09.308391" elapsed="0.008744"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:09.319114" 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-10-11T00:59:09.318569" elapsed="0.000604"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:09.320073" 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-10-11T00:59:09.319560" 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-10-11T00:59:09.320600" elapsed="0.000618"/>
</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-10-11T00:59:09.317653" elapsed="0.003689"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:09.295842" elapsed="0.025660"/>
</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-10-11T00:59:07.267767" elapsed="2.053818"/>
</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-10-11T00:59:09.322719" elapsed="0.003541"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:09.337073" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:09.337304" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:09.337586" 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-10-11T00:59:09.328771" elapsed="0.008870"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:09.338029" elapsed="0.000809"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:09.346664" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:09.346892" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:09.347096" 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-10-11T00:59:09.339198" elapsed="0.007953"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:09.349166" 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-10-11T00:59:09.348627" elapsed="0.000598"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:09.350131" 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-10-11T00:59:09.349617" elapsed="0.000572"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:09.350653" elapsed="0.000624"/>
</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-10-11T00:59:09.347662" elapsed="0.003738"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:09.327688" elapsed="0.023877"/>
</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-10-11T00:59:09.326778" elapsed="0.024864"/>
</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-10-11T00:59:09.321946" elapsed="0.029802"/>
</kw>
<arg>route_eth_arb</arg>
<status status="PASS" start="2026-10-11T00:59:05.217251" elapsed="4.134589"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:05.104697" elapsed="4.247347"/>
</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-10-11T00:59:09.356055" elapsed="0.000506"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:59:09.355465" elapsed="0.001209"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:09.358800" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:09.358590" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:09.358543" 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-10-11T00:59:09.363596" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:09.363360" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:09.363323" elapsed="0.000414"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.365832" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:59:09.365058" elapsed="0.000831"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.366881" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:59:09.366230" elapsed="0.000705"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:59:09.367023" elapsed="0.000064"/>
</return>
<msg time="2026-10-11T00:59:09.367308" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:59:09.364197" elapsed="0.003163"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:09.372652" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:09.372532" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:09.372507" 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-10-11T00:59:09.374353" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:09.374195" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:09.374170" elapsed="0.000451"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:59:09.375323" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:59:09.374834" elapsed="0.000592"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:59:09.376298" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:59:09.375980" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:59:09.412572" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:59:09.378556" elapsed="0.034139"/>
</kw>
<msg time="2026-10-11T00:59:09.412822" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:59:09.412911" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:09.376869" elapsed="0.036112"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:59:09.446765" 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-10-11T00:59:09.414646" elapsed="0.032247"/>
</kw>
<msg time="2026-10-11T00:59:09.447014" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:59:09.447102" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:09.413379" elapsed="0.033791"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:09.447800" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:09.447499" elapsed="0.000433"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:09.447465" elapsed="0.000523"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.448701" 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-10-11T00:59:09.448179" elapsed="0.000639"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:09.449289" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:09.448986" elapsed="0.000458"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:09.448967" elapsed="0.000550"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:59:09.449552" 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-10-11T00:59:09.453122" elapsed="0.000118"/>
</kw>
<msg time="2026-10-11T00:59:09.453280" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:59:09.452643" elapsed="0.000696"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:09.453733" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:09.453940" 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-10-11T00:59:09.451826" 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-10-11T00:59:09.449832" 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-10-11T00:59:09.373797" elapsed="0.080581"/>
</kw>
<msg time="2026-10-11T00:59:09.454497" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:09.454538" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:09.372953" elapsed="0.081620"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:59:09.454727" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:59:09.454642" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:09.454625" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:09.455188" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:09.455609" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:59:09.455706" 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-10-11T00:59:09.372089" elapsed="0.083705"/>
</kw>
<msg time="2026-10-11T00:59:09.455878" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:09.455918" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:09.368163" elapsed="0.087791"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:09.456241" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:09.456021" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:09.456004" elapsed="0.000307"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:59:09.367842" elapsed="0.088491"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:59:09.367519" elapsed="0.088841"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:59:09.362713" elapsed="0.093715"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:59:09.357957" elapsed="0.098543"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:09.357011" elapsed="0.099530"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:59:09.354669" elapsed="0.101920"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:09.463521" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:09.463633" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:09.463719" 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-10-11T00:59:09.456987" elapsed="0.006756"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:09.463923" elapsed="0.000338"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:09.469558" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:09.469661" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:09.469755" 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-10-11T00:59:09.464438" elapsed="0.005341"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:09.470647" 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-10-11T00:59:09.470366" elapsed="0.000308"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:09.471060" 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-10-11T00:59:09.470826" elapsed="0.000261"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:09.471269" elapsed="0.000308"/>
</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-10-11T00:59:09.469985" elapsed="0.001647"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:09.456719" elapsed="0.014996"/>
</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-10-11T00:59:09.353669" elapsed="0.118082"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:09.472452" 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-10-11T00:59:09.472608" 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-10-11T00:59:09.472289" elapsed="0.000347"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:09.472942" 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-10-11T00:59:09.473057" 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-10-11T00:59:09.472805" elapsed="0.000277"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:09.473382" 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-10-11T00:59:09.473547" 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-10-11T00:59:09.473246" elapsed="0.000326"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:59:09.473916" 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-10-11T00:59:09.473735" elapsed="0.000205"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:09.474239" 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-10-11T00:59:09.474354" 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-10-11T00:59:09.474104" elapsed="0.000275"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:59:09.474738" 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-10-11T00:59:09.474571" elapsed="0.000192"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.475178" 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-10-11T00:59:09.474958" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.475663" 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-10-11T00:59:09.475436" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.476110" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a62900011900021999999900010501010101000007d0000000000a05dc10</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:09.475897" elapsed="0.000254"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.476582" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e001946011900021999999900010501010101000007d0000000000a05dc10</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:09.476340" elapsed="0.000283"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:09.476792" elapsed="0.002445"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:09.490617" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T00:59:09.490680" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:09.490763" 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-10-11T00:59:09.479430" elapsed="0.011357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.491269" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:09.490995" elapsed="0.000313"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:09.499368" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:09.499514" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:09.499609" 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-10-11T00:59:09.491494" elapsed="0.008140"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.500111" 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-10-11T00:59:09.499839" elapsed="0.000316"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:09.506781" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:09.506891" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:09.506978" 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-10-11T00:59:09.501069" elapsed="0.005933"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.507523" 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-10-11T00:59:09.507210" elapsed="0.000386"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:09.507760" elapsed="0.000329"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:09.510386" level="INFO">${update} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a62900011900021999999900010501010101000007d0000000000a05dc10</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:59:09.508239" elapsed="0.002196"/>
</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-10-11T00:59:09.510610" elapsed="0.000378"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:59:09.511059" elapsed="0.000041"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:59:09.500764" elapsed="0.010439"/>
</kw>
<msg time="2026-10-11T00:59:09.511300" 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-10-11T00:59:09.500336" elapsed="0.010997"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.511961" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a62900011900021999999900010501010101000007d0000000000a05dc10</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:09.511657" elapsed="0.000362"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.513149" level="INFO">Length is 152.</msg>
<msg time="2026-10-11T00:59:09.513245" 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-10-11T00:59:09.512822" elapsed="0.000454"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.513853" level="INFO">Length is 152.</msg>
<msg time="2026-10-11T00:59:09.513945" 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-10-11T00:59:09.513532" elapsed="0.000444"/>
</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-10-11T00:59:09.514227" elapsed="0.000403"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:09.515048" 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-10-11T00:59:09.514835" elapsed="0.000246"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:09.515522" 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-10-11T00:59:09.515277" 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-10-11T00:59:09.515805" elapsed="0.000366"/>
</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-10-11T00:59:09.512314" elapsed="0.003933"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:09.516459" elapsed="0.002504"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:09.526303" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:09.526503" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:09.526627" 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-10-11T00:59:09.519692" elapsed="0.006968"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.527330" 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-10-11T00:59:09.526948" elapsed="0.000443"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:09.527655" elapsed="0.000451"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:09.534538" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:09.534732" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:09.534864" 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-10-11T00:59:09.528328" elapsed="0.006571"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.535607" 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-10-11T00:59:09.535186" elapsed="0.000483"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:09.535894" elapsed="0.000449"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T00:59:09.536685" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:09.536460" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:09.536434" elapsed="0.000334"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:09.544452" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:09.544530" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:09.544654" 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-10-11T00:59:09.536976" elapsed="0.007712"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:59:09.519235" elapsed="0.025535"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:09.552181" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:09.552325" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:09.552489" 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-10-11T00:59:09.546039" elapsed="0.006487"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.554926" 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-10-11T00:59:09.552816" elapsed="0.002173"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:09.555219" elapsed="0.000496"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:09.558629" level="INFO">${update} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e001946011900021999999900010501010101000007d0000000000a05dc10</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:59:09.555922" elapsed="0.002745"/>
</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-10-11T00:59:09.558884" elapsed="0.000425"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:59:09.559370" elapsed="0.000068"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:59:09.545613" elapsed="0.013947"/>
</kw>
<msg time="2026-10-11T00:59:09.559661" 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-10-11T00:59:09.545018" elapsed="0.014675"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.560315" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e001946011900021999999900010501010101000007d0000000000a05dc10</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:09.560009" elapsed="0.000364"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.561534" level="INFO">Length is 140.</msg>
<msg time="2026-10-11T00:59:09.561632" 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-10-11T00:59:09.561157" elapsed="0.000505"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.562197" level="INFO">Length is 140.</msg>
<msg time="2026-10-11T00:59:09.562290" 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-10-11T00:59:09.561878" elapsed="0.000442"/>
</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-10-11T00:59:09.562612" elapsed="0.000368"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:09.563392" 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-10-11T00:59:09.563184" elapsed="0.000262"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:09.563867" 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-10-11T00:59:09.563659" elapsed="0.000240"/>
</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-10-11T00:59:09.564148" elapsed="0.000397"/>
</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-10-11T00:59:09.560699" elapsed="0.003923"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:09.570293" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:09.570466" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:09.570607" 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-10-11T00:59:09.565334" elapsed="0.005307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.571309" 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-10-11T00:59:09.570926" elapsed="0.000443"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:09.571635" elapsed="0.000452"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:09.577656" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:09.577799" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:09.577928" 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-10-11T00:59:09.572309" elapsed="0.005653"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.578681" 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-10-11T00:59:09.578248" elapsed="0.000493"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:09.578967" elapsed="0.000482"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T00:59:09.579811" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-10-11T00:59:09.579563" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:09.579538" elapsed="0.000383"/>
</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-10-11T00:59:09.580125" elapsed="0.000028"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:59:09.564930" elapsed="0.015305"/>
</kw>
<arg>route_eth_as</arg>
<status status="PASS" start="2026-10-11T00:59:09.471985" elapsed="0.108306"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:09.352672" elapsed="0.227759"/>
</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-10-11T00:59:09.582841" elapsed="0.000272"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:59:09.582489" elapsed="0.000694"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:09.584715" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:09.584591" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:09.584565" 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-10-11T00:59:09.587661" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:09.587544" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:09.587519" elapsed="0.000230"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.589025" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:59:09.588575" elapsed="0.000486"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.589678" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:59:09.589273" elapsed="0.000439"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:59:09.589768" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:59:09.589944" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:59:09.588036" elapsed="0.001941"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:09.592693" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:09.592609" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:09.592591" elapsed="0.000168"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:09.593915" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:09.593797" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:09.593780" elapsed="0.000285"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:59:09.594598" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:59:09.594216" elapsed="0.000439"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:59:09.595220" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:59:09.594998" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:59:09.635974" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:59:09.596771" elapsed="0.039393"/>
</kw>
<msg time="2026-10-11T00:59:09.636320" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:59:09.636431" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:09.595618" elapsed="0.040900"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:59:09.676717" 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-10-11T00:59:09.638146" elapsed="0.038698"/>
</kw>
<msg time="2026-10-11T00:59:09.676965" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:59:09.677055" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:09.636941" elapsed="0.040184"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:09.677766" elapsed="0.000119"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:09.677448" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:09.677426" elapsed="0.000584"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.678721" 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-10-11T00:59:09.678201" elapsed="0.000639"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:09.679298" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:09.679006" elapsed="0.000444"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:09.678987" elapsed="0.000536"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:59:09.679559" 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-10-11T00:59:09.683294" elapsed="0.000253"/>
</kw>
<msg time="2026-10-11T00:59:09.683591" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:59:09.682816" elapsed="0.000835"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:09.683889" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:09.684095" 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-10-11T00:59:09.681890" elapsed="0.002417"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:59:09.679851" elapsed="0.004536"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:59:09.593507" elapsed="0.091060"/>
</kw>
<msg time="2026-10-11T00:59:09.684650" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:09.684689" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:09.592910" elapsed="0.091815"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:59:09.684879" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:59:09.684794" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:09.684776" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:09.685331" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:09.685755" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:59:09.685825" 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-10-11T00:59:09.592296" elapsed="0.093616"/>
</kw>
<msg time="2026-10-11T00:59:09.685995" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:09.686034" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:09.590501" elapsed="0.095568"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:09.686355" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:09.686135" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:09.686119" elapsed="0.000325"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:59:09.590300" elapsed="0.096165"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:59:09.590058" elapsed="0.096455"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:59:09.587099" elapsed="0.099463"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:59:09.583985" elapsed="0.102627"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:09.583397" elapsed="0.103254"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:59:09.581975" elapsed="0.104722"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:09.691527" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:09.691635" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:09.691730" 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-10-11T00:59:09.687126" elapsed="0.004628"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:09.691929" elapsed="0.000337"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:09.696728" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:09.696829" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:09.696920" 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-10-11T00:59:09.692442" elapsed="0.004502"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:09.697818" 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-10-11T00:59:09.697560" elapsed="0.000285"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:09.698230" 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-10-11T00:59:09.697996" elapsed="0.000260"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:09.698454" elapsed="0.000300"/>
</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-10-11T00:59:09.697149" elapsed="0.001660"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:09.686859" elapsed="0.012000"/>
</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-10-11T00:59:09.581346" elapsed="0.117548"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:09.699553" 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-10-11T00:59:09.699675" 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-10-11T00:59:09.699380" elapsed="0.000322"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.708047" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:59:09.707737" elapsed="0.000337"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:59:09.708796" 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-10-11T00:59:09.708594" elapsed="0.000273">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-10-11T00:59:09.708952" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:59:09.708234" elapsed="0.000741"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.709542" 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-10-11T00:59:09.709192" elapsed="0.000376"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:09.709844" 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-10-11T00:59:09.709960" 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-10-11T00:59:09.709735" elapsed="0.000249"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.710398" 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-10-11T00:59:09.710178" 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-10-11T00:59:09.710798" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:09.710541" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.711285" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:59:09.711025" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:09.710877" elapsed="0.000463"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:09.710523" elapsed="0.000837"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.711943" 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-10-11T00:59:09.711553" elapsed="0.000416"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:59:09.712013" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:59:09.712139" 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-10-11T00:59:09.707285" elapsed="0.004878"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:09.712497" 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-10-11T00:59:09.712613" 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-10-11T00:59:09.712328" elapsed="0.000309"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:09.712937" 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-10-11T00:59:09.713047" 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-10-11T00:59:09.712801" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.713513" 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-10-11T00:59:09.713264" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.713969" 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-10-11T00:59:09.713756" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.714470" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a62900011900021999999900010501010101000007d0000000000a05dc10</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:09.714235" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:09.714934" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e001946011900021999999900010501010101000007d0000000000a05dc10</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:09.714721" elapsed="0.000253"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:09.715112" elapsed="0.002410"/>
</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-10-11T00:59:09.717677" elapsed="0.001909"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:09.724550" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:09.724655" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:09.724753" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T00:59:09.720520" elapsed="0.004591">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:09.725292" elapsed="0.000020"/>
</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-10-11T00:59:09.725545" elapsed="0.000023"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T00:59:09.720179" elapsed="0.005481">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:11.736803" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:11.737098" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:11.737335" 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-10-11T00:59:11.727269" elapsed="0.010123"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T00:59:11.738447" 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-10-11T00:59:11.738729" 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-10-11T00:59:11.737853" elapsed="0.000971"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:11.741262" 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-10-11T00:59:11.740284" elapsed="0.001040"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:11.742628" 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-10-11T00:59:11.741722" elapsed="0.000967"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:11.743106" elapsed="0.000689"/>
</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-10-11T00:59:11.739367" elapsed="0.004557"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T00:59:11.726301" elapsed="0.017732"/>
</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-10-11T00:59:09.719779" elapsed="2.024347"/>
</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-10-11T00:59:11.744485" elapsed="0.003582"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:11.757702" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:11.757950" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:11.758164" 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-10-11T00:59:11.750154" elapsed="0.008064"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:11.758659" elapsed="0.000818"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:11.767131" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:11.767374" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:11.767652" 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-10-11T00:59:11.759864" elapsed="0.007843"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:11.769685" 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-10-11T00:59:11.769075" elapsed="0.000670"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:11.771110" 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-10-11T00:59:11.770083" elapsed="0.001087"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T00:59:11.772246" 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-10-11T00:59:11.772784" 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-10-11T00:59:11.771644" elapsed="0.001305">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-10-11T00:59:11.768162" elapsed="0.005073">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-10-11T00:59:11.749548" elapsed="0.023983">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-10-11T00:59:13.784115" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:13.784397" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:13.784705" 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-10-11T00:59:13.775095" elapsed="0.009667"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:13.785170" elapsed="0.000907"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:13.793974" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:13.794208" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:13.794464" 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-10-11T00:59:13.786478" elapsed="0.008066"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:13.796570" 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-10-11T00:59:13.795948" elapsed="0.000685"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:13.797648" 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-10-11T00:59:13.797060" elapsed="0.000647"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:13.798124" elapsed="0.000681"/>
</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-10-11T00:59:13.795017" elapsed="0.003915"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:13.774217" elapsed="0.024826"/>
</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-10-11T00:59:11.748603" elapsed="2.050520"/>
</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-10-11T00:59:13.800263" elapsed="0.003619"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:13.812561" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:13.812794" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:13.812984" 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-10-11T00:59:13.806023" elapsed="0.007014"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:13.813453" elapsed="0.000781"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:13.821841" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:13.822068" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:13.822273" 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-10-11T00:59:13.814650" elapsed="0.007677"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:13.824345" 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-10-11T00:59:13.823806" elapsed="0.000597"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:13.825304" 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-10-11T00:59:13.824795" elapsed="0.000568"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:13.825836" elapsed="0.000647"/>
</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-10-11T00:59:13.822845" elapsed="0.003784"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:13.805296" elapsed="0.021445"/>
</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-10-11T00:59:13.804358" elapsed="0.022460"/>
</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-10-11T00:59:13.799544" elapsed="0.027383"/>
</kw>
<arg>route_eth_as</arg>
<status status="PASS" start="2026-10-11T00:59:09.699075" elapsed="4.127953"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:09.580782" elapsed="4.246452"/>
</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-10-11T00:59:13.831185" elapsed="0.000878"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:59:13.830619" elapsed="0.001629"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:13.834404" elapsed="0.000065"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:13.834191" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:13.834144" elapsed="0.000462"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:13.839214" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:13.839022" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:13.838984" elapsed="0.000370"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:13.841492" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:59:13.840731" elapsed="0.000840"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:59:13.842552" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:59:13.841917" elapsed="0.000690"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:59:13.842698" elapsed="0.000071"/>
</return>
<msg time="2026-10-11T00:59:13.842993" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:59:13.839881" elapsed="0.003163"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:13.847776" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:13.847656" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:13.847631" 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-10-11T00:59:13.849522" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:13.849318" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:13.849294" elapsed="0.000444"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:59:13.850473" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:59:13.849957" elapsed="0.000615"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:59:13.851384" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:59:13.851066" elapsed="0.000432"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:59:13.908729" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:59:13.853646" elapsed="0.055208"/>
</kw>
<msg time="2026-10-11T00:59:13.908982" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:59:13.909092" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:13.851942" elapsed="0.057218"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:59:13.946595" 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-10-11T00:59:13.910814" elapsed="0.035909"/>
</kw>
<msg time="2026-10-11T00:59:13.946844" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:59:13.946930" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:13.909582" elapsed="0.037417"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:13.947639" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:13.947290" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:13.947270" elapsed="0.000554"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:13.948542" 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-10-11T00:59:13.948025" elapsed="0.000637"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:13.949250" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:13.948828" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:13.948810" elapsed="0.000679"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:59:13.949541" 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-10-11T00:59:13.953132" elapsed="0.000116"/>
</kw>
<msg time="2026-10-11T00:59:13.953288" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:59:13.952691" elapsed="0.000661"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:13.953779" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:13.953992" 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-10-11T00:59:13.951902" 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-10-11T00:59:13.949836" elapsed="0.004450"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:59:13.848920" elapsed="0.105546"/>
</kw>
<msg time="2026-10-11T00:59:13.954575" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:13.954615" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:13.848078" elapsed="0.106572"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:59:13.954806" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:59:13.954719" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:13.954701" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:13.955266" 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-10-11T00:59:13.955695" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:59:13.955762" 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-10-11T00:59:13.847225" elapsed="0.108625"/>
</kw>
<msg time="2026-10-11T00:59:13.955933" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:13.955974" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:13.843857" elapsed="0.112152"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:13.956301" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:13.956076" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:13.956060" elapsed="0.000311"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:59:13.843530" elapsed="0.112862"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:59:13.843153" elapsed="0.113285"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:59:13.838321" elapsed="0.118169"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:59:13.833606" elapsed="0.122948"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:13.832642" elapsed="0.123955"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:59:13.829793" elapsed="0.126851"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:13.963919" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:13.964031" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:13.964163" 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-10-11T00:59:13.957048" elapsed="0.007140"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:13.964364" elapsed="0.000390"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:13.969384" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:13.969523" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:13.969617" 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-10-11T00:59:13.964917" elapsed="0.004724"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:13.970500" 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-10-11T00:59:13.970233" elapsed="0.000325"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:13.970946" 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-10-11T00:59:13.970714" elapsed="0.000258"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:13.971158" elapsed="0.000292"/>
</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-10-11T00:59:13.969847" elapsed="0.001674"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:13.956778" elapsed="0.014793"/>
</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-10-11T00:59:13.828790" elapsed="0.142818"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:13.972368" 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-10-11T00:59:13.972571" 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-10-11T00:59:13.972215" elapsed="0.000385"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:13.972908" 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-10-11T00:59:13.973025" 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-10-11T00:59:13.972769" elapsed="0.000281"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:13.973353" 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-10-11T00:59:13.973485" 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-10-11T00:59:13.973217" elapsed="0.000308"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:59:13.973866" 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-10-11T00:59:13.973691" elapsed="0.000199"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:13.974395" 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-10-11T00:59:13.974550" 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-10-11T00:59:13.974055" elapsed="0.000546"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:59:13.974941" 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-10-11T00:59:13.974771" elapsed="0.000195"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:13.975392" 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-10-11T00:59:13.975170" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:13.975896" 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-10-11T00:59:13.975681" elapsed="0.000261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:13.976356" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:13.976145" elapsed="0.000252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:13.976839" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:13.976625" elapsed="0.000254"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:13.977020" elapsed="0.002343"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:13.993436" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T00:59:13.993523" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:13.993648" 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-10-11T00:59:13.979566" elapsed="0.014114"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:13.994226" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:13.993926" elapsed="0.000344"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:13.999961" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:14.000079" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:14.000205" 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-10-11T00:59:13.994472" elapsed="0.005761"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:14.000783" 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-10-11T00:59:14.000487" elapsed="0.000365"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:14.006706" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:14.006850" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:14.006946" 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-10-11T00:59:14.001847" elapsed="0.005126"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:14.007538" 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-10-11T00:59:14.007189" elapsed="0.000395"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:14.007748" elapsed="0.000369"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:14.010535" level="INFO">${update} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:59:14.008277" elapsed="0.002287"/>
</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-10-11T00:59:14.010766" elapsed="0.000313"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:59:14.011137" elapsed="0.000036"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:59:14.001535" elapsed="0.009724"/>
</kw>
<msg time="2026-10-11T00:59:14.011333" 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-10-11T00:59:14.001059" elapsed="0.010299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:14.011870" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:14.011608" elapsed="0.000304"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:14.012745" level="INFO">Length is 152.</msg>
<msg time="2026-10-11T00:59:14.012814" 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-10-11T00:59:14.012493" elapsed="0.000343"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:14.013216" level="INFO">Length is 152.</msg>
<msg time="2026-10-11T00:59:14.013284" 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-10-11T00:59:14.012992" elapsed="0.000314"/>
</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-10-11T00:59:14.013526" elapsed="0.000264"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:14.014103" 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-10-11T00:59:14.013939" elapsed="0.000187"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:14.014433" 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-10-11T00:59:14.014268" elapsed="0.000189"/>
</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-10-11T00:59:14.014656" elapsed="0.000261"/>
</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-10-11T00:59:14.012126" elapsed="0.002845"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:14.015139" elapsed="0.002159"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:14.023541" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:14.023652" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:14.023749" 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-10-11T00:59:14.017832" elapsed="0.005941"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:14.024264" 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-10-11T00:59:14.023988" elapsed="0.000321"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:14.024494" elapsed="0.000340"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:14.030537" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:14.030645" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:14.030741" 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-10-11T00:59:14.024999" elapsed="0.005767"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:14.031261" 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-10-11T00:59:14.030982" elapsed="0.000324"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:14.031490" elapsed="0.000339"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T00:59:14.032049" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:14.031899" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:14.031881" elapsed="0.000228"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:14.038662" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:14.038704" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:14.038792" 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-10-11T00:59:14.032259" elapsed="0.006558"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:59:14.017536" elapsed="0.021340"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:14.044798" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:14.044901" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:14.044986" 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-10-11T00:59:14.039842" elapsed="0.005168"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:14.045529" 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-10-11T00:59:14.045215" elapsed="0.000360"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:14.045737" elapsed="0.000319"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:14.048605" level="INFO">${update} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:59:14.046204" elapsed="0.002441"/>
</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-10-11T00:59:14.048863" elapsed="0.000434"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:59:14.049358" elapsed="0.000038"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:59:14.039533" elapsed="0.010021"/>
</kw>
<msg time="2026-10-11T00:59:14.049654" 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-10-11T00:59:14.039094" elapsed="0.010593"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:14.050280" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:14.049978" elapsed="0.000359"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:14.051479" level="INFO">Length is 140.</msg>
<msg time="2026-10-11T00:59:14.051592" 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-10-11T00:59:14.051124" elapsed="0.000499"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:14.052159" level="INFO">Length is 140.</msg>
<msg time="2026-10-11T00:59:14.052251" 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-10-11T00:59:14.051840" elapsed="0.000442"/>
</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-10-11T00:59:14.052581" elapsed="0.000365"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:14.053358" 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-10-11T00:59:14.053147" elapsed="0.000243"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:14.053839" 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-10-11T00:59:14.053631" elapsed="0.000240"/>
</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-10-11T00:59:14.054166" elapsed="0.000360"/>
</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-10-11T00:59:14.050665" elapsed="0.003916"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:14.060327" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:14.060453" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:14.060586" 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-10-11T00:59:14.055098" elapsed="0.005513"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:14.061099" 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-10-11T00:59:14.060827" elapsed="0.000315"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:14.061307" elapsed="0.000357"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:14.067096" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:14.067200" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:14.067293" 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-10-11T00:59:14.061826" elapsed="0.005492"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:14.067831" 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-10-11T00:59:14.067556" elapsed="0.000317"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:14.068058" elapsed="0.000481"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T00:59:14.068842" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-10-11T00:59:14.068636" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:14.068611" elapsed="0.000336"/>
</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-10-11T00:59:14.069157" elapsed="0.000027"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:59:14.054800" elapsed="0.014467"/>
</kw>
<arg>route_eth_lacp</arg>
<status status="PASS" start="2026-10-11T00:59:13.971903" elapsed="0.097419"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:13.827844" elapsed="0.241623"/>
</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-10-11T00:59:14.071909" elapsed="0.000274"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:59:14.071561" elapsed="0.000690"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:14.073377" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:14.073291" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:14.073273" elapsed="0.000188"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:14.075538" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:14.075439" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:14.075421" elapsed="0.000179"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:14.076519" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:59:14.076164" elapsed="0.000382"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:59:14.076960" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:59:14.076700" elapsed="0.000285"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:59:14.077029" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:59:14.077154" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:59:14.075806" elapsed="0.001371"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:14.079878" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:14.079794" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:14.079776" 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-10-11T00:59:14.081119" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:14.081006" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:14.080988" elapsed="0.000280"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:59:14.081804" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:59:14.081443" elapsed="0.000419"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:59:14.082446" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:59:14.082209" elapsed="0.000305"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:59:14.119323" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:59:14.083982" elapsed="0.035487"/>
</kw>
<msg time="2026-10-11T00:59:14.119603" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:59:14.119691" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:14.082817" elapsed="0.036944"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:59:14.156332" 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-10-11T00:59:14.121323" elapsed="0.035161"/>
</kw>
<msg time="2026-10-11T00:59:14.156618" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:59:14.156705" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:14.120149" elapsed="0.036625"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:14.157358" elapsed="0.000081"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:14.157063" elapsed="0.000453"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:14.157043" elapsed="0.000531"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:14.158239" 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-10-11T00:59:14.157764" elapsed="0.000587"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:14.158848" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:14.158558" elapsed="0.000416"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:14.158539" elapsed="0.000491"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:59:14.159063" 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-10-11T00:59:14.162692" elapsed="0.000121"/>
</kw>
<msg time="2026-10-11T00:59:14.162851" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:59:14.162152" elapsed="0.000763"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:14.163147" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:14.163351" 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-10-11T00:59:14.161278" elapsed="0.002347"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:59:14.159338" elapsed="0.004368"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:59:14.080721" elapsed="0.083133"/>
</kw>
<msg time="2026-10-11T00:59:14.163938" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:14.163977" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:14.080133" elapsed="0.083879"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:59:14.164165" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:59:14.164080" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:14.164063" 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-10-11T00:59:14.164749" 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-10-11T00:59:14.165130" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:59:14.165195" 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-10-11T00:59:14.079487" elapsed="0.085793"/>
</kw>
<msg time="2026-10-11T00:59:14.165364" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:14.165417" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:14.077538" elapsed="0.087916"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:14.165754" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:14.165532" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:14.165515" elapsed="0.000308"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:59:14.077367" elapsed="0.088477"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:59:14.077225" elapsed="0.088647"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:59:14.075135" elapsed="0.090785"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:59:14.073039" elapsed="0.092929"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:14.072488" elapsed="0.093519"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:59:14.071053" elapsed="0.094999"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:14.172830" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:14.172938" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:14.173038" 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-10-11T00:59:14.166489" elapsed="0.006572"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:14.173234" elapsed="0.000378"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:14.179355" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:14.179477" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:14.179581" 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-10-11T00:59:14.173770" elapsed="0.005835"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:14.180448" 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-10-11T00:59:14.180185" elapsed="0.000291"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:14.180914" 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-10-11T00:59:14.180682" elapsed="0.000258"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:14.181121" elapsed="0.000280"/>
</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-10-11T00:59:14.179807" elapsed="0.001666"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:14.166181" elapsed="0.015356"/>
</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-10-11T00:59:14.070439" elapsed="0.111134"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:14.182190" 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-10-11T00:59:14.182319" 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-10-11T00:59:14.182048" elapsed="0.000298"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:59:14.190314" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:59:14.190011" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:59:14.191052" 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-10-11T00:59:14.190853" elapsed="0.000269">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-10-11T00:59:14.191206" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:59:14.190532" elapsed="0.000697"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:14.191740" 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-10-11T00:59:14.191401" elapsed="0.000364"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:14.192035" 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-10-11T00:59:14.192149" 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-10-11T00:59:14.191930" elapsed="0.000244"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:14.192611" 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-10-11T00:59:14.192366" 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-10-11T00:59:14.192972" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:14.192718" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:59:14.193474" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:59:14.193193" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:14.193046" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:14.192701" elapsed="0.000863"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:59:14.194102" 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-10-11T00:59:14.193726" elapsed="0.000402"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:59:14.194171" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:59:14.194329" 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-10-11T00:59:14.189595" elapsed="0.004759"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:14.194694" 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-10-11T00:59:14.194808" 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-10-11T00:59:14.194553" elapsed="0.000278"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:14.195128" 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-10-11T00:59:14.195236" 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-10-11T00:59:14.194993" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:14.195704" 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-10-11T00:59:14.195467" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:14.196155" 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-10-11T00:59:14.195944" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:14.196636" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:14.196389" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:14.197077" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:14.196866" elapsed="0.000251"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:14.197254" elapsed="0.002975"/>
</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-10-11T00:59:14.200377" elapsed="0.002292"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:14.207883" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:14.208009" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:14.208114" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T00:59:14.203608" elapsed="0.004979">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:14.208835" 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-10-11T00:59:14.209085" elapsed="0.000026"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T00:59:14.203265" elapsed="0.006098">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:16.219596" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:16.219892" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:16.220111" 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-10-11T00:59:16.211005" elapsed="0.009162"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T00:59:16.221199" 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-10-11T00:59:16.221478" 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-10-11T00:59:16.220628" elapsed="0.000971"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:16.223949" 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-10-11T00:59:16.222974" elapsed="0.001038"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:16.225233" 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-10-11T00:59:16.224353" elapsed="0.000941"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:16.225760" elapsed="0.000633"/>
</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-10-11T00:59:16.222060" elapsed="0.004513"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T00:59:16.210031" elapsed="0.016653"/>
</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-10-11T00:59:14.202862" elapsed="2.023913"/>
</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-10-11T00:59:16.227102" elapsed="0.003879"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:16.239549" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:16.239796" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:16.240081" 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-10-11T00:59:16.233082" elapsed="0.007054"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:16.240584" elapsed="0.000793"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:16.249968" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:16.250217" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:16.250469" 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-10-11T00:59:16.241793" elapsed="0.008753"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:16.252508" 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-10-11T00:59:16.251927" elapsed="0.000664"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:16.253953" 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-10-11T00:59:16.252932" elapsed="0.001081"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T00:59:16.255159" 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-10-11T00:59:16.255684" 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-10-11T00:59:16.254488" elapsed="0.001368">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-10-11T00:59:16.251013" elapsed="0.005150">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-10-11T00:59:16.232399" elapsed="0.024057">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-10-11T00:59:18.265881" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:18.266161" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:18.266372" 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-10-11T00:59:18.258115" elapsed="0.008347"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:18.266900" elapsed="0.000900"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:18.276066" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:18.276295" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:18.276570" 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-10-11T00:59:18.268168" elapsed="0.008462"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:18.278659" 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-10-11T00:59:18.278022" elapsed="0.000700"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:18.279639" 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-10-11T00:59:18.279063" elapsed="0.000637"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:18.280113" elapsed="0.000686"/>
</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-10-11T00:59:18.277097" elapsed="0.003829"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:18.257227" elapsed="0.023808"/>
</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-10-11T00:59:16.231402" elapsed="2.049713"/>
</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-10-11T00:59:18.282267" elapsed="0.003066"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:18.294722" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:18.294955" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:18.295246" 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-10-11T00:59:18.287927" elapsed="0.007375"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:18.295745" elapsed="0.000810"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:18.303753" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:18.303980" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:18.304183" 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-10-11T00:59:18.296920" elapsed="0.007317"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:18.306257" 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-10-11T00:59:18.305712" elapsed="0.000604"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:18.307223" 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-10-11T00:59:18.306708" elapsed="0.000572"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:18.307737" elapsed="0.000619"/>
</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-10-11T00:59:18.304751" elapsed="0.003763"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:18.286803" elapsed="0.021843"/>
</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-10-11T00:59:18.285856" elapsed="0.022866"/>
</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-10-11T00:59:18.281527" elapsed="0.027302"/>
</kw>
<arg>route_eth_lacp</arg>
<status status="PASS" start="2026-10-11T00:59:14.181753" elapsed="4.127168"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:14.069839" elapsed="4.239287"/>
</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-10-11T00:59:18.313180" elapsed="0.000502"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:59:18.312617" elapsed="0.001178"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:18.315945" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:18.315732" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:18.315683" elapsed="0.000412"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:18.320769" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:18.320578" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:18.320520" elapsed="0.000390"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.323018" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:59:18.322233" elapsed="0.000842"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.324062" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:59:18.323450" elapsed="0.000665"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:59:18.324204" elapsed="0.000069"/>
</return>
<msg time="2026-10-11T00:59:18.324550" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:59:18.321375" elapsed="0.003231"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:18.329043" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:18.328925" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:18.328901" 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-10-11T00:59:18.330862" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:18.330699" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:18.330675" elapsed="0.000401"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:59:18.331820" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:59:18.331290" elapsed="0.000611"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:59:18.332758" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:59:18.332387" elapsed="0.000454"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:59:18.368257" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:59:18.334955" elapsed="0.033419"/>
</kw>
<msg time="2026-10-11T00:59:18.368553" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:59:18.368644" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:18.333264" elapsed="0.035449"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:59:18.406979" 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-10-11T00:59:18.370314" elapsed="0.036796"/>
</kw>
<msg time="2026-10-11T00:59:18.407231" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:59:18.407318" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:18.369100" elapsed="0.038288"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:18.408019" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:18.407721" elapsed="0.000429"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:18.407701" elapsed="0.000504"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.408905" 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-10-11T00:59:18.408397" elapsed="0.000623"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:18.409503" elapsed="0.000079"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:18.409186" elapsed="0.000461"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:18.409168" elapsed="0.000535"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:59:18.409736" 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-10-11T00:59:18.413293" elapsed="0.000277"/>
</kw>
<msg time="2026-10-11T00:59:18.413614" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:59:18.412809" 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-10-11T00:59:18.413915" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:18.414123" 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-10-11T00:59:18.411988" elapsed="0.002346"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:59:18.410015" elapsed="0.004413"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:59:18.330249" elapsed="0.084344"/>
</kw>
<msg time="2026-10-11T00:59:18.414678" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:18.414725" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:18.329389" elapsed="0.085371"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:59:18.414914" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:59:18.414828" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:18.414811" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:18.415450" 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-10-11T00:59:18.415849" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:59:18.415915" 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-10-11T00:59:18.328512" elapsed="0.087490"/>
</kw>
<msg time="2026-10-11T00:59:18.416086" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:18.416126" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:18.325364" elapsed="0.090797"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:18.416470" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:18.416228" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:18.416212" elapsed="0.000344"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:59:18.325042" elapsed="0.091537"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:59:18.324718" elapsed="0.091889"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:59:18.319874" elapsed="0.096784"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:59:18.315085" elapsed="0.101623"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:18.314135" elapsed="0.102614"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:59:18.311796" elapsed="0.105000"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:18.422075" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:18.422185" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:18.422271" 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-10-11T00:59:18.417199" elapsed="0.005096"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:18.422490" elapsed="0.000560"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:18.427972" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:18.428074" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:18.428166" 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-10-11T00:59:18.423214" elapsed="0.004977"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:18.429061" 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-10-11T00:59:18.428816" elapsed="0.000272"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:18.429528" 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-10-11T00:59:18.429275" elapsed="0.000291"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:18.429751" elapsed="0.000276"/>
</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-10-11T00:59:18.428396" elapsed="0.001686"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:18.416929" elapsed="0.013201"/>
</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-10-11T00:59:18.310789" elapsed="0.119377"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:18.430895" 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-10-11T00:59:18.431043" 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-10-11T00:59:18.430745" elapsed="0.000325"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:18.431379" 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-10-11T00:59:18.431512" 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-10-11T00:59:18.431241" elapsed="0.000307"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:18.431850" 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-10-11T00:59:18.431966" 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-10-11T00:59:18.431713" elapsed="0.000278"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:59:18.432328" 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-10-11T00:59:18.432155" elapsed="0.000198"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:18.432683" 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-10-11T00:59:18.432799" 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-10-11T00:59:18.432531" elapsed="0.000293"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:59:18.433151" 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-10-11T00:59:18.432984" elapsed="0.000192"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.433628" 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-10-11T00:59:18.433374" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.434089" 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-10-11T00:59:18.433875" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.434652" level="INFO">ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:18.434358" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.435105" level="INFO">ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:18.434889" elapsed="0.000257"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:18.435287" elapsed="0.002401"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:18.448106" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T00:59:18.448170" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:18.448253" 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-10-11T00:59:18.437851" elapsed="0.010426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.448804" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:18.448510" elapsed="0.000333"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:18.454047" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:18.454159" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:18.454254" 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-10-11T00:59:18.448999" elapsed="0.005280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.454795" 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-10-11T00:59:18.454506" elapsed="0.000334"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:18.461189" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:18.461326" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:18.461437" 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-10-11T00:59:18.455776" elapsed="0.005687"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.461956" 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-10-11T00:59:18.461682" elapsed="0.000320"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:18.462165" elapsed="0.000336"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:18.465050" level="INFO">${update} = ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:59:18.462674" elapsed="0.002404"/>
</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-10-11T00:59:18.465234" elapsed="0.000343"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:59:18.465622" elapsed="0.000028"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:59:18.455449" elapsed="0.010274"/>
</kw>
<msg time="2026-10-11T00:59:18.465793" 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-10-11T00:59:18.455033" elapsed="0.010784"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.466237" level="INFO">ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:18.466016" elapsed="0.000262"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.467092" level="INFO">Length is 174.</msg>
<msg time="2026-10-11T00:59:18.467161" 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-10-11T00:59:18.466855" elapsed="0.000328"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.467608" level="INFO">Length is 174.</msg>
<msg time="2026-10-11T00:59:18.467675" 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-10-11T00:59:18.467339" 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-10-11T00:59:18.467881" elapsed="0.000262"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:18.468470" 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-10-11T00:59:18.468289" elapsed="0.000205"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:18.468806" 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-10-11T00:59:18.468651" elapsed="0.000178"/>
</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-10-11T00:59:18.469008" elapsed="0.000263"/>
</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-10-11T00:59:18.466508" elapsed="0.002818"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:18.469480" elapsed="0.002136"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:18.477360" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:18.477491" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:18.477626" 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-10-11T00:59:18.472105" elapsed="0.005546"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.478134" 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-10-11T00:59:18.477859" elapsed="0.000320"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:18.478343" elapsed="0.000363"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:18.483232" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:18.483341" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:18.483458" 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-10-11T00:59:18.478867" elapsed="0.004617"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.483979" 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-10-11T00:59:18.483707" elapsed="0.000317"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:18.484190" elapsed="0.000337"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T00:59:18.484756" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:18.484608" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:18.484590" elapsed="0.000224"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:18.491333" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:18.491376" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:18.491490" 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-10-11T00:59:18.484960" elapsed="0.006555"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:59:18.471814" elapsed="0.019777"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:18.497188" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:18.497290" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:18.497374" 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-10-11T00:59:18.492489" elapsed="0.004955"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.497946" 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-10-11T00:59:18.497671" elapsed="0.000318"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:18.498151" elapsed="0.000343"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:18.501090" level="INFO">${update} = ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:59:18.498665" elapsed="0.002453"/>
</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-10-11T00:59:18.501276" elapsed="0.000343"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:59:18.501663" elapsed="0.000028"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:59:18.492164" elapsed="0.009600"/>
</kw>
<msg time="2026-10-11T00:59:18.501834" 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-10-11T00:59:18.491770" elapsed="0.010088"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.502272" level="INFO">ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:18.502055" elapsed="0.000258"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.503123" level="INFO">Length is 162.</msg>
<msg time="2026-10-11T00:59:18.503196" 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-10-11T00:59:18.502890" elapsed="0.000330"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.503643" level="INFO">Length is 162.</msg>
<msg time="2026-10-11T00:59:18.503711" 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-10-11T00:59:18.503376" 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-10-11T00:59:18.503914" elapsed="0.000263"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:18.504498" 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-10-11T00:59:18.504323" elapsed="0.000199"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:18.504832" 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-10-11T00:59:18.504679" elapsed="0.000176"/>
</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-10-11T00:59:18.505033" elapsed="0.000262"/>
</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-10-11T00:59:18.502554" elapsed="0.002796"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:18.509975" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:18.510078" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:18.510162" 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-10-11T00:59:18.505897" elapsed="0.004289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.510714" 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-10-11T00:59:18.510394" elapsed="0.000363"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:18.510918" elapsed="0.000323"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:18.515852" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:18.515986" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:18.516081" 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-10-11T00:59:18.511399" elapsed="0.004706"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.516622" 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-10-11T00:59:18.516309" elapsed="0.000357"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:18.516829" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T00:59:18.517369" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:59:18.517217" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:18.517199" elapsed="0.000265"/>
</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-10-11T00:59:18.517625" elapsed="0.000020"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:59:18.505602" elapsed="0.012102"/>
</kw>
<arg>route_eth_lacp_extdef</arg>
<status status="PASS" start="2026-10-11T00:59:18.430423" elapsed="0.087322"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:18.309772" elapsed="0.208059"/>
</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-10-11T00:59:18.519472" elapsed="0.000216"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:59:18.519203" 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-10-11T00:59:18.520811" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:18.520716" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:18.520546" elapsed="0.000330"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:18.522948" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:18.522865" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:18.522848" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.523929" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:59:18.523603" elapsed="0.000351"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.524370" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:59:18.524108" elapsed="0.000286"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:59:18.524451" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:59:18.524592" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:59:18.523217" elapsed="0.001398"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:18.527155" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:18.527071" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:18.527053" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:18.528357" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:18.528243" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:18.528225" elapsed="0.000307"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:59:18.529042" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:59:18.528697" elapsed="0.000403"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:59:18.529696" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:59:18.529460" elapsed="0.000321"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:59:18.564471" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:59:18.531263" elapsed="0.033343"/>
</kw>
<msg time="2026-10-11T00:59:18.564729" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:59:18.564818" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:18.530088" elapsed="0.034797"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:59:18.603168" 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-10-11T00:59:18.566478" elapsed="0.036819"/>
</kw>
<msg time="2026-10-11T00:59:18.603439" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:59:18.603532" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:18.565274" elapsed="0.038344"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:18.604210" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:18.603909" elapsed="0.000429"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:18.603888" elapsed="0.000505"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.605090" 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-10-11T00:59:18.604615" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:18.605702" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:18.605369" elapsed="0.000461"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:18.605351" elapsed="0.000533"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:59:18.605918" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:59:18.609684" elapsed="0.000121"/>
</kw>
<msg time="2026-10-11T00:59:18.609844" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:59:18.609035" 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-10-11T00:59:18.610135" elapsed="0.000020"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:18.610340" 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-10-11T00:59:18.608148" elapsed="0.002509"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:59:18.606191" 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-10-11T00:59:18.527956" elapsed="0.082929"/>
</kw>
<msg time="2026-10-11T00:59:18.610968" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:18.611007" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:18.527370" elapsed="0.083670"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:59:18.611198" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:59:18.611108" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:18.611091" elapsed="0.000183"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:18.611684" 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-10-11T00:59:18.612066" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:59:18.612132" 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-10-11T00:59:18.526785" elapsed="0.085469"/>
</kw>
<msg time="2026-10-11T00:59:18.612338" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:18.612377" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:18.524948" elapsed="0.087507"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:18.612762" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:18.612525" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:18.612508" elapsed="0.000325"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:59:18.524804" elapsed="0.088051"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:59:18.524664" elapsed="0.088218"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:59:18.522572" elapsed="0.090359"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:59:18.520278" elapsed="0.092701"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:18.519888" elapsed="0.093130"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:59:18.518858" elapsed="0.094206"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:18.618133" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:18.618243" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:18.618338" 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-10-11T00:59:18.613474" elapsed="0.004888"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:18.618572" elapsed="0.000339"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:18.623960" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:18.624061" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:18.624152" 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-10-11T00:59:18.619071" elapsed="0.005106"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:18.625048" 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-10-11T00:59:18.624797" elapsed="0.000278"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:18.625481" 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-10-11T00:59:18.625232" elapsed="0.000276"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:18.625703" elapsed="0.000276"/>
</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-10-11T00:59:18.624381" elapsed="0.001654"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:18.613192" elapsed="0.012892"/>
</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-10-11T00:59:18.518392" elapsed="0.107763"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:18.626826" 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-10-11T00:59:18.626949" 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-10-11T00:59:18.626681" elapsed="0.000295"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.635232" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:59:18.634927" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:59:18.636030" 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-10-11T00:59:18.635823" elapsed="0.000283">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-10-11T00:59:18.636191" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:59:18.635434" elapsed="0.000780"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.636731" 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-10-11T00:59:18.636388" elapsed="0.000369"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:18.637032" 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-10-11T00:59:18.637148" 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-10-11T00:59:18.636924" elapsed="0.000249"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.637619" 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-10-11T00:59:18.637367" 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-10-11T00:59:18.637982" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:18.637728" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.638486" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:59:18.638205" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:18.638058" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:18.637711" elapsed="0.000875"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.639132" 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-10-11T00:59:18.638751" elapsed="0.000408"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:59:18.639203" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:59:18.639329" 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-10-11T00:59:18.634488" elapsed="0.004866"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:18.639689" 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-10-11T00:59:18.639831" 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-10-11T00:59:18.639548" elapsed="0.000307"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:18.640154" 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-10-11T00:59:18.640264" 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-10-11T00:59:18.640018" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.640733" 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-10-11T00:59:18.640498" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.641191" 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-10-11T00:59:18.640978" elapsed="0.000259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.641668" level="INFO">ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:18.641440" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:18.642109" level="INFO">ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:18.641897" elapsed="0.000252"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:18.642286" elapsed="0.002327"/>
</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-10-11T00:59:18.644765" elapsed="0.002221"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:18.653021" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:18.653124" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:18.653219" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T00:59:18.647914" elapsed="0.005694">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:18.653791" elapsed="0.000021"/>
</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-10-11T00:59:18.654002" elapsed="0.000022"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T00:59:18.647616" elapsed="0.006530">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:20.665448" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:20.665762" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:20.665998" 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-10-11T00:59:20.655575" elapsed="0.010479"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T00:59:20.667058" 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-10-11T00:59:20.667306" 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-10-11T00:59:20.666472" elapsed="0.000931"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:20.669860" 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-10-11T00:59:20.668819" elapsed="0.001104"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:20.671249" 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-10-11T00:59:20.670270" elapsed="0.001040"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:20.671778" elapsed="0.000656"/>
</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-10-11T00:59:20.667909" elapsed="0.004671"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T00:59:20.654702" elapsed="0.017993"/>
</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-10-11T00:59:18.647179" elapsed="2.025609"/>
</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-10-11T00:59:20.673110" elapsed="0.003401"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:20.685987" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:20.686221" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:20.686546" 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-10-11T00:59:20.678581" elapsed="0.008048"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:20.687020" elapsed="0.000833"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:20.695046" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:20.695290" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:20.695574" 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-10-11T00:59:20.688213" elapsed="0.007420"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:20.697578" 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-10-11T00:59:20.696990" elapsed="0.000650"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:20.699064" 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-10-11T00:59:20.697978" elapsed="0.001146"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T00:59:20.700187" 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-10-11T00:59:20.700688" 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-10-11T00:59:20.699587" elapsed="0.001258">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-10-11T00:59:20.696091" elapsed="0.005066">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-10-11T00:59:20.677916" elapsed="0.023628">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-10-11T00:59:22.713968" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:22.714214" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:22.714465" 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-10-11T00:59:22.702771" elapsed="0.011752"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:22.714940" elapsed="0.000844"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:22.723652" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:22.723883" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:22.724091" 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-10-11T00:59:22.716149" elapsed="0.007996"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:22.726113" 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-10-11T00:59:22.725545" elapsed="0.000628"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:22.727079" 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-10-11T00:59:22.726546" elapsed="0.000592"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:22.727598" elapsed="0.000631"/>
</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-10-11T00:59:22.724657" elapsed="0.003695"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:22.702042" elapsed="0.026453"/>
</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-10-11T00:59:20.676999" elapsed="2.051596"/>
</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-10-11T00:59:22.729722" elapsed="0.003615"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:22.741652" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:22.741885" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:22.742149" 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-10-11T00:59:22.735498" elapsed="0.006708"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:22.742644" elapsed="0.000798"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:22.750114" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:22.750341" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:22.750619" 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-10-11T00:59:22.743830" elapsed="0.006847"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:22.752696" 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-10-11T00:59:22.752104" elapsed="0.000655"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:22.753664" 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-10-11T00:59:22.753100" 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-10-11T00:59:22.754132" elapsed="0.000684"/>
</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-10-11T00:59:22.751137" elapsed="0.003806"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:22.734793" elapsed="0.020259"/>
</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-10-11T00:59:22.733865" elapsed="0.021265"/>
</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-10-11T00:59:22.728958" elapsed="0.026282"/>
</kw>
<arg>route_eth_lacp_extdef</arg>
<status status="PASS" start="2026-10-11T00:59:18.626345" elapsed="4.128990"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:18.518008" elapsed="4.237581"/>
</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-10-11T00:59:22.759318" elapsed="0.000859"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:59:22.758759" elapsed="0.001534"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:22.762464" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:22.762224" elapsed="0.000373"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:22.762177" elapsed="0.000470"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:22.767230" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:22.767046" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:22.767007" elapsed="0.000362"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:22.769501" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:59:22.768735" elapsed="0.000825"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:59:22.770542" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:59:22.769922" elapsed="0.000696"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:59:22.770710" elapsed="0.000071"/>
</return>
<msg time="2026-10-11T00:59:22.771007" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:59:22.767889" elapsed="0.003169"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:22.775544" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:22.775404" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:22.775379" elapsed="0.000277"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:22.777334" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:22.777175" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:22.777150" elapsed="0.000449"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:59:22.778303" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:59:22.777816" elapsed="0.000569"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:59:22.779223" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:59:22.778907" elapsed="0.000396"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:59:22.815205" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:59:22.781444" elapsed="0.033886"/>
</kw>
<msg time="2026-10-11T00:59:22.815480" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:59:22.815580" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:22.779787" elapsed="0.035866"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:59:22.854988" 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-10-11T00:59:22.817255" elapsed="0.037865"/>
</kw>
<msg time="2026-10-11T00:59:22.855240" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:59:22.855326" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:22.816051" elapsed="0.039347"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:22.856022" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:22.855726" elapsed="0.000425"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:22.855706" elapsed="0.000501"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:22.856908" 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-10-11T00:59:22.856397" elapsed="0.000628"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:22.857652" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:22.857190" elapsed="0.000592"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:22.857171" elapsed="0.000667"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:59:22.857872" 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-10-11T00:59:22.861248" elapsed="0.000118"/>
</kw>
<msg time="2026-10-11T00:59:22.861450" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:59:22.860810" elapsed="0.000703"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:22.861764" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:22.861972" 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-10-11T00:59:22.860059" elapsed="0.002125"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:59:22.858150" elapsed="0.004112"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:59:22.776772" elapsed="0.085684"/>
</kw>
<msg time="2026-10-11T00:59:22.862543" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:22.862594" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:22.775917" elapsed="0.086714"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:59:22.862786" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:59:22.862699" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:22.862682" 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-10-11T00:59:22.863287" 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-10-11T00:59:22.863871" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:59:22.863939" 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-10-11T00:59:22.774996" elapsed="0.089031"/>
</kw>
<msg time="2026-10-11T00:59:22.864111" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:22.864150" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:22.771861" elapsed="0.092325"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:22.864494" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:22.864254" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:22.864238" elapsed="0.000342"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:59:22.771518" elapsed="0.093085"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:59:22.771166" elapsed="0.093465"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:59:22.766334" elapsed="0.098348"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:59:22.761641" elapsed="0.103091"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:22.760685" elapsed="0.104087"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:59:22.757931" elapsed="0.106888"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:22.870657" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:22.870765" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:22.870860" 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-10-11T00:59:22.865220" elapsed="0.005665"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:22.871060" elapsed="0.000339"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:22.876390" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:22.876515" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:22.876622" 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-10-11T00:59:22.871590" elapsed="0.005056"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:22.877494" 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-10-11T00:59:22.877231" elapsed="0.000290"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:22.877957" 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-10-11T00:59:22.877721" elapsed="0.000263"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:22.878172" elapsed="0.000299"/>
</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-10-11T00:59:22.876851" elapsed="0.001677"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:22.864951" elapsed="0.013641"/>
</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-10-11T00:59:22.756934" elapsed="0.121695"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:22.879308" 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-10-11T00:59:22.879476" 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-10-11T00:59:22.879158" elapsed="0.000345"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:22.879818" 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-10-11T00:59:22.879935" 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-10-11T00:59:22.879680" elapsed="0.000280"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:22.880261" 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-10-11T00:59:22.880376" 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-10-11T00:59:22.880124" elapsed="0.000278"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:59:22.880766" 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-10-11T00:59:22.880590" elapsed="0.000201"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:22.881293" 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-10-11T00:59:22.881427" 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-10-11T00:59:22.880954" elapsed="0.000500"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:59:22.881799" 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-10-11T00:59:22.881628" elapsed="0.000196"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:22.882242" 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-10-11T00:59:22.882019" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:22.882745" 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-10-11T00:59:22.882511" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:22.883232" level="INFO">ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:22.883016" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:22.883707" level="INFO">ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:22.883479" elapsed="0.000268"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:22.883886" elapsed="0.002333"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:22.897050" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T00:59:22.897116" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:22.897209" 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-10-11T00:59:22.886388" elapsed="0.010845"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:22.897767" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:22.897472" elapsed="0.000334"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:22.904058" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:22.904167" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:22.904262" 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-10-11T00:59:22.897963" elapsed="0.006324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:22.904814" 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-10-11T00:59:22.904524" elapsed="0.000335"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:22.911777" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:22.911918" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:22.912007" 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-10-11T00:59:22.905785" elapsed="0.006246"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:22.912543" 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-10-11T00:59:22.912237" elapsed="0.000365"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:22.912767" elapsed="0.000323"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:22.915360" level="INFO">${update} = ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:59:22.913241" elapsed="0.002147"/>
</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-10-11T00:59:22.915583" elapsed="0.000310"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:59:22.915937" elapsed="0.000028"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:59:22.905457" elapsed="0.010581"/>
</kw>
<msg time="2026-10-11T00:59:22.916109" 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-10-11T00:59:22.905041" elapsed="0.011091"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:22.916587" level="INFO">ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:22.916332" elapsed="0.000298"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:22.917434" level="INFO">Length is 174.</msg>
<msg time="2026-10-11T00:59:22.917506" 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-10-11T00:59:22.917172" elapsed="0.000356"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:22.917924" level="INFO">Length is 174.</msg>
<msg time="2026-10-11T00:59:22.917991" 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-10-11T00:59:22.917696" elapsed="0.000317"/>
</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-10-11T00:59:22.918193" elapsed="0.000282"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:22.918805" 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-10-11T00:59:22.918639" elapsed="0.000189"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:22.919125" 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-10-11T00:59:22.918971" elapsed="0.000177"/>
</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-10-11T00:59:22.919326" elapsed="0.000294"/>
</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-10-11T00:59:22.916843" elapsed="0.002832"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:22.919814" elapsed="0.002140"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:22.928209" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:22.928320" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:22.928475" 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-10-11T00:59:22.922471" elapsed="0.006029"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:22.929001" 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-10-11T00:59:22.928723" elapsed="0.000323"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:22.929209" elapsed="0.000340"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:22.935431" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:22.935543" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:22.935653" 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-10-11T00:59:22.929724" elapsed="0.005954"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:22.936160" 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-10-11T00:59:22.935885" elapsed="0.000320"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:22.936370" elapsed="0.000356"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T00:59:22.936943" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:22.936794" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:22.936776" elapsed="0.000226"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:22.943908" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:22.943951" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:22.944039" 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-10-11T00:59:22.937149" elapsed="0.006915"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:59:22.922152" elapsed="0.021971"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:22.950726" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:22.950829" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:22.950943" 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-10-11T00:59:22.945043" elapsed="0.005924"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:22.951501" 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-10-11T00:59:22.951171" elapsed="0.000392"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:22.951811" elapsed="0.000449"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:22.954980" level="INFO">${update} = ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:59:22.952491" 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-10-11T00:59:22.955239" elapsed="0.000488"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:59:22.955790" elapsed="0.000039"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:59:22.944739" elapsed="0.011193"/>
</kw>
<msg time="2026-10-11T00:59:22.956030" 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-10-11T00:59:22.944301" elapsed="0.011762"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:22.956697" level="INFO">ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:22.956342" elapsed="0.000414"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:22.957873" level="INFO">Length is 162.</msg>
<msg time="2026-10-11T00:59:22.957969" 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-10-11T00:59:22.957529" elapsed="0.000470"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:22.958580" level="INFO">Length is 162.</msg>
<msg time="2026-10-11T00:59:22.958677" 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-10-11T00:59:22.958215" 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-10-11T00:59:22.958960" elapsed="0.000364"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:22.959788" 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-10-11T00:59:22.959549" elapsed="0.000271"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:22.960226" 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-10-11T00:59:22.960017" elapsed="0.000241"/>
</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-10-11T00:59:22.960524" elapsed="0.000380"/>
</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-10-11T00:59:22.957044" elapsed="0.003935"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:22.966504" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:22.966620" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:22.966705" 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-10-11T00:59:22.961729" elapsed="0.005001"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:22.967207" 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-10-11T00:59:22.966934" elapsed="0.000316"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:22.967460" elapsed="0.000472"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:22.974185" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:22.974329" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:22.974488" 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-10-11T00:59:22.968155" elapsed="0.006369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:22.975207" 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-10-11T00:59:22.974822" elapsed="0.000446"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:22.975518" elapsed="0.000471"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T00:59:22.976289" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-10-11T00:59:22.976084" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:22.976060" elapsed="0.000340"/>
</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-10-11T00:59:22.976646" elapsed="0.000028"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:59:22.961286" elapsed="0.015471"/>
</kw>
<arg>route_eth_lacp_extesilab</arg>
<status status="PASS" start="2026-10-11T00:59:22.878858" elapsed="0.097955"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:22.755993" elapsed="0.220937"/>
</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-10-11T00:59:22.979185" elapsed="0.000296"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:59:22.978835" elapsed="0.000716"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:22.980832" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:22.980711" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:22.980686" 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-10-11T00:59:22.983074" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:22.982989" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:22.982972" elapsed="0.000166"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:22.984059" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:59:22.983737" elapsed="0.000347"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:59:22.984512" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:59:22.984236" elapsed="0.000300"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:59:22.984589" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:59:22.984716" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:59:22.983346" elapsed="0.001392"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:22.987429" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:22.987324" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:22.987307" elapsed="0.000188"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:22.988659" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:22.988529" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:22.988511" elapsed="0.000301"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:59:22.989315" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:59:22.988964" elapsed="0.000413"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:59:22.989984" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:59:22.989758" elapsed="0.000324"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:59:23.024872" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:59:22.991610" elapsed="0.033383"/>
</kw>
<msg time="2026-10-11T00:59:23.025116" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:59:23.025206" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:22.990390" elapsed="0.034886"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:59:23.064965" 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-10-11T00:59:23.026871" elapsed="0.038224"/>
</kw>
<msg time="2026-10-11T00:59:23.065216" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:59:23.065303" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:23.025700" elapsed="0.039676"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:23.065999" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:23.065704" elapsed="0.000423"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:23.065683" elapsed="0.000499"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:23.066875" 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-10-11T00:59:23.066371" elapsed="0.000620"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:23.067461" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:23.067158" elapsed="0.000443"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:23.067139" elapsed="0.000518"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:59:23.067691" 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-10-11T00:59:23.071071" elapsed="0.000115"/>
</kw>
<msg time="2026-10-11T00:59:23.071224" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:59:23.070642" elapsed="0.000640"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:23.071537" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:23.071757" 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-10-11T00:59:23.069891" elapsed="0.002084"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:59:23.067965" elapsed="0.004089"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:59:22.988221" elapsed="0.083983"/>
</kw>
<msg time="2026-10-11T00:59:23.072288" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:23.072327" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:22.987664" elapsed="0.084698"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:59:23.072735" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:59:23.072649" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:23.072629" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:23.073184" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:23.073596" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:59:23.073664" 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-10-11T00:59:22.987033" elapsed="0.086750"/>
</kw>
<msg time="2026-10-11T00:59:23.073868" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:23.073906" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:22.985068" elapsed="0.088873"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:23.074229" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:23.074008" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:23.073992" elapsed="0.000308"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:59:22.984925" elapsed="0.089397"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:59:22.984786" elapsed="0.089562"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:59:22.982696" elapsed="0.091700"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:59:22.980321" elapsed="0.094180"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:22.979775" elapsed="0.094768"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:59:22.978320" elapsed="0.096281"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:23.079670" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:23.079774" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:23.079858" 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-10-11T00:59:23.074999" elapsed="0.004882"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:23.080052" elapsed="0.000551"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:23.086993" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:23.087094" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:23.087185" 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-10-11T00:59:23.080768" elapsed="0.006441"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:23.088082" 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-10-11T00:59:23.087838" elapsed="0.000271"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:23.088513" 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-10-11T00:59:23.088260" elapsed="0.000279"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:23.088736" elapsed="0.000276"/>
</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-10-11T00:59:23.087443" elapsed="0.001624"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:23.074731" elapsed="0.014416"/>
</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-10-11T00:59:22.977734" elapsed="0.111451"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:23.089838" 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-10-11T00:59:23.089960" 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-10-11T00:59:23.089695" elapsed="0.000292"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:59:23.098059" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:59:23.097756" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:59:23.098801" 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-10-11T00:59:23.098596" elapsed="0.000277">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-10-11T00:59:23.098959" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:59:23.098244" elapsed="0.000738"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:23.099481" 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-10-11T00:59:23.099155" elapsed="0.000352"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:23.099797" 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-10-11T00:59:23.099913" 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-10-11T00:59:23.099688" elapsed="0.000249"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:23.100349" 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-10-11T00:59:23.100133" 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-10-11T00:59:23.100776" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:23.100503" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:59:23.101259" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:59:23.100999" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:23.100852" elapsed="0.000462"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:23.100485" elapsed="0.000849"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:59:23.101908" 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-10-11T00:59:23.101515" elapsed="0.000419"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:59:23.101978" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:59:23.102103" 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-10-11T00:59:23.097297" elapsed="0.004830"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:23.102479" 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-10-11T00:59:23.102610" 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-10-11T00:59:23.102292" elapsed="0.000344"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:23.102935" 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-10-11T00:59:23.103045" 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-10-11T00:59:23.102799" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:23.103507" 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-10-11T00:59:23.103264" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:23.103984" 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-10-11T00:59:23.103769" elapsed="0.000261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:23.104450" level="INFO">ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:23.104220" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:23.104907" level="INFO">ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:23.104696" elapsed="0.000253"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:23.105085" elapsed="0.002457"/>
</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-10-11T00:59:23.107712" elapsed="0.002314"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:23.115125" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:23.115229" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:23.115318" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T00:59:23.110974" elapsed="0.004742">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:23.115926" elapsed="0.000021"/>
</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-10-11T00:59:23.116139" elapsed="0.000022"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T00:59:23.110674" elapsed="0.005582">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:25.128142" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:25.128494" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:25.128770" 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-10-11T00:59:25.117906" elapsed="0.010918"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T00:59:25.129848" 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-10-11T00:59:25.130102" 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-10-11T00:59:25.129221" elapsed="0.000976"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:25.132846" 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-10-11T00:59:25.131705" elapsed="0.001204"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:25.134295" 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-10-11T00:59:25.133253" elapsed="0.001103"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:25.134835" elapsed="0.000660"/>
</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-10-11T00:59:25.130704" elapsed="0.004946"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T00:59:25.116932" elapsed="0.018829"/>
</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-10-11T00:59:23.110221" elapsed="2.025632"/>
</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-10-11T00:59:25.136183" elapsed="0.003735"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:25.149604" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:25.149939" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:25.150135" 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-10-11T00:59:25.142018" elapsed="0.008170"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:25.150629" elapsed="0.001293"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:25.159778" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:25.160029" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:25.160243" 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-10-11T00:59:25.152292" elapsed="0.008005"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:25.162268" 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-10-11T00:59:25.161725" elapsed="0.000603"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:25.163846" 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-10-11T00:59:25.162724" elapsed="0.001181"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T00:59:25.164977" 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-10-11T00:59:25.165493" 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-10-11T00:59:25.164319" elapsed="0.001361">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-10-11T00:59:25.160814" elapsed="0.005251">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-10-11T00:59:25.141335" elapsed="0.025016">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-10-11T00:59:27.175856" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:27.176141" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:27.176349" 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-10-11T00:59:27.167904" elapsed="0.008499"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:27.176870" elapsed="0.000887"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:27.186509" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:27.186772" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:27.186982" 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-10-11T00:59:27.178131" elapsed="0.008904"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:27.189056" 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-10-11T00:59:27.188471" elapsed="0.000643"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:27.190005" 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-10-11T00:59:27.189475" elapsed="0.000586"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:27.190495" elapsed="0.000653"/>
</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-10-11T00:59:27.187546" elapsed="0.003727"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:27.167050" elapsed="0.024333"/>
</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-10-11T00:59:25.140340" elapsed="2.051156"/>
</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-10-11T00:59:27.192629" elapsed="0.003683"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:27.206654" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:27.206911" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:27.207125" 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-10-11T00:59:27.199014" elapsed="0.008165"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:27.207617" elapsed="0.000780"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:27.215670" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:27.215903" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:27.216107" 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-10-11T00:59:27.208809" elapsed="0.007352"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:27.218219" 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-10-11T00:59:27.217658" elapsed="0.000621"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:27.219182" 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-10-11T00:59:27.218673" elapsed="0.000566"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:27.219696" elapsed="0.000629"/>
</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-10-11T00:59:27.216685" elapsed="0.003797"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:27.198283" elapsed="0.022333"/>
</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-10-11T00:59:27.196928" elapsed="0.023774"/>
</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-10-11T00:59:27.191886" elapsed="0.028932"/>
</kw>
<arg>route_eth_lacp_extesilab</arg>
<status status="PASS" start="2026-10-11T00:59:23.089367" elapsed="4.131549"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:22.977170" elapsed="4.243952"/>
</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-10-11T00:59:27.225063" elapsed="0.000472"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:59:27.224485" elapsed="0.001181"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:27.227772" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:27.227529" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:27.227481" elapsed="0.000440"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:27.232917" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:27.232732" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:27.232693" elapsed="0.000364"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.235161" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:59:27.234370" elapsed="0.000848"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.236200" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:59:27.235591" elapsed="0.000752"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:59:27.236467" elapsed="0.000073"/>
</return>
<msg time="2026-10-11T00:59:27.236789" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:59:27.233556" elapsed="0.003283"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:27.241570" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:27.241443" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:27.241397" elapsed="0.000280"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:27.243396" elapsed="0.000054"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:27.243228" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:27.243202" elapsed="0.000473"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:59:27.244445" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:59:27.243904" elapsed="0.000632"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:59:27.245442" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:59:27.245077" elapsed="0.000455"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:59:27.281018" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:59:27.247779" elapsed="0.033422"/>
</kw>
<msg time="2026-10-11T00:59:27.281366" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:59:27.281482" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:27.246002" elapsed="0.035551"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:59:27.318384" 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-10-11T00:59:27.283296" elapsed="0.035256"/>
</kw>
<msg time="2026-10-11T00:59:27.318702" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:59:27.318791" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:27.282020" elapsed="0.036841"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:27.319556" elapsed="0.000082"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:27.319179" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:27.319147" elapsed="0.000617"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.320483" 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-10-11T00:59:27.319958" elapsed="0.000662"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:27.321080" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:27.320790" elapsed="0.000421"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:27.320771" elapsed="0.000495"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:59:27.321304" 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-10-11T00:59:27.326790" elapsed="0.000130"/>
</kw>
<msg time="2026-10-11T00:59:27.326963" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:59:27.324439" elapsed="0.002589"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:27.327268" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:27.327541" 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-10-11T00:59:27.323672" elapsed="0.004104"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:59:27.321692" elapsed="0.006229"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:59:27.242805" elapsed="0.085272"/>
</kw>
<msg time="2026-10-11T00:59:27.328161" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:27.328202" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:27.241903" elapsed="0.086336"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:59:27.328398" elapsed="0.000084"/>
</return>
<status status="PASS" start="2026-10-11T00:59:27.328310" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:27.328291" elapsed="0.000246"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:27.328944" 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-10-11T00:59:27.329332" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:59:27.329399" elapsed="0.000227"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:59:27.241000" elapsed="0.088703"/>
</kw>
<msg time="2026-10-11T00:59:27.329788" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:27.329828" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:27.237637" elapsed="0.092226"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:27.330154" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:27.329931" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:27.329915" elapsed="0.000311"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:59:27.237269" elapsed="0.092980"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:59:27.236949" elapsed="0.093330"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:59:27.232030" elapsed="0.098299"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:59:27.226925" elapsed="0.103454"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:27.225999" elapsed="0.104438"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:59:27.223683" elapsed="0.106803"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:27.340377" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:27.340546" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:27.340661" 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-10-11T00:59:27.330910" elapsed="0.009776"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:27.340860" elapsed="0.000375"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:27.347125" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:27.347227" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:27.347350" 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-10-11T00:59:27.341397" elapsed="0.005978"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:27.348271" 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-10-11T00:59:27.348010" elapsed="0.000288"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:27.348719" 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-10-11T00:59:27.348466" elapsed="0.000279"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:27.348927" elapsed="0.000279"/>
</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-10-11T00:59:27.347623" elapsed="0.001639"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:27.330635" elapsed="0.018676"/>
</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-10-11T00:59:27.222516" elapsed="0.126831"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:27.350062" 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-10-11T00:59:27.350216" 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-10-11T00:59:27.349913" elapsed="0.000330"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:27.350557" 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-10-11T00:59:27.350688" 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-10-11T00:59:27.350404" elapsed="0.000310"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:27.351010" 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-10-11T00:59:27.351124" 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-10-11T00:59:27.350875" elapsed="0.000274"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:59:27.351502" 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-10-11T00:59:27.351309" elapsed="0.000218"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:27.351841" 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-10-11T00:59:27.351955" 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-10-11T00:59:27.351706" elapsed="0.000274"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:59:27.352301" 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-10-11T00:59:27.352137" elapsed="0.000188"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.352777" 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-10-11T00:59:27.352537" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.353271" 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-10-11T00:59:27.353056" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.353751" level="INFO">ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:27.353524" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.354190" level="INFO">ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:27.353981" elapsed="0.000250"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:27.354369" elapsed="0.002586"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:27.368374" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T00:59:27.368459" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:27.368550" 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-10-11T00:59:27.357131" elapsed="0.011443"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.369094" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:27.368820" elapsed="0.000312"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:27.374518" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:27.374643" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:27.374739" 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-10-11T00:59:27.369296" elapsed="0.005468"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.375256" 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-10-11T00:59:27.374984" elapsed="0.000345"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:27.382041" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:27.382150" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:27.382236" 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-10-11T00:59:27.376269" elapsed="0.005991"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.382778" 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-10-11T00:59:27.382487" elapsed="0.000336"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:27.382985" elapsed="0.000321"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:27.385590" level="INFO">${update} = ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:59:27.383470" elapsed="0.002165"/>
</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-10-11T00:59:27.385801" elapsed="0.000310"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:59:27.386155" elapsed="0.000030"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:59:27.375965" elapsed="0.010294"/>
</kw>
<msg time="2026-10-11T00:59:27.386330" 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-10-11T00:59:27.375544" elapsed="0.010809"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.386829" level="INFO">ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:27.386610" elapsed="0.000260"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.387683" level="INFO">Length is 174.</msg>
<msg time="2026-10-11T00:59:27.387752" 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-10-11T00:59:27.387430" elapsed="0.000344"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.388163" level="INFO">Length is 174.</msg>
<msg time="2026-10-11T00:59:27.388230" 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-10-11T00:59:27.387934" elapsed="0.000317"/>
</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-10-11T00:59:27.388471" elapsed="0.000281"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:27.389058" 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-10-11T00:59:27.388900" elapsed="0.000181"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:27.389376" 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-10-11T00:59:27.389223" elapsed="0.000176"/>
</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-10-11T00:59:27.389620" elapsed="0.000265"/>
</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-10-11T00:59:27.387080" elapsed="0.002859"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:27.390077" elapsed="0.002374"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:27.398857" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:27.399000" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:27.399088" 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-10-11T00:59:27.392958" elapsed="0.006154"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.399649" 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-10-11T00:59:27.399335" elapsed="0.000360"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:27.399865" elapsed="0.000322"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:27.406915" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:27.407025" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:27.407120" 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-10-11T00:59:27.400350" elapsed="0.006795"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.407681" 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-10-11T00:59:27.407368" elapsed="0.000359"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:27.407895" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T00:59:27.408451" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:27.408284" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:27.408265" elapsed="0.000245"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:27.415771" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:27.415813" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:27.415902" 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-10-11T00:59:27.408674" elapsed="0.007252"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:59:27.392662" elapsed="0.023324"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:27.423889" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:27.424079" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:27.424204" 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-10-11T00:59:27.417075" elapsed="0.007164"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.424995" 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-10-11T00:59:27.424573" elapsed="0.000486"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:27.425298" elapsed="0.000516"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:27.428568" level="INFO">${update} = ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:59:27.426035" elapsed="0.002611"/>
</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-10-11T00:59:27.428878" elapsed="0.000452"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:59:27.429393" elapsed="0.000072"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:59:27.416622" elapsed="0.012953"/>
</kw>
<msg time="2026-10-11T00:59:27.429694" 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-10-11T00:59:27.416174" elapsed="0.013555"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.430370" level="INFO">ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:27.430051" elapsed="0.000404"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.431673" level="INFO">Length is 162.</msg>
<msg time="2026-10-11T00:59:27.431775" 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-10-11T00:59:27.431275" elapsed="0.000532"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.432377" level="INFO">Length is 162.</msg>
<msg time="2026-10-11T00:59:27.432501" 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-10-11T00:59:27.432043" 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-10-11T00:59:27.432836" elapsed="0.000385"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:27.433704" 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-10-11T00:59:27.433457" elapsed="0.000282"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:27.434174" 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-10-11T00:59:27.433950" 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-10-11T00:59:27.434513" elapsed="0.000413"/>
</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-10-11T00:59:27.430780" elapsed="0.004227"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:27.441651" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:27.441804" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:27.441928" 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-10-11T00:59:27.435811" elapsed="0.006152"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.442743" 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-10-11T00:59:27.442294" elapsed="0.000557"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:27.443104" elapsed="0.000516"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:27.450268" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:27.450444" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:27.450583" 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-10-11T00:59:27.443865" elapsed="0.006770"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.451370" 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-10-11T00:59:27.450968" elapsed="0.000492"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:27.451732" elapsed="0.000475"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T00:59:27.452548" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-10-11T00:59:27.452308" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:27.452282" elapsed="0.000395"/>
</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-10-11T00:59:27.452899" elapsed="0.000030"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:59:27.435336" elapsed="0.017681"/>
</kw>
<arg>route_eth_lacp_extesr</arg>
<status status="PASS" start="2026-10-11T00:59:27.349614" elapsed="0.103462"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:27.221573" elapsed="0.231637"/>
</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-10-11T00:59:27.456183" elapsed="0.000313"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:59:27.455814" 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-10-11T00:59:27.457934" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:27.457807" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:27.457781" elapsed="0.000245"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:27.461135" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:27.461013" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:27.460988" elapsed="0.000240"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.462616" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:59:27.462105" elapsed="0.000550"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.463264" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:59:27.462883" elapsed="0.000415"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:59:27.463357" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T00:59:27.463568" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:59:27.461557" elapsed="0.002063"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:27.467249" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:27.467164" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:27.467146" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:27.468486" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:27.468347" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:27.468329" elapsed="0.000326"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:59:27.469199" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:59:27.468845" elapsed="0.000413"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:59:27.469876" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:59:27.469650" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:59:27.504254" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:59:27.471439" elapsed="0.032952"/>
</kw>
<msg time="2026-10-11T00:59:27.504535" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:59:27.504638" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:27.470241" elapsed="0.034467"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:59:27.542588" 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-10-11T00:59:27.506255" elapsed="0.036478"/>
</kw>
<msg time="2026-10-11T00:59:27.542853" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:59:27.542940" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:27.505098" elapsed="0.037911"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:27.543661" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:27.543300" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:27.543281" elapsed="0.000566"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.544553" 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-10-11T00:59:27.544056" elapsed="0.000628"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:27.545148" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:27.544853" elapsed="0.000424"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:27.544834" elapsed="0.000498"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:59:27.545365" 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-10-11T00:59:27.549005" elapsed="0.000119"/>
</kw>
<msg time="2026-10-11T00:59:27.549163" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:59:27.548511" elapsed="0.000712"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:27.549576" elapsed="0.000033"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:27.549797" 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-10-11T00:59:27.547740" elapsed="0.002269"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:59:27.545699" elapsed="0.004389"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:59:27.468061" elapsed="0.082175"/>
</kw>
<msg time="2026-10-11T00:59:27.550319" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:27.550359" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:27.467480" elapsed="0.082914"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:59:27.550564" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:59:27.550479" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:27.550461" elapsed="0.000199"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:27.551038" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:27.551489" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:59:27.551557" 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-10-11T00:59:27.466874" elapsed="0.084786"/>
</kw>
<msg time="2026-10-11T00:59:27.551744" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:27.551783" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:27.464114" elapsed="0.087703"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:27.552106" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:27.551884" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:27.551867" elapsed="0.000310"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:59:27.463903" elapsed="0.088296"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:59:27.463692" elapsed="0.088535"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:59:27.460540" elapsed="0.091735"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:59:27.457386" elapsed="0.094940"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:27.456807" elapsed="0.095558"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:59:27.455263" elapsed="0.097165"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:27.557509" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:27.557632" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:27.557728" 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-10-11T00:59:27.552844" elapsed="0.004909"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:27.557926" elapsed="0.000340"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:27.563824" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:27.563927" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:27.564020" 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-10-11T00:59:27.558447" elapsed="0.005598"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:27.564922" 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-10-11T00:59:27.564669" elapsed="0.000280"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:27.565333" 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-10-11T00:59:27.565101" elapsed="0.000258"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:27.565593" elapsed="0.000294"/>
</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-10-11T00:59:27.564249" elapsed="0.001695"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:27.552559" elapsed="0.013433"/>
</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-10-11T00:59:27.454328" elapsed="0.111700"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:27.566691" 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-10-11T00:59:27.566818" 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-10-11T00:59:27.566526" elapsed="0.000319"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.574903" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:59:27.574587" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:59:27.575642" 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-10-11T00:59:27.575424" elapsed="0.000296">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-10-11T00:59:27.575807" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:59:27.575089" elapsed="0.000741"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.576314" 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-10-11T00:59:27.576005" elapsed="0.000334"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:27.576645" 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-10-11T00:59:27.576762" 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-10-11T00:59:27.576521" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.577200" 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-10-11T00:59:27.576983" elapsed="0.000264"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:59:27.577583" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:27.577309" elapsed="0.000340"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.578082" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:59:27.577820" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:27.577672" elapsed="0.000466"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:27.577291" elapsed="0.000867"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.578738" 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-10-11T00:59:27.578322" elapsed="0.000442"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:59:27.578808" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:59:27.578936" 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-10-11T00:59:27.574149" elapsed="0.004843"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:27.579302" 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-10-11T00:59:27.579432" 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-10-11T00:59:27.579162" elapsed="0.000296"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:27.579773" 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-10-11T00:59:27.579884" 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-10-11T00:59:27.579634" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.580323" 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-10-11T00:59:27.580102" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.580816" 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-10-11T00:59:27.580587" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.581267" level="INFO">ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:27.581054" elapsed="0.000254"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:27.581741" level="INFO">ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:27.581513" elapsed="0.000270"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:27.581920" elapsed="0.001939"/>
</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-10-11T00:59:27.584013" elapsed="0.002339"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:27.591717" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:27.591821" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:27.591909" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T00:59:27.587301" elapsed="0.005000">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:27.592509" 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-10-11T00:59:27.592742" elapsed="0.000023"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T00:59:27.586999" elapsed="0.005863">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:29.603121" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:29.603391" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:29.603671" 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-10-11T00:59:29.594145" elapsed="0.009585"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T00:59:29.604711" 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-10-11T00:59:29.604951" 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-10-11T00:59:29.604112" elapsed="0.000935"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:29.607482" 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-10-11T00:59:29.606392" elapsed="0.001154"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:29.608895" 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-10-11T00:59:29.607909" elapsed="0.001045"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:29.609366" elapsed="0.000682"/>
</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-10-11T00:59:29.605528" elapsed="0.004647"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T00:59:29.593315" elapsed="0.016970"/>
</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-10-11T00:59:27.586572" elapsed="2.023807"/>
</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-10-11T00:59:29.610796" elapsed="0.003432"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:29.624890" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:29.625195" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:29.625388" 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-10-11T00:59:29.616281" elapsed="0.009192"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:29.625882" elapsed="0.000820"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:29.634918" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:29.635164" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:29.635375" 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-10-11T00:59:29.627064" elapsed="0.008401"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:29.637380" 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-10-11T00:59:29.636841" elapsed="0.000629"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:29.638936" 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-10-11T00:59:29.637840" elapsed="0.001157"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T00:59:29.640106" 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-10-11T00:59:29.640601" 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-10-11T00:59:29.639438" elapsed="0.001340">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-10-11T00:59:29.635943" elapsed="0.005217">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-10-11T00:59:29.615677" elapsed="0.025801">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-10-11T00:59:31.652310" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:31.652636" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:31.652853" 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-10-11T00:59:31.642812" elapsed="0.010097"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:31.653312" elapsed="0.000875"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:31.662745" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:31.662973" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:31.663183" 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-10-11T00:59:31.654597" elapsed="0.008641"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:31.665242" 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-10-11T00:59:31.664678" elapsed="0.000624"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:31.666217" 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-10-11T00:59:31.665690" elapsed="0.000586"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:31.666734" elapsed="0.000621"/>
</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-10-11T00:59:31.663762" elapsed="0.003753"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:31.642026" elapsed="0.025619"/>
</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-10-11T00:59:29.614758" elapsed="2.052971"/>
</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-10-11T00:59:31.668856" elapsed="0.004736"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:31.683523" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:31.683785" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:31.683996" 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-10-11T00:59:31.676178" elapsed="0.007871"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:31.684465" elapsed="0.000784"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:31.692557" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:31.692810" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:31.693014" 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-10-11T00:59:31.685658" elapsed="0.007411"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:31.695094" 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-10-11T00:59:31.694530" elapsed="0.000625"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:31.696066" 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-10-11T00:59:31.695526" 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-10-11T00:59:31.696589" elapsed="0.000648"/>
</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-10-11T00:59:31.693564" elapsed="0.003797"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:31.675084" elapsed="0.022423"/>
</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-10-11T00:59:31.674158" elapsed="0.023429"/>
</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-10-11T00:59:31.668089" elapsed="0.029630"/>
</kw>
<arg>route_eth_lacp_extesr</arg>
<status status="PASS" start="2026-10-11T00:59:27.566212" elapsed="4.131602"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:27.453679" elapsed="4.244339"/>
</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-10-11T00:59:31.702102" elapsed="0.000481"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:59:31.701510" elapsed="0.001205"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:31.704854" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:31.704640" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:31.704576" 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-10-11T00:59:31.709592" elapsed="0.000052"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:31.709373" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:31.709335" elapsed="0.000420"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:31.711864" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:59:31.711080" elapsed="0.000843"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:59:31.712911" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:59:31.712265" elapsed="0.000767"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:59:31.713128" elapsed="0.000069"/>
</return>
<msg time="2026-10-11T00:59:31.713457" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:59:31.710221" elapsed="0.003292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:31.718944" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:31.718826" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:31.718801" elapsed="0.000230"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:31.720799" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:31.720548" elapsed="0.000399"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:31.720523" elapsed="0.000501"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:59:31.721789" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:59:31.721239" elapsed="0.000634"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:59:31.722728" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:59:31.722367" elapsed="0.000443"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:59:31.758528" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:59:31.724958" elapsed="0.033707"/>
</kw>
<msg time="2026-10-11T00:59:31.758790" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:59:31.758879" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:31.723238" elapsed="0.035711"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:59:31.796795" 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-10-11T00:59:31.760570" elapsed="0.036353"/>
</kw>
<msg time="2026-10-11T00:59:31.797042" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:59:31.797130" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:31.759340" elapsed="0.037860"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:31.797836" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:31.797518" elapsed="0.000450"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:31.797497" elapsed="0.000527"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:31.798724" 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-10-11T00:59:31.798213" elapsed="0.000626"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:31.799295" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:31.799006" elapsed="0.000434"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:31.798987" elapsed="0.000510"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:59:31.799531" 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-10-11T00:59:31.803007" elapsed="0.000120"/>
</kw>
<msg time="2026-10-11T00:59:31.803167" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:59:31.802505" elapsed="0.000725"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:31.803500" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:31.803721" 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-10-11T00:59:31.801767" elapsed="0.002169"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:59:31.799821" elapsed="0.004227"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:59:31.720107" elapsed="0.084092"/>
</kw>
<msg time="2026-10-11T00:59:31.804283" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:31.804323" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:31.719245" elapsed="0.085114"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:59:31.804551" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:59:31.804461" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:31.804425" 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-10-11T00:59:31.805028" 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-10-11T00:59:31.805451" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:59:31.805519" 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-10-11T00:59:31.718395" elapsed="0.087211"/>
</kw>
<msg time="2026-10-11T00:59:31.805701" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:31.805741" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:31.714286" elapsed="0.091490"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:31.806067" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:31.805844" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:31.805828" elapsed="0.000310"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:59:31.713962" elapsed="0.092197"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:59:31.713619" elapsed="0.092567"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:59:31.708717" elapsed="0.097519"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:59:31.704003" elapsed="0.102282"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:31.703052" elapsed="0.103274"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:59:31.700702" elapsed="0.105671"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:31.812228" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:31.812341" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:31.812458" 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-10-11T00:59:31.806959" elapsed="0.005526"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:31.812670" elapsed="0.000346"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:31.818815" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:31.818917" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:31.819043" 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-10-11T00:59:31.813179" elapsed="0.005890"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:31.819952" 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-10-11T00:59:31.819701" elapsed="0.000278"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:31.820364" 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-10-11T00:59:31.820132" elapsed="0.000258"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:31.820591" elapsed="0.000290"/>
</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-10-11T00:59:31.819276" elapsed="0.001661"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:31.806688" elapsed="0.014297"/>
</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-10-11T00:59:31.699683" elapsed="0.121338"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:31.821743" 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-10-11T00:59:31.821970" 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-10-11T00:59:31.821577" elapsed="0.000421"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:31.822303" 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-10-11T00:59:31.822437" 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-10-11T00:59:31.822165" elapsed="0.000298"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:31.822782" 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-10-11T00:59:31.822897" 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-10-11T00:59:31.822639" elapsed="0.000283"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:59:31.823260" 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-10-11T00:59:31.823085" elapsed="0.000200"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:31.823600" 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-10-11T00:59:31.823727" 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-10-11T00:59:31.823465" elapsed="0.000286"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:59:31.824074" 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-10-11T00:59:31.823910" elapsed="0.000189"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:31.824532" 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-10-11T00:59:31.824294" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:31.825043" 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-10-11T00:59:31.824826" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:31.825514" level="INFO">ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:31.825283" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:31.825977" level="INFO">ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:31.825764" elapsed="0.000254"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:31.826158" elapsed="0.002403"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:31.840294" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T00:59:31.840358" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:31.840464" 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-10-11T00:59:31.828745" elapsed="0.011744"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:31.840987" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:31.840712" elapsed="0.000314"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:31.847014" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:31.847126" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:31.847221" 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-10-11T00:59:31.841183" elapsed="0.006062"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:31.847797" 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-10-11T00:59:31.847503" elapsed="0.000340"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:31.853607" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:31.853734" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:31.853822" 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-10-11T00:59:31.848769" elapsed="0.005077"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:31.854326" 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-10-11T00:59:31.854052" elapsed="0.000320"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:31.854554" elapsed="0.000345"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:31.857488" level="INFO">${update} = </msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:59:31.855051" elapsed="0.002464"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<msg time="2026-10-11T00:59:31.858041" level="FAIL"> == </msg>
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="FAIL" start="2026-10-11T00:59:31.857688" elapsed="0.000424"> == </status>
</kw>
<return>
<value>${update}</value>
<status status="NOT RUN" start="2026-10-11T00:59:31.858163" elapsed="0.000017"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="FAIL" start="2026-10-11T00:59:31.848445" elapsed="0.009821"> == </status>
</kw>
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:33.868211" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:33.868526" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:33.868762" 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-10-11T00:59:33.859549" elapsed="0.009269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:33.870004" 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-10-11T00:59:33.869285" elapsed="0.000900"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:33.870591" elapsed="0.000765"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:33.875503" level="INFO">${update} = ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:59:33.871748" elapsed="0.003818"/>
</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-10-11T00:59:33.875988" elapsed="0.000714"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:59:33.876814" elapsed="0.000077"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:59:33.858785" elapsed="0.018279"/>
</kw>
<msg time="2026-10-11T00:59:33.877220" 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-10-11T00:59:31.848027" elapsed="2.029248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:33.878278" level="INFO">ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:33.877786" elapsed="0.000588"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:33.880226" level="INFO">Length is 174.</msg>
<msg time="2026-10-11T00:59:33.880379" 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-10-11T00:59:33.879696" elapsed="0.000766"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:33.881339" level="INFO">Length is 174.</msg>
<msg time="2026-10-11T00:59:33.881523" 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-10-11T00:59:33.880833" elapsed="0.000739"/>
</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-10-11T00:59:33.882001" elapsed="0.000616"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:33.883317" 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-10-11T00:59:33.882969" elapsed="0.000399"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:33.884078" 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-10-11T00:59:33.883735" elapsed="0.000395"/>
</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-10-11T00:59:33.884551" elapsed="0.000607"/>
</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-10-11T00:59:33.878907" elapsed="0.006370"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:33.885616" elapsed="0.002852"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:33.900978" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:33.901231" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:33.901496" 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-10-11T00:59:33.889594" elapsed="0.011960"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:33.902723" 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-10-11T00:59:33.902036" elapsed="0.000791"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:33.903189" elapsed="0.000795"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:33.911478" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:33.911753" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:33.911971" 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-10-11T00:59:33.904439" elapsed="0.007588"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:33.913167" 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-10-11T00:59:33.912521" elapsed="0.000748"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:33.913686" elapsed="0.000757"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T00:59:33.914972" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:33.914606" elapsed="0.000457"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:33.914564" elapsed="0.000545"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:33.923561" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:33.923682" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:33.923889" 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-10-11T00:59:33.915468" elapsed="0.008477"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:59:33.888953" elapsed="0.035129"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:33.933367" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:33.933665" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:33.933858" 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-10-11T00:59:33.926202" elapsed="0.007710"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:33.935047" 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-10-11T00:59:33.934370" elapsed="0.000774"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:33.935551" elapsed="0.000742"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:33.940216" level="INFO">${update} = ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:59:33.936677" elapsed="0.003664"/>
</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-10-11T00:59:33.940819" elapsed="0.000681"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:59:33.941600" elapsed="0.000088"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:59:33.925492" elapsed="0.016363"/>
</kw>
<msg time="2026-10-11T00:59:33.942013" 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-10-11T00:59:33.924519" elapsed="0.017547"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:33.943067" level="INFO">ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:33.942551" elapsed="0.000611"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:33.945005" level="INFO">Length is 162.</msg>
<msg time="2026-10-11T00:59:33.945158" 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-10-11T00:59:33.944460" elapsed="0.000747"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:33.946117" level="INFO">Length is 162.</msg>
<msg time="2026-10-11T00:59:33.946267" 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-10-11T00:59:33.945585" elapsed="0.000731"/>
</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-10-11T00:59:33.946770" elapsed="0.000583"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:33.948085" 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-10-11T00:59:33.947739" elapsed="0.000399"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:33.948849" 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-10-11T00:59:33.948484" elapsed="0.000418"/>
</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-10-11T00:59:33.949300" elapsed="0.000640"/>
</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-10-11T00:59:33.943695" elapsed="0.006364"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:33.957808" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:33.958040" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:33.958230" 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-10-11T00:59:33.951270" elapsed="0.007015"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:33.959442" 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-10-11T00:59:33.958798" elapsed="0.000745"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:33.959928" elapsed="0.000767"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:33.968470" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:33.968731" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:33.969020" 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-10-11T00:59:33.961050" elapsed="0.008025"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:33.970207" 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-10-11T00:59:33.969569" elapsed="0.000732"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:33.970714" elapsed="0.000759"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T00:59:33.971987" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-10-11T00:59:33.971627" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:33.971587" elapsed="0.000569"/>
</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-10-11T00:59:33.972519" elapsed="0.000045"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:59:33.950584" elapsed="0.022145"/>
</kw>
<arg>route_eth_lacp_extl2</arg>
<status status="PASS" start="2026-10-11T00:59:31.821259" elapsed="2.151561"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:31.698667" elapsed="2.274352"/>
</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-10-11T00:59:33.977225" elapsed="0.000507"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:59:33.976662" elapsed="0.001182"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:33.979403" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:33.979282" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:33.979258" elapsed="0.000255"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:33.982377" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:33.982260" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:33.982236" elapsed="0.000252"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:33.983808" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:59:33.983302" elapsed="0.000541"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:59:33.984447" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:59:33.984059" elapsed="0.000423"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:59:33.984538" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:59:33.984762" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:59:33.982802" elapsed="0.001992"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:33.988623" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:33.988504" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:33.988478" 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-10-11T00:59:33.990355" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:33.990195" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:33.990171" elapsed="0.000429"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:59:33.991326" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:59:33.990834" elapsed="0.000595"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:59:33.992250" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:59:33.991938" elapsed="0.000393"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:59:34.026985" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:59:33.994477" elapsed="0.032634"/>
</kw>
<msg time="2026-10-11T00:59:34.027235" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:59:34.027325" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:33.992806" elapsed="0.034590"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:59:34.063779" 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-10-11T00:59:34.029093" elapsed="0.034817"/>
</kw>
<msg time="2026-10-11T00:59:34.064031" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:59:34.064118" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:34.027833" elapsed="0.036354"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:34.064813" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:34.064501" elapsed="0.000441"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:34.064481" elapsed="0.000516"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:34.065703" 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-10-11T00:59:34.065186" elapsed="0.000633"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:34.066280" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:34.065989" elapsed="0.000437"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:34.065971" elapsed="0.000513"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:59:34.066518" 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-10-11T00:59:34.070005" elapsed="0.000120"/>
</kw>
<msg time="2026-10-11T00:59:34.070165" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:59:34.069503" elapsed="0.000722"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:34.070496" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:34.070719" 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-10-11T00:59:34.068757" elapsed="0.002175"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:59:34.066813" 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-10-11T00:59:33.989792" elapsed="0.081368"/>
</kw>
<msg time="2026-10-11T00:59:34.071243" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:34.071283" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:33.988946" elapsed="0.082372"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:59:34.071494" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:59:34.071386" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:34.071369" elapsed="0.000201"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:34.071966" 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-10-11T00:59:34.072349" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:59:34.072625" elapsed="0.000046"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:59:33.988077" elapsed="0.084670"/>
</kw>
<msg time="2026-10-11T00:59:34.072831" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:34.072871" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:33.985264" elapsed="0.087648"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:34.073201" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:34.072979" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:34.072963" elapsed="0.000307"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:59:33.985062" elapsed="0.088262"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:59:33.984861" elapsed="0.088495"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:59:33.981851" elapsed="0.091575"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:59:33.978934" elapsed="0.094545"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:33.978176" elapsed="0.095343"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:59:33.975840" elapsed="0.097725"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:34.079192" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:34.079303" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:34.079388" 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-10-11T00:59:34.073987" elapsed="0.005447"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:34.079610" elapsed="0.000540"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:34.084261" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:34.084363" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:34.084479" 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-10-11T00:59:34.080316" elapsed="0.004188"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:34.085381" 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-10-11T00:59:34.085110" elapsed="0.000313"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:34.085824" 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-10-11T00:59:34.085578" elapsed="0.000272"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:34.086034" elapsed="0.000277"/>
</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-10-11T00:59:34.084727" elapsed="0.001639"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:34.073714" elapsed="0.012717"/>
</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-10-11T00:59:33.974802" elapsed="0.111667"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:34.087123" 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-10-11T00:59:34.087261" 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-10-11T00:59:34.086972" elapsed="0.000315"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:59:34.095344" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:59:34.095039" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:59:34.096094" 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-10-11T00:59:34.095888" elapsed="0.000278">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-10-11T00:59:34.096251" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:59:34.095549" elapsed="0.000725"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:34.096791" 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-10-11T00:59:34.096465" elapsed="0.000352"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:34.097093" 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-10-11T00:59:34.097210" 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-10-11T00:59:34.096985" elapsed="0.000250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:34.097678" 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-10-11T00:59:34.097445" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:59:34.098048" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:34.097789" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:59:34.098547" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:59:34.098269" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:34.098122" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:34.097772" elapsed="0.000852"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:59:34.099183" 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-10-11T00:59:34.098800" elapsed="0.000410"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:59:34.099253" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:59:34.099379" 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-10-11T00:59:34.094571" elapsed="0.004847"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:34.099736" 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-10-11T00:59:34.099852" 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-10-11T00:59:34.099586" elapsed="0.000290"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:34.100174" 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-10-11T00:59:34.100285" 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-10-11T00:59:34.100038" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:34.100784" 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-10-11T00:59:34.100548" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:34.101245" 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-10-11T00:59:34.101032" elapsed="0.000261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:34.101723" level="INFO">ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:34.101498" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:34.102167" level="INFO">ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:34.101955" elapsed="0.000253"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:34.102345" elapsed="0.003593"/>
</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-10-11T00:59:34.106095" elapsed="0.002265"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:34.112684" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:34.112788" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:34.112878" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T00:59:34.109299" elapsed="0.003930">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:34.113431" 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-10-11T00:59:34.113658" elapsed="0.000023"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T00:59:34.108998" elapsed="0.004779">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:36.123361" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:36.123724" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:36.123939" 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-10-11T00:59:36.115200" elapsed="0.008795"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T00:59:36.125009" 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-10-11T00:59:36.125259" 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-10-11T00:59:36.124387" elapsed="0.000973"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:36.127911" 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-10-11T00:59:36.126781" elapsed="0.001195"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:36.129368" 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-10-11T00:59:36.128328" elapsed="0.001132"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:36.129912" elapsed="0.000674"/>
</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-10-11T00:59:36.125865" elapsed="0.004892"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T00:59:36.114306" elapsed="0.016567"/>
</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-10-11T00:59:34.108575" elapsed="2.022394"/>
</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-10-11T00:59:36.131303" elapsed="0.003849"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:36.143702" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:36.143944" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:36.144136" 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-10-11T00:59:36.137273" elapsed="0.006917"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:36.144740" elapsed="0.000837"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:36.153088" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:36.153345" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:36.153609" 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-10-11T00:59:36.145969" elapsed="0.007722"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:36.155785" 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-10-11T00:59:36.155114" elapsed="0.000735"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:36.157360" 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-10-11T00:59:36.156191" elapsed="0.001259"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T00:59:36.158543" 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-10-11T00:59:36.159109" 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-10-11T00:59:36.157894" elapsed="0.001379">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-10-11T00:59:36.154158" elapsed="0.005472">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-10-11T00:59:36.136636" elapsed="0.023384">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-10-11T00:59:38.169338" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:38.169692" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:38.169907" 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-10-11T00:59:38.161651" elapsed="0.008318"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:38.170461" elapsed="0.000875"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:38.178371" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:38.178645" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:38.178880" 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-10-11T00:59:38.171763" elapsed="0.007172"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:38.180956" 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-10-11T00:59:38.180333" elapsed="0.000694"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:38.181947" 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-10-11T00:59:38.181376" 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-10-11T00:59:38.182446" elapsed="0.000663"/>
</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-10-11T00:59:38.179440" elapsed="0.003794"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:38.160782" elapsed="0.022564"/>
</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-10-11T00:59:36.135703" elapsed="2.047756"/>
</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-10-11T00:59:38.184595" elapsed="0.003727"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:38.197382" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:38.197683" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:38.197990" 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-10-11T00:59:38.190896" elapsed="0.007151"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:38.198486" elapsed="0.000782"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:38.206234" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:38.206505" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:38.206738" 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-10-11T00:59:38.199690" elapsed="0.007106"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:38.208813" 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-10-11T00:59:38.208217" elapsed="0.000658"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:38.209788" 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-10-11T00:59:38.209221" elapsed="0.000627"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:38.210256" elapsed="0.000680"/>
</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-10-11T00:59:38.207248" elapsed="0.003815"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:38.189774" elapsed="0.021395"/>
</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-10-11T00:59:38.188847" elapsed="0.022399"/>
</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-10-11T00:59:38.183852" elapsed="0.027502"/>
</kw>
<arg>route_eth_lacp_extl2</arg>
<status status="PASS" start="2026-10-11T00:59:34.086672" elapsed="4.124807"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:33.973625" elapsed="4.238081"/>
</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-10-11T00:59:38.215756" elapsed="0.000440"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:59:38.215141" elapsed="0.001167"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:38.218467" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:38.218229" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:38.218183" elapsed="0.000433"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:38.223216" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:38.223029" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:38.222990" elapsed="0.000366"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:38.225477" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:59:38.224719" elapsed="0.000816"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:59:38.226515" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:59:38.225904" elapsed="0.000666"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:59:38.226679" elapsed="0.000072"/>
</return>
<msg time="2026-10-11T00:59:38.226975" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:59:38.223868" elapsed="0.003157"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:38.231611" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:38.231492" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:38.231467" 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-10-11T00:59:38.233394" elapsed="0.000050"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:38.233235" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:38.233211" elapsed="0.000431"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:59:38.234360" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:59:38.233874" elapsed="0.000595"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:59:38.235289" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:59:38.234975" elapsed="0.000394"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:59:38.273752" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:59:38.237515" elapsed="0.036479"/>
</kw>
<msg time="2026-10-11T00:59:38.274202" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:59:38.274324" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:38.235845" elapsed="0.038607"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:59:38.332182" 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-10-11T00:59:38.276222" elapsed="0.056090"/>
</kw>
<msg time="2026-10-11T00:59:38.332454" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:59:38.332544" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:38.275028" elapsed="0.057585"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:38.333217" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:38.332919" elapsed="0.000426"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:38.332899" elapsed="0.000502"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:38.334106" 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-10-11T00:59:38.333610" elapsed="0.000611"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:38.334717" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:38.334388" elapsed="0.000461"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:38.334370" elapsed="0.000534"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:59:38.334937" 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-10-11T00:59:38.338569" elapsed="0.000132"/>
</kw>
<msg time="2026-10-11T00:59:38.338741" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:59:38.338062" elapsed="0.000742"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:38.339040" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:38.339248" 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-10-11T00:59:38.337178" elapsed="0.002364"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:59:38.335216" elapsed="0.004410"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:59:38.232836" elapsed="0.106957"/>
</kw>
<msg time="2026-10-11T00:59:38.339877" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:38.339917" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:38.231978" elapsed="0.107975"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:59:38.340105" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:59:38.340021" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:38.340004" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:38.340631" 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-10-11T00:59:38.341032" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:59:38.341098" 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-10-11T00:59:38.231070" elapsed="0.110114"/>
</kw>
<msg time="2026-10-11T00:59:38.341268" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:38.341308" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:38.227820" elapsed="0.113523"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:38.341705" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:38.341466" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:38.341394" elapsed="0.000384"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:59:38.227476" elapsed="0.114323"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:59:38.227130" elapsed="0.114697"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:59:38.222330" elapsed="0.119547"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:59:38.217624" elapsed="0.124302"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:38.216702" elapsed="0.125265"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:59:38.214322" elapsed="0.127691"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:38.355131" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:38.355237" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:38.355324" 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-10-11T00:59:38.342425" elapsed="0.012923"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:38.355545" elapsed="0.000360"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:38.361510" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:38.361612" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:38.361721" 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-10-11T00:59:38.356072" elapsed="0.005674"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:38.362596" 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-10-11T00:59:38.362334" elapsed="0.000289"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:38.363057" 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-10-11T00:59:38.362822" elapsed="0.000262"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:38.363266" elapsed="0.000295"/>
</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-10-11T00:59:38.361952" elapsed="0.001664"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:38.342142" elapsed="0.021533"/>
</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-10-11T00:59:38.213320" elapsed="0.150392"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:38.364396" 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-10-11T00:59:38.364561" 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-10-11T00:59:38.364245" elapsed="0.000344"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:38.364903" 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-10-11T00:59:38.365025" 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-10-11T00:59:38.364765" elapsed="0.000284"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:38.365347" 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-10-11T00:59:38.365478" 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-10-11T00:59:38.365211" elapsed="0.000292"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:59:38.365853" 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-10-11T00:59:38.365677" elapsed="0.000200"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:38.366178" 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-10-11T00:59:38.366294" 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-10-11T00:59:38.366045" elapsed="0.000273"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:59:38.366658" 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-10-11T00:59:38.366492" elapsed="0.000203"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:38.367110" 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-10-11T00:59:38.366890" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:38.367590" 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-10-11T00:59:38.367354" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:38.368089" level="INFO">ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:38.367873" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:38.368552" level="INFO">ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:38.368320" elapsed="0.000273"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:38.368746" elapsed="0.002447"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:38.387928" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T00:59:38.387993" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:38.388078" 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-10-11T00:59:38.371356" elapsed="0.016745"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:38.388612" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:38.388307" elapsed="0.000343"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:38.394653" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:38.394781" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:38.394875" 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-10-11T00:59:38.388821" elapsed="0.006078"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:38.395379" 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-10-11T00:59:38.395107" elapsed="0.000334"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:38.401225" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:38.401362" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:38.401471" 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-10-11T00:59:38.396345" elapsed="0.005151"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:38.401993" 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-10-11T00:59:38.401717" elapsed="0.000323"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:38.402201" elapsed="0.000338"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:38.405315" level="INFO">${update} = </msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:59:38.402703" elapsed="0.002649"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<msg time="2026-10-11T00:59:38.406096" level="FAIL"> == </msg>
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="FAIL" start="2026-10-11T00:59:38.405626" elapsed="0.000560"> == </status>
</kw>
<return>
<value>${update}</value>
<status status="NOT RUN" start="2026-10-11T00:59:38.406257" elapsed="0.000023"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="FAIL" start="2026-10-11T00:59:38.396038" elapsed="0.010358"> == </status>
</kw>
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:40.424605" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:40.424890" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:40.425096" 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-10-11T00:59:40.407778" elapsed="0.017372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:40.426324" 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-10-11T00:59:40.425655" elapsed="0.000805"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:40.426854" elapsed="0.000766"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:40.431857" level="INFO">${update} = ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:59:40.427971" elapsed="0.003952"/>
</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-10-11T00:59:40.432455" elapsed="0.000710"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:59:40.433265" elapsed="0.000064"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:59:40.406984" elapsed="0.026550"/>
</kw>
<msg time="2026-10-11T00:59:40.433721" 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-10-11T00:59:38.395624" elapsed="2.038153"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:40.434838" level="INFO">ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:40.434258" elapsed="0.000746"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:40.436897" level="INFO">Length is 174.</msg>
<msg time="2026-10-11T00:59:40.437053" 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-10-11T00:59:40.436305" elapsed="0.000798"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:40.438029" level="INFO">Length is 174.</msg>
<msg time="2026-10-11T00:59:40.438183" 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-10-11T00:59:40.437485" elapsed="0.000748"/>
</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-10-11T00:59:40.438690" elapsed="0.000598"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:40.440039" 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-10-11T00:59:40.439654" elapsed="0.000438"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:40.440892" 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-10-11T00:59:40.440444" elapsed="0.000501"/>
</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-10-11T00:59:40.441348" elapsed="0.000654"/>
</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-10-11T00:59:40.435528" elapsed="0.006597"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:40.442471" elapsed="0.002803"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:40.453452" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:40.453729" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:40.453924" 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-10-11T00:59:40.446451" elapsed="0.007525"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:40.455501" 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-10-11T00:59:40.454466" elapsed="0.001140"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:40.456009" elapsed="0.000785"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:40.464955" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:40.465199" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:40.465446" 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-10-11T00:59:40.457155" elapsed="0.008349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:40.466714" 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-10-11T00:59:40.466047" elapsed="0.000771"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:40.467184" elapsed="0.000774"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T00:59:40.468474" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:40.468112" elapsed="0.000453"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:40.468071" elapsed="0.000539"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:40.476965" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:40.477058" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:40.477255" 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-10-11T00:59:40.468954" elapsed="0.008355"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:59:40.445804" elapsed="0.031686"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:40.486329" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:40.486603" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:40.486816" 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-10-11T00:59:40.479582" elapsed="0.007288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:40.488024" 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-10-11T00:59:40.487359" elapsed="0.000761"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:40.488509" elapsed="0.000743"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:40.492749" level="INFO">${update} = ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:59:40.489613" elapsed="0.003197"/>
</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-10-11T00:59:40.493196" elapsed="0.000700"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:59:40.493991" elapsed="0.000061"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:59:40.478872" elapsed="0.015342"/>
</kw>
<msg time="2026-10-11T00:59:40.494368" 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-10-11T00:59:40.477916" elapsed="0.016541"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:40.495404" level="INFO">ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:40.494923" elapsed="0.000621"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:40.497340" level="INFO">Length is 162.</msg>
<msg time="2026-10-11T00:59:40.497523" 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-10-11T00:59:40.496817" elapsed="0.000756"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:40.498474" level="INFO">Length is 162.</msg>
<msg time="2026-10-11T00:59:40.498716" 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-10-11T00:59:40.497941" elapsed="0.000828"/>
</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-10-11T00:59:40.499174" elapsed="0.000657"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:40.500535" 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-10-11T00:59:40.500157" elapsed="0.000431"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:40.501269" 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-10-11T00:59:40.500930" elapsed="0.000390"/>
</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-10-11T00:59:40.501768" elapsed="0.000583"/>
</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-10-11T00:59:40.496026" elapsed="0.006479"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:40.509949" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:40.510178" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:40.510364" 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-10-11T00:59:40.503727" elapsed="0.006720"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:40.511571" 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-10-11T00:59:40.510928" elapsed="0.000740"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:40.512048" elapsed="0.000771"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:40.519612" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:40.519866" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:40.520072" 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-10-11T00:59:40.513194" elapsed="0.006934"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:40.521253" 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-10-11T00:59:40.520619" elapsed="0.000729"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:40.521771" elapsed="0.000753"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T00:59:40.523027" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-10-11T00:59:40.522695" elapsed="0.000451"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:40.522637" elapsed="0.000557"/>
</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-10-11T00:59:40.523555" elapsed="0.000045"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:59:40.503027" elapsed="0.020725"/>
</kw>
<arg>route_eth_lacp_extmac</arg>
<status status="PASS" start="2026-10-11T00:59:38.363948" elapsed="2.159897"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:38.212301" elapsed="2.311838"/>
</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-10-11T00:59:40.528112" elapsed="0.000485"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:59:40.527531" elapsed="0.001203"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:40.530131" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:40.530008" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:40.529984" 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-10-11T00:59:40.533086" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:40.532972" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:40.532949" elapsed="0.000225"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:40.534473" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:59:40.534001" elapsed="0.000508"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:59:40.535102" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:59:40.534739" elapsed="0.000396"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:59:40.535190" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T00:59:40.535364" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:59:40.533483" elapsed="0.001913"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:40.540897" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:40.540776" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:40.540751" elapsed="0.000235"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:40.542627" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:40.542464" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:40.542436" elapsed="0.000420"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:59:40.543579" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:59:40.543068" elapsed="0.000595"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:59:40.544516" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:59:40.544170" elapsed="0.000427"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:59:40.584226" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:59:40.546835" elapsed="0.037515"/>
</kw>
<msg time="2026-10-11T00:59:40.584496" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:59:40.584584" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:40.545039" elapsed="0.039613"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:59:40.627852" 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-10-11T00:59:40.586249" elapsed="0.041735"/>
</kw>
<msg time="2026-10-11T00:59:40.628104" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:59:40.628191" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:40.585062" elapsed="0.043197"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:40.628888" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:40.628579" elapsed="0.000436"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:40.628559" elapsed="0.000512"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:40.629766" 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-10-11T00:59:40.629258" elapsed="0.000658"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:40.630373" elapsed="0.000081"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:40.630084" elapsed="0.000435"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:40.630064" elapsed="0.000511"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:59:40.630609" 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-10-11T00:59:40.634092" elapsed="0.000121"/>
</kw>
<msg time="2026-10-11T00:59:40.634252" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:59:40.633600" elapsed="0.000712"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:40.634752" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:40.634963" 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-10-11T00:59:40.632851" elapsed="0.002325"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:59:40.630897" elapsed="0.004358"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:59:40.542030" elapsed="0.093390"/>
</kw>
<msg time="2026-10-11T00:59:40.635505" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:40.635544" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:40.541201" elapsed="0.094378"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:59:40.635744" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:59:40.635647" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:40.635630" elapsed="0.000188"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:40.636197" 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-10-11T00:59:40.636604" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:59:40.636670" elapsed="0.000026"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T00:59:40.540335" elapsed="0.096433"/>
</kw>
<msg time="2026-10-11T00:59:40.636849" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:40.636889" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:40.535900" elapsed="0.101024"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:40.637216" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:40.636990" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:40.636974" elapsed="0.000312"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:59:40.535699" elapsed="0.101608"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:59:40.535483" elapsed="0.101852"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:59:40.532555" elapsed="0.104828"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:59:40.529639" elapsed="0.107813"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:40.529066" elapsed="0.108426"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:59:40.526736" elapsed="0.110802"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:40.642989" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:40.643126" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:40.643219" 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-10-11T00:59:40.637943" elapsed="0.005300"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:40.643440" elapsed="0.000358"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:40.647785" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:40.647887" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:40.647979" 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-10-11T00:59:40.643959" elapsed="0.004045"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:40.648876" 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-10-11T00:59:40.648605" elapsed="0.000298"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:40.649283" 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-10-11T00:59:40.649053" elapsed="0.000255"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:40.649506" elapsed="0.000286"/>
</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-10-11T00:59:40.648207" elapsed="0.001640"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:40.637663" elapsed="0.012231"/>
</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-10-11T00:59:40.525734" elapsed="0.124195"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:40.650566" 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-10-11T00:59:40.650776" 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-10-11T00:59:40.650404" elapsed="0.000399"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:59:40.658804" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:59:40.658489" elapsed="0.000341"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:59:40.659527" 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-10-11T00:59:40.659309" elapsed="0.000287">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-10-11T00:59:40.659692" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:59:40.658989" elapsed="0.000727"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:40.660199" 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-10-11T00:59:40.659890" elapsed="0.000334"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:40.660559" 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-10-11T00:59:40.660689" 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-10-11T00:59:40.660446" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:40.661126" 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-10-11T00:59:40.660909" elapsed="0.000265"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:59:40.661510" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:40.661235" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:59:40.662013" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:59:40.661749" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:40.661587" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:40.661218" elapsed="0.000871"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:59:40.662651" 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-10-11T00:59:40.662253" elapsed="0.000437"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:59:40.662735" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:59:40.662861" 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-10-11T00:59:40.658054" elapsed="0.004832"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:40.663188" 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-10-11T00:59:40.663302" 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-10-11T00:59:40.663050" elapsed="0.000276"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:40.663640" 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-10-11T00:59:40.663767" 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-10-11T00:59:40.663504" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:40.664204" 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-10-11T00:59:40.663986" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:40.664696" 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-10-11T00:59:40.664464" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:40.665177" level="INFO">ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:40.664965" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:40.665635" level="INFO">ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:40.665421" elapsed="0.000267"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:40.665828" elapsed="0.002554"/>
</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-10-11T00:59:40.668549" elapsed="0.002320"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:40.675527" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:40.675632" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:40.675742" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T00:59:40.671812" elapsed="0.004305">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:40.676298" elapsed="0.000021"/>
</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-10-11T00:59:40.676525" elapsed="0.000023"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T00:59:40.671491" elapsed="0.005147">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:42.685967" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:42.686231" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:42.686468" 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-10-11T00:59:42.677950" elapsed="0.008576"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T00:59:42.687498" 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-10-11T00:59:42.687758" 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-10-11T00:59:42.686933" elapsed="0.000998"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:42.690350" 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-10-11T00:59:42.689278" elapsed="0.001163"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:42.691814" 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-10-11T00:59:42.690812" elapsed="0.001062"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:42.692287" elapsed="0.000676"/>
</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-10-11T00:59:42.688376" elapsed="0.004714"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T00:59:42.677154" elapsed="0.016044"/>
</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-10-11T00:59:40.671067" elapsed="2.022221"/>
</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-10-11T00:59:42.693644" elapsed="0.004100"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:42.706173" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:42.706405" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:42.706645" 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-10-11T00:59:42.699802" elapsed="0.006920"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:42.707114" elapsed="0.000842"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:42.715369" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:42.715663" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:42.715902" 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-10-11T00:59:42.708318" elapsed="0.007637"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:42.717920" 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-10-11T00:59:42.717324" elapsed="0.000657"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:42.719468" 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-10-11T00:59:42.718324" elapsed="0.001206"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T00:59:42.720605" 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-10-11T00:59:42.721150" 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-10-11T00:59:42.719967" elapsed="0.001342">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-10-11T00:59:42.716443" elapsed="0.005222">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-10-11T00:59:42.699134" elapsed="0.022842">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-10-11T00:59:44.730634" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:44.730930" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:44.731139" 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-10-11T00:59:44.723333" elapsed="0.007862"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:44.731636" elapsed="0.000880"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:44.739395" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:44.739669" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:44.739902" 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-10-11T00:59:44.732912" elapsed="0.007046"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:44.742093" 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-10-11T00:59:44.741500" elapsed="0.000653"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:44.743071" 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-10-11T00:59:44.742531" elapsed="0.000599"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:44.743575" elapsed="0.000664"/>
</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-10-11T00:59:44.740577" elapsed="0.003792"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:44.722571" elapsed="0.021942"/>
</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-10-11T00:59:42.698167" elapsed="2.046426"/>
</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-10-11T00:59:44.745737" elapsed="0.003932"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:44.758939" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:44.759172" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:44.759382" 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-10-11T00:59:44.752196" elapsed="0.007284"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:44.759931" elapsed="0.000864"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:44.768388" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:44.768663" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:44.768900" 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-10-11T00:59:44.761165" elapsed="0.007791"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:44.770968" 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-10-11T00:59:44.770370" elapsed="0.000658"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:44.771933" 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-10-11T00:59:44.771365" 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-10-11T00:59:44.772398" elapsed="0.000672"/>
</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-10-11T00:59:44.769438" elapsed="0.003753"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:44.751094" elapsed="0.022202"/>
</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-10-11T00:59:44.750163" elapsed="0.023211"/>
</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-10-11T00:59:44.744975" elapsed="0.028541"/>
</kw>
<arg>route_eth_lacp_extmac</arg>
<status status="PASS" start="2026-10-11T00:59:40.650107" elapsed="4.123580"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:40.524743" elapsed="4.249183"/>
</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-10-11T00:59:44.777977" elapsed="0.000477"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:59:44.777355" elapsed="0.001212"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:44.780817" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:44.780578" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:44.780530" elapsed="0.000443"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:44.785655" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:44.785465" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:44.785396" elapsed="0.000422"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:44.787940" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:59:44.787150" elapsed="0.000847"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:59:44.788991" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:59:44.788343" elapsed="0.000703"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:59:44.789135" elapsed="0.000073"/>
</return>
<msg time="2026-10-11T00:59:44.789463" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:59:44.786285" elapsed="0.003231"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:44.794030" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:44.793912" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:44.793888" elapsed="0.000230"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:44.795798" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:44.795622" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:44.795597" elapsed="0.000419"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:59:44.796765" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:59:44.796232" elapsed="0.000619"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:59:44.797694" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:59:44.797339" elapsed="0.000452"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:59:44.833422" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:59:44.799901" elapsed="0.033646"/>
</kw>
<msg time="2026-10-11T00:59:44.833692" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:59:44.833791" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:44.798219" elapsed="0.035644"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:59:44.867771" 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-10-11T00:59:44.835468" elapsed="0.032432"/>
</kw>
<msg time="2026-10-11T00:59:44.868022" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:59:44.868110" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:44.834255" elapsed="0.033926"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:44.868817" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:44.868502" elapsed="0.000445"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:44.868481" elapsed="0.000521"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:44.869708" 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-10-11T00:59:44.869198" elapsed="0.000660"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:44.870326" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:44.870027" elapsed="0.000443"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:44.870008" elapsed="0.000519"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:59:44.870560" 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-10-11T00:59:44.874029" elapsed="0.000120"/>
</kw>
<msg time="2026-10-11T00:59:44.874189" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:59:44.873532" elapsed="0.000720"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:44.874505" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:44.874729" 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-10-11T00:59:44.872786" elapsed="0.002160"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:59:44.870852" elapsed="0.004174"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:59:44.795185" elapsed="0.079993"/>
</kw>
<msg time="2026-10-11T00:59:44.875261" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:44.875300" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:44.794333" elapsed="0.081003"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:59:44.875508" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:59:44.875420" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:44.875386" elapsed="0.000198"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:44.875985" 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-10-11T00:59:44.876375" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:59:44.876482" 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-10-11T00:59:44.793497" elapsed="0.083075"/>
</kw>
<msg time="2026-10-11T00:59:44.876655" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:44.876695" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:44.790294" elapsed="0.086447"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:44.877038" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:44.876810" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:44.876793" elapsed="0.000316"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:59:44.789971" elapsed="0.087159"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:59:44.789627" elapsed="0.087533"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:59:44.784778" elapsed="0.092432"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:59:44.779958" elapsed="0.097301"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:44.778924" elapsed="0.098374"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:59:44.776561" elapsed="0.100783"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:44.882523" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:44.882663" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:44.882765" 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-10-11T00:59:44.877783" elapsed="0.005006"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:44.882963" elapsed="0.000556"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:44.887771" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:44.887872" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:44.887964" 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-10-11T00:59:44.883682" elapsed="0.004307"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:44.888858" 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-10-11T00:59:44.888597" elapsed="0.000288"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:44.889274" 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-10-11T00:59:44.889039" elapsed="0.000260"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:44.889500" elapsed="0.000292"/>
</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-10-11T00:59:44.888193" elapsed="0.001655"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:44.877498" elapsed="0.012398"/>
</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-10-11T00:59:44.775540" elapsed="0.114392"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:44.890638" 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-10-11T00:59:44.890799" 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-10-11T00:59:44.890483" elapsed="0.000343"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:44.891133" 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-10-11T00:59:44.891258" 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-10-11T00:59:44.890994" elapsed="0.000289"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:44.891602" 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-10-11T00:59:44.891730" 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-10-11T00:59:44.891463" elapsed="0.000292"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:59:44.892098" 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-10-11T00:59:44.891921" elapsed="0.000201"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:44.892478" 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-10-11T00:59:44.892595" 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-10-11T00:59:44.892322" elapsed="0.000298"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:59:44.892963" 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-10-11T00:59:44.892793" elapsed="0.000195"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:44.893424" 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-10-11T00:59:44.893186" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:44.893899" 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-10-11T00:59:44.893671" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:44.894352" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000102f20cdd809ff70014000000000a05dc10</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:44.894138" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:44.894826" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000102f20cdd809ff70014000000000a05dc10</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:44.894599" elapsed="0.000267"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:44.895004" elapsed="0.002684"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:44.908278" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T00:59:44.908337" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:44.908447" 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-10-11T00:59:44.897862" elapsed="0.010611"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:44.908978" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:44.908686" elapsed="0.000331"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:44.914202" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:44.914344" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:44.914462" 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-10-11T00:59:44.909174" elapsed="0.005314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:44.914985" 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-10-11T00:59:44.914695" elapsed="0.000334"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:44.920427" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:44.920537" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:44.920624" 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-10-11T00:59:44.915961" elapsed="0.004687"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:44.921146" 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-10-11T00:59:44.920869" elapsed="0.000321"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:44.921354" elapsed="0.000359"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:44.924286" level="INFO">${update} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000102f20cdd809ff70014000000000a05dc10</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:59:44.921866" elapsed="0.002448"/>
</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-10-11T00:59:44.924496" elapsed="0.000332"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:59:44.924872" elapsed="0.000028"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:59:44.915640" elapsed="0.009336"/>
</kw>
<msg time="2026-10-11T00:59:44.925047" 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-10-11T00:59:44.915213" elapsed="0.009857"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:44.925517" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000102f20cdd809ff70014000000000a05dc10</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:44.925271" elapsed="0.000288"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:44.926350" level="INFO">Length is 152.</msg>
<msg time="2026-10-11T00:59:44.926446" 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-10-11T00:59:44.926114" elapsed="0.000356"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:44.926869" level="INFO">Length is 152.</msg>
<msg time="2026-10-11T00:59:44.926936" 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-10-11T00:59:44.926625" elapsed="0.000332"/>
</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-10-11T00:59:44.927137" elapsed="0.000282"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:44.927740" 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-10-11T00:59:44.927568" elapsed="0.000196"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:44.928096" 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-10-11T00:59:44.927943" elapsed="0.000177"/>
</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-10-11T00:59:44.928298" elapsed="0.000284"/>
</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-10-11T00:59:44.925783" elapsed="0.002853"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:44.928785" elapsed="0.002063"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:44.935516" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:44.935626" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:44.935726" 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-10-11T00:59:44.931375" elapsed="0.004377"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:44.936240" 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-10-11T00:59:44.935962" elapsed="0.000325"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:44.936465" elapsed="0.000339"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:44.941469" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:44.941583" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:44.941678" 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-10-11T00:59:44.936965" elapsed="0.004751"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:44.942198" 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-10-11T00:59:44.941925" elapsed="0.000318"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:44.942405" elapsed="0.000356"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T00:59:44.942979" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:44.942830" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:44.942813" elapsed="0.000224"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:44.948887" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:44.948957" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:44.949048" 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-10-11T00:59:44.943184" elapsed="0.005889"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:59:44.931074" elapsed="0.018058"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:44.954500" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:44.954603" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:44.954686" 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-10-11T00:59:44.950060" elapsed="0.004663"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:44.955205" 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-10-11T00:59:44.954931" elapsed="0.000317"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:44.955425" elapsed="0.000339"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:44.958826" level="INFO">${update} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000102f20cdd809ff70014000000000a05dc10</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:59:44.955913" elapsed="0.002941"/>
</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-10-11T00:59:44.959013" elapsed="0.000319"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:59:44.959376" elapsed="0.000028"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:59:44.949752" elapsed="0.009751"/>
</kw>
<msg time="2026-10-11T00:59:44.959574" 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-10-11T00:59:44.949314" elapsed="0.010283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:44.960030" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000102f20cdd809ff70014000000000a05dc10</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:44.959809" elapsed="0.000262"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:44.960897" level="INFO">Length is 140.</msg>
<msg time="2026-10-11T00:59:44.960966" 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-10-11T00:59:44.960634" elapsed="0.000354"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:44.961378" level="INFO">Length is 140.</msg>
<msg time="2026-10-11T00:59:44.961470" 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-10-11T00:59:44.961141" 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-10-11T00:59:44.961674" elapsed="0.000282"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:44.962257" 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-10-11T00:59:44.962102" elapsed="0.000181"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:44.962619" 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-10-11T00:59:44.962462" elapsed="0.000181"/>
</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-10-11T00:59:44.962835" elapsed="0.000265"/>
</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-10-11T00:59:44.960281" elapsed="0.002873"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:44.967926" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:44.968062" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:44.968148" 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-10-11T00:59:44.963693" elapsed="0.004479"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:44.968673" 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-10-11T00:59:44.968375" elapsed="0.000353"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:44.968891" elapsed="0.000320"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:44.973365" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:44.973489" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:44.973582" 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-10-11T00:59:44.969371" elapsed="0.004235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:44.974101" 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-10-11T00:59:44.973827" elapsed="0.000316"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:44.974305" elapsed="0.000338"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T00:59:44.974872" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:59:44.974725" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:44.974695" elapsed="0.000302"/>
</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-10-11T00:59:44.975153" elapsed="0.000019"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:59:44.963381" elapsed="0.011851"/>
</kw>
<arg>route_eth_lan</arg>
<status status="PASS" start="2026-10-11T00:59:44.890170" elapsed="0.085102"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:44.774520" elapsed="0.200838"/>
</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-10-11T00:59:44.977108" elapsed="0.000201"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:59:44.976855" elapsed="0.000504"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:44.978452" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:44.978191" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:44.978171" elapsed="0.000346"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:44.980597" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:44.980513" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:44.980496" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:44.981584" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:59:44.981237" elapsed="0.000372"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:59:44.982038" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:59:44.981774" elapsed="0.000288"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:59:44.982102" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:59:44.982228" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:59:44.980877" elapsed="0.001376"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:44.984851" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:44.984767" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:44.984749" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:44.986061" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:44.985947" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:44.985929" elapsed="0.000281"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:59:44.986742" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:59:44.986363" elapsed="0.000439"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:59:44.987366" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:59:44.987145" elapsed="0.000296"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:59:45.022111" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:59:44.988915" elapsed="0.033320"/>
</kw>
<msg time="2026-10-11T00:59:45.022359" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:59:45.022463" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:44.987753" elapsed="0.034781"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:59:45.056619" 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-10-11T00:59:45.024124" elapsed="0.032632"/>
</kw>
<msg time="2026-10-11T00:59:45.056875" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:59:45.056963" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:45.022937" elapsed="0.034095"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:45.057641" elapsed="0.000075"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:45.057319" elapsed="0.000464"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:45.057299" elapsed="0.000540"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:45.058515" 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-10-11T00:59:45.058027" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:45.059090" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:45.058801" elapsed="0.000414"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:45.058783" elapsed="0.000488"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:59:45.059312" 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-10-11T00:59:45.062979" elapsed="0.000120"/>
</kw>
<msg time="2026-10-11T00:59:45.063138" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:59:45.062265" elapsed="0.000932"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:45.063588" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:45.063813" 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-10-11T00:59:45.061543" elapsed="0.002484"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:59:45.059609" elapsed="0.004496"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:59:44.985645" elapsed="0.078607"/>
</kw>
<msg time="2026-10-11T00:59:45.064336" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:45.064375" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:44.985068" elapsed="0.079359"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:59:45.064613" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:59:45.064528" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:45.064509" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:45.065091" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:45.065521" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:59:45.065587" 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-10-11T00:59:44.984466" elapsed="0.081208"/>
</kw>
<msg time="2026-10-11T00:59:45.065774" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:45.065814" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:44.982646" elapsed="0.083202"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:45.066133" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:45.065915" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:45.065898" elapsed="0.000306"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:59:44.982500" elapsed="0.083727"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:59:44.982339" elapsed="0.083917"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:59:44.980203" elapsed="0.086101"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:59:44.977934" elapsed="0.088420"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:44.977525" elapsed="0.088868"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:59:44.976492" elapsed="0.089966"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:45.071743" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:45.071851" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:45.071945" 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-10-11T00:59:45.066867" elapsed="0.005102"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:45.072142" elapsed="0.000367"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:45.077119" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:45.077220" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:45.077312" 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-10-11T00:59:45.072670" elapsed="0.004666"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:45.078234" 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-10-11T00:59:45.077988" elapsed="0.000273"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:45.078663" 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-10-11T00:59:45.078429" elapsed="0.000260"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:45.078885" elapsed="0.000276"/>
</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-10-11T00:59:45.077593" elapsed="0.001624"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:45.066586" elapsed="0.012686"/>
</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-10-11T00:59:44.976050" elapsed="0.103257"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:45.079961" 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-10-11T00:59:45.080084" 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-10-11T00:59:45.079818" elapsed="0.000293"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:59:45.088475" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:59:45.088139" elapsed="0.000363"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:59:45.089205" 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-10-11T00:59:45.089003" elapsed="0.000272">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-10-11T00:59:45.089362" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:59:45.088664" elapsed="0.000720"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:45.089901" 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-10-11T00:59:45.089575" elapsed="0.000351"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:45.090202" 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-10-11T00:59:45.090317" 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-10-11T00:59:45.090094" elapsed="0.000248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:45.090783" 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-10-11T00:59:45.090551" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:59:45.091143" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:45.090890" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:59:45.091643" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:59:45.091365" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:45.091217" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:45.090873" elapsed="0.000862"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:59:45.092281" 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-10-11T00:59:45.091900" elapsed="0.000434"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:59:45.092381" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T00:59:45.092527" 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-10-11T00:59:45.087711" elapsed="0.004842"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:45.092870" 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-10-11T00:59:45.092985" 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-10-11T00:59:45.092730" elapsed="0.000279"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:45.093308" 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-10-11T00:59:45.093435" 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-10-11T00:59:45.093172" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:45.093895" 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-10-11T00:59:45.093653" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:45.094357" 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-10-11T00:59:45.094140" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:45.094836" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000102f20cdd809ff70014000000000a05dc10</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:45.094608" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:45.095274" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000102f20cdd809ff70014000000000a05dc10</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:45.095065" elapsed="0.000249"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:45.095467" elapsed="0.002388"/>
</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-10-11T00:59:45.098001" elapsed="0.002443"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:45.105276" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:45.105381" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:45.105501" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T00:59:45.101360" elapsed="0.004541">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:45.106085" 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-10-11T00:59:45.106298" elapsed="0.000022"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T00:59:45.101054" elapsed="0.005380">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:47.118390" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:47.118733" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:47.118965" 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-10-11T00:59:47.107828" elapsed="0.011194"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T00:59:47.120016" 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-10-11T00:59:47.120259" 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-10-11T00:59:47.119403" elapsed="0.000951"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:47.122784" 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-10-11T00:59:47.121818" elapsed="0.001031"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:47.124131" 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-10-11T00:59:47.123194" elapsed="0.000998"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:47.124639" elapsed="0.000663"/>
</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-10-11T00:59:47.120854" elapsed="0.004610"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T00:59:47.106982" elapsed="0.018597"/>
</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-10-11T00:59:45.100631" elapsed="2.025042"/>
</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-10-11T00:59:47.126019" elapsed="0.003653"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:47.138620" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:47.138880" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:47.139162" 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-10-11T00:59:47.131762" elapsed="0.007456"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:47.139644" elapsed="0.000836"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:47.147581" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:47.147860" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:47.148076" 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-10-11T00:59:47.140866" elapsed="0.007265"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:47.150099" 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-10-11T00:59:47.149531" elapsed="0.000628"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:47.151553" 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-10-11T00:59:47.150529" elapsed="0.001084"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T00:59:47.152682" 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-10-11T00:59:47.153165" 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-10-11T00:59:47.152050" elapsed="0.001267">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-10-11T00:59:47.148627" elapsed="0.005006">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-10-11T00:59:47.131100" elapsed="0.022874">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-10-11T00:59:49.163874" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:49.164124" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:49.164346" 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-10-11T00:59:49.155374" elapsed="0.009027"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:49.164865" elapsed="0.000833"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:49.172716" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:49.172984" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:49.173192" 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-10-11T00:59:49.166089" elapsed="0.007158"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:49.175243" 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-10-11T00:59:49.174660" elapsed="0.000643"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:49.176220" 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-10-11T00:59:49.175677" elapsed="0.000602"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:49.176747" elapsed="0.000637"/>
</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-10-11T00:59:49.173766" elapsed="0.003777"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:49.154504" elapsed="0.023151"/>
</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-10-11T00:59:47.130157" elapsed="2.047600"/>
</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-10-11T00:59:49.178886" elapsed="0.003579"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:49.190843" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:49.191073" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:49.191340" 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-10-11T00:59:49.184615" elapsed="0.006780"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:49.191840" elapsed="0.000800"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:49.198953" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:49.199181" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:49.199385" 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-10-11T00:59:49.193027" elapsed="0.006445"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:49.201509" 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-10-11T00:59:49.200930" elapsed="0.000641"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:49.202482" 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-10-11T00:59:49.201932" elapsed="0.000610"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:49.203006" elapsed="0.000657"/>
</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-10-11T00:59:49.199954" elapsed="0.003859"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:49.183913" elapsed="0.020009"/>
</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-10-11T00:59:49.182990" elapsed="0.021009"/>
</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-10-11T00:59:49.178125" elapsed="0.025983"/>
</kw>
<arg>route_eth_lan</arg>
<status status="PASS" start="2026-10-11T00:59:45.079506" elapsed="4.124698"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:44.975622" elapsed="4.228813"/>
</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-10-11T00:59:49.208479" elapsed="0.000847"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:59:49.207878" elapsed="0.001597"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:49.211627" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:49.211379" elapsed="0.000378"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:49.211334" elapsed="0.000473"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:49.216496" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:49.216273" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:49.216235" elapsed="0.000405"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.219147" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:59:49.218071" elapsed="0.001135"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.219911" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:59:49.219511" elapsed="0.000434"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:59:49.220002" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T00:59:49.220185" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:59:49.217201" elapsed="0.003018"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:49.223857" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:49.223714" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:49.223690" elapsed="0.000260"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:49.225670" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:49.225509" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:49.225485" elapsed="0.000420"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:59:49.226639" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:59:49.226121" elapsed="0.000617"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:59:49.227595" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:59:49.227243" elapsed="0.000437"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:59:49.265769" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:59:49.229828" elapsed="0.036064"/>
</kw>
<msg time="2026-10-11T00:59:49.266037" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:59:49.266125" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:49.228134" elapsed="0.038063"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:59:49.303504" 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-10-11T00:59:49.267817" elapsed="0.035814"/>
</kw>
<msg time="2026-10-11T00:59:49.303767" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:59:49.303856" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:49.266610" elapsed="0.037317"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:49.304546" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:49.304221" elapsed="0.000455"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:49.304200" elapsed="0.000548"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.305448" 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-10-11T00:59:49.304946" elapsed="0.000620"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:49.306202" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:49.305750" elapsed="0.000583"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:49.305717" elapsed="0.000671"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:59:49.306447" 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-10-11T00:59:49.310160" elapsed="0.000122"/>
</kw>
<msg time="2026-10-11T00:59:49.310323" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:59:49.309625" elapsed="0.000761"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:49.310830" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:49.311047" 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-10-11T00:59:49.308829" elapsed="0.002433"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:59:49.306763" 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-10-11T00:59:49.225076" elapsed="0.086438"/>
</kw>
<msg time="2026-10-11T00:59:49.311599" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:49.311640" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:49.224162" elapsed="0.087516"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:59:49.311848" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:59:49.311760" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:49.311741" elapsed="0.000184"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:49.312315" elapsed="0.000062"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:49.312793" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:59:49.312860" 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-10-11T00:59:49.223288" elapsed="0.089659"/>
</kw>
<msg time="2026-10-11T00:59:49.313030" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:49.313070" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:49.220718" elapsed="0.092388"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:49.313397" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:49.313173" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:49.313157" elapsed="0.000329"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:59:49.220515" elapsed="0.092993"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:59:49.220292" elapsed="0.093245"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:59:49.215566" elapsed="0.098023"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:59:49.210794" elapsed="0.102846"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:49.209842" elapsed="0.103839"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:59:49.207051" elapsed="0.106695"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:49.319466" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:49.319605" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:49.319710" 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-10-11T00:59:49.314158" elapsed="0.005593"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:49.319930" elapsed="0.000370"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:49.324547" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:49.324650" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:49.324755" 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-10-11T00:59:49.320483" elapsed="0.004298"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:49.325661" 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-10-11T00:59:49.325380" elapsed="0.000309"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:49.326089" 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-10-11T00:59:49.325856" 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-10-11T00:59:49.326337" elapsed="0.000311"/>
</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-10-11T00:59:49.324991" elapsed="0.001714"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:49.313888" elapsed="0.012883"/>
</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-10-11T00:59:49.206044" elapsed="0.120765"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:49.327523" 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-10-11T00:59:49.327707" 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-10-11T00:59:49.327351" elapsed="0.000398"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:49.328056" 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-10-11T00:59:49.328175" 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-10-11T00:59:49.327916" elapsed="0.000285"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:49.328525" 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-10-11T00:59:49.328641" 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-10-11T00:59:49.328365" elapsed="0.000301"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:59:49.329024" 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-10-11T00:59:49.328845" elapsed="0.000204"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:49.329605" 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-10-11T00:59:49.329737" 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-10-11T00:59:49.329214" elapsed="0.000549"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:59:49.330097" 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-10-11T00:59:49.329926" elapsed="0.000196"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.330563" 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-10-11T00:59:49.330320" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.331047" 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-10-11T00:59:49.330827" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.331556" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000103f20cdd809ff70007d00000000a05dc10</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:49.331316" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.332019" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000103f20cdd809ff70007d00000000a05dc10</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:49.331804" elapsed="0.000257"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:49.332202" elapsed="0.002772"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:49.344714" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T00:59:49.344792" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:49.344885" 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-10-11T00:59:49.335136" elapsed="0.009774"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.345401" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:49.345120" elapsed="0.000344"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:49.352657" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:49.352784" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:49.352879" 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-10-11T00:59:49.345622" elapsed="0.007282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.353388" 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-10-11T00:59:49.353111" elapsed="0.000344"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:49.358931" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:49.359041" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:49.359160" 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-10-11T00:59:49.354388" elapsed="0.004797"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.359696" 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-10-11T00:59:49.359393" elapsed="0.000366"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:49.359926" elapsed="0.000337"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:49.362748" level="INFO">${update} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000103f20cdd809ff70007d00000000a05dc10</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:59:49.360433" elapsed="0.002343"/>
</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-10-11T00:59:49.362935" elapsed="0.000336"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:59:49.363317" elapsed="0.000035"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:59:49.354070" elapsed="0.009383"/>
</kw>
<msg time="2026-10-11T00:59:49.363525" 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-10-11T00:59:49.353642" elapsed="0.009908"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.363983" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000103f20cdd809ff70007d00000000a05dc10</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:49.363763" elapsed="0.000263"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.364855" level="INFO">Length is 152.</msg>
<msg time="2026-10-11T00:59:49.364924" 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-10-11T00:59:49.364600" elapsed="0.000346"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.365328" level="INFO">Length is 152.</msg>
<msg time="2026-10-11T00:59:49.365394" 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-10-11T00:59:49.365101" elapsed="0.000343"/>
</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-10-11T00:59:49.365632" elapsed="0.000283"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:49.366221" 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-10-11T00:59:49.366062" elapsed="0.000182"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:49.366556" 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-10-11T00:59:49.366385" elapsed="0.000194"/>
</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-10-11T00:59:49.366771" elapsed="0.000262"/>
</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-10-11T00:59:49.364240" elapsed="0.002846"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:49.367224" elapsed="0.002279"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:49.374052" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:49.374162" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:49.374257" 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-10-11T00:59:49.370011" elapsed="0.004271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.374799" 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-10-11T00:59:49.374509" elapsed="0.000367"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:49.375043" elapsed="0.000330"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:49.379582" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:49.379690" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:49.379801" 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-10-11T00:59:49.375553" elapsed="0.004274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.380311" 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-10-11T00:59:49.380034" elapsed="0.000322"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:49.380537" elapsed="0.000341"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T00:59:49.381108" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:49.380954" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:49.380934" elapsed="0.000235"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:49.387284" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:49.387326" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:49.387441" 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-10-11T00:59:49.381318" elapsed="0.006149"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:59:49.369698" elapsed="0.017831"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:49.392603" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:49.392706" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:49.392804" 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-10-11T00:59:49.388460" elapsed="0.004368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.393313" 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-10-11T00:59:49.393036" elapsed="0.000319"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:49.393535" elapsed="0.000338"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:49.396402" level="INFO">${update} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000103f20cdd809ff70007d00000000a05dc10</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:59:49.394024" elapsed="0.002425"/>
</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-10-11T00:59:49.396609" elapsed="0.000325"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:59:49.396978" elapsed="0.000028"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:59:49.388134" elapsed="0.008946"/>
</kw>
<msg time="2026-10-11T00:59:49.397151" 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-10-11T00:59:49.387710" elapsed="0.009464"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.397617" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000103f20cdd809ff70007d00000000a05dc10</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:49.397375" elapsed="0.000284"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.398478" level="INFO">Length is 140.</msg>
<msg time="2026-10-11T00:59:49.398547" 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-10-11T00:59:49.398212" elapsed="0.000357"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.398967" level="INFO">Length is 140.</msg>
<msg time="2026-10-11T00:59:49.399034" 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-10-11T00:59:49.398737" elapsed="0.000319"/>
</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-10-11T00:59:49.399238" elapsed="0.000282"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:49.399834" 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-10-11T00:59:49.399666" elapsed="0.000192"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:49.400149" 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-10-11T00:59:49.400000" elapsed="0.000172"/>
</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-10-11T00:59:49.400349" elapsed="0.000285"/>
</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-10-11T00:59:49.397880" elapsed="0.002808"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:49.405553" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:49.405656" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:49.405755" 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-10-11T00:59:49.401220" elapsed="0.004560"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.406258" 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-10-11T00:59:49.405986" elapsed="0.000315"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:49.406478" elapsed="0.000331"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:49.410994" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:49.411096" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:49.411220" 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-10-11T00:59:49.406969" elapsed="0.004276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.411764" 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-10-11T00:59:49.411476" elapsed="0.000332"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:49.411970" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T00:59:49.412521" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-11T00:59:49.412356" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:49.412338" elapsed="0.000260"/>
</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-10-11T00:59:49.412762" elapsed="0.000021"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:59:49.400927" elapsed="0.011916"/>
</kw>
<arg>route_eth_mac</arg>
<status status="PASS" start="2026-10-11T00:59:49.327049" elapsed="0.085833"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:49.205043" elapsed="0.207937"/>
</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-10-11T00:59:49.414833" elapsed="0.000199"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:59:49.414566" elapsed="0.000517"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:49.416000" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:49.415913" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:49.415895" elapsed="0.000168"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:49.418128" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:49.418046" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:49.418029" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.419109" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:59:49.418783" elapsed="0.000351"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.419565" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:59:49.419288" elapsed="0.000301"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:59:49.419628" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:59:49.419767" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:59:49.418399" elapsed="0.001390"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:49.422501" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:49.422399" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:49.422381" elapsed="0.000184"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:49.423757" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:49.423628" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:49.423610" elapsed="0.000301"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:59:49.424435" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:59:49.424067" elapsed="0.000430"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:59:49.425082" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:59:49.424856" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:59:49.463057" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:59:49.426644" elapsed="0.036530"/>
</kw>
<msg time="2026-10-11T00:59:49.463310" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:59:49.463398" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:49.425465" elapsed="0.038027"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:59:49.500515" 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-10-11T00:59:49.465076" elapsed="0.035562"/>
</kw>
<msg time="2026-10-11T00:59:49.500771" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:59:49.500858" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:49.463891" elapsed="0.037036"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:49.501549" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:49.501212" elapsed="0.000466"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:49.501191" elapsed="0.000557"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.502426" 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-10-11T00:59:49.501939" elapsed="0.000605"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:49.503016" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:49.502709" elapsed="0.000434"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:49.502689" elapsed="0.000509"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:59:49.503232" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:59:49.506824" elapsed="0.000120"/>
</kw>
<msg time="2026-10-11T00:59:49.506984" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:59:49.506262" elapsed="0.000783"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:49.507276" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:49.507593" 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-10-11T00:59:49.505543" elapsed="0.002280"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:59:49.503537" elapsed="0.004365"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:59:49.423318" elapsed="0.084732"/>
</kw>
<msg time="2026-10-11T00:59:49.508135" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:49.508174" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:49.422731" elapsed="0.085478"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:59:49.508361" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:59:49.508277" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:49.508259" elapsed="0.000196"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:49.508853" 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-10-11T00:59:49.509235" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:59:49.509300" 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-10-11T00:59:49.422109" elapsed="0.087277"/>
</kw>
<msg time="2026-10-11T00:59:49.509500" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:49.509540" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:49.420130" elapsed="0.089447"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:49.509876" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:49.509643" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:49.509627" elapsed="0.000319"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:59:49.419986" elapsed="0.089982"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:59:49.419840" elapsed="0.090189"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:59:49.417755" elapsed="0.092325"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:59:49.415647" elapsed="0.094482"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:49.415234" elapsed="0.094935"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:59:49.414205" elapsed="0.096010"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:49.514815" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:49.514925" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:49.515009" 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-10-11T00:59:49.510635" elapsed="0.004397"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:49.515205" elapsed="0.000562"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:49.520320" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:49.520441" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:49.520540" 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-10-11T00:59:49.515932" elapsed="0.004631"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:49.521453" 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-10-11T00:59:49.521167" elapsed="0.000313"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:49.521876" 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-10-11T00:59:49.521633" elapsed="0.000269"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:49.522085" elapsed="0.000275"/>
</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-10-11T00:59:49.520785" elapsed="0.001646"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:49.510348" elapsed="0.012134"/>
</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-10-11T00:59:49.413778" elapsed="0.108744"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:49.523163" 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-10-11T00:59:49.523300" 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-10-11T00:59:49.523018" elapsed="0.000309"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.531367" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:59:49.531032" elapsed="0.000362"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:59:49.532122" 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-10-11T00:59:49.531915" elapsed="0.000282">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-10-11T00:59:49.532282" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:59:49.531572" elapsed="0.000733"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.532824" 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-10-11T00:59:49.532499" elapsed="0.000350"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:49.533125" 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-10-11T00:59:49.533241" 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-10-11T00:59:49.533017" elapsed="0.000248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.533701" 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-10-11T00:59:49.533482" 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-10-11T00:59:49.534126" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:49.533868" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.534632" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:59:49.534350" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:49.534202" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:49.533850" elapsed="0.000859"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.535270" 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-10-11T00:59:49.534887" elapsed="0.000409"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:59:49.535340" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:59:49.535487" 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-10-11T00:59:49.530597" elapsed="0.004915"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:49.535829" 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-10-11T00:59:49.535945" 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-10-11T00:59:49.535677" elapsed="0.000292"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:49.536265" 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-10-11T00:59:49.536374" 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-10-11T00:59:49.536130" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.536881" 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-10-11T00:59:49.536646" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.537371" 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-10-11T00:59:49.537156" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.537849" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000103f20cdd809ff70007d00000000a05dc10</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:49.537623" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:49.538292" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000103f20cdd809ff70007d00000000a05dc10</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:49.538080" elapsed="0.000253"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:49.538487" elapsed="0.002540"/>
</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-10-11T00:59:49.541178" elapsed="0.002044"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:49.547973" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:49.548076" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:49.548166" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T00:59:49.544158" elapsed="0.004392">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:49.548751" elapsed="0.000021"/>
</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-10-11T00:59:49.548963" elapsed="0.000022"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T00:59:49.543856" elapsed="0.005226">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:51.558930" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:51.559224" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:51.559471" 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-10-11T00:59:51.550753" elapsed="0.008778"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T00:59:51.560542" 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-10-11T00:59:51.560917" 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-10-11T00:59:51.559945" elapsed="0.001073"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:51.563403" 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-10-11T00:59:51.562395" elapsed="0.001100"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:51.564721" 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-10-11T00:59:51.563863" elapsed="0.000940"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:51.565215" elapsed="0.000679"/>
</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-10-11T00:59:51.561511" elapsed="0.004509"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T00:59:51.549789" elapsed="0.016337"/>
</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-10-11T00:59:49.543454" elapsed="2.022763"/>
</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-10-11T00:59:51.566575" elapsed="0.003714"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:51.579504" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:51.579764" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:51.579956" 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-10-11T00:59:51.572359" elapsed="0.007649"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:51.580394" elapsed="0.001305"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:51.588802" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:51.589046" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:51.589259" 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-10-11T00:59:51.582095" elapsed="0.007219"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:51.591270" 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-10-11T00:59:51.590710" elapsed="0.000620"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:51.592701" 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-10-11T00:59:51.591702" elapsed="0.001078"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T00:59:51.593919" 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-10-11T00:59:51.594322" 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-10-11T00:59:51.593259" elapsed="0.001251">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-10-11T00:59:51.589830" elapsed="0.005063">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-10-11T00:59:51.571725" elapsed="0.023416">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-10-11T00:59:53.603612" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:53.603884" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:53.604085" 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-10-11T00:59:53.596311" elapsed="0.007829"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:53.604573" elapsed="0.000820"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:53.612709" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:53.613026" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:53.613236" 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-10-11T00:59:53.605816" elapsed="0.007475"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:53.615280" 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-10-11T00:59:53.614705" elapsed="0.000634"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:53.616250" 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-10-11T00:59:53.615711" elapsed="0.000597"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:53.616768" elapsed="0.000627"/>
</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-10-11T00:59:53.613813" elapsed="0.003738"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:53.595640" elapsed="0.022019"/>
</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-10-11T00:59:51.570817" elapsed="2.046918"/>
</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-10-11T00:59:53.618888" elapsed="0.003661"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:53.631180" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:53.631448" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:53.631662" 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-10-11T00:59:53.625037" elapsed="0.006680"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:53.632131" elapsed="0.000820"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:53.639307" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:53.639576" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:53.639810" 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-10-11T00:59:53.633315" elapsed="0.006551"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:53.641885" 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-10-11T00:59:53.641292" elapsed="0.000652"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:53.642849" 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-10-11T00:59:53.642280" elapsed="0.000628"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:53.643316" elapsed="0.000686"/>
</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-10-11T00:59:53.640325" elapsed="0.003870"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:53.624295" elapsed="0.020008"/>
</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-10-11T00:59:53.623031" elapsed="0.021348"/>
</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-10-11T00:59:53.618116" elapsed="0.026407"/>
</kw>
<arg>route_eth_mac</arg>
<status status="PASS" start="2026-10-11T00:59:49.522707" elapsed="4.121913"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:49.413281" elapsed="4.231575"/>
</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-10-11T00:59:53.648991" elapsed="0.000469"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:59:53.648371" elapsed="0.001203"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:53.651705" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:53.651489" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:53.651439" elapsed="0.000450"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:53.659619" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:53.659384" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:53.659345" elapsed="0.000473"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.661505" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:59:53.661018" elapsed="0.000523"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.662136" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:59:53.661769" elapsed="0.000400"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:59:53.662224" elapsed="0.000046"/>
</return>
<msg time="2026-10-11T00:59:53.662430" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:59:53.660289" elapsed="0.002175"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:53.666016" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:53.665899" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:53.665875" 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-10-11T00:59:53.667770" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:53.667594" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:53.667568" elapsed="0.000418"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:59:53.668712" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:59:53.668196" elapsed="0.000642"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:59:53.669679" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:59:53.669328" elapsed="0.000451"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:59:53.705537" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:59:53.671881" elapsed="0.033775"/>
</kw>
<msg time="2026-10-11T00:59:53.705811" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:59:53.705902" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:53.670203" elapsed="0.035769"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:59:53.740155" 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-10-11T00:59:53.707610" elapsed="0.032669"/>
</kw>
<msg time="2026-10-11T00:59:53.740398" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:59:53.740511" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:53.706363" elapsed="0.034218"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:53.741207" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:53.740880" elapsed="0.000455"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:53.740860" elapsed="0.000529"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.742098" 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-10-11T00:59:53.741601" elapsed="0.000609"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:53.742690" elapsed="0.000111"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:53.742376" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:53.742357" elapsed="0.000564"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:59:53.742955" 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-10-11T00:59:53.746557" elapsed="0.000251"/>
</kw>
<msg time="2026-10-11T00:59:53.746849" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:59:53.746056" elapsed="0.000854"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:53.747146" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:53.747355" 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-10-11T00:59:53.745165" elapsed="0.002452"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:59:53.743237" elapsed="0.004465"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:59:53.667162" elapsed="0.080711"/>
</kw>
<msg time="2026-10-11T00:59:53.747955" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:53.747995" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:53.666315" elapsed="0.081715"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:59:53.748183" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:59:53.748097" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:53.748080" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:53.748701" 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-10-11T00:59:53.749099" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:59:53.749166" 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-10-11T00:59:53.665483" elapsed="0.083768"/>
</kw>
<msg time="2026-10-11T00:59:53.749333" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:53.749373" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:53.662956" elapsed="0.086490"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:53.749737" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:53.749516" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:53.749500" elapsed="0.000322"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:59:53.662738" elapsed="0.087106"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:59:53.662533" elapsed="0.087339"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:59:53.658654" elapsed="0.091266"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:59:53.650876" elapsed="0.099092"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:53.649931" elapsed="0.100076"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:59:53.647574" elapsed="0.102478"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:53.754323" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:53.754461" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:53.754556" 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-10-11T00:59:53.750507" elapsed="0.004073"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:53.754778" elapsed="0.000346"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:53.759918" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:53.760019" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:53.760110" 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-10-11T00:59:53.755285" elapsed="0.004850"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:53.761012" 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-10-11T00:59:53.760760" elapsed="0.000279"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:53.761437" 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-10-11T00:59:53.761191" elapsed="0.000274"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:53.761647" elapsed="0.000296"/>
</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-10-11T00:59:53.760338" elapsed="0.001660"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:53.750215" elapsed="0.011831"/>
</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-10-11T00:59:53.646522" elapsed="0.115559"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:53.762790" 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-10-11T00:59:53.762938" 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-10-11T00:59:53.762627" elapsed="0.000338"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:53.763264" 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-10-11T00:59:53.763378" 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-10-11T00:59:53.763128" elapsed="0.000275"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:53.763717" 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-10-11T00:59:53.763853" 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-10-11T00:59:53.763582" elapsed="0.000322"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:59:53.764245" 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-10-11T00:59:53.764069" elapsed="0.000201"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:53.764586" 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-10-11T00:59:53.764702" 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-10-11T00:59:53.764448" elapsed="0.000279"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:59:53.765069" 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-10-11T00:59:53.764903" elapsed="0.000190"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.765524" 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-10-11T00:59:53.765287" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.765995" 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-10-11T00:59:53.765781" elapsed="0.000259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.766457" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001042b2b2b2b000007d0000000000a05dc10</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:53.766231" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.766925" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001042b2b2b2b000007d0000000000a05dc10</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:53.766696" elapsed="0.000271"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:53.767106" elapsed="0.002529"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:53.785071" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T00:59:53.785130" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:53.785221" 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-10-11T00:59:53.769812" elapsed="0.015433"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.785810" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:53.785516" elapsed="0.000334"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:53.790769" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:53.790877" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:53.790970" 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-10-11T00:59:53.786008" elapsed="0.004987"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.791507" 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-10-11T00:59:53.791211" elapsed="0.000341"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:53.796789" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:53.796897" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:53.796983" 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-10-11T00:59:53.792473" elapsed="0.004534"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.797506" 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-10-11T00:59:53.797210" elapsed="0.000341"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:53.797713" elapsed="0.000337"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:53.800956" level="INFO">${update} = ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001042b2b2b2b000007d0000000000a05dc10</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:59:53.798198" elapsed="0.002785"/>
</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-10-11T00:59:53.801139" elapsed="0.000338"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:59:53.801523" elapsed="0.000028"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:59:53.792150" elapsed="0.009475"/>
</kw>
<msg time="2026-10-11T00:59:53.801699" 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-10-11T00:59:53.791742" elapsed="0.009981"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.802154" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001042b2b2b2b000007d0000000000a05dc10</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:53.801937" elapsed="0.000258"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.803047" level="INFO">Length is 152.</msg>
<msg time="2026-10-11T00:59:53.803117" 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-10-11T00:59:53.802779" elapsed="0.000361"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.803556" level="INFO">Length is 152.</msg>
<msg time="2026-10-11T00:59:53.803629" 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-10-11T00:59:53.803299" 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-10-11T00:59:53.803855" elapsed="0.000265"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:53.804439" 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-10-11T00:59:53.804266" elapsed="0.000198"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:53.804797" 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-10-11T00:59:53.804606" 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-10-11T00:59:53.805013" elapsed="0.000263"/>
</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-10-11T00:59:53.802403" elapsed="0.002927"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:53.805485" elapsed="0.002137"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:53.812367" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:53.812495" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:53.812582" 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-10-11T00:59:53.808116" elapsed="0.004490"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.813111" 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-10-11T00:59:53.812837" elapsed="0.000318"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:53.813321" elapsed="0.000340"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:53.818105" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:53.818213" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:53.818307" 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-10-11T00:59:53.813841" elapsed="0.004490"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.818848" 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-10-11T00:59:53.818558" elapsed="0.000334"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:53.819089" elapsed="0.000340"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T00:59:53.819647" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:53.819499" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:53.819481" elapsed="0.000224"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:53.825623" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:53.825666" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:53.825766" 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-10-11T00:59:53.819869" elapsed="0.005922"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:59:53.807823" elapsed="0.018027"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:53.834560" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:53.834663" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:53.834763" 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-10-11T00:59:53.826775" elapsed="0.008013"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.835268" 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-10-11T00:59:53.834994" elapsed="0.000318"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:53.835496" elapsed="0.000352"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:53.838503" level="INFO">${update} = ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001042b2b2b2b000007d0000000000a05dc10</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:59:53.835997" 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-10-11T00:59:53.838688" elapsed="0.000318"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:59:53.839050" elapsed="0.000028"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:59:53.826453" elapsed="0.012697"/>
</kw>
<msg time="2026-10-11T00:59:53.839219" 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-10-11T00:59:53.826037" elapsed="0.013206"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.839791" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001042b2b2b2b000007d0000000000a05dc10</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:53.839471" elapsed="0.000388"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.841036" level="INFO">Length is 140.</msg>
<msg time="2026-10-11T00:59:53.841105" 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-10-11T00:59:53.840656" elapsed="0.000470"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.841550" level="INFO">Length is 140.</msg>
<msg time="2026-10-11T00:59:53.841620" 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-10-11T00:59:53.841281" elapsed="0.000360"/>
</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-10-11T00:59:53.841842" elapsed="0.000264"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:53.842403" 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-10-11T00:59:53.842252" elapsed="0.000190"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:53.842814" 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-10-11T00:59:53.842644" 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-10-11T00:59:53.843027" elapsed="0.000264"/>
</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-10-11T00:59:53.840146" elapsed="0.003199"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:53.847524" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:53.847629" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:53.847713" 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-10-11T00:59:53.843891" elapsed="0.003846"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.848247" 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-10-11T00:59:53.847973" elapsed="0.000317"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:53.848473" elapsed="0.000340"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:53.852666" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:53.852783" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:53.852875" 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-10-11T00:59:53.848974" elapsed="0.003925"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.853388" 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-10-11T00:59:53.853116" elapsed="0.000337"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:53.853620" elapsed="0.000338"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T00:59:53.854173" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T00:59:53.854026" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:53.854008" elapsed="0.000239"/>
</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-10-11T00:59:53.854396" elapsed="0.000037"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:59:53.843582" elapsed="0.010911"/>
</kw>
<arg>route_eth_rou</arg>
<status status="PASS" start="2026-10-11T00:59:53.762312" elapsed="0.092222"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:53.645481" elapsed="0.209141"/>
</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-10-11T00:59:53.856572" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:59:53.856304" 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-10-11T00:59:53.857731" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:53.857645" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:53.857627" 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-10-11T00:59:53.859875" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:53.859792" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:53.859774" elapsed="0.000164"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.860865" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:59:53.860523" elapsed="0.000368"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.861304" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:59:53.861045" elapsed="0.000283"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:59:53.861368" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:59:53.861518" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:59:53.860145" elapsed="0.001396"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:53.864228" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:53.864143" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:53.864125" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:53.865452" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:53.865317" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:53.865300" elapsed="0.000302"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:59:53.866111" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:59:53.865768" elapsed="0.000402"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:59:53.866774" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:59:53.866539" elapsed="0.000292"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:59:53.901385" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:59:53.868359" elapsed="0.033160"/>
</kw>
<msg time="2026-10-11T00:59:53.901668" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:59:53.901774" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:53.867133" elapsed="0.034714"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:59:53.937524" 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-10-11T00:59:53.903489" elapsed="0.034159"/>
</kw>
<msg time="2026-10-11T00:59:53.937784" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:59:53.937872" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:53.902240" elapsed="0.035701"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:53.938541" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:53.938224" elapsed="0.000444"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:53.938204" elapsed="0.000518"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.939429" 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-10-11T00:59:53.938941" elapsed="0.000602"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:53.940035" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:53.939707" elapsed="0.000453"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:53.939688" elapsed="0.000527"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:59:53.940248" 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-10-11T00:59:53.943829" elapsed="0.000151"/>
</kw>
<msg time="2026-10-11T00:59:53.944019" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:59:53.943273" 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-10-11T00:59:53.944309" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:53.944630" 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-10-11T00:59:53.942551" elapsed="0.002308"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:59:53.940557" elapsed="0.004381"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:59:53.865033" elapsed="0.080054"/>
</kw>
<msg time="2026-10-11T00:59:53.945171" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:53.945210" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:53.864456" elapsed="0.080789"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:59:53.945398" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-10-11T00:59:53.945312" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:53.945295" elapsed="0.000197"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:53.945884" 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-10-11T00:59:53.946265" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:59:53.946331" 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-10-11T00:59:53.863853" elapsed="0.082592"/>
</kw>
<msg time="2026-10-11T00:59:53.946531" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:53.946571" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:53.861913" elapsed="0.084693"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:53.946912" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:53.946671" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:53.946655" elapsed="0.000328"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:59:53.861738" elapsed="0.085267"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:59:53.861593" elapsed="0.085439"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:59:53.859483" elapsed="0.087598"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:59:53.857376" elapsed="0.089753"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:53.856986" elapsed="0.090182"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:59:53.855961" elapsed="0.091252"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:53.952140" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:53.952246" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:53.952339" 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-10-11T00:59:53.947635" elapsed="0.004728"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:53.952590" elapsed="0.000359"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:53.957151" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:53.957254" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:53.957347" 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-10-11T00:59:53.953111" elapsed="0.004260"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:53.958250" 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-10-11T00:59:53.958002" elapsed="0.000275"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:53.958679" 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-10-11T00:59:53.958445" elapsed="0.000260"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:53.958901" elapsed="0.000280"/>
</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-10-11T00:59:53.957601" elapsed="0.001636"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:53.947341" elapsed="0.011944"/>
</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-10-11T00:59:53.855310" elapsed="0.104010"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:53.959988" 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-10-11T00:59:53.960113" 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-10-11T00:59:53.959842" elapsed="0.000298"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.968212" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:59:53.967903" elapsed="0.000336"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:59:53.968961" 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-10-11T00:59:53.968741" elapsed="0.000291">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-10-11T00:59:53.969117" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:59:53.968397" elapsed="0.000743"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.969648" 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-10-11T00:59:53.969313" elapsed="0.000360"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:53.969966" 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-10-11T00:59:53.970081" 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-10-11T00:59:53.969856" elapsed="0.000250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.970541" 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-10-11T00:59:53.970302" 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-10-11T00:59:53.970965" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:53.970682" elapsed="0.000336"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.971474" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:59:53.971190" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:53.971041" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:53.970664" elapsed="0.000895"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.972126" 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-10-11T00:59:53.971725" elapsed="0.000427"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:59:53.972197" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T00:59:53.972323" 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-10-11T00:59:53.967460" elapsed="0.004887"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:53.972667" 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-10-11T00:59:53.972796" 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-10-11T00:59:53.972527" elapsed="0.000293"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:53.973116" 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-10-11T00:59:53.973226" 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-10-11T00:59:53.972981" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.973678" 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-10-11T00:59:53.973457" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.974166" 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-10-11T00:59:53.973951" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.974628" level="INFO">ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001042b2b2b2b000007d0000000000a05dc10</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:53.974401" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:53.975104" level="INFO">ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001042b2b2b2b000007d0000000000a05dc10</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:53.974892" elapsed="0.000252"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:53.975287" elapsed="0.002424"/>
</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-10-11T00:59:53.977871" elapsed="0.002486"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:53.984983" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:53.985121" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:53.985211" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T00:59:53.981293" elapsed="0.004304">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:53.985795" elapsed="0.000021"/>
</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-10-11T00:59:53.986007" elapsed="0.000022"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T00:59:53.980990" elapsed="0.005132">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:55.995490" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:55.995811" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:55.996028" 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-10-11T00:59:55.987776" elapsed="0.008308"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T00:59:55.997105" 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-10-11T00:59:55.997355" 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-10-11T00:59:55.996508" elapsed="0.000975"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:55.999855" 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-10-11T00:59:55.998879" elapsed="0.001040"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:56.001146" 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-10-11T00:59:56.000263" elapsed="0.000944"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:56.001654" elapsed="0.000655"/>
</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-10-11T00:59:55.997961" elapsed="0.004508"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T00:59:55.986809" elapsed="0.015774"/>
</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-10-11T00:59:53.980568" elapsed="2.022110"/>
</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-10-11T00:59:56.003039" elapsed="0.003879"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:56.015403" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:56.015679" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:56.015901" 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-10-11T00:59:56.009091" elapsed="0.006865"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:56.016342" elapsed="0.000838"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:56.024916" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:56.025161" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:56.025377" 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-10-11T00:59:56.017577" elapsed="0.007899"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:56.027434" 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-10-11T00:59:56.026867" elapsed="0.000631"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:56.028873" 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-10-11T00:59:56.027860" elapsed="0.001075"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T00:59:56.030006" 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-10-11T00:59:56.030440" 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-10-11T00:59:56.029350" elapsed="0.001251">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-10-11T00:59:56.025963" elapsed="0.005002">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-10-11T00:59:56.008458" elapsed="0.022759">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-10-11T00:59:58.040221" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:58.040512" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:58.040714" 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-10-11T00:59:58.032401" elapsed="0.008388"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:58.041188" elapsed="0.000853"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:58.049277" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:58.049547" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:58.049762" 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-10-11T00:59:58.042437" elapsed="0.007409"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:58.051832" 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-10-11T00:59:58.051229" elapsed="0.000665"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:58.052805" 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-10-11T00:59:58.052231" elapsed="0.000634"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:58.053273" elapsed="0.000681"/>
</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-10-11T00:59:58.050309" elapsed="0.003770"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:58.031725" elapsed="0.022462"/>
</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-10-11T00:59:56.007511" elapsed="2.046752"/>
</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-10-11T00:59:58.055380" elapsed="0.003660"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:58.067937" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:58.068242" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:58.068485" 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-10-11T00:59:58.061543" elapsed="0.006999"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:58.068963" elapsed="0.000798"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:58.076095" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:58.076322" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:58.076571" 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-10-11T00:59:58.070148" elapsed="0.006479"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:58.078663" 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-10-11T00:59:58.078079" elapsed="0.000644"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:58.079644" 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-10-11T00:59:58.079093" elapsed="0.000609"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:58.080135" elapsed="0.000674"/>
</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-10-11T00:59:58.077116" elapsed="0.003819"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:58.060452" elapsed="0.020590"/>
</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-10-11T00:59:58.059539" elapsed="0.021581"/>
</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-10-11T00:59:58.054657" elapsed="0.026569"/>
</kw>
<arg>route_eth_rou</arg>
<status status="PASS" start="2026-10-11T00:59:53.959519" elapsed="4.121803"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:53.854885" elapsed="4.226673"/>
</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-10-11T00:59:58.085619" elapsed="0.000477"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:59:58.085025" elapsed="0.001185"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:58.088361" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:58.088151" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:58.088105" elapsed="0.000434"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:58.093138" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:58.092951" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:58.092912" elapsed="0.000368"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.095400" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:59:58.094634" elapsed="0.000856"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.096484" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:59:58.095859" elapsed="0.000682"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:59:58.096699" elapsed="0.000091"/>
</return>
<msg time="2026-10-11T00:59:58.097025" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:59:58.093803" elapsed="0.003275"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:58.101974" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:58.101854" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:58.101829" elapsed="0.000234"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:58.103716" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:58.103555" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:58.103530" elapsed="0.000420"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:59:58.104680" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:59:58.104165" elapsed="0.000597"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:59:58.105619" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:59:58.105268" elapsed="0.000433"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:59:58.141254" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:59:58.107844" elapsed="0.033530"/>
</kw>
<msg time="2026-10-11T00:59:58.141523" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:59:58.141628" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:58.106151" elapsed="0.035548"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:59:58.175496" 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-10-11T00:59:58.143316" elapsed="0.032307"/>
</kw>
<msg time="2026-10-11T00:59:58.175745" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:59:58.175854" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:58.142112" elapsed="0.033812"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:58.176542" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:58.176220" elapsed="0.000452"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:58.176200" elapsed="0.000527"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.177424" 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-10-11T00:59:58.176931" elapsed="0.000610"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:58.178019" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:58.177708" elapsed="0.000439"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:58.177689" elapsed="0.000514"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:59:58.178236" 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-10-11T00:59:58.181889" elapsed="0.000119"/>
</kw>
<msg time="2026-10-11T00:59:58.182048" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:59:58.181327" elapsed="0.000781"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:58.182341" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:58.182636" 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-10-11T00:59:58.180604" elapsed="0.002257"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:59:58.178542" elapsed="0.004400"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:59:58.103121" elapsed="0.080002"/>
</kw>
<msg time="2026-10-11T00:59:58.183208" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:58.183247" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:58.102276" elapsed="0.081006"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:59:58.183496" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T00:59:58.183351" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:58.183333" 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-10-11T00:59:58.183989" 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-10-11T00:59:58.184372" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:59:58.184461" 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-10-11T00:59:58.101431" elapsed="0.083118"/>
</kw>
<msg time="2026-10-11T00:59:58.184632" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:58.184672" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:58.097893" elapsed="0.086815"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:58.185014" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:58.184788" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:58.184759" elapsed="0.000325"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:59:58.097535" elapsed="0.087571"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:59:58.097185" elapsed="0.087948"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:59:58.092243" elapsed="0.092938"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:59:58.087535" elapsed="0.097695"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:58.086580" elapsed="0.098690"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:59:58.084201" elapsed="0.101115"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:58.190996" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:58.191106" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:58.191191" 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-10-11T00:59:58.185742" elapsed="0.005473"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:58.191389" elapsed="0.000364"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:58.196200" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:58.196302" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:58.196447" 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-10-11T00:59:58.191931" elapsed="0.004543"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:58.197334" 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-10-11T00:59:58.197086" elapsed="0.000275"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:58.197780" 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-10-11T00:59:58.197532" elapsed="0.000276"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:58.197991" elapsed="0.000277"/>
</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-10-11T00:59:58.196679" elapsed="0.001645"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:58.185473" elapsed="0.012898"/>
</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-10-11T00:59:58.083104" elapsed="0.115317"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:58.199125" 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-10-11T00:59:58.199267" 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-10-11T00:59:58.198974" elapsed="0.000320"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:58.199607" 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-10-11T00:59:58.199723" 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-10-11T00:59:58.199470" elapsed="0.000277"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:58.200054" 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-10-11T00:59:58.200169" 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-10-11T00:59:58.199918" elapsed="0.000275"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:59:58.200550" 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-10-11T00:59:58.200356" elapsed="0.000218"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:58.200889" 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-10-11T00:59:58.201004" 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-10-11T00:59:58.200736" elapsed="0.000292"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T00:59:58.201350" 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-10-11T00:59:58.201186" elapsed="0.000188"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.201819" 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-10-11T00:59:58.201588" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.202272" 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-10-11T00:59:58.202062" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.202780" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:58.202555" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.203226" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:58.203013" elapsed="0.000254"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:58.203405" elapsed="0.002721"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:58.217343" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T00:59:58.217401" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:58.217506" 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-10-11T00:59:58.206288" elapsed="0.011242"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.218037" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:58.217739" elapsed="0.000337"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:58.223382" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:58.223511" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:58.223605" 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-10-11T00:59:58.218232" elapsed="0.005397"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.224124" 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-10-11T00:59:58.223849" elapsed="0.000318"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:58.231442" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:58.231551" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:58.231666" 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-10-11T00:59:58.225096" elapsed="0.006596"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.232200" 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-10-11T00:59:58.231920" elapsed="0.000325"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:58.232425" elapsed="0.000330"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:58.235722" level="INFO">${update} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:59:58.232922" elapsed="0.002828"/>
</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-10-11T00:59:58.235925" elapsed="0.000310"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:59:58.236279" elapsed="0.000028"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:59:58.224785" elapsed="0.011596"/>
</kw>
<msg time="2026-10-11T00:59:58.236477" 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-10-11T00:59:58.224349" elapsed="0.012153"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.236931" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:58.236700" elapsed="0.000272"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.237782" level="INFO">Length is 136.</msg>
<msg time="2026-10-11T00:59:58.237854" 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-10-11T00:59:58.237529" elapsed="0.000347"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.238261" level="INFO">Length is 136.</msg>
<msg time="2026-10-11T00:59:58.238328" 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-10-11T00:59:58.238033" elapsed="0.000317"/>
</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-10-11T00:59:58.238557" elapsed="0.000282"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:58.239138" 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-10-11T00:59:58.238986" elapsed="0.000175"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:58.239469" 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-10-11T00:59:58.239303" 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-10-11T00:59:58.239671" elapsed="0.000286"/>
</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-10-11T00:59:58.237178" elapsed="0.002833"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:58.240150" elapsed="0.002437"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:58.247021" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:58.247126" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:58.247211" 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-10-11T00:59:58.243085" elapsed="0.004151"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.247737" 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-10-11T00:59:58.247461" elapsed="0.000339"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:58.247996" elapsed="0.000323"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:58.252482" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:58.252589" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:58.252683" 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-10-11T00:59:58.248497" elapsed="0.004210"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.253206" 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-10-11T00:59:58.252930" elapsed="0.000321"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:58.253429" elapsed="0.000321"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T00:59:58.253987" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:58.253838" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:58.253819" elapsed="0.000228"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:58.260400" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:58.260467" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:58.260557" 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-10-11T00:59:58.254192" elapsed="0.006390"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:59:58.242795" elapsed="0.017846"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:58.265958" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:58.266062" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:58.266147" 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-10-11T00:59:58.261572" elapsed="0.004598"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.266675" 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-10-11T00:59:58.266376" elapsed="0.000342"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:58.266897" elapsed="0.000493"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:58.269942" level="INFO">${update} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T00:59:58.267562" elapsed="0.002408"/>
</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-10-11T00:59:58.270154" elapsed="0.000337"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T00:59:58.270536" elapsed="0.000027"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T00:59:58.261248" elapsed="0.009389"/>
</kw>
<msg time="2026-10-11T00:59:58.270707" 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-10-11T00:59:58.260845" elapsed="0.009886"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.271161" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:58.270944" elapsed="0.000258"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.272010" level="INFO">Length is 124.</msg>
<msg time="2026-10-11T00:59:58.272079" 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-10-11T00:59:58.271761" elapsed="0.000340"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.272515" level="INFO">Length is 124.</msg>
<msg time="2026-10-11T00:59:58.272583" 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-10-11T00:59:58.272258" 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-10-11T00:59:58.272805" elapsed="0.000265"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:58.273364" 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-10-11T00:59:58.273217" elapsed="0.000171"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T00:59:58.273698" 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-10-11T00:59:58.273551" elapsed="0.000171"/>
</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-10-11T00:59:58.273920" elapsed="0.000267"/>
</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-10-11T00:59:58.271429" elapsed="0.002813"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:58.278652" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:58.278755" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:58.278855" 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-10-11T00:59:58.274797" elapsed="0.004082"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.279362" 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-10-11T00:59:58.279087" elapsed="0.000318"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:58.279587" elapsed="0.000341"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:58.283949" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:58.284050" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:58.284142" 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-10-11T00:59:58.280089" elapsed="0.004109"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.284707" 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-10-11T00:59:58.284428" elapsed="0.000322"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:58.284928" elapsed="0.000322"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T00:59:58.285484" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-11T00:59:58.285319" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:58.285301" elapsed="0.000260"/>
</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-10-11T00:59:58.285708" elapsed="0.000019"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T00:59:58.274483" elapsed="0.011321"/>
</kw>
<arg>route_inc_arb</arg>
<status status="PASS" start="2026-10-11T00:59:58.198659" elapsed="0.087186"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:58.082177" elapsed="0.203755"/>
</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-10-11T00:59:58.287676" elapsed="0.000214"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T00:59:58.287428" elapsed="0.000511"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:58.289009" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:58.288916" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:58.288727" elapsed="0.000346"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:58.291121" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:58.291037" elapsed="0.000133"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:58.291020" elapsed="0.000171"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.292116" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T00:59:58.291789" elapsed="0.000353"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.292574" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T00:59:58.292294" elapsed="0.000304"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T00:59:58.292638" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T00:59:58.292779" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T00:59:58.291400" elapsed="0.001404"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:58.295345" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:58.295261" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:58.295243" elapsed="0.000179"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T00:59:58.296574" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T00:59:58.296459" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:58.296440" elapsed="0.000283"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T00:59:58.297232" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T00:59:58.296888" elapsed="0.000402"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T00:59:58.297889" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T00:59:58.297652" elapsed="0.000294"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T00:59:58.332253" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T00:59:58.299436" elapsed="0.032940"/>
</kw>
<msg time="2026-10-11T00:59:58.332520" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T00:59:58.332608" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:58.298247" elapsed="0.034430"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T00:59:58.367655" 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-10-11T00:59:58.334261" elapsed="0.033564"/>
</kw>
<msg time="2026-10-11T00:59:58.367946" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T00:59:58.368034" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:58.333078" elapsed="0.035028"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:58.368716" elapsed="0.000082"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:58.368395" elapsed="0.000470"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:58.368375" elapsed="0.000546"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.369613" 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-10-11T00:59:58.369112" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:58.370203" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:58.369912" elapsed="0.000418"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:58.369894" elapsed="0.000493"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T00:59:58.370445" 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-10-11T00:59:58.374244" elapsed="0.000122"/>
</kw>
<msg time="2026-10-11T00:59:58.374549" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T00:59:58.373610" 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-10-11T00:59:58.374866" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:58.375074" 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-10-11T00:59:58.372804" elapsed="0.002482"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T00:59:58.370721" elapsed="0.004645"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T00:59:58.296150" elapsed="0.079380"/>
</kw>
<msg time="2026-10-11T00:59:58.375613" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:58.375652" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:58.295577" elapsed="0.080111"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T00:59:58.375859" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T00:59:58.375756" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:58.375738" elapsed="0.000197"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:58.376315" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:58.376722" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T00:59:58.376808" 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-10-11T00:59:58.294974" elapsed="0.081921"/>
</kw>
<msg time="2026-10-11T00:59:58.376978" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T00:59:58.377017" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:58.293142" elapsed="0.083911"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T00:59:58.377341" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:58.377119" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:58.377103" elapsed="0.000324"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T00:59:58.292998" elapsed="0.084452"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T00:59:58.292853" elapsed="0.084624"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T00:59:58.290724" elapsed="0.086802"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T00:59:58.288492" elapsed="0.089117"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T00:59:58.288086" elapsed="0.089564"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T00:59:58.287075" elapsed="0.090620"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:58.383129" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:58.383235" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T00:59:58.383328" 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-10-11T00:59:58.378111" elapsed="0.005241"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T00:59:58.383547" elapsed="0.000360"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:58.388172" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:58.388275" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T00:59:58.388367" 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-10-11T00:59:58.384069" elapsed="0.004323"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:58.389280" 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-10-11T00:59:58.389027" elapsed="0.000280"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T00:59:58.389706" 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-10-11T00:59:58.389475" elapsed="0.000256"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T00:59:58.389933" elapsed="0.000274"/>
</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-10-11T00:59:58.388628" elapsed="0.001636"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:58.377841" elapsed="0.012471"/>
</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-10-11T00:59:58.286629" elapsed="0.103718"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:58.391003" 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-10-11T00:59:58.391130" 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-10-11T00:59:58.390860" elapsed="0.000302"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.399425" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:59:58.399105" elapsed="0.000349"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T00:59:58.400190" 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-10-11T00:59:58.399989" elapsed="0.000272">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-10-11T00:59:58.400346" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T00:59:58.399616" elapsed="0.000753"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.400882" 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-10-11T00:59:58.400558" elapsed="0.000349"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:58.401183" 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-10-11T00:59:58.401299" 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-10-11T00:59:58.401075" elapsed="0.000249"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.401754" 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-10-11T00:59:58.401535" elapsed="0.000277"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T00:59:58.402130" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T00:59:58.401875" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.402634" 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 variable.</doc>
<status status="PASS" start="2026-10-11T00:59:58.402353" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:58.402206" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-10-11T00:59:58.401857" elapsed="0.000854"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.403264" 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-10-11T00:59:58.402885" elapsed="0.000405"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T00:59:58.403334" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T00:59:58.403479" 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-10-11T00:59:58.398665" elapsed="0.004839"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:58.403821" 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-10-11T00:59:58.403937" 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-10-11T00:59:58.403671" elapsed="0.000290"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T00:59:58.404259" 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-10-11T00:59:58.404369" 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-10-11T00:59:58.404123" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.404835" 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-10-11T00:59:58.404604" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.405323" 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-10-11T00:59:58.405108" elapsed="0.000259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.405799" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:58.405573" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T00:59:58.406242" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T00:59:58.406030" elapsed="0.000253"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T00:59:58.406434" elapsed="0.002486"/>
</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-10-11T00:59:58.409067" elapsed="0.002310"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T00:59:58.415996" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T00:59:58.416100" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:58.416196" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T00:59:58.412295" elapsed="0.004276">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T00:59:58.416753" elapsed="0.000043"/>
</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-10-11T00:59:58.416988" elapsed="0.000023"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T00:59:58.411997" elapsed="0.005106">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:00.425345" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:00.425683" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:00.425943" 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-10-11T01:00:00.418265" elapsed="0.007737"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T01:00:00.427020" 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-10-11T01:00:00.427357" 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-10-11T01:00:00.426397" elapsed="0.001089"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:00.429809" 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-10-11T01:00:00.428907" elapsed="0.000966"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:00.431047" 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-10-11T01:00:00.430223" elapsed="0.000885"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:00.431557" elapsed="0.000667"/>
</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-10-11T01:00:00.427982" elapsed="0.004371"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T01:00:00.417725" elapsed="0.014773"/>
</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-10-11T00:59:58.411585" elapsed="2.021011"/>
</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-10-11T01:00:00.432950" elapsed="0.003740"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:00.445261" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:00.445536" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:00.445730" 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-10-11T01:00:00.438747" elapsed="0.007060"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:00.446202" elapsed="0.000842"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:00.454734" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:00.455010" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:00.455223" 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-10-11T01:00:00.447438" elapsed="0.007839"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:00.457251" 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-10-11T01:00:00.456684" elapsed="0.000626"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:00.458635" 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-10-11T01:00:00.457687" elapsed="0.001008"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:00:00.459898" 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-10-11T01:00:00.460288" 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-10-11T01:00:00.459157" elapsed="0.001327">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-10-11T01:00:00.455767" elapsed="0.004996">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-10-11T01:00:00.438107" elapsed="0.022922">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-10-11T01:00:02.471360" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:02.471714" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:02.471985" 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-10-11T01:00:02.462696" elapsed="0.009345"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:02.472482" elapsed="0.000970"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:02.480308" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:02.480581" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:02.480815" 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-10-11T01:00:02.473845" elapsed="0.007027"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:02.483022" 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-10-11T01:00:02.482384" elapsed="0.000698"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:02.483999" 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-10-11T01:00:02.483452" elapsed="0.000608"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:02.484504" elapsed="0.000654"/>
</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-10-11T01:00:02.481472" elapsed="0.003813"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:02.461775" elapsed="0.023621"/>
</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-10-11T01:00:00.437171" elapsed="2.048339"/>
</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-10-11T01:00:02.486641" elapsed="0.003897"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:02.498919" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:02.499153" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:02.499341" 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-10-11T01:00:02.492706" elapsed="0.006688"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:02.499834" elapsed="0.000792"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:02.506957" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:02.507183" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:02.507388" 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-10-11T01:00:02.501013" elapsed="0.006471"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:02.509508" 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-10-11T01:00:02.508931" elapsed="0.000639"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:02.510474" 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-10-11T01:00:02.509928" elapsed="0.000605"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:02.510987" elapsed="0.000650"/>
</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-10-11T01:00:02.507965" elapsed="0.003843"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:02.492012" elapsed="0.019907"/>
</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-10-11T01:00:02.491036" elapsed="0.020960"/>
</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-10-11T01:00:02.485903" elapsed="0.026200"/>
</kw>
<arg>route_inc_arb</arg>
<status status="PASS" start="2026-10-11T00:59:58.390546" elapsed="4.121724"/>
</kw>
<status status="PASS" start="2026-10-11T00:59:58.286190" elapsed="4.226390"/>
</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-10-11T01:00:02.517820" elapsed="0.000866"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:00:02.517127" elapsed="0.001700"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:02.520999" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:02.520762" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:02.520712" elapsed="0.000439"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:02.525924" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:02.525715" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:02.525677" elapsed="0.000387"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.528090" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:00:02.527389" elapsed="0.000736"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.528725" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:00:02.528341" elapsed="0.000418"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:00:02.528829" elapsed="0.000052"/>
</return>
<msg time="2026-10-11T01:00:02.529022" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:00:02.526563" elapsed="0.002491"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:02.532675" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:02.532558" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:02.532534" elapsed="0.000230"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:02.534396" elapsed="0.000054"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:02.534236" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:02.534212" elapsed="0.000436"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:00:02.535369" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:00:02.534877" elapsed="0.000598"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:00:02.536302" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:00:02.535982" elapsed="0.000403"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:00:02.574530" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:00:02.538513" elapsed="0.036140"/>
</kw>
<msg time="2026-10-11T01:00:02.574813" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:00:02.574901" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:02.536838" elapsed="0.038133"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:00:02.611893" 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-10-11T01:00:02.576576" elapsed="0.035467"/>
</kw>
<msg time="2026-10-11T01:00:02.612183" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:00:02.612273" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:02.575358" elapsed="0.036986"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:02.613033" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:02.612675" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:02.612651" elapsed="0.000569"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.613953" 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-10-11T01:00:02.613426" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:02.614771" elapsed="0.000078"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:02.614289" elapsed="0.000626"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:02.614270" elapsed="0.000699"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:00:02.615005" 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-10-11T01:00:02.618676" elapsed="0.000139"/>
</kw>
<msg time="2026-10-11T01:00:02.618856" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:00:02.618042" elapsed="0.000880"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:02.619159" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:02.619393" elapsed="0.000037"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:00:02.617281" 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-10-11T01:00:02.615332" elapsed="0.004382"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:00:02.533833" elapsed="0.086235"/>
</kw>
<msg time="2026-10-11T01:00:02.620158" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:02.620198" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:02.532991" elapsed="0.087242"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:00:02.620388" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-10-11T01:00:02.620302" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:02.620285" elapsed="0.000195"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:02.620885" 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-10-11T01:00:02.621273" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:00:02.621339" 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-10-11T01:00:02.532141" elapsed="0.089298"/>
</kw>
<msg time="2026-10-11T01:00:02.621525" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:02.621565" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:02.529562" elapsed="0.092039"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:02.621903" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:02.621668" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:02.621652" elapsed="0.000322"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:00:02.529336" elapsed="0.092660"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:00:02.529127" elapsed="0.092901"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:00:02.525027" elapsed="0.097053"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:00:02.520140" elapsed="0.101990"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:02.519174" elapsed="0.102997"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:00:02.516307" elapsed="0.105913"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:02.627520" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:02.627698" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:02.627816" 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-10-11T01:00:02.622692" elapsed="0.005149"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:02.628018" elapsed="0.000366"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:02.634773" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:02.634892" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:02.634984" 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-10-11T01:00:02.628598" elapsed="0.006410"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:02.635915" 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-10-11T01:00:02.635633" elapsed="0.000309"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:02.636326" 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-10-11T01:00:02.636095" elapsed="0.000256"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:02.636571" elapsed="0.000299"/>
</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-10-11T01:00:02.635216" elapsed="0.001710"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:02.622359" elapsed="0.014614"/>
</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-10-11T01:00:02.515084" elapsed="0.121925"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:02.637725" 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-10-11T01:00:02.637897" 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-10-11T01:00:02.637571" elapsed="0.000353"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:02.638224" 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-10-11T01:00:02.638341" 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-10-11T01:00:02.638087" elapsed="0.000279"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:02.638682" 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-10-11T01:00:02.638809" 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-10-11T01:00:02.638544" elapsed="0.000290"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:00:02.639378" 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-10-11T01:00:02.638998" elapsed="0.000405"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:02.639762" 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-10-11T01:00:02.639892" 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-10-11T01:00:02.639592" elapsed="0.000325"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:00:02.640246" 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-10-11T01:00:02.640078" elapsed="0.000192"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.640916" 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-10-11T01:00:02.640667" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.641376" 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-10-11T01:00:02.641161" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.641868" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:02.641639" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.642309" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:02.642098" elapsed="0.000251"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:02.642507" elapsed="0.002708"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:02.660523" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T01:00:02.660581" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:02.660672" 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-10-11T01:00:02.645378" elapsed="0.015318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.661197" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:02.660921" elapsed="0.000314"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:02.668015" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:02.668123" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:02.668247" 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-10-11T01:00:02.661391" elapsed="0.006881"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.668776" 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-10-11T01:00:02.668500" elapsed="0.000335"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:02.674521" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:02.674629" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:02.674714" 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-10-11T01:00:02.669755" elapsed="0.004983"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.675238" 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-10-11T01:00:02.674962" elapsed="0.000321"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:02.675464" elapsed="0.000335"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:02.678567" level="INFO">${update} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:00:02.675957" elapsed="0.002637"/>
</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-10-11T01:00:02.678753" elapsed="0.000392"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:00:02.679205" elapsed="0.000040"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:00:02.669450" elapsed="0.009896"/>
</kw>
<msg time="2026-10-11T01:00:02.679475" 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-10-11T01:00:02.669021" elapsed="0.010488"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.680065" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:02.679802" elapsed="0.000304"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.680920" level="INFO">Length is 136.</msg>
<msg time="2026-10-11T01:00:02.680994" 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-10-11T01:00:02.680669" elapsed="0.000347"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.681396" level="INFO">Length is 136.</msg>
<msg time="2026-10-11T01:00:02.681489" 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-10-11T01:00:02.681170" elapsed="0.000341"/>
</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-10-11T01:00:02.681691" elapsed="0.000281"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:02.682274" 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-10-11T01:00:02.682120" elapsed="0.000177"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:02.682603" 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-10-11T01:00:02.682456" elapsed="0.000170"/>
</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-10-11T01:00:02.682814" elapsed="0.000262"/>
</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-10-11T01:00:02.680318" elapsed="0.002811"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:02.683265" elapsed="0.002485"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:02.691453" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:02.691562" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:02.691658" 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-10-11T01:00:02.686222" elapsed="0.005461"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.692183" 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-10-11T01:00:02.691903" elapsed="0.000323"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:02.692388" elapsed="0.000341"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:02.696961" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:02.697067" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:02.697161" 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-10-11T01:00:02.692903" elapsed="0.004283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.697692" 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-10-11T01:00:02.697392" elapsed="0.000344"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:02.697911" elapsed="0.000324"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T01:00:02.698491" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:02.698304" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:02.698286" elapsed="0.000265"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:02.705128" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:02.705170" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:02.705258" 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-10-11T01:00:02.698701" elapsed="0.006582"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:00:02.685952" elapsed="0.019389"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:02.710855" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:02.711024" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:02.711143" 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-10-11T01:00:02.706264" elapsed="0.004912"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.711892" 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-10-11T01:00:02.711488" elapsed="0.000467"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:02.712181" elapsed="0.000474"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:02.715546" level="INFO">${update} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:00:02.712880" elapsed="0.002705"/>
</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-10-11T01:00:02.715824" elapsed="0.000428"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:00:02.716312" elapsed="0.000038"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:00:02.705961" elapsed="0.010518"/>
</kw>
<msg time="2026-10-11T01:00:02.716578" 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-10-11T01:00:02.705543" elapsed="0.011067"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.717206" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:02.716902" elapsed="0.000360"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.718384" level="INFO">Length is 124.</msg>
<msg time="2026-10-11T01:00:02.718507" 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-10-11T01:00:02.718055" elapsed="0.000483"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.719096" level="INFO">Length is 124.</msg>
<msg time="2026-10-11T01:00:02.719190" 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-10-11T01:00:02.718754" elapsed="0.000466"/>
</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-10-11T01:00:02.719493" elapsed="0.000384"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:02.720289" 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-10-11T01:00:02.720081" elapsed="0.000240"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:02.720742" 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-10-11T01:00:02.720540" 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-10-11T01:00:02.721041" elapsed="0.000363"/>
</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-10-11T01:00:02.717584" elapsed="0.003920"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:02.726915" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:02.727018" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:02.727101" 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-10-11T01:00:02.722227" elapsed="0.004898"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.727632" 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-10-11T01:00:02.727334" elapsed="0.000375"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:02.727887" elapsed="0.000479"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:02.732217" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:02.732319" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:02.732433" 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-10-11T01:00:02.728547" elapsed="0.003911"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.732968" 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-10-11T01:00:02.732666" elapsed="0.000366"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:02.733258" elapsed="0.000473"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T01:00:02.734048" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-10-11T01:00:02.733843" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:02.733817" elapsed="0.000337"/>
</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-10-11T01:00:02.734359" elapsed="0.000028"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:00:02.721821" elapsed="0.012673"/>
</kw>
<arg>route_inc_as</arg>
<status status="PASS" start="2026-10-11T01:00:02.637253" elapsed="0.097298"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:02.513449" elapsed="0.221230"/>
</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-10-11T01:00:02.738045" elapsed="0.000274"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:00:02.737682" elapsed="0.000705"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:02.739362" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:02.739274" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:02.739257" elapsed="0.000181"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:02.741882" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:02.741796" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:02.741770" elapsed="0.000175"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.742891" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:00:02.742544" elapsed="0.000372"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.743328" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:00:02.743069" elapsed="0.000283"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:00:02.743391" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T01:00:02.743534" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:00:02.742161" elapsed="0.001395"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:02.747583" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:02.747498" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:02.747480" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:02.748821" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:02.748690" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:02.748673" elapsed="0.000301"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:00:02.749542" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:00:02.749163" elapsed="0.000441"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:00:02.750201" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:00:02.749974" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:00:02.786808" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:00:02.751774" elapsed="0.035159"/>
</kw>
<msg time="2026-10-11T01:00:02.787058" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:00:02.787160" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:02.750590" elapsed="0.036641"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:00:02.823186" 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-10-11T01:00:02.788835" elapsed="0.034522"/>
</kw>
<msg time="2026-10-11T01:00:02.823531" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:00:02.823623" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:02.787645" elapsed="0.036048"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:02.824357" elapsed="0.000104"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:02.824018" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:02.823990" elapsed="0.000597"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.825300" 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-10-11T01:00:02.824778" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:02.825926" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:02.825619" elapsed="0.000435"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:02.825600" elapsed="0.000511"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:00:02.826148" 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-10-11T01:00:02.829919" elapsed="0.000121"/>
</kw>
<msg time="2026-10-11T01:00:02.830079" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:00:02.829441" elapsed="0.000705"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:02.830380" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:02.830917" 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-10-11T01:00:02.828661" elapsed="0.002474"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:00:02.826593" elapsed="0.004623"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:00:02.748377" elapsed="0.082988"/>
</kw>
<msg time="2026-10-11T01:00:02.831467" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:02.831507" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:02.747812" elapsed="0.083732"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:00:02.831700" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:00:02.831613" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:02.831595" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:02.832361" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:02.832864" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:00:02.832931" 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-10-11T01:00:02.747180" elapsed="0.085838"/>
</kw>
<msg time="2026-10-11T01:00:02.833104" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:02.833144" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:02.743912" elapsed="0.089268"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:02.833486" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:02.833249" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:02.833233" elapsed="0.000325"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:00:02.743755" elapsed="0.089825"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:00:02.743608" elapsed="0.090004"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:00:02.741456" elapsed="0.092209"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:00:02.739025" elapsed="0.094690"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:02.738618" 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-10-11T01:00:02.737172" elapsed="0.096645"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:02.840530" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:02.840688" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:02.840804" 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-10-11T01:00:02.834229" elapsed="0.006601"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:02.841010" elapsed="0.000376"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:02.846668" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:02.846769" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:02.846876" 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-10-11T01:00:02.841567" elapsed="0.005334"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:02.847812" 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-10-11T01:00:02.847516" elapsed="0.000323"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:02.848221" 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-10-11T01:00:02.847990" elapsed="0.000257"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:02.848479" elapsed="0.000290"/>
</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-10-11T01:00:02.847109" elapsed="0.001729"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:02.833954" elapsed="0.014932"/>
</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-10-11T01:00:02.735988" elapsed="0.112935"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:02.849582" 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-10-11T01:00:02.849731" 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-10-11T01:00:02.849428" elapsed="0.000329"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.857844" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:00:02.857525" elapsed="0.000346"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:00:02.859565" 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-10-11T01:00:02.859334" elapsed="0.000311">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-10-11T01:00:02.859730" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:00:02.858033" elapsed="0.001720"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.860257" 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-10-11T01:00:02.859943" elapsed="0.000339"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:02.860573" 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-10-11T01:00:02.860690" 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-10-11T01:00:02.860464" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.861140" 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-10-11T01:00:02.860923" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:00:02.861528" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:02.861246" elapsed="0.000335"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.862031" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:00:02.861758" elapsed="0.000297"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:02.861604" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:02.861228" elapsed="0.000879"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.862680" 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-10-11T01:00:02.862271" elapsed="0.000436"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:00:02.862751" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:00:02.862892" 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-10-11T01:00:02.857088" elapsed="0.005829"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:02.863220" 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-10-11T01:00:02.863366" 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-10-11T01:00:02.863082" elapsed="0.000313"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:02.863714" 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-10-11T01:00:02.863840" 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-10-11T01:00:02.863576" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.864279" 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-10-11T01:00:02.864060" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.864754" 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-10-11T01:00:02.864539" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.865214" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:02.865002" elapsed="0.000252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:02.865672" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:02.865458" elapsed="0.000254"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:02.865863" elapsed="0.002600"/>
</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-10-11T01:00:02.868608" elapsed="0.002481"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:02.877077" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:02.877179" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:02.877269" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T01:00:02.872038" elapsed="0.005625">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:02.877860" elapsed="0.000021"/>
</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-10-11T01:00:02.878072" elapsed="0.000022"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T01:00:02.871721" elapsed="0.006474">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:04.887971" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:04.888355" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:04.888601" 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-10-11T01:00:04.879765" elapsed="0.008892"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T01:00:04.889682" 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-10-11T01:00:04.889952" 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-10-11T01:00:04.889075" elapsed="0.000972"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:04.892391" 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-10-11T01:00:04.891494" elapsed="0.000990"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:04.893648" 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-10-11T01:00:04.892844" elapsed="0.000864"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:04.894149" elapsed="0.000688"/>
</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-10-11T01:00:04.890538" elapsed="0.004426"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T01:00:04.878818" elapsed="0.016257"/>
</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-10-11T01:00:02.871285" elapsed="2.023883"/>
</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-10-11T01:00:04.895524" elapsed="0.003770"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:04.907945" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:04.908200" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:04.908393" 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-10-11T01:00:04.901369" elapsed="0.007111"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:04.908893" elapsed="0.000833"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:04.917003" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:04.917246" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:04.917575" 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-10-11T01:00:04.910114" elapsed="0.007518"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:04.919601" 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-10-11T01:00:04.919025" elapsed="0.000636"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:04.920960" 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-10-11T01:00:04.920022" elapsed="0.000999"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:00:04.922096" 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-10-11T01:00:04.922520" 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-10-11T01:00:04.921472" elapsed="0.001202">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-10-11T01:00:04.918114" elapsed="0.004857">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-10-11T01:00:04.900736" elapsed="0.022474">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-10-11T01:00:06.933613" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:06.933926" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:06.934139" 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-10-11T01:00:06.924970" elapsed="0.009224"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:06.934640" elapsed="0.000909"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:06.942559" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:06.942790" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:06.943023" 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-10-11T01:00:06.936025" elapsed="0.007055"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:06.945110" 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-10-11T01:00:06.944521" elapsed="0.000648"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:06.946084" 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-10-11T01:00:06.945542" elapsed="0.000601"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:06.946583" elapsed="0.000652"/>
</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-10-11T01:00:06.943586" elapsed="0.003776"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:06.924013" elapsed="0.023491"/>
</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-10-11T01:00:04.899820" elapsed="2.047763"/>
</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-10-11T01:00:06.948705" elapsed="0.003646"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:06.961208" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:06.961478" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:06.961690" 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-10-11T01:00:06.954924" elapsed="0.006820"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:06.962156" elapsed="0.000821"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:06.969534" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:06.969761" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:06.969990" 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-10-11T01:00:06.963341" elapsed="0.006706"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:06.972247" 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-10-11T01:00:06.971671" elapsed="0.000637"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:06.973312" 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-10-11T01:00:06.972765" elapsed="0.000606"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:06.973836" elapsed="0.000669"/>
</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-10-11T01:00:06.970640" elapsed="0.003992"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:06.953791" elapsed="0.020952"/>
</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-10-11T01:00:06.952886" elapsed="0.021957"/>
</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-10-11T01:00:06.947970" elapsed="0.026989"/>
</kw>
<arg>route_inc_as</arg>
<status status="PASS" start="2026-10-11T01:00:02.849116" elapsed="4.125939"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:02.735237" elapsed="4.240024"/>
</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-10-11T01:00:06.980648" elapsed="0.000478"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:00:06.980026" elapsed="0.001215"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:06.983494" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:06.983252" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:06.983206" elapsed="0.000440"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:06.988280" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:06.988092" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:06.988053" elapsed="0.000400"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:06.990554" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:00:06.989774" elapsed="0.000838"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:00:06.991395" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:00:06.990985" elapsed="0.000464"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:00:06.991506" elapsed="0.000045"/>
</return>
<msg time="2026-10-11T01:00:06.991692" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:00:06.988938" elapsed="0.002787"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:06.995567" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:06.995446" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:06.995403" elapsed="0.000260"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:06.997304" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:06.997144" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:06.997119" elapsed="0.000435"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:00:06.998274" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:00:06.997769" elapsed="0.000586"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:00:06.999199" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:00:06.998884" elapsed="0.000396"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:00:07.034850" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:00:07.001385" elapsed="0.033588"/>
</kw>
<msg time="2026-10-11T01:00:07.035099" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:00:07.035186" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:06.999737" elapsed="0.035519"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:00:07.082902" 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-10-11T01:00:07.036883" elapsed="0.046149"/>
</kw>
<msg time="2026-10-11T01:00:07.083192" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:00:07.083280" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:07.035671" elapsed="0.047680"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:07.083984" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:07.083672" elapsed="0.000445"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:07.083652" elapsed="0.000521"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:07.084875" 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-10-11T01:00:07.084363" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:07.085476" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:07.085158" elapsed="0.000450"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:07.085140" elapsed="0.000523"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:00:07.085697" 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-10-11T01:00:07.089358" elapsed="0.000140"/>
</kw>
<msg time="2026-10-11T01:00:07.089539" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:00:07.088835" elapsed="0.000766"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:07.089850" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:07.090059" 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-10-11T01:00:07.087942" elapsed="0.002334"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:00:07.085992" elapsed="0.004365"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:00:06.996727" elapsed="0.093936"/>
</kw>
<msg time="2026-10-11T01:00:07.090748" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:07.090789" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:06.995890" elapsed="0.094949"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:00:07.090996" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:00:07.090909" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:07.090892" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:07.091490" 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-10-11T01:00:07.092029" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:00:07.092101" 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-10-11T01:00:06.995026" elapsed="0.097164"/>
</kw>
<msg time="2026-10-11T01:00:07.092275" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:07.092315" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:06.992212" elapsed="0.100140"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:07.092704" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:07.092477" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:07.092458" elapsed="0.000317"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:00:06.992011" elapsed="0.100786"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:00:06.991793" elapsed="0.101050"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:00:06.987381" elapsed="0.105512"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:00:06.982645" elapsed="0.110331"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:06.981673" elapsed="0.111345"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:00:06.979049" elapsed="0.114016"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:07.098472" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:07.098608" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:07.098694" 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-10-11T01:00:07.093491" elapsed="0.005227"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:07.098905" elapsed="0.000573"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:07.104045" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:07.104148" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:07.104242" 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-10-11T01:00:07.099644" elapsed="0.004623"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:07.105143" 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-10-11T01:00:07.104886" elapsed="0.000284"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:07.105576" 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-10-11T01:00:07.105323" elapsed="0.000280"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:07.105787" elapsed="0.000291"/>
</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-10-11T01:00:07.104492" elapsed="0.001641"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:07.093199" elapsed="0.012983"/>
</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-10-11T01:00:06.978009" elapsed="0.128209"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:07.106930" 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-10-11T01:00:07.107080" 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-10-11T01:00:07.106767" elapsed="0.000340"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:07.107420" 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-10-11T01:00:07.107542" 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-10-11T01:00:07.107270" elapsed="0.000325"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:07.107912" 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-10-11T01:00:07.108028" 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-10-11T01:00:07.107762" elapsed="0.000290"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:00:07.108392" 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-10-11T01:00:07.108214" elapsed="0.000217"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:07.108732" 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-10-11T01:00:07.108858" 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-10-11T01:00:07.108596" elapsed="0.000287"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:00:07.109217" 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-10-11T01:00:07.109049" elapsed="0.000193"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:07.109674" 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-10-11T01:00:07.109451" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:07.110141" 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-10-11T01:00:07.109928" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:07.110603" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:07.110375" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:07.111065" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:07.110854" elapsed="0.000252"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:07.111243" elapsed="0.002690"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:07.125140" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T01:00:07.125198" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:07.125310" 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-10-11T01:00:07.114094" elapsed="0.011240"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:07.125905" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:07.125606" elapsed="0.000339"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:07.130639" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:07.130747" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:07.130851" 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-10-11T01:00:07.126100" elapsed="0.004776"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:07.131355" 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-10-11T01:00:07.131080" elapsed="0.000319"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:07.137623" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:07.137730" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:07.137831" 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-10-11T01:00:07.132337" elapsed="0.005520"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:07.138337" 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-10-11T01:00:07.138062" elapsed="0.000319"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:07.138561" elapsed="0.000336"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:07.141478" level="INFO">${update} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:00:07.139046" elapsed="0.002459"/>
</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-10-11T01:00:07.141684" elapsed="0.000306"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:00:07.142033" elapsed="0.000030"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:00:07.132027" elapsed="0.010110"/>
</kw>
<msg time="2026-10-11T01:00:07.142207" 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-10-11T01:00:07.131602" elapsed="0.010628"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:07.142662" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:07.142444" elapsed="0.000259"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:07.143529" level="INFO">Length is 136.</msg>
<msg time="2026-10-11T01:00:07.143599" 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-10-11T01:00:07.143263" elapsed="0.000388"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:07.144055" level="INFO">Length is 136.</msg>
<msg time="2026-10-11T01:00:07.144124" 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-10-11T01:00:07.143823" elapsed="0.000322"/>
</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-10-11T01:00:07.144326" elapsed="0.000290"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:07.144932" 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-10-11T01:00:07.144764" elapsed="0.000191"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:07.145253" 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-10-11T01:00:07.145099" elapsed="0.000177"/>
</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-10-11T01:00:07.145472" elapsed="0.000266"/>
</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-10-11T01:00:07.142926" elapsed="0.002866"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:07.145941" elapsed="0.002127"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:07.152699" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:07.152818" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:07.152905" 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-10-11T01:00:07.148579" elapsed="0.004350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:07.153453" 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-10-11T01:00:07.153154" elapsed="0.000344"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:07.153664" elapsed="0.000334"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:07.158361" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:07.158487" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:07.158580" 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-10-11T01:00:07.154163" elapsed="0.004442"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:07.159094" 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-10-11T01:00:07.158822" elapsed="0.000316"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:07.159299" elapsed="0.000337"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T01:00:07.159897" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:07.159705" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:07.159686" elapsed="0.000275"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:07.165594" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:07.165637" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:07.165726" 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-10-11T01:00:07.160114" elapsed="0.005637"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:00:07.148261" elapsed="0.017564"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:07.172020" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:07.172128" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:07.172213" 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-10-11T01:00:07.166728" elapsed="0.005510"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:07.172745" 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-10-11T01:00:07.172466" elapsed="0.000322"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:07.172965" elapsed="0.000504"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:07.175907" level="INFO">${update} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:00:07.173622" elapsed="0.002313"/>
</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-10-11T01:00:07.176092" elapsed="0.000309"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:00:07.176468" elapsed="0.000028"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:00:07.166404" elapsed="0.010165"/>
</kw>
<msg time="2026-10-11T01:00:07.176639" 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-10-11T01:00:07.166005" elapsed="0.010657"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:07.177093" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:07.176875" elapsed="0.000259"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:07.177943" level="INFO">Length is 124.</msg>
<msg time="2026-10-11T01:00:07.178014" 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-10-11T01:00:07.177688" elapsed="0.000349"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:07.178483" level="INFO">Length is 124.</msg>
<msg time="2026-10-11T01:00:07.178552" 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-10-11T01:00:07.178215" elapsed="0.000360"/>
</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-10-11T01:00:07.178778" elapsed="0.000292"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:07.179381" 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-10-11T01:00:07.179226" elapsed="0.000212"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:07.179735" 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-10-11T01:00:07.179585" elapsed="0.000174"/>
</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-10-11T01:00:07.180000" elapsed="0.000275"/>
</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-10-11T01:00:07.177340" elapsed="0.002993"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:07.185046" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:07.185168" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:07.185253" 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-10-11T01:00:07.180921" elapsed="0.004356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:07.185792" 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-10-11T01:00:07.185505" elapsed="0.000346"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:07.186014" elapsed="0.000324"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:07.191267" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:07.191368" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:07.191483" 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-10-11T01:00:07.186513" elapsed="0.004996"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:07.191998" 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-10-11T01:00:07.191713" elapsed="0.000328"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:07.192217" elapsed="0.000337"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T01:00:07.192783" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-10-11T01:00:07.192628" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:07.192608" elapsed="0.000275"/>
</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-10-11T01:00:07.193033" elapsed="0.000019"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:00:07.180603" elapsed="0.012509"/>
</kw>
<arg>route_inc_lacp</arg>
<status status="PASS" start="2026-10-11T01:00:07.106467" elapsed="0.086688"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:06.976144" elapsed="0.217110"/>
</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-10-11T01:00:07.195720" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:00:07.195470" elapsed="0.000512"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:07.197063" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:07.196975" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:07.196957" elapsed="0.000171"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:07.199174" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:07.199091" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:07.199074" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:07.200197" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:00:07.199869" elapsed="0.000353"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:00:07.200655" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:00:07.200376" elapsed="0.000303"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:00:07.200719" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:00:07.200859" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:00:07.199497" elapsed="0.001386"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:07.203438" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:07.203338" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:07.203320" elapsed="0.000183"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:07.204685" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:07.204569" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:07.204551" elapsed="0.000304"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:00:07.205364" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:00:07.205010" elapsed="0.000431"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:00:07.206038" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:00:07.205795" elapsed="0.000301"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:00:07.240330" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:00:07.207629" elapsed="0.032843"/>
</kw>
<msg time="2026-10-11T01:00:07.240599" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:00:07.240689" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:07.206401" elapsed="0.034359"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:00:07.275466" 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-10-11T01:00:07.242355" elapsed="0.033238"/>
</kw>
<msg time="2026-10-11T01:00:07.275715" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:00:07.275802" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:07.241187" elapsed="0.034696"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:07.276482" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:07.276165" elapsed="0.000444"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:07.276146" elapsed="0.000519"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:07.277339" 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-10-11T01:00:07.276866" elapsed="0.000602"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:07.277933" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:07.277633" elapsed="0.000426"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:07.277615" elapsed="0.000498"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:00:07.278146" 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-10-11T01:00:07.281873" elapsed="0.000121"/>
</kw>
<msg time="2026-10-11T01:00:07.282034" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:00:07.281238" elapsed="0.000857"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:07.282357" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:07.282726" 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-10-11T01:00:07.280357" elapsed="0.002597"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:00:07.278444" elapsed="0.004590"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:00:07.204256" elapsed="0.079058"/>
</kw>
<msg time="2026-10-11T01:00:07.283399" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:07.283454" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:07.203655" elapsed="0.079835"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:00:07.283645" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:00:07.283560" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:07.283542" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:07.284112" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:07.284516" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:00:07.284581" 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-10-11T01:00:07.203051" elapsed="0.081616"/>
</kw>
<msg time="2026-10-11T01:00:07.284749" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:07.284788" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:07.201227" elapsed="0.083609"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:07.285122" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:07.284902" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:07.284887" elapsed="0.000304"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:00:07.201084" elapsed="0.084129"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:00:07.200936" elapsed="0.084304"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:00:07.198787" elapsed="0.086502"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:00:07.196538" elapsed="0.088800"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:07.196130" elapsed="0.089248"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:00:07.195091" elapsed="0.090350"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:07.289963" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:07.290068" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:07.290166" 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-10-11T01:00:07.285849" elapsed="0.004341"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:07.290364" elapsed="0.000364"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:07.295823" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:07.295957" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:07.296049" 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-10-11T01:00:07.290901" elapsed="0.005174"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:07.296964" 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-10-11T01:00:07.296686" elapsed="0.000305"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:07.297369" 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-10-11T01:00:07.297141" elapsed="0.000253"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:07.297593" elapsed="0.000287"/>
</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-10-11T01:00:07.296284" elapsed="0.001653"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:07.285573" elapsed="0.012412"/>
</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-10-11T01:00:07.194272" elapsed="0.103748"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:07.298664" 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-10-11T01:00:07.298805" 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-10-11T01:00:07.298514" elapsed="0.000330"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:00:07.307138" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:00:07.306824" elapsed="0.000341"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:00:07.307883" 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-10-11T01:00:07.307666" elapsed="0.000287">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-10-11T01:00:07.308038" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:00:07.307327" elapsed="0.000733"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:07.308553" 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-10-11T01:00:07.308232" elapsed="0.000346"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:07.308867" 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-10-11T01:00:07.308983" 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-10-11T01:00:07.308742" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:07.309434" 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-10-11T01:00:07.309203" elapsed="0.000277"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:00:07.309797" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:07.309541" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:00:07.310326" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:00:07.310032" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:07.309885" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:07.309523" elapsed="0.000879"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:00:07.310974" 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-10-11T01:00:07.310581" elapsed="0.000419"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:00:07.311043" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:00:07.311169" 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-10-11T01:00:07.306379" elapsed="0.004814"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:07.311512" 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-10-11T01:00:07.311628" 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-10-11T01:00:07.311358" elapsed="0.000294"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:07.311967" 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-10-11T01:00:07.312078" 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-10-11T01:00:07.311828" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:07.312527" 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-10-11T01:00:07.312293" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:07.312992" 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-10-11T01:00:07.312766" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:07.313451" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:07.313225" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:07.313905" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:07.313679" elapsed="0.000266"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:07.314083" elapsed="0.002897"/>
</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-10-11T01:00:07.317134" elapsed="0.002374"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:07.324640" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:07.324742" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:07.324885" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T01:00:07.320463" elapsed="0.004771">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:07.325432" elapsed="0.000021"/>
</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-10-11T01:00:07.325643" elapsed="0.000022"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T01:00:07.320138" elapsed="0.005620">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:09.339052" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:09.339338" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:09.339619" 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-10-11T01:00:09.327315" elapsed="0.012361"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T01:00:09.340684" 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-10-11T01:00:09.340949" 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-10-11T01:00:09.340090" elapsed="0.000955"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:09.343308" 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-10-11T01:00:09.342436" elapsed="0.000934"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:09.344579" 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-10-11T01:00:09.343748" elapsed="0.000891"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:09.345072" elapsed="0.000661"/>
</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-10-11T01:00:09.341528" elapsed="0.004355"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T01:00:09.326361" elapsed="0.019633"/>
</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-10-11T01:00:07.319702" elapsed="2.026387"/>
</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-10-11T01:00:09.346441" elapsed="0.003929"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:09.360464" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:09.360786" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:09.361009" 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-10-11T01:00:09.352495" elapsed="0.008569"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:09.361482" elapsed="0.000801"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:09.369314" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:09.369598" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:09.369809" 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-10-11T01:00:09.362679" elapsed="0.007216"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:09.371856" 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-10-11T01:00:09.371262" elapsed="0.000656"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:09.373192" 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-10-11T01:00:09.372257" elapsed="0.000994"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:00:09.374321" 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-10-11T01:00:09.374738" 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-10-11T01:00:09.373692" elapsed="0.001221">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-10-11T01:00:09.370350" elapsed="0.004840">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-10-11T01:00:09.351847" elapsed="0.023677">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-10-11T01:00:11.385897" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:11.386181" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:11.386448" 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-10-11T01:00:11.377095" elapsed="0.009412"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:11.386946" elapsed="0.000953"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:11.395047" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:11.395289" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:11.395582" 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-10-11T01:00:11.388275" elapsed="0.007373"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:11.397682" 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-10-11T01:00:11.397091" elapsed="0.000651"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:11.398662" 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-10-11T01:00:11.398110" elapsed="0.000611"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:11.399159" elapsed="0.000688"/>
</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-10-11T01:00:11.396163" elapsed="0.003812"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:11.376207" elapsed="0.023881"/>
</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-10-11T01:00:09.350906" elapsed="2.049263"/>
</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-10-11T01:00:11.401306" elapsed="0.004003"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:11.413789" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:11.414059" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:11.414342" 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-10-11T01:00:11.407477" elapsed="0.006920"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:11.414853" elapsed="0.000821"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:11.422222" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:11.422493" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:11.422703" 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-10-11T01:00:11.416068" elapsed="0.006689"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:11.424786" 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-10-11T01:00:11.424211" elapsed="0.000657"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:11.425765" 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-10-11T01:00:11.425209" elapsed="0.000632"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:11.426256" elapsed="0.000691"/>
</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-10-11T01:00:11.423242" elapsed="0.003830"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:11.406745" elapsed="0.020434"/>
</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-10-11T01:00:11.405814" elapsed="0.021441"/>
</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-10-11T01:00:11.400569" elapsed="0.026795"/>
</kw>
<arg>route_inc_lacp</arg>
<status status="PASS" start="2026-10-11T01:00:07.298203" elapsed="4.129290"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:07.193699" elapsed="4.234007"/>
</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-10-11T01:00:11.433066" elapsed="0.000869"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:00:11.432480" elapsed="0.001574"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:11.436216" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:11.436004" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:11.435956" elapsed="0.000409"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:11.441026" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:11.440816" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:11.440778" elapsed="0.000387"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.443270" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:00:11.442521" elapsed="0.000806"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.444324" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:00:11.443704" elapsed="0.000674"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:00:11.444499" elapsed="0.000074"/>
</return>
<msg time="2026-10-11T01:00:11.444799" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:00:11.441664" elapsed="0.003211"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:11.448520" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:11.448380" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:11.448355" 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-10-11T01:00:11.450325" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:11.450165" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:11.450141" elapsed="0.000468"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:00:11.451336" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:00:11.450841" elapsed="0.000623"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:00:11.452302" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:00:11.451982" elapsed="0.000403"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:00:11.490528" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:00:11.454537" elapsed="0.036115"/>
</kw>
<msg time="2026-10-11T01:00:11.490781" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:00:11.490903" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:11.452856" elapsed="0.038116"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:00:11.527680" 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-10-11T01:00:11.492566" elapsed="0.035240"/>
</kw>
<msg time="2026-10-11T01:00:11.527940" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:00:11.528027" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:11.491366" elapsed="0.036731"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:11.528707" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:11.528385" elapsed="0.000464"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:11.528365" elapsed="0.000541"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.529603" 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-10-11T01:00:11.529101" elapsed="0.000617"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:11.530322" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:11.529897" elapsed="0.000582"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:11.529878" elapsed="0.000657"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:00:11.530570" 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-10-11T01:00:11.534241" elapsed="0.000121"/>
</kw>
<msg time="2026-10-11T01:00:11.534519" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:00:11.533688" elapsed="0.000901"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:11.534842" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:11.535056" 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-10-11T01:00:11.532900" 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-10-11T01:00:11.530872" elapsed="0.004490"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:00:11.449747" elapsed="0.085786"/>
</kw>
<msg time="2026-10-11T01:00:11.535747" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:11.535790" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:11.448821" elapsed="0.087018"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:00:11.535999" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:00:11.535911" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:11.535893" elapsed="0.000183"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:11.536502" 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-10-11T01:00:11.536946" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:00:11.537013" 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-10-11T01:00:11.447978" elapsed="0.089122"/>
</kw>
<msg time="2026-10-11T01:00:11.537183" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:11.537223" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:11.445379" elapsed="0.091880"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:11.537569" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:11.537326" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:11.537310" elapsed="0.000330"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:00:11.445178" elapsed="0.092484"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:00:11.444973" elapsed="0.092718"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:00:11.440130" elapsed="0.097611"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:00:11.435360" elapsed="0.102431"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:11.434401" elapsed="0.103444"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:00:11.431656" elapsed="0.106238"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:11.542959" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:11.543071" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:11.543167" 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-10-11T01:00:11.538297" elapsed="0.004894"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:11.543367" elapsed="0.000366"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:11.548672" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:11.548807" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:11.548939" 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-10-11T01:00:11.543909" elapsed="0.005056"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:11.549931" 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-10-11T01:00:11.549652" elapsed="0.000311"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:11.550352" 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-10-11T01:00:11.550117" elapsed="0.000324"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:11.550640" elapsed="0.000317"/>
</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-10-11T01:00:11.549208" elapsed="0.001808"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:11.538026" elapsed="0.013040"/>
</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-10-11T01:00:11.430345" elapsed="0.120760"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:11.551851" 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-10-11T01:00:11.552009" 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-10-11T01:00:11.551678" elapsed="0.000366"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:11.552354" 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-10-11T01:00:11.552489" 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-10-11T01:00:11.552210" elapsed="0.000304"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:11.552815" 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-10-11T01:00:11.552949" 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-10-11T01:00:11.552678" elapsed="0.000296"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:00:11.553320" 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-10-11T01:00:11.553140" elapsed="0.000205"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:11.553949" 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-10-11T01:00:11.554068" 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-10-11T01:00:11.553528" elapsed="0.000566"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:00:11.554445" 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-10-11T01:00:11.554259" elapsed="0.000212"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.554910" 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-10-11T01:00:11.554671" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.555382" 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-10-11T01:00:11.555157" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.555870" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:11.555641" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.556370" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:11.556148" elapsed="0.000280"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:11.556573" elapsed="0.002781"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:11.570747" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T01:00:11.570805" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:11.570920" 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-10-11T01:00:11.559544" elapsed="0.011400"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.571453" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:11.571156" elapsed="0.000337"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:11.576471" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:11.576581" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:11.576674" 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-10-11T01:00:11.571652" elapsed="0.005046"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.577195" 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-10-11T01:00:11.576921" elapsed="0.000317"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:11.582909" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:11.583015" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:11.583100" 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-10-11T01:00:11.578182" elapsed="0.004942"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.583661" 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-10-11T01:00:11.583359" elapsed="0.000346"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:11.583884" elapsed="0.000337"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:11.586958" level="INFO">${update} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:00:11.584374" elapsed="0.002611"/>
</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-10-11T01:00:11.587149" elapsed="0.000334"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:00:11.587531" elapsed="0.000039"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:00:11.577875" elapsed="0.009774"/>
</kw>
<msg time="2026-10-11T01:00:11.587720" 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-10-11T01:00:11.577443" elapsed="0.010301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.588184" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:11.587963" elapsed="0.000263"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.589043" level="INFO">Length is 136.</msg>
<msg time="2026-10-11T01:00:11.589112" 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-10-11T01:00:11.588790" elapsed="0.000344"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.589547" level="INFO">Length is 136.</msg>
<msg time="2026-10-11T01:00:11.589614" 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-10-11T01:00:11.589290" 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-10-11T01:00:11.589818" elapsed="0.000276"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:11.590423" 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-10-11T01:00:11.590244" elapsed="0.000205"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:11.590743" 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-10-11T01:00:11.590593" elapsed="0.000173"/>
</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-10-11T01:00:11.590958" elapsed="0.000263"/>
</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-10-11T01:00:11.588457" elapsed="0.002817"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:11.591433" elapsed="0.002503"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:11.598688" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:11.598796" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:11.598906" 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-10-11T01:00:11.594449" elapsed="0.004481"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.599453" 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-10-11T01:00:11.599146" elapsed="0.000352"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:11.599661" elapsed="0.000340"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:11.604915" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:11.605022" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:11.605118" 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-10-11T01:00:11.600192" elapsed="0.004951"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.605649" 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-10-11T01:00:11.605349" elapsed="0.000345"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:11.605871" elapsed="0.000323"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T01:00:11.606449" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:11.606271" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:11.606249" elapsed="0.000263"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:11.611791" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:11.611846" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:11.611936" 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-10-11T01:00:11.606661" elapsed="0.005300"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:00:11.594137" elapsed="0.017885"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:11.617304" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:11.617430" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:11.617518" 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-10-11T01:00:11.612955" elapsed="0.004587"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.618052" 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-10-11T01:00:11.617750" elapsed="0.000345"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:11.618259" elapsed="0.000348"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:11.621494" level="INFO">${update} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:00:11.618757" elapsed="0.002764"/>
</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-10-11T01:00:11.621679" elapsed="0.000323"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:00:11.622078" elapsed="0.000029"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:00:11.612629" elapsed="0.009553"/>
</kw>
<msg time="2026-10-11T01:00:11.622252" 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-10-11T01:00:11.612201" elapsed="0.010075"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.622715" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:11.622495" elapsed="0.000261"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.623575" level="INFO">Length is 124.</msg>
<msg time="2026-10-11T01:00:11.623645" 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-10-11T01:00:11.623307" elapsed="0.000360"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.624071" level="INFO">Length is 124.</msg>
<msg time="2026-10-11T01:00:11.624139" 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-10-11T01:00:11.623823" elapsed="0.000338"/>
</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-10-11T01:00:11.624342" elapsed="0.000286"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:11.624941" 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-10-11T01:00:11.624775" elapsed="0.000189"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:11.625250" 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-10-11T01:00:11.625106" elapsed="0.000167"/>
</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-10-11T01:00:11.625466" elapsed="0.000267"/>
</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-10-11T01:00:11.622975" elapsed="0.002814"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:11.630255" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:11.630361" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:11.630468" 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-10-11T01:00:11.626330" elapsed="0.004163"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.630997" 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-10-11T01:00:11.630704" elapsed="0.000337"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:11.631203" elapsed="0.000340"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:11.635575" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:11.635680" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:11.635773" 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-10-11T01:00:11.631704" elapsed="0.004094"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.636297" 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-10-11T01:00:11.636024" elapsed="0.000348"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:11.636553" elapsed="0.000348"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T01:00:11.637124" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T01:00:11.636970" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:11.636952" elapsed="0.000248"/>
</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-10-11T01:00:11.637354" elapsed="0.000019"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:00:11.626034" elapsed="0.011418"/>
</kw>
<arg>route_inc_lan</arg>
<status status="PASS" start="2026-10-11T01:00:11.551353" elapsed="0.086141"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:11.428707" elapsed="0.208884"/>
</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-10-11T01:00:11.640022" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:00:11.639539" 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-10-11T01:00:11.641240" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:11.641153" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:11.641135" elapsed="0.000167"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:11.643365" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:11.643282" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:11.643264" elapsed="0.000180"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.644357" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:00:11.644025" elapsed="0.000358"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.644815" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:00:11.644555" elapsed="0.000296"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:00:11.644891" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:00:11.645019" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:00:11.643653" elapsed="0.001389"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:11.647751" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:11.647665" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:11.647647" elapsed="0.000168"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:11.649067" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:11.648945" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:11.648927" elapsed="0.000308"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:00:11.649784" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:00:11.649392" elapsed="0.000464"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:00:11.650489" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:00:11.650225" elapsed="0.000322"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:00:11.685460" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:00:11.652049" elapsed="0.033533"/>
</kw>
<msg time="2026-10-11T01:00:11.685708" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:00:11.685814" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:11.650863" elapsed="0.035039"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:00:11.720905" 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-10-11T01:00:11.687518" elapsed="0.033513"/>
</kw>
<msg time="2026-10-11T01:00:11.721189" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:00:11.721277" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:11.686300" elapsed="0.035048"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:11.721978" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:11.721662" elapsed="0.000443"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:11.721641" elapsed="0.000519"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.722924" 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-10-11T01:00:11.722353" elapsed="0.000687"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:11.723528" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:11.723209" elapsed="0.000450"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:11.723190" elapsed="0.000524"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:00:11.723748" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:00:11.727333" elapsed="0.000311"/>
</kw>
<msg time="2026-10-11T01:00:11.727684" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:00:11.726783" elapsed="0.000964"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:11.727998" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:11.728203" 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-10-11T01:00:11.726040" elapsed="0.002395"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:00:11.724061" elapsed="0.004455"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:00:11.648637" elapsed="0.080031"/>
</kw>
<msg time="2026-10-11T01:00:11.728752" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:11.728792" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:11.648027" elapsed="0.080820"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:00:11.729003" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:00:11.728917" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:11.728899" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:11.729495" 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-10-11T01:00:11.730036" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:00:11.730107" 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-10-11T01:00:11.647359" elapsed="0.082837"/>
</kw>
<msg time="2026-10-11T01:00:11.730280" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:11.730320" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:11.645383" elapsed="0.084974"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:11.730664" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:11.730440" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:11.730423" elapsed="0.000311"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:00:11.645239" elapsed="0.085516"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:00:11.645092" elapsed="0.085692"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:00:11.642990" elapsed="0.087865"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:00:11.640900" elapsed="0.090041"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:11.640493" elapsed="0.090489"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:00:11.639006" elapsed="0.092023"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:11.736138" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:11.736253" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:11.736343" 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-10-11T01:00:11.731454" elapsed="0.004913"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:11.736560" elapsed="0.000562"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:11.741449" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:11.741553" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:11.741647" 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-10-11T01:00:11.737296" elapsed="0.004376"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:11.742566" 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-10-11T01:00:11.742283" elapsed="0.000310"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:11.742994" 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-10-11T01:00:11.742744" elapsed="0.000276"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:11.743202" elapsed="0.000301"/>
</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-10-11T01:00:11.741895" elapsed="0.001664"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:11.731164" elapsed="0.012444"/>
</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-10-11T01:00:11.638542" elapsed="0.105101"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:11.744293" 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-10-11T01:00:11.744442" 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-10-11T01:00:11.744145" elapsed="0.000325"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.752562" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:00:11.752234" elapsed="0.000355"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:00:11.753389" 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-10-11T01:00:11.753176" elapsed="0.000308">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-10-11T01:00:11.753571" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:00:11.752749" elapsed="0.000845"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.754168" 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-10-11T01:00:11.753788" elapsed="0.000409"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:11.754535" 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-10-11T01:00:11.754674" 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-10-11T01:00:11.754393" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.755138" 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-10-11T01:00:11.754916" elapsed="0.000268"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:00:11.755589" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:11.755254" elapsed="0.000389"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.756123" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:00:11.755817" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:11.755669" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:11.755232" elapsed="0.000967"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.756770" 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-10-11T01:00:11.756366" elapsed="0.000431"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:00:11.756856" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T01:00:11.756998" 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-10-11T01:00:11.751785" elapsed="0.005237"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:11.757326" 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-10-11T01:00:11.757520" 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-10-11T01:00:11.757189" elapsed="0.000356"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:11.757859" 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-10-11T01:00:11.757972" 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-10-11T01:00:11.757707" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.758424" 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-10-11T01:00:11.758188" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.758943" 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-10-11T01:00:11.758708" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.759389" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:11.759177" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:11.759870" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:11.759642" elapsed="0.000268"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:11.760049" elapsed="0.002909"/>
</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-10-11T01:00:11.763105" elapsed="0.002013"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:11.769844" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:11.769983" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:11.770089" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T01:00:11.766087" elapsed="0.004399">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:11.770673" elapsed="0.000021"/>
</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-10-11T01:00:11.770906" elapsed="0.000023"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T01:00:11.765761" elapsed="0.005265">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:13.780338" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:13.780673" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:13.780913" 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-10-11T01:00:13.772563" elapsed="0.008408"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T01:00:13.781982" 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-10-11T01:00:13.782327" 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-10-11T01:00:13.781365" elapsed="0.001089"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:13.784733" 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-10-11T01:00:13.783857" elapsed="0.000938"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:13.785981" 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-10-11T01:00:13.785162" 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-10-11T01:00:13.786483" elapsed="0.000650"/>
</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-10-11T01:00:13.782941" elapsed="0.004321"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T01:00:13.771650" elapsed="0.015723"/>
</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-10-11T01:00:11.765309" elapsed="2.022190"/>
</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-10-11T01:00:13.787827" elapsed="0.003904"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:13.799959" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:13.800189" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:13.800378" 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-10-11T01:00:13.793794" elapsed="0.006677"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:13.800883" elapsed="0.001299"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:13.808606" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:13.808873" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:13.809087" 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-10-11T01:00:13.802586" elapsed="0.006555"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:13.811121" 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-10-11T01:00:13.810550" elapsed="0.000630"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:13.812494" 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-10-11T01:00:13.811552" elapsed="0.001004"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:00:13.813691" 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-10-11T01:00:13.814163" 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-10-11T01:00:13.812988" elapsed="0.001360">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-10-11T01:00:13.809632" elapsed="0.005070">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-10-11T01:00:13.793158" elapsed="0.021840">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-10-11T01:00:15.824333" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:15.824655" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:15.824895" 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-10-11T01:00:15.816612" elapsed="0.008341"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:15.825355" elapsed="0.000925"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:15.833968" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:15.834197" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:15.834402" 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-10-11T01:00:15.826682" elapsed="0.007820"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:15.836612" 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-10-11T01:00:15.836015" elapsed="0.000656"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:15.837575" 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-10-11T01:00:15.837032" elapsed="0.000602"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:15.838103" elapsed="0.000660"/>
</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-10-11T01:00:15.835089" elapsed="0.003823"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:15.815745" elapsed="0.023276"/>
</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-10-11T01:00:13.792215" elapsed="2.046886"/>
</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-10-11T01:00:15.840221" elapsed="0.004006"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:15.853113" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:15.853345" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:15.853598" 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-10-11T01:00:15.846804" elapsed="0.006850"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:15.854087" elapsed="0.000825"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:15.861598" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:15.861823" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:15.862052" 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-10-11T01:00:15.855279" elapsed="0.006827"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:15.864128" 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-10-11T01:00:15.863565" elapsed="0.000622"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:15.865102" 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-10-11T01:00:15.864558" elapsed="0.000601"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:15.865629" elapsed="0.000672"/>
</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-10-11T01:00:15.862595" elapsed="0.003868"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:15.846105" elapsed="0.020471"/>
</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-10-11T01:00:15.844730" elapsed="0.021922"/>
</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-10-11T01:00:15.839497" elapsed="0.027263"/>
</kw>
<arg>route_inc_lan</arg>
<status status="PASS" start="2026-10-11T01:00:11.743845" elapsed="4.123215"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:11.638022" elapsed="4.229251"/>
</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-10-11T01:00:15.871190" elapsed="0.000482"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:00:15.870608" elapsed="0.001176"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:15.873978" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:15.873737" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:15.873692" elapsed="0.000433"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:15.881713" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:15.881521" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:15.881480" elapsed="0.000399"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:15.884026" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:00:15.883218" elapsed="0.000867"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:00:15.885108" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:00:15.884459" elapsed="0.000704"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:00:15.885255" elapsed="0.000068"/>
</return>
<msg time="2026-10-11T01:00:15.885592" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:00:15.882356" elapsed="0.003270"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:15.889200" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:15.889082" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:15.889057" 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-10-11T01:00:15.890969" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:15.890791" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:15.890765" elapsed="0.000426"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:00:15.891940" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:00:15.891426" elapsed="0.000597"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:00:15.892859" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:00:15.892526" elapsed="0.000417"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:00:15.930652" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:00:15.895045" elapsed="0.035734"/>
</kw>
<msg time="2026-10-11T01:00:15.930937" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:00:15.931026" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:15.893366" elapsed="0.037729"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:00:15.967989" 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-10-11T01:00:15.932719" elapsed="0.035400"/>
</kw>
<msg time="2026-10-11T01:00:15.968240" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:00:15.968327" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:15.931520" elapsed="0.036876"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:15.969024" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:15.968714" elapsed="0.000440"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:15.968694" elapsed="0.000515"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:15.969908" 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-10-11T01:00:15.969397" elapsed="0.000675"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:15.970550" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:15.970241" elapsed="0.000439"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:15.970221" elapsed="0.000515"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:00:15.970770" 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-10-11T01:00:15.974300" elapsed="0.000280"/>
</kw>
<msg time="2026-10-11T01:00:15.974621" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:00:15.973860" 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-10-11T01:00:15.974932" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:15.975143" 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-10-11T01:00:15.973105" elapsed="0.002254"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:00:15.971112" elapsed="0.004361"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:00:15.890352" elapsed="0.085271"/>
</kw>
<msg time="2026-10-11T01:00:15.975706" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:15.975745" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:15.889525" elapsed="0.086256"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:00:15.975948" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:00:15.975862" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:15.975831" elapsed="0.000193"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:15.976401" elapsed="0.000040"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:15.976794" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:00:15.976871" 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-10-11T01:00:15.888663" elapsed="0.088294"/>
</kw>
<msg time="2026-10-11T01:00:15.977039" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:15.977078" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:15.886119" elapsed="0.090994"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:15.977398" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:15.977178" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:15.977163" elapsed="0.000321"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:00:15.885911" elapsed="0.091595"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:00:15.885695" elapsed="0.091838"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:00:15.880791" elapsed="0.096791"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:00:15.873128" elapsed="0.104504"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:15.872148" elapsed="0.105524"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:00:15.869782" elapsed="0.107935"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:15.983112" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:15.983265" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:15.983363" 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-10-11T01:00:15.978187" elapsed="0.005200"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:15.983582" elapsed="0.000380"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:15.988163" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:15.988264" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:15.988356" 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-10-11T01:00:15.984126" elapsed="0.004254"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:15.989258" 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-10-11T01:00:15.989005" elapsed="0.000280"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:15.989680" 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-10-11T01:00:15.989452" elapsed="0.000254"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:15.989900" elapsed="0.000278"/>
</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-10-11T01:00:15.988613" elapsed="0.001620"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:15.977861" elapsed="0.012419"/>
</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-10-11T01:00:15.868787" elapsed="0.121529"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:15.991032" 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-10-11T01:00:15.991187" 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-10-11T01:00:15.990878" elapsed="0.000337"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:15.991536" 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-10-11T01:00:15.991652" 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-10-11T01:00:15.991378" elapsed="0.000298"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:15.991989" 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-10-11T01:00:15.992105" 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-10-11T01:00:15.991839" elapsed="0.000290"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:00:15.992482" 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-10-11T01:00:15.992289" elapsed="0.000218"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:15.992834" 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-10-11T01:00:15.992962" 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-10-11T01:00:15.992669" elapsed="0.000318"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:00:15.993311" 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-10-11T01:00:15.993146" elapsed="0.000189"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:15.993764" 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-10-11T01:00:15.993543" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:15.994230" 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-10-11T01:00:15.994015" elapsed="0.000259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:15.994691" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:15.994478" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:15.995169" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:15.994958" elapsed="0.000252"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:15.995347" elapsed="0.002888"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:16.007723" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T01:00:16.007781" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:16.007888" 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-10-11T01:00:15.998397" elapsed="0.009515"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:16.008395" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:16.008120" elapsed="0.000344"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:16.013024" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:16.013131" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:16.013256" 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-10-11T01:00:16.008620" elapsed="0.004661"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:16.013781" 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-10-11T01:00:16.013506" elapsed="0.000319"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:16.019322" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:16.019451" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:16.019537" 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-10-11T01:00:16.014741" elapsed="0.004820"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:16.020057" 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-10-11T01:00:16.019764" elapsed="0.000337"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:16.020263" elapsed="0.000339"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:16.022873" level="INFO">${update} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:00:16.020752" elapsed="0.002149"/>
</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-10-11T01:00:16.023057" elapsed="0.000310"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:00:16.023433" elapsed="0.000030"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:00:16.014435" elapsed="0.009103"/>
</kw>
<msg time="2026-10-11T01:00:16.023608" 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-10-11T01:00:16.014020" elapsed="0.009611"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:16.024059" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:16.023829" elapsed="0.000271"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:16.024923" level="INFO">Length is 136.</msg>
<msg time="2026-10-11T01:00:16.024992" 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-10-11T01:00:16.024671" elapsed="0.000344"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:16.025399" level="INFO">Length is 136.</msg>
<msg time="2026-10-11T01:00:16.025487" 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-10-11T01:00:16.025170" elapsed="0.000339"/>
</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-10-11T01:00:16.025695" elapsed="0.000278"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:16.026270" 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-10-11T01:00:16.026119" elapsed="0.000174"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:16.026600" 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-10-11T01:00:16.026448" elapsed="0.000175"/>
</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-10-11T01:00:16.026801" elapsed="0.000281"/>
</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-10-11T01:00:16.024308" elapsed="0.002828"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:16.027273" elapsed="0.002266"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:16.034020" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:16.034126" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:16.034212" 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-10-11T01:00:16.030029" elapsed="0.004207"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:16.034733" 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-10-11T01:00:16.034457" elapsed="0.000319"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:16.034949" elapsed="0.000321"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:16.039789" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:16.039919" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:16.040014" 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-10-11T01:00:16.035457" elapsed="0.004581"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:16.040540" 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-10-11T01:00:16.040244" elapsed="0.000340"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:16.040746" elapsed="0.000334"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T01:00:16.041297" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:16.041148" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:16.041130" elapsed="0.000226"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:16.051217" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:16.051259" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:16.051352" 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-10-11T01:00:16.041519" elapsed="0.009857"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:00:16.029728" elapsed="0.021732"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:16.056810" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:16.056960" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:16.057046" 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-10-11T01:00:16.052373" elapsed="0.004697"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:16.057574" 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-10-11T01:00:16.057275" elapsed="0.000343"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:16.057779" elapsed="0.000341"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:16.060824" level="INFO">${update} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:00:16.058269" elapsed="0.002594"/>
</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-10-11T01:00:16.061022" elapsed="0.000310"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:00:16.061376" elapsed="0.000058"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:00:16.052068" elapsed="0.009445"/>
</kw>
<msg time="2026-10-11T01:00:16.061588" 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-10-11T01:00:16.051645" elapsed="0.009966"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:16.062054" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:16.061810" elapsed="0.000285"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:16.062904" level="INFO">Length is 124.</msg>
<msg time="2026-10-11T01:00:16.062973" 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-10-11T01:00:16.062652" elapsed="0.000343"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:16.063385" level="INFO">Length is 124.</msg>
<msg time="2026-10-11T01:00:16.063470" 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-10-11T01:00:16.063151" elapsed="0.000341"/>
</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-10-11T01:00:16.063673" elapsed="0.000279"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:16.064249" 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-10-11T01:00:16.064099" elapsed="0.000174"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:16.064586" 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-10-11T01:00:16.064434" elapsed="0.000175"/>
</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-10-11T01:00:16.064787" elapsed="0.000278"/>
</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-10-11T01:00:16.062301" elapsed="0.002819"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:16.069767" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:16.069893" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:16.069978" 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-10-11T01:00:16.065661" elapsed="0.004341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:16.070509" 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-10-11T01:00:16.070208" elapsed="0.000379"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:16.070753" elapsed="0.000340"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:16.075190" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:16.075291" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:16.075383" 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-10-11T01:00:16.071254" elapsed="0.004172"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:16.075922" 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-10-11T01:00:16.075634" elapsed="0.000331"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:16.076127" elapsed="0.000339"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T01:00:16.076682" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:00:16.076536" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:16.076518" elapsed="0.000239"/>
</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-10-11T01:00:16.076916" elapsed="0.000021"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:00:16.065339" elapsed="0.011658"/>
</kw>
<arg>route_inc_mac</arg>
<status status="PASS" start="2026-10-11T01:00:15.990562" elapsed="0.086475"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:15.867881" elapsed="0.209245"/>
</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-10-11T01:00:16.078961" elapsed="0.000200"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:00:16.078702" elapsed="0.000509"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:16.080129" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:16.080043" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:16.080024" elapsed="0.000167"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:16.082226" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:16.082144" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:16.082127" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:16.083209" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:00:16.082885" elapsed="0.000350"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:00:16.083667" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:00:16.083389" elapsed="0.000302"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:00:16.083730" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:00:16.083867" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:00:16.082515" elapsed="0.001376"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:16.086642" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:16.086558" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:16.086541" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:16.087874" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:16.087748" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:16.087731" elapsed="0.000296"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:00:16.088591" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:00:16.088222" elapsed="0.000427"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:00:16.089228" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:00:16.089006" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:00:16.125341" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:00:16.090764" elapsed="0.034721"/>
</kw>
<msg time="2026-10-11T01:00:16.125608" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:00:16.125698" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:16.089608" elapsed="0.036161"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:00:16.162364" 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-10-11T01:00:16.127358" elapsed="0.035152"/>
</kw>
<msg time="2026-10-11T01:00:16.162629" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:00:16.162716" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:16.126173" elapsed="0.036613"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:16.163430" elapsed="0.000067"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:16.163102" elapsed="0.000459"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:16.163082" elapsed="0.000535"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:16.164300" 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-10-11T01:00:16.163811" elapsed="0.000618"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:16.164902" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:16.164597" elapsed="0.000434"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:16.164579" elapsed="0.000507"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:00:16.165119" 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-10-11T01:00:16.168545" elapsed="0.000116"/>
</kw>
<msg time="2026-10-11T01:00:16.168700" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:00:16.168096" 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="NOT RUN" start="2026-10-11T01:00:16.169011" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:16.169218" 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-10-11T01:00:16.167339" elapsed="0.002108"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:00:16.165398" elapsed="0.004131"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:00:16.087462" elapsed="0.082216"/>
</kw>
<msg time="2026-10-11T01:00:16.169761" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:16.169800" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:16.086873" elapsed="0.082962"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:00:16.170002" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:00:16.169917" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:16.169899" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:16.170526" 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-10-11T01:00:16.170973" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:00:16.171040" 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-10-11T01:00:16.086244" elapsed="0.084882"/>
</kw>
<msg time="2026-10-11T01:00:16.171210" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:16.171249" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:16.084231" elapsed="0.087054"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:16.171635" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:16.171351" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:16.171335" elapsed="0.000372"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:00:16.084087" elapsed="0.087642"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:00:16.083941" elapsed="0.087816"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:00:16.081852" elapsed="0.089954"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:00:16.079770" elapsed="0.092117"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:16.079359" elapsed="0.092570"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:00:16.078343" elapsed="0.093634"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:16.177302" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:16.177431" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:16.177529" 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-10-11T01:00:16.172375" elapsed="0.005179"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:16.177727" elapsed="0.000358"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:16.182325" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:16.182449" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:16.182544" 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-10-11T01:00:16.178248" elapsed="0.004320"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:16.183453" 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-10-11T01:00:16.183178" elapsed="0.000303"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:16.183895" 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-10-11T01:00:16.183633" elapsed="0.000290"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:16.184139" elapsed="0.000298"/>
</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-10-11T01:00:16.182773" elapsed="0.001721"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:16.172106" elapsed="0.012436"/>
</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-10-11T01:00:16.077721" elapsed="0.106856"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:16.185224" 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-10-11T01:00:16.185368" 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-10-11T01:00:16.185079" elapsed="0.000316"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:00:16.193549" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:00:16.193228" elapsed="0.000348"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:00:16.194285" 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-10-11T01:00:16.194077" elapsed="0.000285">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-10-11T01:00:16.194464" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:00:16.193738" elapsed="0.000749"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:16.195002" 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-10-11T01:00:16.194663" elapsed="0.000365"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:16.195312" 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-10-11T01:00:16.195443" 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-10-11T01:00:16.195203" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:16.195897" 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-10-11T01:00:16.195668" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:00:16.196264" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:16.196005" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:00:16.196764" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:00:16.196502" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:16.196338" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:16.195987" elapsed="0.000853"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:00:16.197401" 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-10-11T01:00:16.197018" elapsed="0.000425"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:00:16.197488" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:00:16.197615" 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-10-11T01:00:16.192792" elapsed="0.004847"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:16.197956" 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-10-11T01:00:16.198103" 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-10-11T01:00:16.197804" elapsed="0.000324"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:16.198445" 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-10-11T01:00:16.198558" 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-10-11T01:00:16.198292" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:16.199040" 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-10-11T01:00:16.198803" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:16.199515" 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-10-11T01:00:16.199283" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:16.199980" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:16.199750" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:16.200437" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:16.200211" elapsed="0.000268"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:16.200617" elapsed="0.002356"/>
</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-10-11T01:00:16.203129" 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-10-11T01:00:16.210643" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:16.210747" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:16.210838" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T01:00:16.207001" elapsed="0.004218">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:16.211403" elapsed="0.000041"/>
</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-10-11T01:00:16.211637" elapsed="0.000022"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T01:00:16.206678" elapsed="0.005080">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:18.221330" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:18.221758" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:18.221998" 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-10-11T01:00:18.213342" elapsed="0.008713"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T01:00:18.223074" 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-10-11T01:00:18.223321" 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-10-11T01:00:18.222479" elapsed="0.000964"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:18.225746" 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-10-11T01:00:18.224821" elapsed="0.000988"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:18.227012" 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-10-11T01:00:18.226181" elapsed="0.000891"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:18.227518" elapsed="0.000650"/>
</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-10-11T01:00:18.223923" elapsed="0.004374"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T01:00:18.212400" elapsed="0.016039"/>
</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-10-11T01:00:16.206243" elapsed="2.022295"/>
</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-10-11T01:00:18.228889" elapsed="0.003870"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:18.240964" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:18.241198" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:18.241388" 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-10-11T01:00:18.234831" elapsed="0.006642"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:18.241878" elapsed="0.000811"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:18.249541" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:18.249787" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:18.250094" 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-10-11T01:00:18.243074" elapsed="0.007077"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:18.252124" 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-10-11T01:00:18.251559" elapsed="0.000624"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:18.253500" 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-10-11T01:00:18.252554" elapsed="0.001008"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:00:18.254629" 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-10-11T01:00:18.255039" 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-10-11T01:00:18.253995" elapsed="0.001197">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-10-11T01:00:18.250647" elapsed="0.004853">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-10-11T01:00:18.234194" elapsed="0.021548">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-10-11T01:00:20.265072" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:20.265351" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:20.265598" 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-10-11T01:00:20.257294" elapsed="0.008360"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:20.266083" elapsed="0.000899"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:20.273615" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:20.273846" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:20.274079" 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-10-11T01:00:20.267480" elapsed="0.006654"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:20.276153" 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-10-11T01:00:20.275560" elapsed="0.000653"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:20.277124" 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-10-11T01:00:20.276586" elapsed="0.000596"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:20.277625" elapsed="0.000652"/>
</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-10-11T01:00:20.274631" elapsed="0.003773"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:20.256394" elapsed="0.022152"/>
</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-10-11T01:00:18.233243" elapsed="2.045384"/>
</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-10-11T01:00:20.279759" elapsed="0.003820"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:20.292160" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:20.292393" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:20.292647" 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-10-11T01:00:20.286107" elapsed="0.006595"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:20.293117" elapsed="0.000819"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:20.300323" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:20.300594" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:20.300803" 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-10-11T01:00:20.294299" elapsed="0.006582"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:20.302910" 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-10-11T01:00:20.302313" elapsed="0.000658"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:20.303958" 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-10-11T01:00:20.303382" elapsed="0.000637"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:20.304457" elapsed="0.000641"/>
</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-10-11T01:00:20.301342" elapsed="0.003882"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:20.284981" elapsed="0.020349"/>
</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-10-11T01:00:20.284063" elapsed="0.021370"/>
</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-10-11T01:00:20.279017" elapsed="0.026531"/>
</kw>
<arg>route_inc_mac</arg>
<status status="PASS" start="2026-10-11T01:00:16.184763" elapsed="4.120881"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:16.077315" elapsed="4.228534"/>
</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-10-11T01:00:20.309801" elapsed="0.000463"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:00:20.309210" elapsed="0.001166"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:20.312549" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:20.312304" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:20.312257" elapsed="0.000440"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:20.317371" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:20.317185" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:20.317147" elapsed="0.000398"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.319699" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:00:20.318931" elapsed="0.000826"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.320817" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:00:20.320194" elapsed="0.000703"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:00:20.320989" elapsed="0.000077"/>
</return>
<msg time="2026-10-11T01:00:20.321294" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:00:20.318072" elapsed="0.003273"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:20.325290" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:20.325172" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:20.325148" elapsed="0.000230"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:20.327043" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:20.326882" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:20.326840" elapsed="0.000422"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:00:20.328006" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:00:20.327498" elapsed="0.000590"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:00:20.329016" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:00:20.328606" elapsed="0.000491"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:00:20.365798" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:00:20.331229" elapsed="0.034713"/>
</kw>
<msg time="2026-10-11T01:00:20.366074" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:00:20.366165" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:20.329555" elapsed="0.036682"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:00:20.400453" 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-10-11T01:00:20.367911" elapsed="0.032669"/>
</kw>
<msg time="2026-10-11T01:00:20.400741" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:00:20.400831" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:20.366665" elapsed="0.034252"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:20.401542" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:20.401215" elapsed="0.000467"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:20.401195" elapsed="0.000545"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.402451" 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-10-11T01:00:20.401947" elapsed="0.000620"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:20.403049" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:20.402740" elapsed="0.000439"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:20.402721" elapsed="0.000518"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:00:20.403272" 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-10-11T01:00:20.406956" elapsed="0.000120"/>
</kw>
<msg time="2026-10-11T01:00:20.407117" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:00:20.406388" elapsed="0.000791"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:20.407506" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:20.407718" 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-10-11T01:00:20.405645" 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-10-11T01:00:20.403582" 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-10-11T01:00:20.326465" elapsed="0.081714"/>
</kw>
<msg time="2026-10-11T01:00:20.408263" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:20.408303" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:20.325611" elapsed="0.082727"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:00:20.408553" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:00:20.408464" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:20.408389" 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-10-11T01:00:20.409034" 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-10-11T01:00:20.409430" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:00:20.409496" 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-10-11T01:00:20.324754" elapsed="0.084827"/>
</kw>
<msg time="2026-10-11T01:00:20.409665" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:20.409708" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:20.321950" elapsed="0.087793"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:20.410044" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:20.409810" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:20.409794" elapsed="0.000320"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:00:20.321734" elapsed="0.088402"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:00:20.321486" elapsed="0.088679"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:00:20.316484" elapsed="0.093729"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:00:20.311687" elapsed="0.098608"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:20.310741" elapsed="0.099596"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:00:20.308379" elapsed="0.102005"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:20.415494" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:20.415610" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:20.415697" 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-10-11T01:00:20.410818" elapsed="0.004903"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:20.415914" elapsed="0.000351"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:20.420293" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:20.420395" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:20.420512" 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-10-11T01:00:20.416443" elapsed="0.004094"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:20.421401" 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-10-11T01:00:20.421150" elapsed="0.000293"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:20.421826" 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-10-11T01:00:20.421597" elapsed="0.000255"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:20.422049" elapsed="0.000275"/>
</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-10-11T01:00:20.420749" elapsed="0.001631"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:20.410542" elapsed="0.011904"/>
</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-10-11T01:00:20.307225" elapsed="0.115258"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:20.423183" 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-10-11T01:00:20.423330" 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-10-11T01:00:20.423033" elapsed="0.000324"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:20.423678" 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-10-11T01:00:20.423794" 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-10-11T01:00:20.423535" elapsed="0.000309"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:20.424161" 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-10-11T01:00:20.424276" 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-10-11T01:00:20.424023" elapsed="0.000278"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:00:20.424657" 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-10-11T01:00:20.424479" elapsed="0.000203"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:20.424991" 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-10-11T01:00:20.425106" 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-10-11T01:00:20.424844" elapsed="0.000287"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:00:20.425472" 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-10-11T01:00:20.425290" elapsed="0.000206"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.425927" 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-10-11T01:00:20.425689" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.426380" 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-10-11T01:00:20.426168" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.426841" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:20.426630" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.427290" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:20.427080" elapsed="0.000250"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:20.427481" elapsed="0.003057"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:20.439341" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T01:00:20.439399" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:20.439531" 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-10-11T01:00:20.430706" elapsed="0.008849"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.440063" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:20.439769" elapsed="0.000333"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:20.444347" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:20.444475" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:20.444568" 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-10-11T01:00:20.440258" elapsed="0.004335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.445088" 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-10-11T01:00:20.444798" elapsed="0.000333"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:20.454953" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:20.455060" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:20.455145" 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-10-11T01:00:20.446061" elapsed="0.009116"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.455689" 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-10-11T01:00:20.455383" elapsed="0.000349"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:20.455919" elapsed="0.000326"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:20.458629" level="INFO">${update} = ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:00:20.456394" elapsed="0.002263"/>
</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-10-11T01:00:20.458838" elapsed="0.000299"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:00:20.459180" elapsed="0.000038"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:00:20.445736" elapsed="0.013556"/>
</kw>
<msg time="2026-10-11T01:00:20.459361" 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-10-11T01:00:20.445313" elapsed="0.014072"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.459826" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:20.459607" elapsed="0.000271"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.460669" level="INFO">Length is 136.</msg>
<msg time="2026-10-11T01:00:20.460737" 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-10-11T01:00:20.460432" elapsed="0.000355"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.461193" level="INFO">Length is 136.</msg>
<msg time="2026-10-11T01:00:20.461261" 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-10-11T01:00:20.460962" elapsed="0.000321"/>
</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-10-11T01:00:20.461488" elapsed="0.000266"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:20.462065" 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-10-11T01:00:20.461912" elapsed="0.000177"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:20.462378" 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-10-11T01:00:20.462231" elapsed="0.000171"/>
</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-10-11T01:00:20.462603" elapsed="0.000277"/>
</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-10-11T01:00:20.460088" elapsed="0.002845"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:20.463073" elapsed="0.002036"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:20.470258" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:20.470364" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:20.470473" 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-10-11T01:00:20.465610" elapsed="0.004888"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.470991" 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-10-11T01:00:20.470702" elapsed="0.000334"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:20.471201" elapsed="0.000343"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:20.475956" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:20.476062" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:20.476155" 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-10-11T01:00:20.471703" elapsed="0.004476"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.476678" 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-10-11T01:00:20.476384" elapsed="0.000337"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:20.476896" elapsed="0.000321"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T01:00:20.477481" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:20.477287" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:20.477268" elapsed="0.000277"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:20.485540" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:20.485583" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:20.485674" 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-10-11T01:00:20.477691" elapsed="0.008009"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:00:20.465296" elapsed="0.020464"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:20.490677" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:20.490784" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:20.490880" 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-10-11T01:00:20.486685" elapsed="0.004220"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.491390" 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-10-11T01:00:20.491110" elapsed="0.000340"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:20.491614" elapsed="0.042046"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:20.536678" level="INFO">${update} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:00:20.533889" elapsed="0.002820"/>
</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-10-11T01:00:20.536880" elapsed="0.000328"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:00:20.537257" elapsed="0.000047"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:00:20.486358" elapsed="0.051034"/>
</kw>
<msg time="2026-10-11T01:00:20.537502" 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-10-11T01:00:20.485955" elapsed="0.051571"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.537967" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:20.537734" elapsed="0.000274"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.538850" level="INFO">Length is 124.</msg>
<msg time="2026-10-11T01:00:20.538930" 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-10-11T01:00:20.538614" elapsed="0.000338"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.539340" level="INFO">Length is 124.</msg>
<msg time="2026-10-11T01:00:20.539430" 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-10-11T01:00:20.539108" 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-10-11T01:00:20.539635" elapsed="0.000275"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:20.540206" 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-10-11T01:00:20.540059" elapsed="0.000170"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:20.540530" 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-10-11T01:00:20.540369" elapsed="0.000184"/>
</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-10-11T01:00:20.540791" elapsed="0.000299"/>
</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-10-11T01:00:20.538232" elapsed="0.002912"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:20.546278" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:20.546437" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:20.546525" 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-10-11T01:00:20.541694" elapsed="0.004855"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.547048" 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-10-11T01:00:20.546754" elapsed="0.000338"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:20.547253" elapsed="0.000340"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:20.551478" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:20.551581" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:20.551674" 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-10-11T01:00:20.547765" elapsed="0.003934"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.552211" 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-10-11T01:00:20.551936" elapsed="0.000317"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:20.552430" elapsed="0.000322"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T01:00:20.553004" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-11T01:00:20.552826" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:20.552806" elapsed="0.000277"/>
</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-10-11T01:00:20.553233" elapsed="0.000019"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:00:20.541383" elapsed="0.011928"/>
</kw>
<arg>route_inc_rou</arg>
<status status="PASS" start="2026-10-11T01:00:20.422719" elapsed="0.130633"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:20.306276" elapsed="0.247193"/>
</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-10-11T01:00:20.555485" elapsed="0.000203"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:00:20.555215" 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-10-11T01:00:20.556654" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:20.556562" elapsed="0.000134"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:20.556545" elapsed="0.000171"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:20.558770" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:20.558687" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:20.558670" elapsed="0.000207"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.559801" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:00:20.559475" elapsed="0.000352"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.560253" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:00:20.559994" elapsed="0.000284"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:00:20.560317" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:00:20.560461" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:00:20.559091" elapsed="0.001394"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:20.563154" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:20.563070" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:20.563052" elapsed="0.000171"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:20.564398" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:20.564284" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:20.564267" elapsed="0.000311"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:00:20.565098" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:00:20.564730" elapsed="0.000425"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:00:20.565755" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:00:20.565524" elapsed="0.000288"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:00:20.590769" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:00:20.567374" elapsed="0.023527"/>
</kw>
<msg time="2026-10-11T01:00:20.591023" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:00:20.591113" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:20.566129" elapsed="0.025055"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:00:20.612044" 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-10-11T01:00:20.592824" elapsed="0.019346"/>
</kw>
<msg time="2026-10-11T01:00:20.612290" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:00:20.612377" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:20.591627" elapsed="0.020841"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:20.613055" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:20.612749" elapsed="0.000431"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:20.612730" elapsed="0.000504"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.613929" 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-10-11T01:00:20.613438" elapsed="0.000603"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:20.614520" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:20.614204" elapsed="0.000443"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:20.614186" elapsed="0.000516"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:00:20.614735" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:00:20.618253" elapsed="0.000120"/>
</kw>
<msg time="2026-10-11T01:00:20.618558" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:00:20.617757" elapsed="0.000867"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:20.618899" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:20.619108" 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-10-11T01:00:20.616959" elapsed="0.002361"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:00:20.615026" elapsed="0.004372"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:00:20.564000" elapsed="0.055563"/>
</kw>
<msg time="2026-10-11T01:00:20.619646" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:20.619685" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:20.563375" elapsed="0.056345"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:00:20.619901" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T01:00:20.619788" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:20.619771" 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-10-11T01:00:20.620359" 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-10-11T01:00:20.620767" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:00:20.620831" 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-10-11T01:00:20.562753" elapsed="0.058180"/>
</kw>
<msg time="2026-10-11T01:00:20.621017" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:20.621058" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:20.560830" elapsed="0.060263"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:20.621378" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:20.621159" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:20.621143" elapsed="0.000323"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:00:20.560686" elapsed="0.060802"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:00:20.560538" elapsed="0.060978"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:00:20.558381" elapsed="0.063183"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:00:20.556291" elapsed="0.065321"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:20.555901" elapsed="0.065751"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:00:20.554850" elapsed="0.066848"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:20.626729" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:20.626835" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:20.626946" 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-10-11T01:00:20.622107" elapsed="0.004863"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:20.627142" elapsed="0.000360"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:20.631495" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:20.631629" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:20.631723" 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-10-11T01:00:20.627668" elapsed="0.004080"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:20.632643" 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-10-11T01:00:20.632345" elapsed="0.000325"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:20.633068" 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-10-11T01:00:20.632822" elapsed="0.000272"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:20.633276" elapsed="0.000293"/>
</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-10-11T01:00:20.631967" elapsed="0.001657"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:20.621827" elapsed="0.011845"/>
</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-10-11T01:00:20.554263" elapsed="0.079444"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:20.634349" 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-10-11T01:00:20.634509" 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-10-11T01:00:20.634198" elapsed="0.000338"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.642544" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:00:20.642226" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:00:20.643277" 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-10-11T01:00:20.643063" elapsed="0.000289">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-10-11T01:00:20.643453" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:00:20.642730" elapsed="0.000746"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.643979" 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-10-11T01:00:20.643651" elapsed="0.000354"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:20.644281" 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-10-11T01:00:20.644397" 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-10-11T01:00:20.644173" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.644852" 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-10-11T01:00:20.644633" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:00:20.645228" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:20.644971" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.645764" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:00:20.645466" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:20.645303" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:20.644953" elapsed="0.000888"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.646420" 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-10-11T01:00:20.646026" elapsed="0.000422"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:00:20.646492" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:00:20.646619" 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-10-11T01:00:20.641792" elapsed="0.004850"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:20.646959" 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-10-11T01:00:20.647074" 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-10-11T01:00:20.646808" elapsed="0.000290"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:20.647398" 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-10-11T01:00:20.647525" 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-10-11T01:00:20.647262" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.647975" 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-10-11T01:00:20.647743" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.648440" 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-10-11T01:00:20.648214" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.648901" level="INFO">ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:20.648675" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:20.649524" level="INFO">ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:20.649131" elapsed="0.000436"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:20.649708" elapsed="0.003447"/>
</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-10-11T01:00:20.653302" elapsed="0.002077"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:20.659887" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:20.659991" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:20.660108" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T01:00:20.656315" elapsed="0.004174">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:20.660670" elapsed="0.000021"/>
</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-10-11T01:00:20.660891" elapsed="0.000023"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T01:00:20.656016" elapsed="0.004993">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:22.669692" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:22.669988" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:22.670195" 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-10-11T01:00:22.662376" elapsed="0.007873"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T01:00:22.671286" 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-10-11T01:00:22.671561" 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-10-11T01:00:22.670678" elapsed="0.000979"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:22.673937" 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-10-11T01:00:22.673027" elapsed="0.000973"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:22.675199" 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-10-11T01:00:22.674342" elapsed="0.000921"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:22.675714" elapsed="0.000656"/>
</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-10-11T01:00:22.672124" elapsed="0.004406"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T01:00:22.661567" elapsed="0.015070"/>
</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-10-11T01:00:20.655595" elapsed="2.021134"/>
</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-10-11T01:00:22.677079" elapsed="0.003816"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:22.689866" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:22.690217" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:22.690466" 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-10-11T01:00:22.682963" elapsed="0.007561"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:22.690932" elapsed="0.000855"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:22.698193" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:22.698474" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:22.698689" 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-10-11T01:00:22.692180" elapsed="0.006564"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:22.700752" 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-10-11T01:00:22.700181" elapsed="0.000631"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:22.702130" 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-10-11T01:00:22.701174" elapsed="0.001017"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:00:22.703295" 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-10-11T01:00:22.703712" 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-10-11T01:00:22.702635" elapsed="0.001225">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-10-11T01:00:22.699227" elapsed="0.004935">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-10-11T01:00:22.682292" elapsed="0.022203">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-10-11T01:00:24.714145" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:24.714490" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:24.714716" 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-10-11T01:00:24.706124" elapsed="0.008647"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:24.715206" elapsed="0.000957"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:24.722688" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:24.722944" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:24.723157" 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-10-11T01:00:24.716567" elapsed="0.006644"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:24.725285" 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-10-11T01:00:24.724656" elapsed="0.000688"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:24.726267" 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-10-11T01:00:24.725717" elapsed="0.000607"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:24.726769" elapsed="0.000683"/>
</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-10-11T01:00:24.723713" elapsed="0.003868"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:24.705204" elapsed="0.022486"/>
</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-10-11T01:00:22.681318" elapsed="2.046451"/>
</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-10-11T01:00:24.728932" elapsed="0.004136"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:24.741161" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:24.741394" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:24.741788" 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-10-11T01:00:24.735230" elapsed="0.006614"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:24.742258" elapsed="0.000857"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:24.749449" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:24.749685" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:24.749913" 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-10-11T01:00:24.743515" elapsed="0.006454"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:24.752001" 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-10-11T01:00:24.751404" elapsed="0.000658"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:24.752963" 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-10-11T01:00:24.752397" 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-10-11T01:00:24.753459" elapsed="0.000641"/>
</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-10-11T01:00:24.750459" elapsed="0.003765"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:24.734542" elapsed="0.019789"/>
</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-10-11T01:00:24.733577" elapsed="0.020859"/>
</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-10-11T01:00:24.728167" elapsed="0.026384"/>
</kw>
<arg>route_inc_rou</arg>
<status status="PASS" start="2026-10-11T01:00:20.633900" elapsed="4.120746"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:20.553790" elapsed="4.201068"/>
</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-10-11T01:00:24.758962" elapsed="0.000440"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:00:24.758338" elapsed="0.001224"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:24.761722" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:24.761501" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:24.761447" elapsed="0.000449"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:24.766948" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:24.766732" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:24.766692" elapsed="0.000397"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:24.769229" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:00:24.768462" elapsed="0.000824"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:00:24.770279" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:00:24.769668" elapsed="0.000665"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:00:24.770460" elapsed="0.000079"/>
</return>
<msg time="2026-10-11T01:00:24.770774" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:00:24.767591" elapsed="0.003234"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:24.774922" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:24.774786" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:24.774758" 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-10-11T01:00:24.776727" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:24.776564" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:24.776538" elapsed="0.000418"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:00:24.777700" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:00:24.777173" elapsed="0.000607"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:00:24.778639" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:00:24.778286" elapsed="0.000433"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:00:24.814267" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:00:24.780819" elapsed="0.033640"/>
</kw>
<msg time="2026-10-11T01:00:24.814635" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:00:24.814758" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:24.779162" elapsed="0.035692"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:00:24.846282" 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-10-11T01:00:24.817153" elapsed="0.029269"/>
</kw>
<msg time="2026-10-11T01:00:24.846543" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:00:24.846631" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:24.815442" elapsed="0.031258"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:24.847306" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:24.847011" elapsed="0.000440"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:24.846992" elapsed="0.000518"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:24.848203" 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-10-11T01:00:24.847703" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:24.848793" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:24.848506" elapsed="0.000434"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:24.848487" elapsed="0.000509"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:00:24.849029" 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-10-11T01:00:24.852767" elapsed="0.000134"/>
</kw>
<msg time="2026-10-11T01:00:24.852943" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:00:24.852157" elapsed="0.000850"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:24.853243" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:24.853527" 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-10-11T01:00:24.851271" elapsed="0.002470"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:00:24.849308" elapsed="0.004512"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:00:24.776133" elapsed="0.077870"/>
</kw>
<msg time="2026-10-11T01:00:24.854087" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:24.854127" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:24.775227" elapsed="0.078935"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:00:24.854316" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:00:24.854230" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:24.854212" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:24.854797" 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-10-11T01:00:24.855232" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:00:24.855299" 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-10-11T01:00:24.774301" elapsed="0.081084"/>
</kw>
<msg time="2026-10-11T01:00:24.855527" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:24.855568" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:24.771656" elapsed="0.083948"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:24.855905" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:24.855671" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:24.855654" elapsed="0.000323"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:00:24.771299" elapsed="0.084699"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:00:24.770969" elapsed="0.085058"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:00:24.766037" elapsed="0.090041"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:00:24.760850" elapsed="0.095278"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:24.759923" elapsed="0.096244"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:00:24.757549" elapsed="0.098665"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:24.861625" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:24.861787" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:24.861925" 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-10-11T01:00:24.856633" elapsed="0.005320"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:24.862172" elapsed="0.000453"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:24.866815" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:24.866932" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:24.867027" 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-10-11T01:00:24.862795" elapsed="0.004257"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:24.867997" 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-10-11T01:00:24.867710" elapsed="0.000314"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:24.868422" 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-10-11T01:00:24.868175" 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-10-11T01:00:24.868683" elapsed="0.000297"/>
</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-10-11T01:00:24.867276" elapsed="0.001762"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:24.856347" elapsed="0.012742"/>
</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-10-11T01:00:24.756554" elapsed="0.112574"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:24.869861" 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-10-11T01:00:24.870051" 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-10-11T01:00:24.869698" elapsed="0.000381"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:24.870383" 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-10-11T01:00:24.870519" 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-10-11T01:00:24.870244" elapsed="0.000300"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:24.870845" 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-10-11T01:00:24.870971" 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-10-11T01:00:24.870708" elapsed="0.000288"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:00:24.871342" 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-10-11T01:00:24.871161" elapsed="0.000205"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:24.871681" 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-10-11T01:00:24.871797" 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-10-11T01:00:24.871545" elapsed="0.000276"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:00:24.872169" 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-10-11T01:00:24.872000" elapsed="0.000194"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:24.872635" 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-10-11T01:00:24.872394" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:24.873109" 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-10-11T01:00:24.872895" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:24.873610" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:24.873377" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:24.874066" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:24.873842" elapsed="0.000265"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:24.874248" elapsed="0.002874"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:24.888562" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T01:00:24.888625" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:24.888716" 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-10-11T01:00:24.877288" elapsed="0.011452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:24.889254" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:24.888976" elapsed="0.000318"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:24.894447" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:24.894558" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:24.894653" 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-10-11T01:00:24.889466" elapsed="0.005212"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:24.895178" 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-10-11T01:00:24.894902" elapsed="0.000320"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:24.900820" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:24.900940" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:24.901055" 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-10-11T01:00:24.896170" elapsed="0.004910"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:24.901582" 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-10-11T01:00:24.901285" elapsed="0.000343"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:24.901791" elapsed="0.000339"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:24.904774" level="INFO">${update} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:00:24.902282" elapsed="0.002520"/>
</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-10-11T01:00:24.904972" elapsed="0.000311"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:00:24.905329" elapsed="0.000042"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:00:24.895854" elapsed="0.009618"/>
</kw>
<msg time="2026-10-11T01:00:24.905545" 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-10-11T01:00:24.895427" elapsed="0.010141"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:24.906001" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:24.905768" elapsed="0.000275"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:24.906851" level="INFO">Length is 182.</msg>
<msg time="2026-10-11T01:00:24.906933" 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-10-11T01:00:24.906610" elapsed="0.000346"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:24.907339" level="INFO">Length is 182.</msg>
<msg time="2026-10-11T01:00:24.907425" 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-10-11T01:00:24.907111" elapsed="0.000338"/>
</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-10-11T01:00:24.907633" elapsed="0.000279"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:24.908226" 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-10-11T01:00:24.908062" elapsed="0.000187"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:24.908566" 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-10-11T01:00:24.908391" 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-10-11T01:00:24.908767" elapsed="0.000278"/>
</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-10-11T01:00:24.906259" elapsed="0.002840"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:24.909236" elapsed="0.001984"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:24.915920" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:24.916031" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:24.916151" 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-10-11T01:00:24.911730" elapsed="0.004446"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:24.916675" 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-10-11T01:00:24.916381" elapsed="0.000340"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:24.916900" elapsed="0.000323"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:24.921374" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:24.921501" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:24.921597" 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-10-11T01:00:24.917384" elapsed="0.004238"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:24.922117" 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-10-11T01:00:24.921828" elapsed="0.000333"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:24.922324" elapsed="0.000340"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T01:00:24.922907" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:24.922738" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:24.922717" elapsed="0.000253"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:24.928296" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:24.928339" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:24.928447" 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-10-11T01:00:24.923120" elapsed="0.005353"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:00:24.911439" elapsed="0.017094"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:24.934208" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:24.934311" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:24.934397" 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-10-11T01:00:24.929447" elapsed="0.004993"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:24.935003" 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-10-11T01:00:24.934705" elapsed="0.000342"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:24.935226" elapsed="0.000372"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:24.937836" level="INFO">${update} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:00:24.935751" 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-10-11T01:00:24.938056" elapsed="0.000285"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:00:24.938385" elapsed="0.000047"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:00:24.929125" elapsed="0.009384"/>
</kw>
<msg time="2026-10-11T01:00:24.938578" 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-10-11T01:00:24.928712" elapsed="0.009890"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:24.939036" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:24.938806" elapsed="0.000272"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:24.939863" level="INFO">Length is 170.</msg>
<msg time="2026-10-11T01:00:24.939943" 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-10-11T01:00:24.939630" elapsed="0.000335"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:24.940347" level="INFO">Length is 170.</msg>
<msg time="2026-10-11T01:00:24.940435" 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-10-11T01:00:24.940120" elapsed="0.000339"/>
</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-10-11T01:00:24.940641" elapsed="0.000275"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:24.941217" 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-10-11T01:00:24.941061" elapsed="0.000180"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:24.941554" 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-10-11T01:00:24.941381" 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-10-11T01:00:24.941756" elapsed="0.000279"/>
</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-10-11T01:00:24.939282" elapsed="0.002808"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:24.946870" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:24.946987" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:24.947071" 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-10-11T01:00:24.942623" elapsed="0.004472"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:24.947598" 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-10-11T01:00:24.947301" elapsed="0.000341"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:24.947808" elapsed="0.000338"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:24.952196" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:24.952333" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:24.952446" 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-10-11T01:00:24.948305" elapsed="0.004167"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:24.952962" 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-10-11T01:00:24.952677" elapsed="0.000329"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:24.953167" elapsed="0.000333"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T01:00:24.953866" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-10-11T01:00:24.953568" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:24.953550" elapsed="0.000409"/>
</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-10-11T01:00:24.954112" elapsed="0.000020"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:00:24.942313" elapsed="0.011879"/>
</kw>
<arg>route_mac_arb</arg>
<status status="PASS" start="2026-10-11T01:00:24.869378" elapsed="0.084854"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:24.755504" elapsed="0.198821"/>
</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-10-11T01:00:24.956167" elapsed="0.000197"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:00:24.955918" elapsed="0.000512"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:24.957331" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:24.957243" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:24.957225" elapsed="0.000168"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:24.959487" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:24.959389" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:24.959372" elapsed="0.000179"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:24.960478" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:00:24.960133" elapsed="0.000371"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:00:24.960937" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:00:24.960659" elapsed="0.000302"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:00:24.961001" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:00:24.961127" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:00:24.959759" elapsed="0.001391"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:24.965084" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:24.964997" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:24.964980" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:24.966306" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:24.966193" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:24.966175" elapsed="0.000305"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:00:24.967007" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:00:24.966634" elapsed="0.000432"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:00:24.967666" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:00:24.967434" elapsed="0.000289"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:00:25.000978" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:00:24.969215" elapsed="0.031884"/>
</kw>
<msg time="2026-10-11T01:00:25.001271" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:00:25.001362" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:24.968042" elapsed="0.033409"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:00:25.032620" 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-10-11T01:00:25.003062" elapsed="0.029683"/>
</kw>
<msg time="2026-10-11T01:00:25.032864" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:00:25.032966" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:25.001846" elapsed="0.031191"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:25.033645" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:25.033324" elapsed="0.000451"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:25.033304" elapsed="0.000528"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:25.034524" 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-10-11T01:00:25.034029" elapsed="0.000610"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:25.035112" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:25.034807" elapsed="0.000435"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:25.034788" elapsed="0.000510"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:00:25.035331" 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-10-11T01:00:25.038905" elapsed="0.000120"/>
</kw>
<msg time="2026-10-11T01:00:25.039065" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:00:25.038341" 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-10-11T01:00:25.039358" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:25.039706" 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-10-11T01:00:25.037609" elapsed="0.002328"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:00:25.035633" elapsed="0.004385"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:00:24.965906" elapsed="0.074260"/>
</kw>
<msg time="2026-10-11T01:00:25.040250" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:25.040290" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:24.965298" elapsed="0.075027"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:00:25.040493" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:00:25.040393" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:25.040376" elapsed="0.000192"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:25.040963" 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-10-11T01:00:25.041343" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:00:25.041430" 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-10-11T01:00:24.964686" elapsed="0.076835"/>
</kw>
<msg time="2026-10-11T01:00:25.041604" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:25.041643" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:24.961516" elapsed="0.080162"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:25.042010" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:25.041776" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:25.041759" elapsed="0.000322"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:00:24.961355" elapsed="0.080748"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:00:24.961203" elapsed="0.080929"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:00:24.959096" elapsed="0.083087"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:00:24.956990" elapsed="0.085241"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:24.956584" elapsed="0.085687"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:00:24.955558" elapsed="0.086759"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:25.047314" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:25.047440" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:25.047537" 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-10-11T01:00:25.042729" elapsed="0.004832"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:25.047735" elapsed="0.000363"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:25.052593" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:25.052695" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:25.052787" 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-10-11T01:00:25.048259" elapsed="0.004553"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:25.053683" 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-10-11T01:00:25.053433" elapsed="0.000276"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:25.054102" 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-10-11T01:00:25.053861" elapsed="0.000267"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:25.054311" elapsed="0.000295"/>
</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-10-11T01:00:25.053037" elapsed="0.001624"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:25.042462" elapsed="0.012247"/>
</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-10-11T01:00:24.955118" elapsed="0.099626"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:25.055372" 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-10-11T01:00:25.055510" 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-10-11T01:00:25.055231" elapsed="0.000335"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:00:25.063645" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:00:25.063325" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:00:25.064377" 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-10-11T01:00:25.064169" elapsed="0.000305">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-10-11T01:00:25.064561" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:00:25.063831" elapsed="0.000752"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:25.065105" 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-10-11T01:00:25.064757" elapsed="0.000376"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:25.065529" 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-10-11T01:00:25.065646" 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-10-11T01:00:25.065376" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:25.066105" 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-10-11T01:00:25.065870" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:00:25.066630" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:25.066213" elapsed="0.000475"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:00:25.067174" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:00:25.066861" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:25.066711" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:25.066196" elapsed="0.001068"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:00:25.067862" 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-10-11T01:00:25.067454" elapsed="0.000450"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:00:25.067953" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T01:00:25.068095" 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-10-11T01:00:25.062902" elapsed="0.005217"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:25.068448" 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-10-11T01:00:25.068582" 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-10-11T01:00:25.068287" elapsed="0.000319"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:25.068921" 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-10-11T01:00:25.069075" 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-10-11T01:00:25.068766" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:25.069533" 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-10-11T01:00:25.069295" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:25.070005" 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-10-11T01:00:25.069774" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:25.070466" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:25.070238" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:25.070922" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:25.070694" elapsed="0.000270"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:25.071103" elapsed="0.002867"/>
</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-10-11T01:00:25.074125" elapsed="0.002845"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:25.081972" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:25.082122" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:25.082229" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T01:00:25.077973" elapsed="0.004665">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:25.082825" elapsed="0.000020"/>
</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-10-11T01:00:25.083052" elapsed="0.000023"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T01:00:25.077631" elapsed="0.005542">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:27.092566" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:27.092998" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:27.093220" 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-10-11T01:00:27.084817" elapsed="0.008457"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T01:00:27.094314" 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-10-11T01:00:27.094596" 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-10-11T01:00:27.093706" elapsed="0.000985"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:27.097105" 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-10-11T01:00:27.096083" elapsed="0.001083"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:27.098440" 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-10-11T01:00:27.097537" elapsed="0.000965"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:27.098939" elapsed="0.000662"/>
</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-10-11T01:00:27.095163" elapsed="0.004566"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T01:00:27.083812" elapsed="0.016027"/>
</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-10-11T01:00:25.077175" elapsed="2.022781"/>
</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-10-11T01:00:27.100281" elapsed="0.005036"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:27.113910" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:27.114147" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:27.114341" 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-10-11T01:00:27.107383" elapsed="0.007012"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:27.114814" elapsed="0.000845"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:27.122964" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:27.123211" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:27.123528" 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-10-11T01:00:27.116041" elapsed="0.007550"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:27.125559" 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-10-11T01:00:27.124987" elapsed="0.000633"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:27.127018" 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-10-11T01:00:27.125988" elapsed="0.001091"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:00:27.128177" 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-10-11T01:00:27.128673" 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-10-11T01:00:27.127543" elapsed="0.001298">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-10-11T01:00:27.124082" elapsed="0.005104">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-10-11T01:00:27.106761" elapsed="0.022733">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-10-11T01:00:29.138391" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:29.138741" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:29.139096" 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-10-11T01:00:29.131060" elapsed="0.008096"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:29.139632" elapsed="0.000952"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:29.147105" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:29.147332" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:29.147585" 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-10-11T01:00:29.140986" elapsed="0.006656"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:29.149747" 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-10-11T01:00:29.149145" elapsed="0.000664"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:29.150731" 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-10-11T01:00:29.150173" 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-10-11T01:00:29.151247" elapsed="0.000737"/>
</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-10-11T01:00:29.148154" elapsed="0.003961"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:29.130170" elapsed="0.022054"/>
</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-10-11T01:00:27.105817" elapsed="2.046486"/>
</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-10-11T01:00:29.153461" elapsed="0.003753"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:29.165540" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:29.165769" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:29.166012" 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-10-11T01:00:29.159847" elapsed="0.006224"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:29.166520" elapsed="0.000813"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:29.173628" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:29.173852" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:29.174092" 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-10-11T01:00:29.167726" elapsed="0.006424"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:29.176285" 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-10-11T01:00:29.175722" elapsed="0.000622"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:29.177247" 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-10-11T01:00:29.176711" elapsed="0.000593"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:29.177743" elapsed="0.000639"/>
</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-10-11T01:00:29.174744" elapsed="0.003790"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:29.158690" elapsed="0.019950"/>
</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-10-11T01:00:29.157713" elapsed="0.021005"/>
</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-10-11T01:00:29.152701" elapsed="0.026126"/>
</kw>
<arg>route_mac_arb</arg>
<status status="PASS" start="2026-10-11T01:00:25.054937" elapsed="4.124002"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:24.954637" elapsed="4.224506"/>
</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-10-11T01:00:29.183244" elapsed="0.000512"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:00:29.182612" elapsed="0.001264"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:29.186047" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:29.185806" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:29.185760" elapsed="0.000444"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:29.191131" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:29.190945" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:29.190885" elapsed="0.000386"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.193372" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:00:29.192618" elapsed="0.000841"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.194437" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:00:29.193805" elapsed="0.000688"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:00:29.194583" elapsed="0.000069"/>
</return>
<msg time="2026-10-11T01:00:29.194874" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:00:29.191771" elapsed="0.003173"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:29.199534" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:29.199395" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:29.199369" 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-10-11T01:00:29.201267" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:29.201107" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:29.201083" elapsed="0.000423"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:00:29.202226" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:00:29.201722" elapsed="0.000586"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:00:29.203154" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:00:29.202820" elapsed="0.000415"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:00:29.231400" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:00:29.205326" elapsed="0.026294"/>
</kw>
<msg time="2026-10-11T01:00:29.231814" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:00:29.231966" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:29.203688" elapsed="0.028377"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:00:29.251185" 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-10-11T01:00:29.234575" elapsed="0.016733"/>
</kw>
<msg time="2026-10-11T01:00:29.251445" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:00:29.251534" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:29.232803" elapsed="0.018801"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:29.252234" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:29.251914" elapsed="0.000452"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:29.251878" elapsed="0.000563"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.253132" 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-10-11T01:00:29.252633" elapsed="0.000613"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:29.253724" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:29.253434" elapsed="0.000423"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:29.253396" elapsed="0.000527"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:00:29.253960" 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-10-11T01:00:29.257605" elapsed="0.000121"/>
</kw>
<msg time="2026-10-11T01:00:29.257766" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:00:29.257141" elapsed="0.000690"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:29.258079" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:29.258288" 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-10-11T01:00:29.256252" 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-10-11T01:00:29.254285" elapsed="0.004439"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:00:29.200686" elapsed="0.058191"/>
</kw>
<msg time="2026-10-11T01:00:29.258978" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:29.259018" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:29.199834" elapsed="0.059221"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:00:29.259211" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:00:29.259125" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:29.259107" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:29.259695" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:29.260097" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:00:29.260162" 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-10-11T01:00:29.198992" elapsed="0.061259"/>
</kw>
<msg time="2026-10-11T01:00:29.260335" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:29.260375" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:29.195716" elapsed="0.064716"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:29.260723" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:29.260501" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:29.260485" elapsed="0.000344"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:00:29.195364" elapsed="0.065491"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:00:29.195053" elapsed="0.065834"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:00:29.190241" elapsed="0.070713"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:00:29.185195" elapsed="0.075812"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:29.184243" elapsed="0.076805"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:00:29.181721" elapsed="0.079377"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:29.265585" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:29.265726" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:29.265813" 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-10-11T01:00:29.261565" elapsed="0.004272"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:29.266027" elapsed="0.000585"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:29.270468" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:29.270570" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:29.270663" 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-10-11T01:00:29.266777" elapsed="0.003911"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:29.271571" 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-10-11T01:00:29.271292" elapsed="0.000307"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:29.272001" 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-10-11T01:00:29.271751" elapsed="0.000277"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:29.272213" elapsed="0.000296"/>
</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-10-11T01:00:29.270909" elapsed="0.001656"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:29.261239" elapsed="0.011374"/>
</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-10-11T01:00:29.180628" elapsed="0.092022"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:29.273353" 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-10-11T01:00:29.273519" 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-10-11T01:00:29.273204" elapsed="0.000342"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:29.273876" 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-10-11T01:00:29.274010" 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-10-11T01:00:29.273737" elapsed="0.000298"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:29.274337" 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-10-11T01:00:29.274467" 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-10-11T01:00:29.274200" elapsed="0.000292"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:00:29.274834" 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-10-11T01:00:29.274655" elapsed="0.000203"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:29.275172" 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-10-11T01:00:29.275291" 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-10-11T01:00:29.275036" elapsed="0.000280"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:00:29.275661" 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-10-11T01:00:29.275494" elapsed="0.000193"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.276117" 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-10-11T01:00:29.275881" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.276592" 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-10-11T01:00:29.276362" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.277054" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a62900022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:29.276829" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.277516" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d001946022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:29.277286" elapsed="0.000272"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:29.277699" elapsed="0.002837"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:29.287363" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T01:00:29.287472" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:29.287559" 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-10-11T01:00:29.280699" elapsed="0.006885"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.288089" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:29.287792" elapsed="0.000336"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:29.292422" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:29.292534" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:29.292629" 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-10-11T01:00:29.288284" elapsed="0.004369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.293151" 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-10-11T01:00:29.292858" elapsed="0.000337"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:29.298688" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:29.298798" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:29.298885" 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-10-11T01:00:29.294120" elapsed="0.004803"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.299423" 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-10-11T01:00:29.299131" elapsed="0.000339"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:29.299633" elapsed="0.000345"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:29.302554" level="INFO">${update} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a62900022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:00:29.300129" elapsed="0.002453"/>
</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-10-11T01:00:29.302741" elapsed="0.000325"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:00:29.303110" elapsed="0.000029"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:00:29.293797" elapsed="0.009415"/>
</kw>
<msg time="2026-10-11T01:00:29.303314" 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-10-11T01:00:29.293379" elapsed="0.009959"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.303786" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a62900022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:29.303568" elapsed="0.000260"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.304644" level="INFO">Length is 182.</msg>
<msg time="2026-10-11T01:00:29.304714" 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-10-11T01:00:29.304388" elapsed="0.000347"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.305137" level="INFO">Length is 182.</msg>
<msg time="2026-10-11T01:00:29.305203" 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-10-11T01:00:29.304905" elapsed="0.000320"/>
</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-10-11T01:00:29.305433" elapsed="0.000264"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:29.306028" 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-10-11T01:00:29.305845" elapsed="0.000208"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:29.306352" 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-10-11T01:00:29.306195" elapsed="0.000181"/>
</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-10-11T01:00:29.306581" elapsed="0.000266"/>
</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-10-11T01:00:29.304054" elapsed="0.002860"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:29.307056" elapsed="0.002023"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:29.313573" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:29.313681" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:29.313767" 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-10-11T01:00:29.309587" elapsed="0.004204"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.314295" 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-10-11T01:00:29.314019" elapsed="0.000320"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:29.314521" elapsed="0.000322"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:29.318668" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:29.318775" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:29.318914" 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-10-11T01:00:29.315020" elapsed="0.003920"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.319446" 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-10-11T01:00:29.319155" elapsed="0.000337"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:29.319657" elapsed="0.000333"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T01:00:29.320206" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:29.320058" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:29.320041" elapsed="0.000225"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:29.325369" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:29.325428" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:29.325518" 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-10-11T01:00:29.320429" elapsed="0.005113"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:00:29.309273" elapsed="0.016328"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:29.330021" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:29.330123" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:29.330206" 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-10-11T01:00:29.326512" elapsed="0.003718"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.330725" 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-10-11T01:00:29.330453" elapsed="0.000315"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:29.330945" elapsed="0.000489"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:29.333868" level="INFO">${update} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d001946022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:00:29.331587" elapsed="0.002319"/>
</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-10-11T01:00:29.334070" elapsed="0.000306"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:00:29.334439" elapsed="0.000029"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:00:29.326191" elapsed="0.008351"/>
</kw>
<msg time="2026-10-11T01:00:29.334613" 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-10-11T01:00:29.325784" elapsed="0.008854"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.335081" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d001946022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:29.334845" elapsed="0.000280"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.335926" level="INFO">Length is 170.</msg>
<msg time="2026-10-11T01:00:29.336027" 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-10-11T01:00:29.335681" elapsed="0.000369"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.336463" level="INFO">Length is 170.</msg>
<msg time="2026-10-11T01:00:29.336532" 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-10-11T01:00:29.336211" elapsed="0.000343"/>
</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-10-11T01:00:29.336743" elapsed="0.000283"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:29.337329" 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-10-11T01:00:29.337174" elapsed="0.000179"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:29.337666" 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-10-11T01:00:29.337513" elapsed="0.000177"/>
</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-10-11T01:00:29.337876" elapsed="0.000277"/>
</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-10-11T01:00:29.335332" elapsed="0.002875"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:29.342447" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:29.342552" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:29.342636" 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-10-11T01:00:29.338741" elapsed="0.003918"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.343207" 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-10-11T01:00:29.342923" elapsed="0.000327"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:29.343430" elapsed="0.000318"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:29.346795" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:29.346907" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:29.347001" 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-10-11T01:00:29.343923" elapsed="0.003102"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.347528" 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-10-11T01:00:29.347239" elapsed="0.000332"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:29.347735" elapsed="0.000334"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T01:00:29.348281" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T01:00:29.348136" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:29.348118" elapsed="0.000240"/>
</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-10-11T01:00:29.348522" elapsed="0.000020"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:00:29.338444" elapsed="0.010194"/>
</kw>
<arg>route_mac_as</arg>
<status status="PASS" start="2026-10-11T01:00:29.272903" elapsed="0.075777"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:29.179580" elapsed="0.169193"/>
</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-10-11T01:00:29.350554" elapsed="0.000198"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:00:29.350289" elapsed="0.000512"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:29.351869" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:29.351781" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:29.351763" elapsed="0.000188"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:29.354009" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:29.353926" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:29.353909" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.354990" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:00:29.354652" elapsed="0.000363"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.355501" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:00:29.355170" elapsed="0.000360"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:00:29.355571" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:00:29.355702" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:00:29.354280" elapsed="0.001444"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:29.358325" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:29.358214" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:29.358197" 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-10-11T01:00:29.359560" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:29.359443" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:29.359424" elapsed="0.000291"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:00:29.360238" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:00:29.359868" elapsed="0.000429"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:00:29.360904" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:00:29.360666" elapsed="0.000298"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:00:29.385741" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:00:29.362468" elapsed="0.023392"/>
</kw>
<msg time="2026-10-11T01:00:29.385996" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:00:29.386086" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:29.361268" elapsed="0.024886"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:00:29.405763" 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-10-11T01:00:29.387746" elapsed="0.018142"/>
</kw>
<msg time="2026-10-11T01:00:29.406023" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:00:29.406110" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:29.386559" elapsed="0.019621"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:29.406781" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:29.406486" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:29.406466" elapsed="0.000558"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.407712" 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-10-11T01:00:29.407219" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:29.408340" elapsed="0.000081"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:29.408048" elapsed="0.000441"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:29.408029" elapsed="0.000515"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:00:29.408577" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:00:29.412714" elapsed="0.000119"/>
</kw>
<msg time="2026-10-11T01:00:29.412872" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:00:29.412125" elapsed="0.000822"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:29.413181" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:29.413385" 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-10-11T01:00:29.410856" elapsed="0.002757"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:00:29.408860" elapsed="0.004832"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:00:29.359136" elapsed="0.054706"/>
</kw>
<msg time="2026-10-11T01:00:29.413937" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:29.413977" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:29.358556" elapsed="0.055457"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:00:29.414165" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:00:29.414081" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:29.414063" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:29.414657" 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-10-11T01:00:29.415060" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:00:29.415125" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T01:00:29.357929" elapsed="0.057281"/>
</kw>
<msg time="2026-10-11T01:00:29.415292" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:29.415331" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:29.356091" elapsed="0.059275"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:29.415668" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:29.415448" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:29.415431" elapsed="0.000307"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:00:29.355942" elapsed="0.059818"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:00:29.355774" elapsed="0.060014"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:00:29.353622" elapsed="0.062213"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:00:29.351355" elapsed="0.064529"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:29.350964" elapsed="0.064981"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:00:29.349942" elapsed="0.066050"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:29.420524" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:29.420671" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:29.420767" 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-10-11T01:00:29.416389" elapsed="0.004402"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:29.420979" elapsed="0.000341"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:29.425240" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:29.425342" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:29.425453" 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-10-11T01:00:29.421497" elapsed="0.003981"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:29.426334" 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-10-11T01:00:29.426082" elapsed="0.000278"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:29.426759" 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-10-11T01:00:29.426527" elapsed="0.000257"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:29.426981" elapsed="0.000277"/>
</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-10-11T01:00:29.425683" elapsed="0.001632"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:29.416122" elapsed="0.011241"/>
</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-10-11T01:00:29.349498" elapsed="0.077900"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:29.428064" 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-10-11T01:00:29.428194" 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-10-11T01:00:29.427913" elapsed="0.000308"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.436824" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:00:29.436490" elapsed="0.000364"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:00:29.437606" 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-10-11T01:00:29.437367" elapsed="0.000312">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-10-11T01:00:29.437764" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:00:29.437037" elapsed="0.000750"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.438287" 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-10-11T01:00:29.437975" elapsed="0.000338"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:29.438612" 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-10-11T01:00:29.438786" 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-10-11T01:00:29.438499" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.439252" 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-10-11T01:00:29.439032" elapsed="0.000267"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:00:29.439711" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:29.439367" elapsed="0.000399"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.440216" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:00:29.439952" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:29.439790" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:29.439346" elapsed="0.000946"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.440862" 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-10-11T01:00:29.440474" elapsed="0.000414"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:00:29.440953" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T01:00:29.441091" 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-10-11T01:00:29.435991" elapsed="0.005124"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:29.441439" 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-10-11T01:00:29.441558" 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-10-11T01:00:29.441286" elapsed="0.000296"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:29.441885" 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-10-11T01:00:29.442008" 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-10-11T01:00:29.441748" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.442470" 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-10-11T01:00:29.442235" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.442951" 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-10-11T01:00:29.442721" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.443457" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a62900022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:29.443226" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:29.443919" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d001946022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:29.443697" elapsed="0.000263"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:29.444100" elapsed="0.002779"/>
</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-10-11T01:00:29.447038" elapsed="0.002165"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:29.454059" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:29.454201" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:29.454304" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T01:00:29.450159" elapsed="0.004527">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:29.454870" 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-10-11T01:00:29.455099" elapsed="0.000022"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T01:00:29.449841" elapsed="0.005378">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:31.468205" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:31.468540" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:31.468769" 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-10-11T01:00:31.457040" elapsed="0.011785"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T01:00:31.469823" 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-10-11T01:00:31.470096" 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-10-11T01:00:31.469236" elapsed="0.001058"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:31.472855" 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-10-11T01:00:31.471740" elapsed="0.001206"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:31.474231" 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-10-11T01:00:31.473298" elapsed="0.000992"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:31.474729" elapsed="0.000648"/>
</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-10-11T01:00:31.470782" elapsed="0.004804"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T01:00:31.455929" elapsed="0.019768"/>
</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-10-11T01:00:29.449403" elapsed="2.026387"/>
</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-10-11T01:00:31.476132" elapsed="0.003722"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:31.487947" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:31.488182" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:31.488372" 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-10-11T01:00:31.481889" elapsed="0.006575"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:31.488859" elapsed="0.000824"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:31.495874" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:31.496147" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:31.496359" 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-10-11T01:00:31.490073" elapsed="0.006369"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:31.498453" 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-10-11T01:00:31.497860" elapsed="0.000655"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:31.499920" 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-10-11T01:00:31.498856" elapsed="0.001126"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:00:31.501049" 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-10-11T01:00:31.501592" 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-10-11T01:00:31.500400" elapsed="0.001350">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-10-11T01:00:31.496974" elapsed="0.005111">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-10-11T01:00:31.481259" elapsed="0.021114">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-10-11T01:00:33.512540" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:33.512832" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:33.513092" 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-10-11T01:00:33.503866" elapsed="0.009283"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:33.513597" elapsed="0.000917"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:33.521264" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:33.521550" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:33.521770" 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-10-11T01:00:33.514881" elapsed="0.006947"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:33.523972" 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-10-11T01:00:33.523347" elapsed="0.000687"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:33.524952" 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-10-11T01:00:33.524378" elapsed="0.000635"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:33.525453" elapsed="0.000661"/>
</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-10-11T01:00:33.522329" elapsed="0.003913"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:33.503035" elapsed="0.023317"/>
</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-10-11T01:00:31.480333" elapsed="2.046131"/>
</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-10-11T01:00:33.527600" elapsed="0.003409"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:33.539529" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:33.539769" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:33.539989" 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-10-11T01:00:33.533139" elapsed="0.006906"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:33.540467" elapsed="0.000783"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:33.547562" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:33.547788" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:33.548020" 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-10-11T01:00:33.541642" elapsed="0.006435"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:33.550088" 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-10-11T01:00:33.549529" elapsed="0.000620"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:33.551069" 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-10-11T01:00:33.550530" elapsed="0.000597"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:33.551566" elapsed="0.000642"/>
</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-10-11T01:00:33.548565" elapsed="0.003767"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:33.532443" elapsed="0.020026"/>
</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-10-11T01:00:33.531518" elapsed="0.021031"/>
</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-10-11T01:00:33.526836" elapsed="0.025829"/>
</kw>
<arg>route_mac_as</arg>
<status status="PASS" start="2026-10-11T01:00:29.427600" elapsed="4.125163"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:29.349045" elapsed="4.203947"/>
</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-10-11T01:00:33.557134" elapsed="0.000883"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:00:33.556543" elapsed="0.001594"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:33.560312" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:33.560100" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:33.560055" elapsed="0.000437"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:33.565149" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:33.564960" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:33.564898" elapsed="0.000392"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.567492" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:00:33.566709" elapsed="0.000841"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.568543" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:00:33.567892" elapsed="0.000706"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:00:33.568687" elapsed="0.000071"/>
</return>
<msg time="2026-10-11T01:00:33.569008" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:00:33.565785" elapsed="0.003275"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:33.573568" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:33.573448" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:33.573403" 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-10-11T01:00:33.575321" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:33.575159" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:33.575135" elapsed="0.000432"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:00:33.576312" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:00:33.575783" elapsed="0.000611"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:00:33.577249" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:00:33.576928" elapsed="0.000403"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:00:33.612099" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:00:33.579497" elapsed="0.032768"/>
</kw>
<msg time="2026-10-11T01:00:33.612443" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:00:33.612536" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:33.577779" elapsed="0.034829"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:00:33.663536" 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-10-11T01:00:33.614315" elapsed="0.049350"/>
</kw>
<msg time="2026-10-11T01:00:33.663785" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:00:33.663873" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:33.613056" elapsed="0.050902"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:33.664604" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:33.664261" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:33.664237" elapsed="0.000559"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.665521" 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-10-11T01:00:33.665010" elapsed="0.000629"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:33.666341" elapsed="0.000084"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:33.665858" elapsed="0.000637"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:33.665839" elapsed="0.000713"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:00:33.666588" 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-10-11T01:00:33.670319" elapsed="0.000142"/>
</kw>
<msg time="2026-10-11T01:00:33.670503" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:00:33.669784" elapsed="0.000783"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:33.670803" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:33.671029" 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-10-11T01:00:33.669012" elapsed="0.002233"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:00:33.666924" elapsed="0.004403"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:00:33.574727" elapsed="0.096876"/>
</kw>
<msg time="2026-10-11T01:00:33.671689" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:33.671729" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:33.573866" elapsed="0.097898"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:00:33.671932" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T01:00:33.671833" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:33.671816" elapsed="0.000196"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:33.672417" 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-10-11T01:00:33.672803" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:00:33.672870" 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-10-11T01:00:33.573029" elapsed="0.099941"/>
</kw>
<msg time="2026-10-11T01:00:33.673055" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:33.673096" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:33.569847" elapsed="0.103284"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:33.673464" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:33.673199" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:33.673183" elapsed="0.000354"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:00:33.569526" elapsed="0.104032"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:00:33.569170" elapsed="0.104418"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:00:33.564250" elapsed="0.109388"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:00:33.559475" elapsed="0.114212"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:33.558512" elapsed="0.115214"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:00:33.555712" elapsed="0.118062"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:33.678615" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:33.678754" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:33.678888" 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-10-11T01:00:33.674200" elapsed="0.004728"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:33.679107" elapsed="0.000383"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:33.683925" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:33.684029" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:33.684121" 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-10-11T01:00:33.679656" elapsed="0.004490"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:33.685037" 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-10-11T01:00:33.684758" elapsed="0.000306"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:33.685467" 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-10-11T01:00:33.685220" elapsed="0.000273"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:33.685680" elapsed="0.000306"/>
</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-10-11T01:00:33.684355" elapsed="0.001688"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:33.673925" elapsed="0.012166"/>
</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-10-11T01:00:33.554689" elapsed="0.131439"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:33.686833" 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-10-11T01:00:33.686995" 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-10-11T01:00:33.686683" elapsed="0.000339"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:33.687330" 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-10-11T01:00:33.687462" 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-10-11T01:00:33.687195" elapsed="0.000292"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:33.687789" 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-10-11T01:00:33.687913" 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-10-11T01:00:33.687653" elapsed="0.000286"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:00:33.688281" 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-10-11T01:00:33.688103" elapsed="0.000202"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:33.688861" 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-10-11T01:00:33.688993" 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-10-11T01:00:33.688518" elapsed="0.000500"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:00:33.689355" 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-10-11T01:00:33.689186" elapsed="0.000194"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.689823" 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-10-11T01:00:33.689601" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.690309" 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-10-11T01:00:33.690091" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.690785" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:33.690570" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.691253" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:33.691041" elapsed="0.000253"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:33.691451" elapsed="0.002447"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:33.702791" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T01:00:33.702853" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:33.702958" 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-10-11T01:00:33.694081" elapsed="0.008902"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.703522" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:33.703223" elapsed="0.000338"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:33.708699" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:33.708809" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:33.708903" 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-10-11T01:00:33.703717" elapsed="0.005225"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.709439" 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-10-11T01:00:33.709147" elapsed="0.000339"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:33.714364" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:33.714492" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:33.714578" 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-10-11T01:00:33.710395" elapsed="0.004207"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.715093" 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-10-11T01:00:33.714805" elapsed="0.000334"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:33.715301" elapsed="0.000343"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:33.717858" level="INFO">${update} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:00:33.715795" elapsed="0.002091"/>
</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-10-11T01:00:33.718057" elapsed="0.000309"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:00:33.718429" elapsed="0.000031"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:00:33.710090" elapsed="0.008445"/>
</kw>
<msg time="2026-10-11T01:00:33.718605" 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-10-11T01:00:33.709670" elapsed="0.008958"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.719057" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:33.718827" elapsed="0.000272"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.719939" level="INFO">Length is 182.</msg>
<msg time="2026-10-11T01:00:33.720009" 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-10-11T01:00:33.719692" elapsed="0.000339"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.720434" level="INFO">Length is 182.</msg>
<msg time="2026-10-11T01:00:33.720504" 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-10-11T01:00:33.720186" elapsed="0.000340"/>
</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-10-11T01:00:33.720708" elapsed="0.000274"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:33.721296" 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-10-11T01:00:33.721130" elapsed="0.000190"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:33.721642" 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-10-11T01:00:33.721479" elapsed="0.000186"/>
</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-10-11T01:00:33.721843" elapsed="0.000276"/>
</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-10-11T01:00:33.719341" elapsed="0.002835"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:33.722314" elapsed="0.001938"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:33.728921" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:33.729034" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:33.729131" 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-10-11T01:00:33.724756" elapsed="0.004399"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.729655" 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-10-11T01:00:33.729359" elapsed="0.000342"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:33.729863" elapsed="0.000336"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:33.733745" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:33.733856" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:33.733965" 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-10-11T01:00:33.730359" elapsed="0.003631"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.734492" 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-10-11T01:00:33.734198" elapsed="0.000372"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:33.734735" elapsed="0.000334"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T01:00:33.735287" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:33.735138" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:33.735120" elapsed="0.000227"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:33.740233" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:33.740276" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:33.740365" 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-10-11T01:00:33.735509" elapsed="0.004880"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:00:33.724463" elapsed="0.016005"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:33.745622" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:33.745727" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:33.745812" 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-10-11T01:00:33.741369" elapsed="0.004467"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.746335" 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-10-11T01:00:33.746060" elapsed="0.000318"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:33.746558" elapsed="0.000322"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:33.749274" level="INFO">${update} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:00:33.747043" elapsed="0.002258"/>
</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-10-11T01:00:33.749476" elapsed="0.000307"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:00:33.749827" elapsed="0.000028"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:00:33.741062" elapsed="0.008882"/>
</kw>
<msg time="2026-10-11T01:00:33.750016" 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-10-11T01:00:33.740648" elapsed="0.009392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.750480" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:33.750245" elapsed="0.000277"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.751302" level="INFO">Length is 170.</msg>
<msg time="2026-10-11T01:00:33.751371" 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-10-11T01:00:33.751068" elapsed="0.000325"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.751804" level="INFO">Length is 170.</msg>
<msg time="2026-10-11T01:00:33.751871" 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-10-11T01:00:33.751574" elapsed="0.000319"/>
</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-10-11T01:00:33.752089" elapsed="0.000265"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:33.752686" 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-10-11T01:00:33.752521" elapsed="0.000219"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:33.753061" 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-10-11T01:00:33.752889" 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-10-11T01:00:33.753268" elapsed="0.000283"/>
</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-10-11T01:00:33.750728" elapsed="0.002878"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:33.758161" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:33.758264" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:33.758348" 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-10-11T01:00:33.754134" elapsed="0.004237"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.758869" 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-10-11T01:00:33.758599" elapsed="0.000325"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:33.759087" elapsed="0.000318"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:33.763342" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:33.763463" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:33.763557" 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-10-11T01:00:33.759581" elapsed="0.004000"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.764076" 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-10-11T01:00:33.763785" elapsed="0.000337"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:33.764286" elapsed="0.000340"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T01:00:33.764846" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:00:33.764696" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:33.764678" elapsed="0.000255"/>
</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-10-11T01:00:33.765081" elapsed="0.000019"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:00:33.753827" elapsed="0.011332"/>
</kw>
<arg>route_mac_lacp</arg>
<status status="PASS" start="2026-10-11T01:00:33.686368" elapsed="0.078831"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:33.553667" elapsed="0.211624"/>
</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-10-11T01:00:33.767072" elapsed="0.000197"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:00:33.766807" elapsed="0.000513"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:33.768278" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:33.768190" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:33.768172" elapsed="0.000169"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:33.770425" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:33.770327" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:33.770310" elapsed="0.000180"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.771394" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:00:33.771071" elapsed="0.000363"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.771847" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:00:33.771588" elapsed="0.000282"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:00:33.771922" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:00:33.772051" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:00:33.770699" elapsed="0.001375"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:33.774788" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:33.774702" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:33.774685" elapsed="0.000168"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:33.776029" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:33.775901" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:33.775883" elapsed="0.000296"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:00:33.776699" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:00:33.776335" elapsed="0.000422"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:00:33.777344" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:00:33.777118" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:00:33.813630" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:00:33.778886" elapsed="0.034904"/>
</kw>
<msg time="2026-10-11T01:00:33.813956" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:00:33.814046" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:33.777727" elapsed="0.036391"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:00:33.849615" 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-10-11T01:00:33.815827" elapsed="0.033915"/>
</kw>
<msg time="2026-10-11T01:00:33.849862" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:00:33.849963" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:33.814570" elapsed="0.035463"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:33.850660" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:33.850324" elapsed="0.000468"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:33.850301" elapsed="0.000548"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.851561" 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-10-11T01:00:33.851057" elapsed="0.000618"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:33.852160" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:33.851842" elapsed="0.000446"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:33.851823" elapsed="0.000519"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:00:33.852379" elapsed="0.000102"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:00:33.856029" elapsed="0.000124"/>
</kw>
<msg time="2026-10-11T01:00:33.856193" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:00:33.855511" elapsed="0.000745"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:33.856568" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:33.856777" 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-10-11T01:00:33.854744" elapsed="0.002263"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:00:33.852772" elapsed="0.004317"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:00:33.775614" elapsed="0.081626"/>
</kw>
<msg time="2026-10-11T01:00:33.857326" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:33.857367" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:33.775020" elapsed="0.082523"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:00:33.857704" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:00:33.857617" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:33.857599" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:33.858180" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:33.858585" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:00:33.858651" 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-10-11T01:00:33.774398" elapsed="0.084341"/>
</kw>
<msg time="2026-10-11T01:00:33.858824" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:33.858865" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:33.772434" elapsed="0.086467"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:33.859203" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:33.858983" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:33.858966" elapsed="0.000306"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:00:33.772273" elapsed="0.087022"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:00:33.772124" elapsed="0.087203"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:00:33.770032" elapsed="0.089349"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:00:33.767933" elapsed="0.091539"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:33.767522" elapsed="0.091994"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:00:33.766465" elapsed="0.093101"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:33.864551" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:33.864686" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:33.864805" 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-10-11T01:00:33.859995" elapsed="0.004834"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:33.865016" elapsed="0.000578"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:33.869404" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:33.869524" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:33.869618" 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-10-11T01:00:33.865758" elapsed="0.003885"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:33.870525" 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-10-11T01:00:33.870247" elapsed="0.000306"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:33.870948" 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-10-11T01:00:33.870706" elapsed="0.000269"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:33.871164" elapsed="0.000296"/>
</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-10-11T01:00:33.869851" elapsed="0.001665"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:33.859704" elapsed="0.011862"/>
</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-10-11T01:00:33.766020" elapsed="0.105584"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:33.872257" 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-10-11T01:00:33.872400" 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-10-11T01:00:33.872109" elapsed="0.000334"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.880499" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:00:33.880173" elapsed="0.000353"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:00:33.881234" 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-10-11T01:00:33.881030" elapsed="0.000275">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-10-11T01:00:33.881390" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:00:33.880689" elapsed="0.000739"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.881930" 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-10-11T01:00:33.881608" elapsed="0.000348"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:33.882233" 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-10-11T01:00:33.882391" 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-10-11T01:00:33.882125" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.882888" 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-10-11T01:00:33.882668" 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-10-11T01:00:33.883275" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:33.883014" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.883780" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:00:33.883516" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:33.883351" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:33.882996" elapsed="0.000861"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.884438" 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-10-11T01:00:33.884038" elapsed="0.000427"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:00:33.884509" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:00:33.884637" 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-10-11T01:00:33.879736" elapsed="0.004925"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:33.884983" 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-10-11T01:00:33.885098" 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-10-11T01:00:33.884830" elapsed="0.000292"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:33.885439" 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-10-11T01:00:33.885551" 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-10-11T01:00:33.885288" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.886010" 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-10-11T01:00:33.885777" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.886494" 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-10-11T01:00:33.886267" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.886975" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:33.886737" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:33.887477" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:33.887245" elapsed="0.000274"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:33.887659" elapsed="0.002539"/>
</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-10-11T01:00:33.890348" elapsed="0.002216"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:33.897159" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:33.897263" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:33.897352" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T01:00:33.893523" elapsed="0.004198">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:33.897903" 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-10-11T01:00:33.898136" elapsed="0.000022"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T01:00:33.893204" elapsed="0.005047">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:35.907672" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:35.907992" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:35.908207" 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-10-11T01:00:35.899748" elapsed="0.008515"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T01:00:35.909274" 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-10-11T01:00:35.909555" 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-10-11T01:00:35.908685" elapsed="0.000968"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:35.912144" 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-10-11T01:00:35.911144" elapsed="0.001073"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:35.913613" 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-10-11T01:00:35.912650" elapsed="0.001023"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:35.914140" elapsed="0.000661"/>
</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-10-11T01:00:35.910225" elapsed="0.004727"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T01:00:35.898831" elapsed="0.016234"/>
</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-10-11T01:00:33.892765" elapsed="2.022395"/>
</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-10-11T01:00:35.915523" elapsed="0.003473"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:35.927151" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:35.927459" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:35.927679" 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-10-11T01:00:35.921078" elapsed="0.006655"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:35.928139" elapsed="0.001345"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:35.936232" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:35.936517" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:35.936737" 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-10-11T01:00:35.929857" elapsed="0.006935"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:35.938748" 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-10-11T01:00:35.938179" elapsed="0.000628"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:35.940433" 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-10-11T01:00:35.939331" elapsed="0.001167"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:00:35.941573" 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-10-11T01:00:35.942122" 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-10-11T01:00:35.940937" elapsed="0.001351">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-10-11T01:00:35.937270" elapsed="0.005377">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-10-11T01:00:35.920399" elapsed="0.022618">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-10-11T01:00:37.951947" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:37.952229" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:37.952516" 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-10-11T01:00:37.944587" elapsed="0.008009"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:37.953047" elapsed="0.000937"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:37.960894" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:37.961147" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:37.961355" 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-10-11T01:00:37.954365" elapsed="0.007083"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:37.964164" 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-10-11T01:00:37.963506" elapsed="0.000721"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:37.965145" 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-10-11T01:00:37.964604" 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-10-11T01:00:37.965641" elapsed="0.000672"/>
</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-10-11T01:00:37.962111" elapsed="0.004357"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:37.943700" elapsed="0.022885"/>
</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-10-11T01:00:35.919506" elapsed="2.047161"/>
</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-10-11T01:00:37.967900" elapsed="0.003309"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:37.979855" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:37.980219" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:37.980476" 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-10-11T01:00:37.973852" elapsed="0.006686"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:37.980948" elapsed="0.000815"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:37.987909" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:37.988166" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:37.988389" 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-10-11T01:00:37.982149" elapsed="0.006338"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:37.990570" 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-10-11T01:00:37.989960" elapsed="0.000670"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:37.991535" 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-10-11T01:00:37.990989" elapsed="0.000605"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:37.992021" elapsed="0.000651"/>
</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-10-11T01:00:37.988987" elapsed="0.003810"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:37.973146" elapsed="0.019759"/>
</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-10-11T01:00:37.971723" elapsed="0.021283"/>
</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-10-11T01:00:37.967142" elapsed="0.025978"/>
</kw>
<arg>route_mac_lacp</arg>
<status status="PASS" start="2026-10-11T01:00:33.871795" elapsed="4.121420"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:33.765570" elapsed="4.227977"/>
</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-10-11T01:00:37.997660" elapsed="0.000467"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:00:37.997061" elapsed="0.001180"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:38.000363" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:38.000154" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:38.000108" elapsed="0.000433"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:38.008098" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:38.007881" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:38.007840" elapsed="0.000405"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.010374" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:00:38.009603" elapsed="0.000840"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.011046" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:00:38.010662" elapsed="0.000418"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:00:38.011137" elapsed="0.000044"/>
</return>
<msg time="2026-10-11T01:00:38.011323" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:00:38.008747" elapsed="0.002608"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:38.014963" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:38.014830" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:38.014805" elapsed="0.000248"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:38.016716" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:38.016555" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:38.016531" elapsed="0.000420"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:00:38.017695" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:00:38.017168" elapsed="0.000609"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:00:38.018634" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:00:38.018286" elapsed="0.000429"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:00:38.053547" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:00:38.020815" elapsed="0.032853"/>
</kw>
<msg time="2026-10-11T01:00:38.053790" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:00:38.053888" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:38.019153" elapsed="0.034817"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:00:38.085536" 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-10-11T01:00:38.055566" elapsed="0.030092"/>
</kw>
<msg time="2026-10-11T01:00:38.085775" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:00:38.085861" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:38.054363" elapsed="0.031583"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:38.086553" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:38.086238" elapsed="0.000445"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:38.086219" elapsed="0.000519"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.087435" 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-10-11T01:00:38.086939" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:38.088067" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:38.087760" elapsed="0.000436"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:38.087741" elapsed="0.000510"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:00:38.088285" 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-10-11T01:00:38.091893" elapsed="0.000250"/>
</kw>
<msg time="2026-10-11T01:00:38.092184" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:00:38.091351" elapsed="0.000896"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:38.092592" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:38.092802" 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-10-11T01:00:38.090621" elapsed="0.002410"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:00:38.088590" 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-10-11T01:00:38.016127" elapsed="0.077133"/>
</kw>
<msg time="2026-10-11T01:00:38.093342" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:38.093381" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:38.015267" elapsed="0.078164"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:00:38.093587" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:00:38.093500" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:38.093483" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:38.094064" 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-10-11T01:00:38.094469" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:00:38.094535" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T01:00:38.014428" elapsed="0.080193"/>
</kw>
<msg time="2026-10-11T01:00:38.094703" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:38.094743" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:38.011853" elapsed="0.082924"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:38.095080" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:38.094844" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:38.094828" elapsed="0.000322"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:00:38.011651" elapsed="0.083520"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:00:38.011443" elapsed="0.083756"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:00:38.007178" elapsed="0.088068"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:00:37.999556" elapsed="0.095739"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:37.998608" elapsed="0.096726"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:00:37.996236" elapsed="0.099146"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:38.100719" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:38.100869" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:38.100977" 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-10-11T01:00:38.095796" elapsed="0.005206"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:38.101176" elapsed="0.000375"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:38.107940" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:38.108042" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:38.108133" 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-10-11T01:00:38.101713" elapsed="0.006444"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:38.109022" 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-10-11T01:00:38.108760" elapsed="0.000289"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:38.109448" 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-10-11T01:00:38.109200" elapsed="0.000275"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:38.109656" elapsed="0.000288"/>
</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-10-11T01:00:38.108361" elapsed="0.001639"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:38.095530" elapsed="0.014517"/>
</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-10-11T01:00:37.995222" elapsed="0.114861"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:38.110779" 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-10-11T01:00:38.110938" 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-10-11T01:00:38.110630" elapsed="0.000335"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:38.111265" 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-10-11T01:00:38.111381" 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-10-11T01:00:38.111127" elapsed="0.000293"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:38.111720" 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-10-11T01:00:38.111835" 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-10-11T01:00:38.111584" elapsed="0.000276"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:00:38.112207" 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-10-11T01:00:38.112033" elapsed="0.000200"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:38.112577" 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-10-11T01:00:38.112693" 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-10-11T01:00:38.112438" elapsed="0.000279"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:00:38.113057" 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-10-11T01:00:38.112876" elapsed="0.000205"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.113511" 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-10-11T01:00:38.113276" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.113984" 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-10-11T01:00:38.113758" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.114475" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:38.114246" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.114944" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:38.114707" elapsed="0.000280"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:38.115127" elapsed="0.002649"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:38.127391" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T01:00:38.127473" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:38.127565" 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-10-11T01:00:38.117951" elapsed="0.009638"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.128115" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:38.127823" elapsed="0.000331"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:38.133678" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:38.133791" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:38.133885" 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-10-11T01:00:38.128309" elapsed="0.005600"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.134428" 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-10-11T01:00:38.134130" elapsed="0.000345"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:38.139786" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:38.139895" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:38.139994" 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-10-11T01:00:38.135381" elapsed="0.004637"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.140514" 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-10-11T01:00:38.140222" elapsed="0.000338"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:38.140721" elapsed="0.000337"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:38.143427" level="INFO">${update} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:00:38.141206" elapsed="0.002250"/>
</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-10-11T01:00:38.143634" elapsed="0.000303"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:00:38.143982" elapsed="0.000030"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:00:38.135072" elapsed="0.009014"/>
</kw>
<msg time="2026-10-11T01:00:38.144156" 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-10-11T01:00:38.134657" elapsed="0.009522"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.144613" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:38.144378" elapsed="0.000305"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.145505" level="INFO">Length is 182.</msg>
<msg time="2026-10-11T01:00:38.145575" 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-10-11T01:00:38.145241" elapsed="0.000356"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.145991" level="INFO">Length is 182.</msg>
<msg time="2026-10-11T01:00:38.146058" 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-10-11T01:00:38.145751" elapsed="0.000329"/>
</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-10-11T01:00:38.146261" elapsed="0.000280"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:38.146847" 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-10-11T01:00:38.146688" elapsed="0.000182"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:38.147179" 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-10-11T01:00:38.147022" elapsed="0.000180"/>
</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-10-11T01:00:38.147380" elapsed="0.000276"/>
</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-10-11T01:00:38.144894" elapsed="0.002815"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:38.147848" elapsed="0.002144"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:38.154586" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:38.154697" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:38.154784" 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-10-11T01:00:38.150499" elapsed="0.004309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.155302" 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-10-11T01:00:38.155025" elapsed="0.000322"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:38.155526" elapsed="0.000324"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:38.160087" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:38.160197" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:38.160292" 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-10-11T01:00:38.156026" elapsed="0.004290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.160849" 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-10-11T01:00:38.160541" elapsed="0.000353"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:38.161073" elapsed="0.000326"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T01:00:38.161632" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:38.161484" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:38.161466" elapsed="0.000224"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:38.167726" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:38.167769" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:38.167858" 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-10-11T01:00:38.161836" elapsed="0.006046"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:00:38.150188" elapsed="0.017768"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:38.173913" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:38.174056" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:38.174155" 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-10-11T01:00:38.168858" elapsed="0.005323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.174747" 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-10-11T01:00:38.174431" elapsed="0.000361"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:38.174970" elapsed="0.000335"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:38.177780" level="INFO">${update} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:00:38.175474" elapsed="0.002333"/>
</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-10-11T01:00:38.177994" elapsed="0.000290"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:00:38.178330" elapsed="0.000035"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:00:38.168554" elapsed="0.009914"/>
</kw>
<msg time="2026-10-11T01:00:38.178543" 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-10-11T01:00:38.168135" elapsed="0.010432"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.178997" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:38.178766" elapsed="0.000273"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.179852" level="INFO">Length is 170.</msg>
<msg time="2026-10-11T01:00:38.179935" 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-10-11T01:00:38.179616" elapsed="0.000342"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.180339" level="INFO">Length is 170.</msg>
<msg time="2026-10-11T01:00:38.180424" 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-10-11T01:00:38.180114" elapsed="0.000377"/>
</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-10-11T01:00:38.180675" elapsed="0.000278"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:38.181259" 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-10-11T01:00:38.181100" elapsed="0.000182"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:38.181598" 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-10-11T01:00:38.181442" elapsed="0.000179"/>
</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-10-11T01:00:38.181800" elapsed="0.000277"/>
</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-10-11T01:00:38.179255" elapsed="0.002876"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:38.186957" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:38.187060" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:38.187143" 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-10-11T01:00:38.182679" elapsed="0.004489"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.187666" 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-10-11T01:00:38.187372" elapsed="0.000337"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:38.187870" elapsed="0.000334"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:38.192053" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:38.192155" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:38.192246" 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-10-11T01:00:38.188366" elapsed="0.003906"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.192767" 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-10-11T01:00:38.192497" elapsed="0.000313"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:38.192983" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T01:00:38.193545" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-11T01:00:38.193375" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:38.193356" elapsed="0.000268"/>
</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-10-11T01:00:38.193772" elapsed="0.000020"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:00:38.182370" elapsed="0.011481"/>
</kw>
<arg>route_mac_lan</arg>
<status status="PASS" start="2026-10-11T01:00:38.110315" elapsed="0.083577"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:37.994148" elapsed="0.199856"/>
</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-10-11T01:00:38.196097" elapsed="0.000197"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:00:38.195832" elapsed="0.000512"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:38.197255" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:38.197167" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:38.197150" elapsed="0.000167"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:38.199377" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:38.199294" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:38.199277" elapsed="0.000178"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.200366" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:00:38.200039" elapsed="0.000353"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.200821" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:00:38.200561" elapsed="0.000284"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:00:38.200885" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:00:38.201024" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:00:38.199667" elapsed="0.001380"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:38.203792" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:38.203707" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:38.203689" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:38.205051" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:38.204931" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:38.204902" elapsed="0.000304"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:00:38.205735" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:00:38.205364" elapsed="0.000431"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:00:38.206391" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:00:38.206162" elapsed="0.000307"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:00:38.239500" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:00:38.207991" elapsed="0.031628"/>
</kw>
<msg time="2026-10-11T01:00:38.239741" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:00:38.239845" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:38.206781" elapsed="0.033149"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:00:38.271882" 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-10-11T01:00:38.241515" elapsed="0.030510"/>
</kw>
<msg time="2026-10-11T01:00:38.272141" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:00:38.272230" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:38.240319" elapsed="0.031980"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:38.272907" elapsed="0.000079"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:38.272611" elapsed="0.000439"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:38.272591" elapsed="0.000515"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.273785" 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-10-11T01:00:38.273294" elapsed="0.000611"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:38.274438" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:38.274120" elapsed="0.000448"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:38.274100" elapsed="0.000523"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:00:38.274657" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:00:38.278188" elapsed="0.000126"/>
</kw>
<msg time="2026-10-11T01:00:38.278353" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:00:38.277698" elapsed="0.000858"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:38.278791" elapsed="0.000026"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:38.279044" 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-10-11T01:00:38.276889" elapsed="0.002378"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:00:38.274951" 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-10-11T01:00:38.204633" elapsed="0.074880"/>
</kw>
<msg time="2026-10-11T01:00:38.279596" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:38.279635" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:38.204022" elapsed="0.075649"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:00:38.279822" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:00:38.279738" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:38.279720" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:38.280307" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:38.280715" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:00:38.280781" 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-10-11T01:00:38.203402" elapsed="0.077464"/>
</kw>
<msg time="2026-10-11T01:00:38.280968" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:38.281008" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:38.201392" elapsed="0.079653"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:38.281332" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:38.281111" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:38.281095" elapsed="0.000306"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:00:38.201248" elapsed="0.080192"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:00:38.201100" elapsed="0.080369"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:00:38.199001" elapsed="0.082518"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:00:38.196902" elapsed="0.084666"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:38.196509" elapsed="0.085100"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:00:38.195485" elapsed="0.086171"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:38.287082" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:38.287195" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:38.287326" 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-10-11T01:00:38.282083" elapsed="0.005268"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:38.287542" elapsed="0.000344"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:38.291903" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:38.292018" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:38.292109" 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-10-11T01:00:38.288061" elapsed="0.004072"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:38.293022" 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-10-11T01:00:38.292742" elapsed="0.000307"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:38.293453" 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-10-11T01:00:38.293200" elapsed="0.000279"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:38.293662" elapsed="0.000293"/>
</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-10-11T01:00:38.292340" elapsed="0.001672"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:38.281790" elapsed="0.012270"/>
</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-10-11T01:00:38.194809" elapsed="0.099288"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:38.294748" 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-10-11T01:00:38.294889" 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-10-11T01:00:38.294600" elapsed="0.000317"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.303036" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:00:38.302686" elapsed="0.000377"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:00:38.303774" 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-10-11T01:00:38.303561" elapsed="0.000286">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-10-11T01:00:38.303946" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:00:38.303224" elapsed="0.000747"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.304478" 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-10-11T01:00:38.304148" elapsed="0.000355"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:38.304781" 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-10-11T01:00:38.304978" 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-10-11T01:00:38.304672" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.305440" 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-10-11T01:00:38.305202" 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-10-11T01:00:38.305811" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:38.305552" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.306317" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:00:38.306053" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:38.305887" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:38.305533" elapsed="0.000861"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.306974" 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-10-11T01:00:38.306575" elapsed="0.000425"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:00:38.307045" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:00:38.307171" 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-10-11T01:00:38.302241" elapsed="0.004955"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:38.307515" 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-10-11T01:00:38.307639" 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-10-11T01:00:38.307360" elapsed="0.000303"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:38.307982" 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-10-11T01:00:38.308092" 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-10-11T01:00:38.307832" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.308549" 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-10-11T01:00:38.308312" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.309020" 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-10-11T01:00:38.308793" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.309522" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:38.309291" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:38.310015" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:38.309770" elapsed="0.000295"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:38.310211" elapsed="0.002537"/>
</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-10-11T01:00:38.312893" elapsed="0.002371"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:38.322059" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:38.322165" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:38.322255" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T01:00:38.316208" elapsed="0.006428">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:38.322821" elapsed="0.000020"/>
</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-10-11T01:00:38.323047" elapsed="0.000023"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T01:00:38.315893" elapsed="0.007276">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:40.332594" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:40.332907" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:40.333150" 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-10-11T01:00:40.324740" elapsed="0.008465"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T01:00:40.334242" 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-10-11T01:00:40.334524" 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-10-11T01:00:40.333641" elapsed="0.001079"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:40.337150" 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-10-11T01:00:40.336119" elapsed="0.001092"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:40.338514" 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-10-11T01:00:40.337581" elapsed="0.000994"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:40.339005" elapsed="0.000659"/>
</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-10-11T01:00:40.335206" elapsed="0.004583"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T01:00:40.323823" elapsed="0.016076"/>
</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-10-11T01:00:38.315480" elapsed="2.024550"/>
</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-10-11T01:00:40.340358" elapsed="0.003211"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:40.352225" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:40.352501" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:40.352698" 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-10-11T01:00:40.345652" elapsed="0.007100"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:40.353171" elapsed="0.000840"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:40.361764" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:40.362052" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:40.362270" 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-10-11T01:00:40.354371" elapsed="0.007954"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:40.364291" 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-10-11T01:00:40.363727" elapsed="0.000625"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:40.365787" 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-10-11T01:00:40.364725" elapsed="0.001122"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:00:40.366979" 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-10-11T01:00:40.367544" 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-10-11T01:00:40.366281" elapsed="0.001429">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-10-11T01:00:40.362820" elapsed="0.005242">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-10-11T01:00:40.344997" elapsed="0.023353">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-10-11T01:00:42.377472" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:42.377751" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:42.377985" 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-10-11T01:00:42.369809" elapsed="0.008234"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:42.378490" elapsed="0.000868"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:42.385865" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:42.386138" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:42.386354" 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-10-11T01:00:42.379760" elapsed="0.006680"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:42.388569" 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-10-11T01:00:42.387968" elapsed="0.000661"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:42.389559" 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-10-11T01:00:42.389000" elapsed="0.000618"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:42.390080" elapsed="0.000679"/>
</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-10-11T01:00:42.387023" elapsed="0.003864"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:42.368999" elapsed="0.022021"/>
</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-10-11T01:00:40.344055" elapsed="2.047047"/>
</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-10-11T01:00:42.392241" elapsed="0.003092"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:42.404303" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:42.404581" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:42.404795" 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-10-11T01:00:42.397895" elapsed="0.006955"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:42.405267" elapsed="0.000826"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:42.413845" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:42.414105" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:42.414314" 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-10-11T01:00:42.406488" elapsed="0.007880"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:42.416405" 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-10-11T01:00:42.415841" elapsed="0.000656"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:42.417381" 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-10-11T01:00:42.416841" elapsed="0.000634"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:42.417907" elapsed="0.000681"/>
</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-10-11T01:00:42.414867" elapsed="0.003847"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:42.396773" elapsed="0.022148"/>
</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-10-11T01:00:42.395844" elapsed="0.023190"/>
</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-10-11T01:00:42.391500" elapsed="0.027649"/>
</kw>
<arg>route_mac_lan</arg>
<status status="PASS" start="2026-10-11T01:00:38.294283" elapsed="4.124963"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:38.194329" elapsed="4.225229"/>
</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-10-11T01:00:42.423512" elapsed="0.000476"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:00:42.422891" elapsed="0.001212"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:42.426258" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:42.426049" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:42.426001" 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-10-11T01:00:42.431031" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:42.430822" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:42.430783" elapsed="0.000390"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.433295" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:00:42.432542" elapsed="0.000811"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.434342" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:00:42.433728" elapsed="0.000669"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:00:42.434519" elapsed="0.000069"/>
</return>
<msg time="2026-10-11T01:00:42.434814" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:00:42.431666" elapsed="0.003198"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:42.440461" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:42.440318" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:42.440292" elapsed="0.000259"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:42.442210" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:42.442051" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:42.442026" elapsed="0.000422"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:00:42.443177" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:00:42.442665" elapsed="0.000595"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:00:42.444112" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:00:42.443778" elapsed="0.000416"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:00:42.479033" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:00:42.446312" elapsed="0.032847"/>
</kw>
<msg time="2026-10-11T01:00:42.479286" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:00:42.479375" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:42.444654" elapsed="0.034820"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:00:42.510872" 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-10-11T01:00:42.481102" elapsed="0.029907"/>
</kw>
<msg time="2026-10-11T01:00:42.511130" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:00:42.511218" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:42.479878" elapsed="0.031410"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:42.511902" elapsed="0.000079"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:42.511607" elapsed="0.000440"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:42.511587" elapsed="0.000515"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.512796" 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-10-11T01:00:42.512295" elapsed="0.000662"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:42.513442" elapsed="0.000067"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:42.513129" elapsed="0.000445"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:42.513110" elapsed="0.000520"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:00:42.513664" 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-10-11T01:00:42.517215" elapsed="0.000119"/>
</kw>
<msg time="2026-10-11T01:00:42.517374" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:00:42.516717" elapsed="0.000760"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:42.517713" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:42.517921" elapsed="0.000037"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:00:42.515902" elapsed="0.002251"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:00:42.513957" elapsed="0.004276"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:00:42.441633" elapsed="0.076750"/>
</kw>
<msg time="2026-10-11T01:00:42.518549" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:42.518589" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:42.440765" elapsed="0.077860"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:00:42.518777" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:00:42.518693" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:42.518675" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:42.519260" 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-10-11T01:00:42.519711" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:00:42.519781" 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-10-11T01:00:42.439899" elapsed="0.079967"/>
</kw>
<msg time="2026-10-11T01:00:42.519966" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:42.520007" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:42.435659" elapsed="0.084383"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:42.520330" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:42.520110" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:42.520093" elapsed="0.000307"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:00:42.435305" elapsed="0.085173"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:00:42.434988" elapsed="0.085518"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:00:42.430136" elapsed="0.090419"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:00:42.425436" elapsed="0.095168"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:42.424484" elapsed="0.096159"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:00:42.422061" elapsed="0.098628"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:42.525312" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:42.525476" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:42.525565" 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-10-11T01:00:42.521105" elapsed="0.004484"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:42.525762" elapsed="0.000360"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:42.530769" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:42.530871" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:42.530975" 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-10-11T01:00:42.526285" elapsed="0.004716"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:42.531857" 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-10-11T01:00:42.531613" elapsed="0.000270"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:42.532277" 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-10-11T01:00:42.532049" elapsed="0.000253"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:42.532501" elapsed="0.000276"/>
</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-10-11T01:00:42.531207" elapsed="0.001626"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:42.520818" elapsed="0.012062"/>
</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-10-11T01:00:42.421027" elapsed="0.111889"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:42.533629" 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-10-11T01:00:42.533774" 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-10-11T01:00:42.533478" elapsed="0.000323"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:42.534113" 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-10-11T01:00:42.534229" 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-10-11T01:00:42.533974" elapsed="0.000281"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:42.534568" 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-10-11T01:00:42.534682" 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-10-11T01:00:42.534431" elapsed="0.000276"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:00:42.535054" 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-10-11T01:00:42.534867" elapsed="0.000211"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:42.535420" 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-10-11T01:00:42.535539" 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-10-11T01:00:42.535270" elapsed="0.000293"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:00:42.535889" 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-10-11T01:00:42.535723" elapsed="0.000191"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.536339" 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-10-11T01:00:42.536119" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.536813" 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-10-11T01:00:42.536600" elapsed="0.000259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.537273" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:42.537061" elapsed="0.000252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.537734" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:42.537522" elapsed="0.000253"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:42.537911" elapsed="0.002672"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:42.550268" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T01:00:42.550333" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:42.550444" 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-10-11T01:00:42.540783" elapsed="0.009687"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.551054" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:42.550720" elapsed="0.000373"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:42.557483" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:42.557615" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:42.557710" 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-10-11T01:00:42.551250" elapsed="0.006485"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.558226" 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-10-11T01:00:42.557953" elapsed="0.000317"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:42.565757" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:42.565868" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:42.565971" 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-10-11T01:00:42.559248" elapsed="0.006749"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.566508" 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-10-11T01:00:42.566202" elapsed="0.000351"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:42.566718" elapsed="0.000349"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:42.569541" level="INFO">${update} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:00:42.567218" elapsed="0.002351"/>
</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-10-11T01:00:42.569726" elapsed="0.000327"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:00:42.570099" elapsed="0.000037"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:00:42.558911" elapsed="0.011303"/>
</kw>
<msg time="2026-10-11T01:00:42.570285" 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-10-11T01:00:42.558477" elapsed="0.011832"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.570755" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:42.570536" elapsed="0.000262"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.571639" level="INFO">Length is 182.</msg>
<msg time="2026-10-11T01:00:42.571708" 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-10-11T01:00:42.571385" elapsed="0.000346"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.572125" level="INFO">Length is 182.</msg>
<msg time="2026-10-11T01:00:42.572192" 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-10-11T01:00:42.571885" elapsed="0.000329"/>
</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-10-11T01:00:42.572394" elapsed="0.000288"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:42.573002" 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-10-11T01:00:42.572828" elapsed="0.000198"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:42.573324" 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-10-11T01:00:42.573168" elapsed="0.000180"/>
</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-10-11T01:00:42.573545" elapsed="0.000264"/>
</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-10-11T01:00:42.571054" elapsed="0.002809"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:42.574014" elapsed="0.002166"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:42.580660" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:42.580771" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:42.580858" 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-10-11T01:00:42.576688" elapsed="0.004194"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.581375" 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-10-11T01:00:42.581102" elapsed="0.000341"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:42.581608" elapsed="0.000319"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:42.586053" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:42.586162" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:42.586257" 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-10-11T01:00:42.582103" elapsed="0.004178"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.586778" 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-10-11T01:00:42.586504" elapsed="0.000349"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:42.587027" elapsed="0.000321"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T01:00:42.587598" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:42.587440" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:42.587417" elapsed="0.000243"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:42.593282" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:42.593324" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:42.593435" 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-10-11T01:00:42.587805" elapsed="0.005659"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:00:42.576373" elapsed="0.017149"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:42.598453" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:42.598557" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:42.598643" 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-10-11T01:00:42.594432" elapsed="0.004235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.599161" 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-10-11T01:00:42.598872" elapsed="0.000333"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:42.599368" elapsed="0.000506"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:42.602635" level="INFO">${update} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:00:42.600096" elapsed="0.002567"/>
</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-10-11T01:00:42.602820" elapsed="0.000320"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:00:42.603184" elapsed="0.000027"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:00:42.594113" elapsed="0.009170"/>
</kw>
<msg time="2026-10-11T01:00:42.603353" 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-10-11T01:00:42.593699" elapsed="0.009677"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.603814" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:42.603599" elapsed="0.000258"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.604670" level="INFO">Length is 170.</msg>
<msg time="2026-10-11T01:00:42.604738" 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-10-11T01:00:42.604431" elapsed="0.000329"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.605158" level="INFO">Length is 170.</msg>
<msg time="2026-10-11T01:00:42.605224" 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-10-11T01:00:42.604915" elapsed="0.000360"/>
</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-10-11T01:00:42.605483" elapsed="0.000269"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:42.606071" 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-10-11T01:00:42.605900" elapsed="0.000194"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:42.606388" 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-10-11T01:00:42.606237" elapsed="0.000191"/>
</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-10-11T01:00:42.606614" elapsed="0.000262"/>
</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-10-11T01:00:42.604083" elapsed="0.002847"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:42.611096" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:42.611199" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:42.611284" 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-10-11T01:00:42.607476" elapsed="0.003832"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.611807" 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-10-11T01:00:42.611534" elapsed="0.000315"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:42.612025" elapsed="0.000319"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:42.616445" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:42.616548" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:42.616641" 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-10-11T01:00:42.612519" elapsed="0.004146"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.617156" 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-10-11T01:00:42.616869" elapsed="0.000330"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:42.617361" elapsed="0.000338"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T01:00:42.617914" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-10-11T01:00:42.617768" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:42.617750" elapsed="0.000253"/>
</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-10-11T01:00:42.618152" elapsed="0.000020"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:00:42.607170" elapsed="0.011061"/>
</kw>
<arg>route_mac_mac</arg>
<status status="PASS" start="2026-10-11T01:00:42.533161" elapsed="0.085110"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:42.419971" elapsed="0.198398"/>
</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-10-11T01:00:42.620283" elapsed="0.000213"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:00:42.620030" elapsed="0.000516"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:42.621619" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:42.621525" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:42.621336" 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-10-11T01:00:42.623747" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:42.623663" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:42.623646" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.624740" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:00:42.624392" elapsed="0.000374"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.625200" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:00:42.624922" elapsed="0.000302"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:00:42.625265" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:00:42.625392" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:00:42.624034" elapsed="0.001398"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:42.628001" elapsed="0.000096"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:42.627903" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:42.627886" 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-10-11T01:00:42.629328" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:42.629213" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:42.629195" elapsed="0.000313"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:00:42.630034" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:00:42.629660" elapsed="0.000435"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:00:42.630704" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:00:42.630469" elapsed="0.000293"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:00:42.664980" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:00:42.632308" elapsed="0.032794"/>
</kw>
<msg time="2026-10-11T01:00:42.665227" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:00:42.665330" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:42.631095" elapsed="0.034304"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:00:42.697077" 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-10-11T01:00:42.666995" elapsed="0.030210"/>
</kw>
<msg time="2026-10-11T01:00:42.697323" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:00:42.697430" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:42.665804" elapsed="0.031698"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:42.698095" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:42.697788" elapsed="0.000434"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:42.697768" elapsed="0.000508"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.698959" 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-10-11T01:00:42.698477" elapsed="0.000596"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:42.699586" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:42.699238" elapsed="0.000477"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:42.699219" elapsed="0.000550"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:00:42.699803" 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-10-11T01:00:42.703540" elapsed="0.000120"/>
</kw>
<msg time="2026-10-11T01:00:42.703700" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:00:42.702900" elapsed="0.000862"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:42.704008" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:42.704215" 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-10-11T01:00:42.702029" 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-10-11T01:00:42.700094" elapsed="0.004490"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:00:42.628908" elapsed="0.075826"/>
</kw>
<msg time="2026-10-11T01:00:42.704817" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:42.704856" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:42.628305" elapsed="0.076586"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:00:42.705059" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:00:42.704973" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:42.704955" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:42.705535" 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-10-11T01:00:42.705914" elapsed="0.000037"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:00:42.705995" 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-10-11T01:00:42.627617" elapsed="0.078463"/>
</kw>
<msg time="2026-10-11T01:00:42.706163" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:42.706203" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:42.625781" elapsed="0.080457"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:42.706582" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:42.706303" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:42.706287" elapsed="0.000366"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:00:42.625637" elapsed="0.081038"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:00:42.625486" elapsed="0.081217"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:00:42.623353" elapsed="0.083399"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:00:42.621101" elapsed="0.085702"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:42.620697" elapsed="0.086146"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:00:42.619657" elapsed="0.087232"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:42.711322" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:42.711450" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:42.711577" 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-10-11T01:00:42.707296" elapsed="0.004306"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:42.711774" elapsed="0.000357"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:42.716732" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:42.716834" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:42.716927" 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-10-11T01:00:42.712293" elapsed="0.004673"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:42.717853" 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-10-11T01:00:42.717581" elapsed="0.000299"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:42.718277" 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-10-11T01:00:42.718047" elapsed="0.000256"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:42.718503" elapsed="0.000276"/>
</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-10-11T01:00:42.717171" elapsed="0.001664"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:42.707029" elapsed="0.011854"/>
</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-10-11T01:00:42.619211" elapsed="0.099708"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:42.719600" 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-10-11T01:00:42.719732" 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-10-11T01:00:42.719446" elapsed="0.000313"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.728049" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:00:42.727729" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:00:42.728836" 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-10-11T01:00:42.728575" elapsed="0.000338">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-10-11T01:00:42.729014" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:00:42.728236" elapsed="0.000801"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.729545" 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-10-11T01:00:42.729211" elapsed="0.000359"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:42.729846" 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-10-11T01:00:42.729992" 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-10-11T01:00:42.729737" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.730487" 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-10-11T01:00:42.730244" 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-10-11T01:00:42.730856" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:42.730596" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.731354" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:00:42.731094" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:42.730944" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:42.730579" elapsed="0.000867"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.732006" 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-10-11T01:00:42.731611" elapsed="0.000422"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:00:42.732077" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:00:42.732203" 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-10-11T01:00:42.727285" elapsed="0.004943"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:42.732549" 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-10-11T01:00:42.732665" 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-10-11T01:00:42.732394" elapsed="0.000295"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:42.733001" 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-10-11T01:00:42.733113" 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-10-11T01:00:42.732853" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.733567" 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-10-11T01:00:42.733331" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.734038" 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-10-11T01:00:42.733812" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.734501" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:42.734273" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:42.734992" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:42.734763" elapsed="0.000270"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:42.735171" elapsed="0.002306"/>
</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-10-11T01:00:42.737631" elapsed="0.002277"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:42.744686" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:42.744791" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:42.744888" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T01:00:42.740848" elapsed="0.004412">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:42.745469" 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-10-11T01:00:42.745683" elapsed="0.000022"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T01:00:42.740548" elapsed="0.005250">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:44.755824" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:44.756156" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:44.756397" 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-10-11T01:00:44.747303" elapsed="0.009185"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T01:00:44.757501" 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-10-11T01:00:44.757752" 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-10-11T01:00:44.756884" elapsed="0.000965"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:44.760338" 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-10-11T01:00:44.759328" elapsed="0.001073"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:44.761712" 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-10-11T01:00:44.760778" elapsed="0.000995"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:44.762216" elapsed="0.000676"/>
</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-10-11T01:00:44.758441" elapsed="0.004603"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T01:00:44.746379" elapsed="0.016778"/>
</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-10-11T01:00:42.740114" elapsed="2.023138"/>
</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-10-11T01:00:44.763611" elapsed="0.003250"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:44.776038" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:44.776271" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:44.776505" 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-10-11T01:00:44.768930" elapsed="0.007633"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:44.776971" elapsed="0.000815"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:44.784484" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:44.784731" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:44.784965" 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-10-11T01:00:44.778167" elapsed="0.006854"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:44.786994" 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-10-11T01:00:44.786397" elapsed="0.000657"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:44.788486" 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-10-11T01:00:44.787390" elapsed="0.001156"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:00:44.789620" 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-10-11T01:00:44.790172" 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-10-11T01:00:44.788982" elapsed="0.001356">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-10-11T01:00:44.785514" elapsed="0.005179">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-10-11T01:00:44.768284" elapsed="0.022709">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-10-11T01:00:46.800817" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:46.801127" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:46.801365" 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-10-11T01:00:46.792565" elapsed="0.008891"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:46.801867" elapsed="0.000910"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:46.810166" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:46.810398" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:46.810649" 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-10-11T01:00:46.803175" elapsed="0.007531"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:46.812822" 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-10-11T01:00:46.812223" elapsed="0.000659"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:46.813794" 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-10-11T01:00:46.813245" elapsed="0.000607"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:46.814284" elapsed="0.000682"/>
</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-10-11T01:00:46.811283" elapsed="0.003811"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:46.791724" elapsed="0.023479"/>
</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-10-11T01:00:44.767310" elapsed="2.047971"/>
</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-10-11T01:00:46.816449" elapsed="0.003281"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:46.828165" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:46.828393" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:46.828624" 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-10-11T01:00:46.821856" elapsed="0.006821"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:46.829096" elapsed="0.000790"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:46.836296" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:46.836563" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:46.836768" 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-10-11T01:00:46.830274" elapsed="0.006548"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:46.838851" 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-10-11T01:00:46.838272" elapsed="0.000638"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:46.839824" 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-10-11T01:00:46.839278" elapsed="0.000603"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:46.840316" elapsed="0.000679"/>
</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-10-11T01:00:46.837307" elapsed="0.003812"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:46.821160" elapsed="0.020064"/>
</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-10-11T01:00:46.820211" elapsed="0.021090"/>
</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-10-11T01:00:46.815686" elapsed="0.025755"/>
</kw>
<arg>route_mac_mac</arg>
<status status="PASS" start="2026-10-11T01:00:42.719132" elapsed="4.122408"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:42.618702" elapsed="4.223136"/>
</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-10-11T01:00:46.846012" elapsed="0.000846"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:00:46.845392" elapsed="0.001603"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:46.849158" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:46.848919" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:46.848871" elapsed="0.000437"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:46.854034" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:46.853795" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:46.853757" elapsed="0.000422"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:46.856311" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:00:46.855558" elapsed="0.000810"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:00:46.857359" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:00:46.856745" elapsed="0.000705"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:00:46.857545" elapsed="0.000074"/>
</return>
<msg time="2026-10-11T01:00:46.857846" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:00:46.854680" elapsed="0.003216"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:46.861870" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:46.861750" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:46.861726" 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-10-11T01:00:46.863642" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:46.863482" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:46.863456" elapsed="0.000400"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:00:46.864609" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:00:46.864097" elapsed="0.000596"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:00:46.865575" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:00:46.865224" elapsed="0.000432"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:00:46.900829" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:00:46.867756" elapsed="0.033211"/>
</kw>
<msg time="2026-10-11T01:00:46.901096" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:00:46.901184" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:46.866097" elapsed="0.035155"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:00:46.934754" 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-10-11T01:00:46.902876" elapsed="0.032030"/>
</kw>
<msg time="2026-10-11T01:00:46.935060" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:00:46.935149" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:46.901674" elapsed="0.033545"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:46.935880" elapsed="0.000078"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:46.935546" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:46.935522" elapsed="0.000561"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:46.936796" 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-10-11T01:00:46.936278" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:46.937631" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:46.937140" elapsed="0.000622"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:46.937121" elapsed="0.000696"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:00:46.937853" 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-10-11T01:00:46.941614" elapsed="0.000127"/>
</kw>
<msg time="2026-10-11T01:00:46.941781" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:00:46.940960" 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-10-11T01:00:46.942113" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:46.942325" 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-10-11T01:00:46.940158" 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-10-11T01:00:46.938186" elapsed="0.004453"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:00:46.863053" elapsed="0.079736"/>
</kw>
<msg time="2026-10-11T01:00:46.942873" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:46.942913" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:46.862190" elapsed="0.080771"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:00:46.943117" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:00:46.943031" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:46.943013" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:46.943621" 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-10-11T01:00:46.944024" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:00:46.944090" 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-10-11T01:00:46.861326" elapsed="0.082850"/>
</kw>
<msg time="2026-10-11T01:00:46.944260" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:46.944301" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:46.858726" elapsed="0.085610"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:46.944643" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:46.944418" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:46.944387" elapsed="0.000326"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:00:46.858361" elapsed="0.086374"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:00:46.858036" elapsed="0.086730"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:00:46.853112" elapsed="0.091706"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:00:46.848301" elapsed="0.096566"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:46.847341" elapsed="0.097566"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:00:46.844597" elapsed="0.100375"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:46.950043" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:46.950206" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:46.950307" 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-10-11T01:00:46.945385" elapsed="0.004947"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:46.950529" elapsed="0.000365"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:46.955233" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:46.955335" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:46.955448" 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-10-11T01:00:46.951071" elapsed="0.004403"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:46.956338" 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-10-11T01:00:46.956080" elapsed="0.000285"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:46.956765" 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-10-11T01:00:46.956537" elapsed="0.000253"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:46.956986" elapsed="0.000279"/>
</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-10-11T01:00:46.955682" elapsed="0.001639"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:46.945112" elapsed="0.012257"/>
</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-10-11T01:00:46.843583" elapsed="0.113839"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:46.958125" 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-10-11T01:00:46.958281" 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-10-11T01:00:46.957974" elapsed="0.000333"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:46.958625" 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-10-11T01:00:46.958742" 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-10-11T01:00:46.958485" elapsed="0.000282"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:46.959079" 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-10-11T01:00:46.959194" 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-10-11T01:00:46.958929" elapsed="0.000289"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:00:46.959779" 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-10-11T01:00:46.959379" elapsed="0.000425"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:46.960150" 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-10-11T01:00:46.960267" 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-10-11T01:00:46.960011" elapsed="0.000280"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:00:46.960636" 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-10-11T01:00:46.960468" elapsed="0.000192"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:46.961090" 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-10-11T01:00:46.960855" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:46.961568" 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-10-11T01:00:46.961336" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:46.962032" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:46.961807" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:46.962493" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:46.962263" elapsed="0.000272"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:46.962674" elapsed="0.002638"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:46.974035" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T01:00:46.974097" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:46.974188" 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-10-11T01:00:46.965495" elapsed="0.008718"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:46.974745" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:46.974469" elapsed="0.000315"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:46.979452" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:46.979564" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:46.979658" 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-10-11T01:00:46.974939" elapsed="0.004744"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:46.980176" 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-10-11T01:00:46.979885" elapsed="0.000336"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:46.985837" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:46.985958" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:46.986046" 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-10-11T01:00:46.981209" elapsed="0.004861"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:46.986569" 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-10-11T01:00:46.986274" elapsed="0.000342"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:46.986777" elapsed="0.000339"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:46.989824" level="INFO">${update} = ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:00:46.987268" elapsed="0.002584"/>
</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-10-11T01:00:46.990024" elapsed="0.000316"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:00:46.990384" elapsed="0.000051"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:00:46.980834" elapsed="0.009679"/>
</kw>
<msg time="2026-10-11T01:00:46.990584" 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-10-11T01:00:46.980403" elapsed="0.010204"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:46.991036" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:46.990806" elapsed="0.000304"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:46.991922" level="INFO">Length is 182.</msg>
<msg time="2026-10-11T01:00:46.992007" 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-10-11T01:00:46.991684" elapsed="0.000345"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:46.992443" level="INFO">Length is 182.</msg>
<msg time="2026-10-11T01:00:46.992514" 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-10-11T01:00:46.992186" 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-10-11T01:00:46.992719" elapsed="0.000280"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:46.993312" 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-10-11T01:00:46.993148" elapsed="0.000188"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:46.993653" 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-10-11T01:00:46.993495" elapsed="0.000181"/>
</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-10-11T01:00:46.993854" elapsed="0.000278"/>
</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-10-11T01:00:46.991327" elapsed="0.002859"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:46.994326" elapsed="0.002390"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:47.001255" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:47.001365" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:47.001483" 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-10-11T01:00:46.997218" elapsed="0.004290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:47.002004" 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-10-11T01:00:47.001714" elapsed="0.000336"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:47.002215" elapsed="0.000340"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:47.007530" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:47.007640" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:47.007736" 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-10-11T01:00:47.002715" elapsed="0.005046"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:47.008291" 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-10-11T01:00:47.008012" elapsed="0.000324"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:47.008517" elapsed="0.000327"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T01:00:47.009076" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:47.008913" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:47.008895" elapsed="0.000242"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:47.014609" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:47.014654" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:47.014743" 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-10-11T01:00:47.009285" elapsed="0.005482"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:00:46.996917" elapsed="0.017910"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:47.019937" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:47.020053" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:47.020137" 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-10-11T01:00:47.015741" elapsed="0.004419"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:47.020660" 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-10-11T01:00:47.020366" elapsed="0.000337"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:47.020865" elapsed="0.000332"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:47.023831" level="INFO">${update} = ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:00:47.021345" 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-10-11T01:00:47.024029" elapsed="0.000305"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:00:47.024377" elapsed="0.000049"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:00:47.015434" elapsed="0.009070"/>
</kw>
<msg time="2026-10-11T01:00:47.024575" 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-10-11T01:00:47.015019" elapsed="0.009580"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:47.025033" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:47.024799" elapsed="0.000276"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:47.025865" level="INFO">Length is 170.</msg>
<msg time="2026-10-11T01:00:47.025932" 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-10-11T01:00:47.025631" elapsed="0.000337"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:47.026391" level="INFO">Length is 170.</msg>
<msg time="2026-10-11T01:00:47.026487" 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-10-11T01:00:47.026125" elapsed="0.000385"/>
</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-10-11T01:00:47.026698" elapsed="0.000275"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:47.027276" 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-10-11T01:00:47.027121" elapsed="0.000178"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:47.027615" 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-10-11T01:00:47.027460" elapsed="0.000179"/>
</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-10-11T01:00:47.027816" elapsed="0.000281"/>
</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-10-11T01:00:47.025279" elapsed="0.002873"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:47.032429" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:47.032534" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:47.032618" 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-10-11T01:00:47.028681" elapsed="0.003961"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:47.033138" 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-10-11T01:00:47.032848" elapsed="0.000333"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:47.033341" elapsed="0.000499"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:47.038023" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:47.038126" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:47.038218" 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-10-11T01:00:47.034014" elapsed="0.004228"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:47.038749" 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-10-11T01:00:47.038468" elapsed="0.000324"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:47.038967" elapsed="0.000322"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T01:00:47.039525" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:00:47.039359" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:47.039341" elapsed="0.000259"/>
</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-10-11T01:00:47.039747" elapsed="0.000020"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:00:47.028371" elapsed="0.011455"/>
</kw>
<arg>route_mac_rou</arg>
<status status="PASS" start="2026-10-11T01:00:46.957663" elapsed="0.082202"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:46.842559" elapsed="0.197440"/>
</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-10-11T01:00:47.041775" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:00:47.041518" elapsed="0.000518"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:47.042933" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:47.042846" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:47.042829" elapsed="0.000178"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:47.045075" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:47.044991" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:47.044974" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:47.046057" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:00:47.045719" elapsed="0.000364"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:00:47.046512" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:00:47.046237" elapsed="0.000298"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:00:47.046575" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:00:47.046699" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:00:47.045344" elapsed="0.001378"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:47.050604" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:47.050518" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:47.050500" elapsed="0.000168"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:47.051842" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:47.051726" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:47.051709" elapsed="0.000302"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:00:47.052650" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:00:47.052163" elapsed="0.000548"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:00:47.053308" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:00:47.053077" elapsed="0.000290"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:00:47.086789" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:00:47.054904" elapsed="0.032008"/>
</kw>
<msg time="2026-10-11T01:00:47.087048" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:00:47.087137" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:47.053699" elapsed="0.033507"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:00:47.118803" 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-10-11T01:00:47.088774" elapsed="0.030200"/>
</kw>
<msg time="2026-10-11T01:00:47.119113" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:00:47.119202" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:47.087614" elapsed="0.031658"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:47.119939" elapsed="0.000080"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:47.119604" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:47.119577" elapsed="0.000565"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:47.120858" 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-10-11T01:00:47.120337" elapsed="0.000650"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:47.121530" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:47.121211" elapsed="0.000450"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:47.121192" elapsed="0.000526"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:00:47.121754" 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-10-11T01:00:47.125615" elapsed="0.000124"/>
</kw>
<msg time="2026-10-11T01:00:47.125779" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:00:47.125004" 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-10-11T01:00:47.126094" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:47.126300" 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-10-11T01:00:47.124163" elapsed="0.002391"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:00:47.122167" elapsed="0.004474"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:00:47.051429" elapsed="0.075363"/>
</kw>
<msg time="2026-10-11T01:00:47.126879" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:47.126920" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:47.050822" elapsed="0.076146"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:00:47.127123" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:00:47.127038" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:47.127020" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:47.127651" 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-10-11T01:00:47.128057" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:00:47.128123" 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-10-11T01:00:47.050208" elapsed="0.078003"/>
</kw>
<msg time="2026-10-11T01:00:47.128296" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:47.128337" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:47.047078" elapsed="0.081294"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:47.128697" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:47.128474" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:47.128458" elapsed="0.000309"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:00:47.046918" elapsed="0.081872"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:00:47.046772" elapsed="0.082051"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:00:47.044686" elapsed="0.084189"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:00:47.042595" elapsed="0.086333"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:47.042186" elapsed="0.086799"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:00:47.041160" elapsed="0.087873"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:47.133732" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:47.133899" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:47.134015" 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-10-11T01:00:47.129465" elapsed="0.004575"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:47.134214" elapsed="0.000386"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:47.139534" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:47.139638" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:47.139733" 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-10-11T01:00:47.134759" elapsed="0.004999"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:47.140645" 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-10-11T01:00:47.140360" elapsed="0.000312"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:47.141068" 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-10-11T01:00:47.140826" elapsed="0.000268"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:47.141278" elapsed="0.000295"/>
</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-10-11T01:00:47.139979" elapsed="0.001651"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:47.129171" elapsed="0.012506"/>
</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-10-11T01:00:47.040720" elapsed="0.100995"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:47.142362" 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-10-11T01:00:47.142530" 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-10-11T01:00:47.142214" elapsed="0.000343"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:00:47.150593" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:00:47.150274" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:00:47.151319" 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-10-11T01:00:47.151116" elapsed="0.000275">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-10-11T01:00:47.151491" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:00:47.150781" elapsed="0.000733"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:47.152014" 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-10-11T01:00:47.151688" elapsed="0.000352"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:47.152313" 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-10-11T01:00:47.152471" 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-10-11T01:00:47.152206" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:47.152910" 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-10-11T01:00:47.152693" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:00:47.153312" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:47.153033" elapsed="0.000331"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:00:47.153822" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:00:47.153559" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:47.153387" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:47.153016" elapsed="0.000883"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:00:47.154486" 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-10-11T01:00:47.154080" elapsed="0.000432"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:00:47.154556" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:00:47.154682" 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-10-11T01:00:47.149844" elapsed="0.004862"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:47.155022" 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-10-11T01:00:47.155147" 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-10-11T01:00:47.154871" elapsed="0.000300"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:47.155493" 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-10-11T01:00:47.155664" 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-10-11T01:00:47.155334" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:47.156123" 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-10-11T01:00:47.155887" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:47.156600" 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-10-11T01:00:47.156366" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:47.157115" level="INFO">ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:47.156867" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:47.157586" level="INFO">ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:47.157347" elapsed="0.000280"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:47.157766" elapsed="0.002487"/>
</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-10-11T01:00:47.160399" elapsed="0.002636"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:47.167671" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:47.167775" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:47.167866" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T01:00:47.163983" elapsed="0.004259">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:47.168445" elapsed="0.000021"/>
</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-10-11T01:00:47.168658" elapsed="0.000022"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T01:00:47.163670" elapsed="0.005109">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:49.179635" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:49.179930" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:49.180175" 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-10-11T01:00:49.170303" elapsed="0.009928"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T01:00:49.181249" 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-10-11T01:00:49.181623" 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-10-11T01:00:49.180655" elapsed="0.001067"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:49.184130" 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-10-11T01:00:49.183122" elapsed="0.001070"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:49.185503" 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-10-11T01:00:49.184569" elapsed="0.000996"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:49.186005" elapsed="0.000665"/>
</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-10-11T01:00:49.182201" elapsed="0.004596"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T01:00:49.169356" elapsed="0.017550"/>
</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-10-11T01:00:47.163231" elapsed="2.023796"/>
</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-10-11T01:00:49.187358" elapsed="0.003314"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:49.200014" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:49.200276" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:49.200519" 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-10-11T01:00:49.192751" elapsed="0.007826"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:49.200997" elapsed="0.000840"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:49.209013" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:49.209263" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:49.209519" 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-10-11T01:00:49.202227" elapsed="0.007348"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:49.211573" 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-10-11T01:00:49.210994" elapsed="0.000639"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:49.213032" 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-10-11T01:00:49.211992" elapsed="0.001174"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:00:49.214252" 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-10-11T01:00:49.214735" 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-10-11T01:00:49.213622" elapsed="0.001275">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-10-11T01:00:49.210074" elapsed="0.005164">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-10-11T01:00:49.192106" elapsed="0.023443">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-10-11T01:00:51.224900" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:51.225215" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:51.225460" 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-10-11T01:00:51.217129" elapsed="0.008391"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:51.225933" elapsed="0.000944"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:51.236105" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:51.236456" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:51.236670" 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-10-11T01:00:51.227274" elapsed="0.009452"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:51.238795" 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-10-11T01:00:51.238191" elapsed="0.000664"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:51.239778" 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-10-11T01:00:51.239220" 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-10-11T01:00:51.240272" elapsed="0.000667"/>
</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-10-11T01:00:51.237268" elapsed="0.003834"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:51.216262" elapsed="0.024949"/>
</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-10-11T01:00:49.191159" elapsed="2.050131"/>
</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-10-11T01:00:51.242450" elapsed="0.003347"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:51.254609" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:51.254840" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:51.255079" 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-10-11T01:00:51.248385" elapsed="0.006749"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:51.255553" elapsed="0.000782"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:51.263001" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:51.263227" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:51.263472" 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-10-11T01:00:51.256733" elapsed="0.006798"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:51.265574" 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-10-11T01:00:51.264995" elapsed="0.000638"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:51.266546" 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-10-11T01:00:51.265996" elapsed="0.000608"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:51.267037" elapsed="0.000656"/>
</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-10-11T01:00:51.264015" elapsed="0.003886"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:51.247243" elapsed="0.020797"/>
</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-10-11T01:00:51.246287" elapsed="0.021832"/>
</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-10-11T01:00:51.241689" elapsed="0.026540"/>
</kw>
<arg>route_mac_rou</arg>
<status status="PASS" start="2026-10-11T01:00:47.141908" elapsed="4.126414"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:47.040263" elapsed="4.228301"/>
</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-10-11T01:00:51.272887" elapsed="0.000470"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:00:51.272286" elapsed="0.001224"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:51.275931" elapsed="0.000060"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:51.275715" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:51.275669" elapsed="0.000442"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:51.280756" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:51.280567" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:51.280528" elapsed="0.000370"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:51.283178" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:00:51.282350" elapsed="0.000886"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:00:51.284248" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:00:51.283630" elapsed="0.000672"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:00:51.284391" elapsed="0.000105"/>
</return>
<msg time="2026-10-11T01:00:51.284724" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:00:51.281465" elapsed="0.003310"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:51.289109" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:51.288989" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:51.288948" 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-10-11T01:00:51.290855" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:51.290693" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:51.290668" elapsed="0.000428"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:00:51.291831" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:00:51.291311" elapsed="0.000601"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:00:51.292798" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:00:51.292475" elapsed="0.000405"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:00:51.327614" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:00:51.295013" elapsed="0.032724"/>
</kw>
<msg time="2026-10-11T01:00:51.327863" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:00:51.327951" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:51.293325" elapsed="0.034714"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:00:51.362722" 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-10-11T01:00:51.329651" elapsed="0.033200"/>
</kw>
<msg time="2026-10-11T01:00:51.362993" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:00:51.363082" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:51.328454" elapsed="0.034699"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:51.363813" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:51.363511" elapsed="0.000431"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:51.363490" elapsed="0.000526"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:51.364716" 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-10-11T01:00:51.364210" elapsed="0.000623"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:51.365308" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:51.365016" elapsed="0.000448"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:51.364996" elapsed="0.000525"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:00:51.365555" 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-10-11T01:00:51.369268" elapsed="0.000120"/>
</kw>
<msg time="2026-10-11T01:00:51.369546" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:00:51.368710" elapsed="0.000903"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:51.369849" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:51.370083" 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-10-11T01:00:51.367918" elapsed="0.002380"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:00:51.365850" elapsed="0.004528"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:00:51.290265" elapsed="0.080283"/>
</kw>
<msg time="2026-10-11T01:00:51.370632" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:51.370673" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:51.289432" elapsed="0.081276"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:00:51.370862" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:00:51.370777" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:51.370759" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:51.371340" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:51.371750" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:00:51.371817" 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-10-11T01:00:51.288568" elapsed="0.083337"/>
</kw>
<msg time="2026-10-11T01:00:51.372006" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:51.372048" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:51.285583" elapsed="0.086502"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:51.372377" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:51.372153" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:51.372136" elapsed="0.000330"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:00:51.285230" elapsed="0.087257"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:00:51.284883" elapsed="0.087634"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:00:51.279858" elapsed="0.092709"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:00:51.275071" elapsed="0.097548"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:51.273850" elapsed="0.098809"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:00:51.271487" elapsed="0.101254"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:51.377933" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:51.378082" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:51.378169" 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-10-11T01:00:51.373169" elapsed="0.005024"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:51.378367" elapsed="0.000576"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:51.383482" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:51.383585" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:51.383679" 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-10-11T01:00:51.379131" elapsed="0.004573"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:51.384596" 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-10-11T01:00:51.384318" elapsed="0.000306"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:51.385031" 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-10-11T01:00:51.384777" elapsed="0.000280"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:51.385244" elapsed="0.000300"/>
</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-10-11T01:00:51.383915" elapsed="0.001686"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:51.372881" elapsed="0.012768"/>
</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-10-11T01:00:51.270313" elapsed="0.115372"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:51.386396" 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-10-11T01:00:51.386568" 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-10-11T01:00:51.386242" elapsed="0.000353"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:51.386896" 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-10-11T01:00:51.387029" 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-10-11T01:00:51.386759" elapsed="0.000295"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:51.387352" 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-10-11T01:00:51.387511" 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-10-11T01:00:51.387216" elapsed="0.000320"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:00:51.387875" 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-10-11T01:00:51.387699" elapsed="0.000201"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:51.388220" 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-10-11T01:00:51.388336" 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-10-11T01:00:51.388084" elapsed="0.000276"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:00:51.388704" 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-10-11T01:00:51.388536" elapsed="0.000193"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:51.389164" 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-10-11T01:00:51.388925" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:51.389642" 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-10-11T01:00:51.389426" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:51.390112" level="INFO">ffffffffffffffffffffffffffffffff005e0200000047c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:51.389881" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:51.390571" level="INFO">ffffffffffffffffffffffffffffffff00580200000041c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:51.390342" elapsed="0.000271"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:51.390751" elapsed="0.002581"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:51.403144" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T01:00:51.403237" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:51.403324" 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-10-11T01:00:51.393515" elapsed="0.009832"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:51.403854" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:51.403578" elapsed="0.000316"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:51.408675" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:51.408794" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:51.408890" 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-10-11T01:00:51.404063" elapsed="0.004852"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:51.409435" 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-10-11T01:00:51.409138" elapsed="0.000344"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:51.424226" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:51.424337" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:51.424448" 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-10-11T01:00:51.410429" elapsed="0.014046"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:51.424979" 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-10-11T01:00:51.424680" elapsed="0.000347"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:51.425191" elapsed="0.000343"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:51.428116" level="INFO">${update} = </msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:00:51.425685" elapsed="0.002461"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:00:51.428699" level="FAIL"> == </msg>
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="FAIL" start="2026-10-11T01:00:51.428312" elapsed="0.000454"> == </status>
</kw>
<return>
<value>${update}</value>
<status status="NOT RUN" start="2026-10-11T01:00:51.428819" elapsed="0.000018"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="FAIL" start="2026-10-11T01:00:51.410103" elapsed="0.018819"> == </status>
</kw>
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:53.439355" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:53.439695" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:53.439911" 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-10-11T01:00:53.430660" elapsed="0.009333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:53.441238" 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-10-11T01:00:53.440505" elapsed="0.000841"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:53.441755" elapsed="0.000820"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:53.446138" level="INFO">${update} = ffffffffffffffffffffffffffffffff005e0200000047c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:00:53.442916" elapsed="0.003286"/>
</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-10-11T01:00:53.446643" elapsed="0.000681"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:00:53.447469" elapsed="0.000080"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:00:53.429684" elapsed="0.018043"/>
</kw>
<msg time="2026-10-11T01:00:53.447887" 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-10-11T01:00:51.409667" elapsed="2.038277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:53.448987" level="INFO">ffffffffffffffffffffffffffffffff005e0200000047c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:53.448470" elapsed="0.000616"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:53.450926" level="INFO">Length is 188.</msg>
<msg time="2026-10-11T01:00:53.451108" 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-10-11T01:00:53.450365" elapsed="0.000793"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:53.452078" level="INFO">Length is 188.</msg>
<msg time="2026-10-11T01:00:53.452229" 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-10-11T01:00:53.451545" elapsed="0.000733"/>
</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-10-11T01:00:53.452716" elapsed="0.000618"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:53.454083" 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-10-11T01:00:53.453696" elapsed="0.000439"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:53.454834" 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-10-11T01:00:53.454483" elapsed="0.000403"/>
</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-10-11T01:00:53.455308" elapsed="0.000623"/>
</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-10-11T01:00:53.449596" elapsed="0.006480"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:53.456386" elapsed="0.003199"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:53.467290" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:53.467668" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:53.467868" 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-10-11T01:00:53.460748" elapsed="0.007175"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:53.469128" 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-10-11T01:00:53.468445" elapsed="0.000790"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:53.469633" elapsed="0.000761"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:53.477444" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:53.477698" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:53.477912" 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-10-11T01:00:53.470789" elapsed="0.007197"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:53.479134" 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-10-11T01:00:53.478480" elapsed="0.000756"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:53.479642" elapsed="0.000752"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T01:00:53.480940" elapsed="0.000059"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:53.480593" elapsed="0.000465"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:53.480547" elapsed="0.000558"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:53.489139" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:53.489237" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:53.489481" 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-10-11T01:00:53.481467" elapsed="0.008073"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:00:53.460090" elapsed="0.029585"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:53.498095" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:53.498389" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:53.498626" 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-10-11T01:00:53.491826" elapsed="0.006855"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:53.499828" 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-10-11T01:00:53.499168" elapsed="0.000758"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:53.500319" elapsed="0.000786"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:53.504327" level="INFO">${update} = ffffffffffffffffffffffffffffffff00580200000041c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:00:53.501470" elapsed="0.002919"/>
</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-10-11T01:00:53.504826" elapsed="0.000712"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:00:53.505637" elapsed="0.000062"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:00:53.491101" elapsed="0.014763"/>
</kw>
<msg time="2026-10-11T01:00:53.506051" 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-10-11T01:00:53.490106" elapsed="0.016000"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:53.507130" level="INFO">ffffffffffffffffffffffffffffffff00580200000041c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:53.506598" elapsed="0.000626"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:53.509066" level="INFO">Length is 176.</msg>
<msg time="2026-10-11T01:00:53.509219" 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-10-11T01:00:53.508523" elapsed="0.000745"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:53.510172" level="INFO">Length is 176.</msg>
<msg time="2026-10-11T01:00:53.510320" 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-10-11T01:00:53.509644" elapsed="0.000724"/>
</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-10-11T01:00:53.510804" elapsed="0.000642"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:53.512156" 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-10-11T01:00:53.511776" elapsed="0.000433"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:53.512902" 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-10-11T01:00:53.512557" elapsed="0.000397"/>
</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-10-11T01:00:53.513377" elapsed="0.000637"/>
</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-10-11T01:00:53.507728" elapsed="0.006408"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:53.521308" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:53.521580" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:53.521772" 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-10-11T01:00:53.515379" elapsed="0.006446"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:53.522951" 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-10-11T01:00:53.522306" elapsed="0.000841"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:53.523550" elapsed="0.000751"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:53.530747" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:53.531005" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:53.531212" 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-10-11T01:00:53.524693" elapsed="0.006573"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:53.532395" 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-10-11T01:00:53.531755" elapsed="0.000774"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:53.532890" elapsed="0.000769"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T01:00:53.534166" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-10-11T01:00:53.533811" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:53.533772" elapsed="0.000953"/>
</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-10-11T01:00:53.535086" elapsed="0.000047"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:00:53.514668" elapsed="0.020601"/>
</kw>
<arg>pmsi_rsvp_te_p2mp_lsp</arg>
<status status="PASS" start="2026-10-11T01:00:51.385927" elapsed="2.149433"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:51.269323" elapsed="2.266282"/>
</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-10-11T01:00:53.539170" elapsed="0.000300"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:00:53.538706" elapsed="0.000835"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:53.540818" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:53.540695" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:53.540670" 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-10-11T01:00:53.543822" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:53.543707" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:53.543684" elapsed="0.000227"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:53.545221" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:00:53.544747" elapsed="0.000509"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:00:53.545860" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:00:53.545492" elapsed="0.000401"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:00:53.545948" elapsed="0.000052"/>
</return>
<msg time="2026-10-11T01:00:53.546138" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:00:53.544220" elapsed="0.001949"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:53.549925" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:53.549808" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:53.549784" elapsed="0.000247"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:53.551690" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:53.551531" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:53.551506" elapsed="0.000402"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:00:53.552704" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:00:53.552186" elapsed="0.000599"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:00:53.553651" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:00:53.553299" elapsed="0.000433"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:00:53.588258" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:00:53.555848" elapsed="0.032582"/>
</kw>
<msg time="2026-10-11T01:00:53.588583" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:00:53.588675" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:53.554174" elapsed="0.034572"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:00:53.624020" 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-10-11T01:00:53.590454" elapsed="0.033701"/>
</kw>
<msg time="2026-10-11T01:00:53.624277" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:00:53.624368" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:53.589182" elapsed="0.035280"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:53.625102" elapsed="0.000067"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:53.624763" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:53.624741" elapsed="0.000552"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:53.626006" 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-10-11T01:00:53.625501" elapsed="0.000623"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:53.626618" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:53.626296" elapsed="0.000453"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:53.626276" elapsed="0.000528"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:00:53.626840" 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-10-11T01:00:53.630567" elapsed="0.000123"/>
</kw>
<msg time="2026-10-11T01:00:53.630730" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:00:53.630042" elapsed="0.000752"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:53.631045" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:53.631253" 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-10-11T01:00:53.629139" elapsed="0.002404"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:00:53.627164" elapsed="0.004462"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:00:53.551101" elapsed="0.080673"/>
</kw>
<msg time="2026-10-11T01:00:53.631858" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:53.631899" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:53.550245" elapsed="0.081691"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:00:53.632106" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:00:53.632021" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:53.632003" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:53.632593" 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-10-11T01:00:53.633035" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:00:53.633102" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T01:00:53.549392" elapsed="0.083797"/>
</kw>
<msg time="2026-10-11T01:00:53.633273" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:53.633312" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:53.546668" elapsed="0.086679"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:53.633697" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:53.633471" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:53.633398" elapsed="0.000369"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:00:53.546466" elapsed="0.087323"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:00:53.546241" elapsed="0.087579"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:00:53.543282" elapsed="0.090590"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:00:53.540319" elapsed="0.093607"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:53.539753" elapsed="0.094226"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:00:53.538200" elapsed="0.095830"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:53.641244" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:53.641373" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:53.641499" 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-10-11T01:00:53.634460" elapsed="0.007064"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:53.641698" elapsed="0.000373"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:53.646398" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:53.646521" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:53.646616" 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-10-11T01:00:53.642233" elapsed="0.004408"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:53.647536" 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-10-11T01:00:53.647252" elapsed="0.000311"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:53.647949" 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-10-11T01:00:53.647714" 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-10-11T01:00:53.648248" elapsed="0.000300"/>
</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-10-11T01:00:53.646849" elapsed="0.001754"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:53.634170" elapsed="0.014481"/>
</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-10-11T01:00:53.537297" elapsed="0.111391"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:53.649347" 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-10-11T01:00:53.649507" 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-10-11T01:00:53.649194" elapsed="0.000340"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:00:53.657621" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:00:53.657300" elapsed="0.000348"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:00:53.658354" 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-10-11T01:00:53.658150" elapsed="0.000295">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-10-11T01:00:53.658531" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:00:53.657809" elapsed="0.000745"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:53.659051" 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-10-11T01:00:53.658728" elapsed="0.000348"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:53.659348" 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-10-11T01:00:53.659481" 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-10-11T01:00:53.659241" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:53.659915" 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-10-11T01:00:53.659699" elapsed="0.000279"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:00:53.660299" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:53.660040" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:00:53.660804" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:00:53.660544" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:53.660374" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:53.660023" elapsed="0.000857"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:00:53.661461" 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-10-11T01:00:53.661058" elapsed="0.000429"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:00:53.661532" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:00:53.661688" 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-10-11T01:00:53.656866" elapsed="0.004847"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:53.662031" 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-10-11T01:00:53.662146" 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-10-11T01:00:53.661878" elapsed="0.000292"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:53.662483" 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-10-11T01:00:53.662595" 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-10-11T01:00:53.662332" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:53.663045" 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-10-11T01:00:53.662814" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:53.663517" 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-10-11T01:00:53.663290" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:53.663977" level="INFO">ffffffffffffffffffffffffffffffff005e0200000047c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:53.663754" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:53.666003" level="INFO">ffffffffffffffffffffffffffffffff00580200000041c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:53.664207" elapsed="0.001841"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:53.666197" elapsed="0.002313"/>
</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-10-11T01:00:53.668656" elapsed="0.002213"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:53.675738" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:53.675844" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:53.675988" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T01:00:53.671824" elapsed="0.004524">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:53.676551" elapsed="0.000021"/>
</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-10-11T01:00:53.676763" elapsed="0.000022"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T01:00:53.671519" elapsed="0.005360">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:55.686745" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:55.687070" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:55.687288" 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-10-11T01:00:55.678494" elapsed="0.008851"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T01:00:55.688366" 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-10-11T01:00:55.688653" 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-10-11T01:00:55.687773" elapsed="0.000980"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:55.691239" 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-10-11T01:00:55.690168" elapsed="0.001135"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:55.692668" 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-10-11T01:00:55.691704" elapsed="0.001024"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:55.693233" elapsed="0.000663"/>
</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-10-11T01:00:55.689228" elapsed="0.004818"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T01:00:55.677568" elapsed="0.016588"/>
</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-10-11T01:00:53.671081" elapsed="2.023169"/>
</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-10-11T01:00:55.694602" elapsed="0.003423"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:55.706952" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:55.707213" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:55.707405" 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-10-11T01:00:55.700180" elapsed="0.007313"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:55.707881" elapsed="0.000837"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:55.715921" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:55.716201" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:55.716446" 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-10-11T01:00:55.709106" elapsed="0.007398"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:55.718478" 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-10-11T01:00:55.717879" elapsed="0.000663"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:55.719957" 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-10-11T01:00:55.718884" elapsed="0.001156"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:00:55.721106" 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-10-11T01:00:55.721608" 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-10-11T01:00:55.720481" elapsed="0.001291">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-10-11T01:00:55.716961" elapsed="0.005225">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-10-11T01:00:55.699548" elapsed="0.022956">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-10-11T01:00:57.732059" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:57.732344" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:57.732591" 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-10-11T01:00:57.724011" elapsed="0.008636"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:57.733079" elapsed="0.000915"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:57.741558" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:57.741786" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:57.742026" 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-10-11T01:00:57.734361" elapsed="0.007723"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:57.744118" 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-10-11T01:00:57.743510" elapsed="0.000669"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:57.745107" 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-10-11T01:00:57.744548" elapsed="0.000618"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:57.745604" elapsed="0.000658"/>
</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-10-11T01:00:57.742588" elapsed="0.003801"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:57.723162" elapsed="0.023371"/>
</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-10-11T01:00:55.698611" elapsed="2.048003"/>
</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-10-11T01:00:57.747750" elapsed="0.004019"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:57.761465" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:57.761699" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:57.761910" 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-10-11T01:00:57.754329" elapsed="0.007635"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:57.762384" elapsed="0.000829"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:57.771934" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:57.772194" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:57.772399" 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-10-11T01:00:57.763611" elapsed="0.008878"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:57.774524" 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-10-11T01:00:57.773922" elapsed="0.000663"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:57.775532" 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-10-11T01:00:57.774924" elapsed="0.000667"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:57.776022" elapsed="0.000659"/>
</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-10-11T01:00:57.772945" elapsed="0.003861"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:57.753224" elapsed="0.023691"/>
</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-10-11T01:00:57.752262" elapsed="0.024749"/>
</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-10-11T01:00:57.747009" elapsed="0.030114"/>
</kw>
<arg>pmsi_rsvp_te_p2mp_lsp</arg>
<status status="PASS" start="2026-10-11T01:00:53.648880" elapsed="4.128338"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:53.536239" elapsed="4.241217"/>
</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-10-11T01:00:57.781528" elapsed="0.000466"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:00:57.780900" elapsed="0.001212"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:57.784244" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:57.784031" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:57.783963" elapsed="0.000429"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:57.789113" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:57.788897" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:57.788859" elapsed="0.000396"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:57.791504" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:00:57.790605" elapsed="0.000960"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:00:57.792563" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:00:57.791910" elapsed="0.000708"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:00:57.792776" elapsed="0.000073"/>
</return>
<msg time="2026-10-11T01:00:57.793101" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:00:57.789750" elapsed="0.003404"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:57.799399" elapsed="0.000064"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:57.799209" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:57.799170" elapsed="0.000404"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:57.802245" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:57.801961" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:57.801922" elapsed="0.000713"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:00:57.803871" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:00:57.803007" elapsed="0.001039"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:00:57.804918" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:00:57.804600" elapsed="0.000417"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:00:57.839591" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:00:57.807167" elapsed="0.032542"/>
</kw>
<msg time="2026-10-11T01:00:57.839834" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:00:57.839943" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:57.805478" elapsed="0.034550"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:00:57.875036" 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-10-11T01:00:57.841660" elapsed="0.033501"/>
</kw>
<msg time="2026-10-11T01:00:57.875281" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:00:57.875367" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:57.840443" elapsed="0.035016"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:57.876057" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:57.875745" elapsed="0.000440"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:57.875725" elapsed="0.000514"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:57.876929" 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-10-11T01:00:57.876452" elapsed="0.000608"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:57.877542" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:57.877226" elapsed="0.000443"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:57.877207" elapsed="0.000520"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:00:57.877761" 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-10-11T01:00:57.881371" elapsed="0.000138"/>
</kw>
<msg time="2026-10-11T01:00:57.881550" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:00:57.880857" elapsed="0.000756"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:57.881852" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:57.882079" 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-10-11T01:00:57.879985" elapsed="0.002308"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:00:57.878057" elapsed="0.004317"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:00:57.801267" elapsed="0.081338"/>
</kw>
<msg time="2026-10-11T01:00:57.882689" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:57.882728" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:57.799916" elapsed="0.082847"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:00:57.882919" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:00:57.882831" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:57.882813" elapsed="0.000200"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:57.883399" elapsed="0.000076"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:57.883840" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:00:57.883907" 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-10-11T01:00:57.798542" elapsed="0.085474"/>
</kw>
<msg time="2026-10-11T01:00:57.884102" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:57.884142" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:57.793947" elapsed="0.090229"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:57.884528" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:57.884243" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:57.884227" elapsed="0.000374"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:00:57.793622" elapsed="0.091000"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:00:57.793265" elapsed="0.091387"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:00:57.788216" elapsed="0.096487"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:00:57.783396" elapsed="0.101356"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:57.782477" elapsed="0.102315"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:00:57.780101" elapsed="0.104738"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:57.890119" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:57.890227" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:57.890311" 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-10-11T01:00:57.885275" elapsed="0.005060"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:57.890531" elapsed="0.000707"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:57.896213" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:57.896316" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:57.896459" 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-10-11T01:00:57.891421" elapsed="0.005065"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:57.897350" 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-10-11T01:00:57.897107" elapsed="0.000270"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:57.897778" 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-10-11T01:00:57.897548" elapsed="0.000256"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:57.898000" elapsed="0.000278"/>
</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-10-11T01:00:57.896692" elapsed="0.001641"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:57.885002" elapsed="0.013380"/>
</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-10-11T01:00:57.779101" elapsed="0.119337"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:57.899158" 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-10-11T01:00:57.899310" 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-10-11T01:00:57.899001" elapsed="0.000335"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:57.899657" 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-10-11T01:00:57.899775" 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-10-11T01:00:57.899518" elapsed="0.000282"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:57.900121" 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-10-11T01:00:57.900238" 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-10-11T01:00:57.899967" elapsed="0.000296"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:00:57.900621" 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-10-11T01:00:57.900441" elapsed="0.000205"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:57.900946" 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-10-11T01:00:57.901077" 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-10-11T01:00:57.900811" elapsed="0.000291"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:00:57.901444" 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-10-11T01:00:57.901262" elapsed="0.000208"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:57.901891" 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-10-11T01:00:57.901668" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:57.902451" 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-10-11T01:00:57.902216" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:57.902908" level="INFO">ffffffffffffffffffffffffffffffff0066020000004fc01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:57.902694" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:57.903367" level="INFO">ffffffffffffffffffffffffffffffff00600200000049c01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:57.903153" elapsed="0.000270"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:57.903563" elapsed="0.002572"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:57.916207" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T01:00:57.916272" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:57.916355" 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-10-11T01:00:57.906298" elapsed="0.010080"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:57.916886" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:57.916611" elapsed="0.000314"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:57.922028" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:57.922141" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:57.922265" 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-10-11T01:00:57.917103" elapsed="0.005186"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:57.922794" 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-10-11T01:00:57.922516" elapsed="0.000324"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:57.928949" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:57.929080" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:57.929168" 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-10-11T01:00:57.923770" elapsed="0.005421"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:57.929704" 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-10-11T01:00:57.929397" elapsed="0.000353"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:57.929914" elapsed="0.000358"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:57.934276" level="INFO">${update} = ffffffffffffffffffffffffffffffff0066020000004fc01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b...</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:00:57.930594" elapsed="0.003717"/>
</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-10-11T01:00:57.934525" elapsed="0.000355"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:00:57.934927" elapsed="0.000039"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:00:57.923461" elapsed="0.011612"/>
</kw>
<msg time="2026-10-11T01:00:57.935149" 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-10-11T01:00:57.923040" elapsed="0.012134"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:57.935624" level="INFO">ffffffffffffffffffffffffffffffff0066020000004fc01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:57.935378" elapsed="0.000289"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:57.936526" level="INFO">Length is 204.</msg>
<msg time="2026-10-11T01:00:57.936597" 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-10-11T01:00:57.936254" elapsed="0.000365"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:57.937036" level="INFO">Length is 204.</msg>
<msg time="2026-10-11T01:00:57.937106" 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-10-11T01:00:57.936776" 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-10-11T01:00:57.937311" elapsed="0.000290"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:57.937919" 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-10-11T01:00:57.937749" elapsed="0.000194"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:57.938265" 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-10-11T01:00:57.938102" elapsed="0.000226"/>
</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-10-11T01:00:57.938529" elapsed="0.000272"/>
</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-10-11T01:00:57.935887" elapsed="0.002970"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:57.939011" elapsed="0.002077"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:57.945818" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:57.945951" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:57.946056" 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-10-11T01:00:57.941606" elapsed="0.004475"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:57.946598" 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-10-11T01:00:57.946287" elapsed="0.000356"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:57.946806" elapsed="0.000342"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:57.952199" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:57.952308" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:57.952402" 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-10-11T01:00:57.947308" elapsed="0.005139"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:57.952927" 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-10-11T01:00:57.952655" elapsed="0.000348"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:57.953169" elapsed="0.000337"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T01:00:57.953735" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:57.953581" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:57.953562" elapsed="0.000235"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:57.959315" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:57.959384" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:57.959496" 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-10-11T01:00:57.953944" elapsed="0.005577"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:00:57.941289" elapsed="0.018292"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:57.965504" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:57.965606" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:57.965690" 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-10-11T01:00:57.960535" elapsed="0.005178"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:57.966234" 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-10-11T01:00:57.965943" elapsed="0.000334"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:57.966456" elapsed="0.000321"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:57.969457" level="INFO">${update} = ffffffffffffffffffffffffffffffff00600200000049c01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:00:57.966925" elapsed="0.002560"/>
</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-10-11T01:00:57.969645" elapsed="0.000361"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:00:57.970050" elapsed="0.000028"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:00:57.960212" elapsed="0.009938"/>
</kw>
<msg time="2026-10-11T01:00:57.970222" 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-10-11T01:00:57.959768" elapsed="0.010478"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:57.970681" level="INFO">ffffffffffffffffffffffffffffffff00600200000049c01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:57.970460" elapsed="0.000263"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:57.971538" level="INFO">Length is 192.</msg>
<msg time="2026-10-11T01:00:57.971608" 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-10-11T01:00:57.971277" elapsed="0.000352"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:00:57.972032" level="INFO">Length is 192.</msg>
<msg time="2026-10-11T01:00:57.972100" 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-10-11T01:00:57.971785" elapsed="0.000336"/>
</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-10-11T01:00:57.972304" elapsed="0.000288"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:57.972900" 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-10-11T01:00:57.972739" elapsed="0.000185"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:00:57.973244" 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-10-11T01:00:57.973083" elapsed="0.000183"/>
</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-10-11T01:00:57.973461" elapsed="0.000264"/>
</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-10-11T01:00:57.970930" elapsed="0.002883"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:57.978117" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:57.978219" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:57.978304" 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-10-11T01:00:57.974364" elapsed="0.003963"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:57.978829" 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-10-11T01:00:57.978554" elapsed="0.000318"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:57.979050" elapsed="0.000321"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:57.983359" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:57.983482" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:57.983575" 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-10-11T01:00:57.979547" elapsed="0.004052"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:57.984100" 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-10-11T01:00:57.983807" elapsed="0.000336"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:57.984304" elapsed="0.000341"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T01:00:57.984859" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-11T01:00:57.984713" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:57.984696" elapsed="0.000239"/>
</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-10-11T01:00:57.985101" elapsed="0.000020"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:00:57.974068" elapsed="0.011112"/>
</kw>
<arg>pmsi_mldp_p2mp_lsp</arg>
<status status="PASS" start="2026-10-11T01:00:57.898678" elapsed="0.086544"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:57.778072" elapsed="0.207251"/>
</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-10-11T01:00:57.987144" elapsed="0.000197"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:00:57.986872" elapsed="0.000518"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:57.988494" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:57.988230" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:57.988211" 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-10-11T01:00:57.990661" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:57.990575" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:57.990558" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:57.991696" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:00:57.991349" elapsed="0.000372"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:00:57.992204" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:00:57.991876" elapsed="0.000351"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:00:57.992267" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:00:57.992393" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:00:57.990984" elapsed="0.001447"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:57.995036" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:57.994936" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:57.994919" elapsed="0.000181"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:00:57.996268" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:00:57.996151" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:57.996134" elapsed="0.000313"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:00:57.996962" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:00:57.996604" elapsed="0.000435"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:00:57.997648" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:00:57.997398" elapsed="0.000309"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:00:58.031598" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:00:57.999358" elapsed="0.032689"/>
</kw>
<msg time="2026-10-11T01:00:58.032465" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:00:58.032676" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:57.998030" elapsed="0.034804"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:00:58.066887" 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-10-11T01:00:58.036824" elapsed="0.030279"/>
</kw>
<msg time="2026-10-11T01:00:58.067277" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:00:58.067400" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:58.033916" elapsed="0.033619"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:58.068470" elapsed="0.000093"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:58.067967" elapsed="0.000705"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:58.067925" elapsed="0.000837"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:58.069797" 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-10-11T01:00:58.069052" elapsed="0.000914"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:58.070660" elapsed="0.000091"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:58.070226" elapsed="0.000617"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:58.070199" elapsed="0.000722"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:00:58.070995" 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-10-11T01:00:58.076488" elapsed="0.000181"/>
</kw>
<msg time="2026-10-11T01:00:58.076725" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:00:58.075472" 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-10-11T01:00:58.077266" elapsed="0.000031"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:58.077671" 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-10-11T01:00:58.074347" elapsed="0.003645"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:00:58.071514" elapsed="0.006595"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:00:57.995849" elapsed="0.082483"/>
</kw>
<msg time="2026-10-11T01:00:58.078494" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:58.078553" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:57.995252" elapsed="0.083351"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:00:58.078820" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-10-11T01:00:58.078700" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:58.078675" 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-10-11T01:00:58.079684" 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-10-11T01:00:58.080247" elapsed="0.000033"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:00:58.080339" 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-10-11T01:00:57.994650" elapsed="0.085831"/>
</kw>
<msg time="2026-10-11T01:00:58.080600" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:00:58.080657" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:57.992785" elapsed="0.087921"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:00:58.081129" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:58.080801" elapsed="0.000397"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:58.080779" elapsed="0.000449"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:00:57.992639" elapsed="0.088620"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:00:57.992488" elapsed="0.088814"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:00:57.990267" elapsed="0.091109"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:00:57.987954" elapsed="0.093518"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:00:57.987560" elapsed="0.093974"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:00:57.986527" elapsed="0.095079"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:58.087670" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:58.087883" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:00:58.088075" 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-10-11T01:00:58.082208" elapsed="0.005902"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:00:58.088363" elapsed="0.000550"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:58.094077" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:58.094268" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:00:58.094400" 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-10-11T01:00:58.089165" elapsed="0.005296"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:58.095737" 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-10-11T01:00:58.095320" elapsed="0.000454"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:00:58.096332" 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-10-11T01:00:58.096005" elapsed="0.000364"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:00:58.096649" elapsed="0.000416"/>
</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-10-11T01:00:58.094754" elapsed="0.002391"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:58.081804" elapsed="0.015407"/>
</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-10-11T01:00:57.986077" elapsed="0.111186"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:58.098207" 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-10-11T01:00:58.098452" 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-10-11T01:00:58.097992" elapsed="0.000500"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:00:58.110375" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:00:58.109900" elapsed="0.000533"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:00:58.111443" 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-10-11T01:00:58.111136" elapsed="0.000415">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-10-11T01:00:58.111673" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:00:58.110663" elapsed="0.001042"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:00:58.112423" 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-10-11T01:00:58.111951" elapsed="0.000509"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:58.112845" 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-10-11T01:00:58.113028" 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-10-11T01:00:58.112694" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:58.113662" 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-10-11T01:00:58.113335" elapsed="0.000440"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:00:58.114250" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:00:58.113864" elapsed="0.000460"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:00:58.114955" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:00:58.114586" elapsed="0.000530"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:58.114356" elapsed="0.000806"/>
</branch>
<status status="PASS" start="2026-10-11T01:00:58.113839" elapsed="0.001351"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:00:58.116007" 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-10-11T01:00:58.115440" elapsed="0.000606"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:00:58.116107" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T01:00:58.116285" 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-10-11T01:00:58.109277" elapsed="0.007042"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:58.116768" 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-10-11T01:00:58.116929" 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-10-11T01:00:58.116572" elapsed="0.000391"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:00:58.117424" 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-10-11T01:00:58.117583" 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-10-11T01:00:58.117215" elapsed="0.000401"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:58.118208" 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-10-11T01:00:58.117887" elapsed="0.000402"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:58.118874" 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-10-11T01:00:58.118577" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:58.119663" level="INFO">ffffffffffffffffffffffffffffffff0066020000004fc01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:58.119295" elapsed="0.000467"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:00:58.120347" level="INFO">ffffffffffffffffffffffffffffffff00600200000049c01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:00:58.120046" elapsed="0.000386"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:00:58.120634" elapsed="0.002990"/>
</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-10-11T01:00:58.123842" elapsed="0.002415"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:00:58.131856" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:00:58.132080" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:58.132221" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T01:00:58.127582" elapsed="0.005158">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:00:58.133021" 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-10-11T01:00:58.133321" elapsed="0.000032"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T01:00:58.127139" elapsed="0.006386">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:00.143637" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:00.143941" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:00.144215" 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-10-11T01:01:00.135176" elapsed="0.009096"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T01:01:00.145292" 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-10-11T01:01:00.145672" 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-10-11T01:01:00.144699" elapsed="0.001075"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:00.148288" 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-10-11T01:01:00.147182" elapsed="0.001169"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:00.149788" 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-10-11T01:01:00.148727" elapsed="0.001122"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:01:00.150346" elapsed="0.000689"/>
</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-10-11T01:01:00.146247" elapsed="0.004915"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T01:01:00.134206" elapsed="0.017064"/>
</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-10-11T01:00:58.126549" elapsed="2.024810"/>
</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-10-11T01:01:00.151717" elapsed="0.003222"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:00.163692" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:00.163926" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:00.164147" 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-10-11T01:01:00.157032" elapsed="0.007169"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:00.164622" elapsed="0.000839"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:00.172194" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:00.172481" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:01:00.172699" 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-10-11T01:01:00.165823" elapsed="0.006930"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:00.174719" 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-10-11T01:01:00.174145" elapsed="0.000634"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:00.176264" 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-10-11T01:01:00.175142" elapsed="0.001244"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:01:00.177498" 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-10-11T01:01:00.177971" 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-10-11T01:01:00.176838" elapsed="0.001324">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-10-11T01:01:00.173232" elapsed="0.005276">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-10-11T01:01:00.156365" elapsed="0.022436">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-10-11T01:01:02.188199" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:02.188526" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:02.188764" 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-10-11T01:01:02.180441" elapsed="0.008380"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:02.189267" elapsed="0.000911"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:02.197685" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:02.197917" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:01:02.198157" 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-10-11T01:01:02.190668" elapsed="0.007546"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:02.200251" 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-10-11T01:01:02.199666" elapsed="0.000646"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:02.201229" 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-10-11T01:01:02.200684" elapsed="0.000605"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:01:02.201736" elapsed="0.000654"/>
</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-10-11T01:01:02.198731" elapsed="0.003817"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:02.179561" elapsed="0.023099"/>
</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-10-11T01:01:00.155388" elapsed="2.047353"/>
</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-10-11T01:01:02.203875" elapsed="0.003174"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:02.215346" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:02.215618" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:02.215807" 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-10-11T01:01:02.209174" elapsed="0.006685"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:02.216269" elapsed="0.000819"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:02.223279" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:02.223545" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:01:02.223749" 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-10-11T01:01:02.217478" elapsed="0.006325"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:02.225819" 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-10-11T01:01:02.225240" elapsed="0.000703"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:02.226908" 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-10-11T01:01:02.226353" elapsed="0.000613"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:01:02.227401" elapsed="0.000677"/>
</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-10-11T01:01:02.224281" elapsed="0.003921"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:02.208493" elapsed="0.019814"/>
</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-10-11T01:01:02.207561" elapsed="0.020823"/>
</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-10-11T01:01:02.203135" elapsed="0.025392"/>
</kw>
<arg>pmsi_mldp_p2mp_lsp</arg>
<status status="PASS" start="2026-10-11T01:00:58.097552" elapsed="4.131069"/>
</kw>
<status status="PASS" start="2026-10-11T01:00:57.985622" elapsed="4.243211"/>
</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-10-11T01:01:02.233086" elapsed="0.003584"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:01:02.232305" elapsed="0.004484"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:02.239025" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:02.238796" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:02.238750" elapsed="0.000425"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:02.243847" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:02.243659" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:02.243620" elapsed="0.000413"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:02.246161" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:01:02.245365" elapsed="0.000860"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:01:02.246842" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:01:02.246477" elapsed="0.000399"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:01:02.246932" elapsed="0.000063"/>
</return>
<msg time="2026-10-11T01:01:02.247138" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:01:02.244535" elapsed="0.002634"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:02.250770" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:02.250650" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:02.250626" elapsed="0.000232"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:02.252562" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:02.252370" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:02.252346" elapsed="0.000431"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:01:02.253537" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:01:02.253008" elapsed="0.000612"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:01:02.254470" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:01:02.254124" elapsed="0.000428"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:01:02.289548" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:01:02.256663" elapsed="0.033070"/>
</kw>
<msg time="2026-10-11T01:01:02.289949" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:01:02.290093" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:02.254996" elapsed="0.035194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:01:02.344093" 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-10-11T01:01:02.292530" elapsed="0.051814"/>
</kw>
<msg time="2026-10-11T01:01:02.344527" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:01:02.344618" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:02.290783" elapsed="0.053904"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:02.345389" elapsed="0.000085"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:02.345021" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:02.344975" elapsed="0.000627"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:02.346342" 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-10-11T01:01:02.345798" elapsed="0.000687"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:02.347176" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:02.346657" elapsed="0.000653"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:02.346638" elapsed="0.000728"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:01:02.347423" 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-10-11T01:01:02.351195" elapsed="0.000128"/>
</kw>
<msg time="2026-10-11T01:01:02.351364" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:02.350637" elapsed="0.000910"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:02.351783" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:02.352005" 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-10-11T01:01:02.349814" elapsed="0.002408"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:01:02.347764" 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-10-11T01:01:02.251950" elapsed="0.100521"/>
</kw>
<msg time="2026-10-11T01:01:02.352654" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:02.352697" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:02.251098" elapsed="0.101634"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:01:02.352891" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:01:02.352804" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:02.352786" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:02.353375" 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-10-11T01:01:02.353790" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:01:02.353856" 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-10-11T01:01:02.250230" elapsed="0.103711"/>
</kw>
<msg time="2026-10-11T01:01:02.354041" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:02.354081" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:02.247670" elapsed="0.106446"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:02.354422" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:02.354183" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:02.354167" elapsed="0.000326"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:01:02.247465" elapsed="0.107050"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:01:02.247239" elapsed="0.107307"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:01:02.242946" elapsed="0.111651"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:01:02.238175" elapsed="0.116505"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:02.237161" elapsed="0.117561"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:01:02.231513" elapsed="0.123258"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:02.368115" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:02.368262" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:02.368365" 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-10-11T01:01:02.355198" elapsed="0.013192"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:02.368588" elapsed="0.000367"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:02.374244" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:02.374347" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:01:02.374462" 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-10-11T01:01:02.369135" elapsed="0.005353"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:02.375359" 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-10-11T01:01:02.375089" elapsed="0.000297"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:02.375788" 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-10-11T01:01:02.375555" elapsed="0.000259"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:01:02.376018" elapsed="0.000285"/>
</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-10-11T01:01:02.374694" elapsed="0.001665"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:02.354912" elapsed="0.021509"/>
</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-10-11T01:01:02.230370" elapsed="0.146090"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:02.377173" 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-10-11T01:01:02.377326" 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-10-11T01:01:02.377019" elapsed="0.000334"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:02.377671" 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-10-11T01:01:02.377789" 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-10-11T01:01:02.377532" elapsed="0.000310"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:02.378159" 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-10-11T01:01:02.378275" 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-10-11T01:01:02.378021" elapsed="0.000278"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:01:02.378658" 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-10-11T01:01:02.378479" elapsed="0.000204"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:02.379214" 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-10-11T01:01:02.379334" 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-10-11T01:01:02.378848" elapsed="0.000511"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:01:02.379710" 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-10-11T01:01:02.379540" elapsed="0.000195"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:02.380165" 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-10-11T01:01:02.379929" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:02.380659" 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-10-11T01:01:02.380442" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:02.381125" level="INFO">ffffffffffffffffffffffffffffffff005a0200000043c0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:02.380898" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:02.381584" level="INFO">ffffffffffffffffffffffffffffffff0054020000003dc0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:02.381355" elapsed="0.000269"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:01:02.381763" elapsed="0.002350"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:02.400068" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T01:01:02.400156" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:02.400249" 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-10-11T01:01:02.384275" elapsed="0.015999"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:02.400778" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:02.400501" elapsed="0.000317"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:02.405945" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:02.406070" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:02.406166" 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-10-11T01:01:02.400972" elapsed="0.005218"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:02.406691" 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-10-11T01:01:02.406394" elapsed="0.000341"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:02.411615" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:02.411725" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:02.411810" 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-10-11T01:01:02.407668" elapsed="0.004167"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:02.412331" 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-10-11T01:01:02.412057" elapsed="0.000319"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:02.412554" elapsed="0.000350"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:01:02.415209" level="INFO">${update} = </msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:01:02.413066" elapsed="0.002170"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:01:02.415764" level="FAIL"> == </msg>
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="FAIL" start="2026-10-11T01:01:02.415394" elapsed="0.000439"> == </status>
</kw>
<return>
<value>${update}</value>
<status status="NOT RUN" start="2026-10-11T01:01:02.415885" elapsed="0.000019"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="FAIL" start="2026-10-11T01:01:02.407345" elapsed="0.008657"> == </status>
</kw>
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:04.434974" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:04.435301" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:04.435553" 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-10-11T01:01:04.417747" elapsed="0.017863"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:04.436849" 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-10-11T01:01:04.436118" elapsed="0.000837"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:04.437354" elapsed="0.000812"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:01:04.441589" level="INFO">${update} = ffffffffffffffffffffffffffffffff005a0200000043c0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:01:04.438541" elapsed="0.003112"/>
</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-10-11T01:01:04.442121" elapsed="0.000699"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:01:04.442926" elapsed="0.000104"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:01:04.416770" elapsed="0.026437"/>
</kw>
<msg time="2026-10-11T01:01:04.443370" 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-10-11T01:01:02.406921" elapsed="2.036551"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:04.444495" level="INFO">ffffffffffffffffffffffffffffffff005a0200000043c0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:04.443931" elapsed="0.000661"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:01:04.446947" level="INFO">Length is 180.</msg>
<msg time="2026-10-11T01:01:04.447155" 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-10-11T01:01:04.446382" elapsed="0.000824"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:01:04.448151" level="INFO">Length is 180.</msg>
<msg time="2026-10-11T01:01:04.448305" 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-10-11T01:01:04.447600" elapsed="0.000754"/>
</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-10-11T01:01:04.448802" elapsed="0.000667"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:01:04.450182" 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-10-11T01:01:04.449803" elapsed="0.000434"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:01:04.450932" 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-10-11T01:01:04.450586" elapsed="0.000420"/>
</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-10-11T01:01:04.451442" elapsed="0.000614"/>
</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-10-11T01:01:04.445595" elapsed="0.006582"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:01:04.452521" elapsed="0.003085"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:04.463871" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:04.464252" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:04.464508" 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-10-11T01:01:04.456758" elapsed="0.007807"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:04.465704" 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-10-11T01:01:04.465049" elapsed="0.000756"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:04.466195" elapsed="0.000760"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:04.474766" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:04.475040" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:04.475256" 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-10-11T01:01:04.467370" elapsed="0.007940"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:04.476485" 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-10-11T01:01:04.475809" elapsed="0.000782"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:04.477007" elapsed="0.000764"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T01:01:04.478389" elapsed="0.000080"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:04.477935" elapsed="0.000611"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:04.477892" elapsed="0.000719"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:04.488973" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:04.489130" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:04.489332" 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-10-11T01:01:04.479067" elapsed="0.010318"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:01:04.456107" elapsed="0.033462"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:04.498581" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:04.498877" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:04.499098" 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-10-11T01:01:04.491707" elapsed="0.007445"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:04.500284" 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-10-11T01:01:04.499647" elapsed="0.000734"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:04.500781" elapsed="0.000822"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:01:04.504659" level="INFO">${update} = ffffffffffffffffffffffffffffffff0054020000003dc0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:01:04.501938" elapsed="0.002783"/>
</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-10-11T01:01:04.505147" elapsed="0.000681"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:01:04.505926" elapsed="0.000084"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:01:04.490965" elapsed="0.015212"/>
</kw>
<msg time="2026-10-11T01:01:04.506335" 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-10-11T01:01:04.489977" elapsed="0.016411"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:04.507381" level="INFO">ffffffffffffffffffffffffffffffff0054020000003dc0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:04.506872" elapsed="0.000648"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:01:04.509336" level="INFO">Length is 168.</msg>
<msg time="2026-10-11T01:01:04.509520" 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-10-11T01:01:04.508790" elapsed="0.000780"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:01:04.510483" level="INFO">Length is 168.</msg>
<msg time="2026-10-11T01:01:04.510635" 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-10-11T01:01:04.509916" elapsed="0.000767"/>
</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-10-11T01:01:04.511108" elapsed="0.000618"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:01:04.512865" 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-10-11T01:01:04.512113" elapsed="0.000808"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:01:04.513661" 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-10-11T01:01:04.513270" elapsed="0.000444"/>
</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-10-11T01:01:04.514182" elapsed="0.000638"/>
</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-10-11T01:01:04.508014" elapsed="0.006931"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:04.521703" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:04.521848" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:04.521977" 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-10-11T01:01:04.516186" elapsed="0.005845"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:04.523111" 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-10-11T01:01:04.522392" elapsed="0.000909"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:04.523710" elapsed="0.000790"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:04.530706" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:04.530934" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:04.531174" 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-10-11T01:01:04.524858" elapsed="0.006370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:04.532355" 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-10-11T01:01:04.531718" elapsed="0.000771"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:04.532874" elapsed="0.000770"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T01:01:04.534191" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-10-11T01:01:04.533796" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:04.533757" elapsed="0.000604"/>
</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-10-11T01:01:04.534719" elapsed="0.000045"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:01:04.515504" elapsed="0.019393"/>
</kw>
<arg>pmsi_pim_ssm_tree</arg>
<status status="PASS" start="2026-10-11T01:01:02.376706" elapsed="2.158300"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:02.229445" elapsed="2.305773"/>
</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-10-11T01:01:04.538474" elapsed="0.000279"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:01:04.538100" 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-10-11T01:01:04.540123" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:04.539998" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:04.539957" 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-10-11T01:01:04.543329" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:04.543212" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:04.543188" elapsed="0.000249"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:04.544722" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:01:04.544245" elapsed="0.000512"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:01:04.545359" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:01:04.544972" elapsed="0.000421"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:01:04.545470" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T01:01:04.545649" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:01:04.543730" elapsed="0.001951"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:04.549303" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:04.549185" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:04.549160" elapsed="0.000231"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:04.551055" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:04.550877" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:04.550852" elapsed="0.000423"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:01:04.552062" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:01:04.551553" elapsed="0.000593"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:01:04.553001" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:01:04.552665" elapsed="0.000421"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:01:04.589053" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:01:04.555221" elapsed="0.033990"/>
</kw>
<msg time="2026-10-11T01:01:04.589366" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:01:04.589499" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:04.553545" elapsed="0.036026"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:01:04.625564" 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-10-11T01:01:04.591244" elapsed="0.034453"/>
</kw>
<msg time="2026-10-11T01:01:04.625821" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:01:04.625909" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:04.590008" elapsed="0.035970"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:04.626669" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:04.626323" elapsed="0.000477"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:04.626300" elapsed="0.000557"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:04.627580" 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-10-11T01:01:04.627067" elapsed="0.000632"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:04.628188" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:04.627871" elapsed="0.000458"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:04.627851" elapsed="0.000535"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:01:04.628445" 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-10-11T01:01:04.632188" elapsed="0.000369"/>
</kw>
<msg time="2026-10-11T01:01:04.632599" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:04.631649" elapsed="0.001016"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:04.632902" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:04.633135" 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-10-11T01:01:04.630843" elapsed="0.002508"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:01:04.628766" elapsed="0.004735"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:01:04.550470" elapsed="0.083257"/>
</kw>
<msg time="2026-10-11T01:01:04.633814" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:04.633855" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:04.549624" elapsed="0.084267"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:01:04.634065" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T01:01:04.633960" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:04.633942" elapsed="0.000203"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:04.634556" 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-10-11T01:01:04.635017" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:01:04.635086" 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-10-11T01:01:04.548767" elapsed="0.086407"/>
</kw>
<msg time="2026-10-11T01:01:04.635259" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:04.635300" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:04.546195" elapsed="0.089141"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:04.635653" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:04.635426" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:04.635388" elapsed="0.000337"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:01:04.545952" elapsed="0.089795"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:01:04.545752" elapsed="0.090025"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:01:04.542782" elapsed="0.093047"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:01:04.539632" elapsed="0.096249"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:04.539051" elapsed="0.096871"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:01:04.537536" elapsed="0.098435"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:04.641039" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:04.641172" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:04.641275" 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-10-11T01:01:04.636394" elapsed="0.004907"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:04.641498" elapsed="0.000363"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:04.645898" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:04.646015" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:01:04.646108" 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-10-11T01:01:04.642038" elapsed="0.004094"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:04.647029" 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-10-11T01:01:04.646745" elapsed="0.000311"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:04.647461" 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-10-11T01:01:04.647210" elapsed="0.000278"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:01:04.647705" elapsed="0.000291"/>
</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-10-11T01:01:04.646340" elapsed="0.001713"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:04.636120" elapsed="0.011981"/>
</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-10-11T01:01:04.536721" elapsed="0.111418"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:04.648804" 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-10-11T01:01:04.648949" 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-10-11T01:01:04.648652" elapsed="0.000324"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:04.657275" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:04.656953" elapsed="0.000349"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:01:04.658020" 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-10-11T01:01:04.657805" elapsed="0.000288">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-10-11T01:01:04.658178" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:01:04.657479" elapsed="0.000722"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:04.658700" 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-10-11T01:01:04.658375" elapsed="0.000350"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:04.659011" 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-10-11T01:01:04.659128" 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-10-11T01:01:04.658892" elapsed="0.000261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:04.659584" 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-10-11T01:01:04.659349" 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-10-11T01:01:04.659952" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:04.659695" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:04.660473" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:04.660189" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:04.660042" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:04.659677" elapsed="0.000873"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:04.661132" 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-10-11T01:01:04.660713" elapsed="0.000445"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:01:04.661202" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:01:04.661327" 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-10-11T01:01:04.656525" elapsed="0.004855"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:04.661706" 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-10-11T01:01:04.661821" 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-10-11T01:01:04.661565" elapsed="0.000281"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:04.662157" 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-10-11T01:01:04.662268" 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-10-11T01:01:04.662019" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:04.662719" 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-10-11T01:01:04.662501" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:04.663191" 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-10-11T01:01:04.662963" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:04.663655" level="INFO">ffffffffffffffffffffffffffffffff005a0200000043c0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:04.663442" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:04.664109" level="INFO">ffffffffffffffffffffffffffffffff0054020000003dc0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:04.663884" elapsed="0.000266"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:01:04.664289" elapsed="0.002562"/>
</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-10-11T01:01:04.667011" elapsed="0.002893"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:04.675024" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:04.675130" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:04.675228" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T01:01:04.670846" elapsed="0.004785">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:04.675815" elapsed="0.000021"/>
</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-10-11T01:01:04.676041" elapsed="0.000023"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T01:01:04.670544" elapsed="0.005616">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:06.685773" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:06.686104" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:06.686347" 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-10-11T01:01:06.677689" elapsed="0.008716"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T01:01:06.687459" 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-10-11T01:01:06.687718" 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-10-11T01:01:06.686835" elapsed="0.000978"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:06.690217" 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-10-11T01:01:06.689199" elapsed="0.001084"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:06.691613" 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-10-11T01:01:06.690663" elapsed="0.001013"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:01:06.692112" elapsed="0.000669"/>
</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-10-11T01:01:06.688288" elapsed="0.004625"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T01:01:06.676772" elapsed="0.016280"/>
</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-10-11T01:01:04.670112" elapsed="2.023038"/>
</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-10-11T01:01:06.693507" elapsed="0.003136"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:06.705394" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:06.705759" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:06.705954" 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-10-11T01:01:06.698722" elapsed="0.007312"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:06.706459" elapsed="0.000810"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:06.713705" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:06.713952" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:01:06.714197" 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-10-11T01:01:06.707676" elapsed="0.006577"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:06.716593" 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-10-11T01:01:06.715960" elapsed="0.000694"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:06.718101" 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-10-11T01:01:06.717012" elapsed="0.001149"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:01:06.719248" 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-10-11T01:01:06.719746" 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-10-11T01:01:06.718620" elapsed="0.001287">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-10-11T01:01:06.714752" elapsed="0.005504">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-10-11T01:01:06.698069" elapsed="0.022575">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-10-11T01:01:08.730275" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:08.730601" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:08.730838" 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-10-11T01:01:08.722143" elapsed="0.008751"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:08.731337" elapsed="0.000908"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:08.739527" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:08.739758" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:01:08.739970" 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-10-11T01:01:08.732660" elapsed="0.007388"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:08.742083" 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-10-11T01:01:08.741488" elapsed="0.000657"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:08.743055" 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-10-11T01:01:08.742516" elapsed="0.000599"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:01:08.743556" elapsed="0.000660"/>
</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-10-11T01:01:08.740557" elapsed="0.003785"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:08.721291" elapsed="0.023194"/>
</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-10-11T01:01:06.697132" elapsed="2.047434"/>
</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-10-11T01:01:08.745754" elapsed="0.003187"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:08.757245" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:08.757619" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:08.757817" 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-10-11T01:01:08.751152" elapsed="0.006719"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:08.758292" elapsed="0.000858"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:08.765895" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:08.766149" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:01:08.766357" 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-10-11T01:01:08.759563" elapsed="0.006879"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:08.768506" 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-10-11T01:01:08.767892" elapsed="0.000675"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:08.769474" 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-10-11T01:01:08.768905" 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-10-11T01:01:08.769944" elapsed="0.000676"/>
</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-10-11T01:01:08.766906" elapsed="0.003840"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:08.750450" elapsed="0.020402"/>
</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-10-11T01:01:08.749493" elapsed="0.021437"/>
</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-10-11T01:01:08.744935" elapsed="0.026134"/>
</kw>
<arg>pmsi_pim_ssm_tree</arg>
<status status="PASS" start="2026-10-11T01:01:04.648333" elapsed="4.122836"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:04.535854" elapsed="4.235524"/>
</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-10-11T01:01:08.775476" elapsed="0.000882"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:01:08.774865" elapsed="0.001644"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:08.778697" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:08.778479" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:08.778404" elapsed="0.000443"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:08.783503" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:08.783282" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:08.783243" elapsed="0.000403"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:08.785763" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:01:08.784974" elapsed="0.000846"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:01:08.786814" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:01:08.786187" elapsed="0.000681"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:01:08.786957" elapsed="0.000094"/>
</return>
<msg time="2026-10-11T01:01:08.787282" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:01:08.784138" elapsed="0.003195"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:08.791081" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:08.790942" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:08.790917" 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-10-11T01:01:08.792836" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:08.792676" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:08.792652" elapsed="0.000418"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:01:08.793804" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:01:08.793284" elapsed="0.000603"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:01:08.794752" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:01:08.794402" elapsed="0.000432"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:01:08.830599" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:01:08.796948" elapsed="0.033771"/>
</kw>
<msg time="2026-10-11T01:01:08.830844" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:01:08.830941" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:08.795275" elapsed="0.035756"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:01:08.866343" 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-10-11T01:01:08.832653" elapsed="0.033833"/>
</kw>
<msg time="2026-10-11T01:01:08.866605" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:01:08.866692" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:08.831447" elapsed="0.035314"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:08.867443" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:08.867125" elapsed="0.000450"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:08.867106" elapsed="0.000525"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:08.868462" 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-10-11T01:01:08.867826" elapsed="0.000754"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:08.869064" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:08.868750" elapsed="0.000449"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:08.868731" elapsed="0.000524"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:01:08.869288" 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-10-11T01:01:08.872894" elapsed="0.000135"/>
</kw>
<msg time="2026-10-11T01:01:08.873070" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:08.872305" elapsed="0.000828"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:08.873368" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:08.873591" 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-10-11T01:01:08.871569" elapsed="0.002234"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:01:08.869590" elapsed="0.004291"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:01:08.792247" elapsed="0.081797"/>
</kw>
<msg time="2026-10-11T01:01:08.874129" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:08.874168" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:08.791386" elapsed="0.082849"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:01:08.874393" elapsed="0.000135"/>
</return>
<status status="PASS" start="2026-10-11T01:01:08.874306" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:08.874288" elapsed="0.000295"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:08.874967" 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-10-11T01:01:08.875367" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:01:08.875449" 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-10-11T01:01:08.790538" elapsed="0.084999"/>
</kw>
<msg time="2026-10-11T01:01:08.875620" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:08.875661" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:08.787960" elapsed="0.087736"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:08.875985" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:08.875763" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:08.875747" elapsed="0.000322"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:01:08.787757" elapsed="0.088334"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:01:08.787546" elapsed="0.088572"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:01:08.782599" elapsed="0.093568"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:01:08.777836" elapsed="0.098380"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:08.776852" elapsed="0.099405"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:01:08.774058" elapsed="0.102246"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:08.881114" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:08.881228" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:08.881322" 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-10-11T01:01:08.876754" elapsed="0.004592"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:08.881549" elapsed="0.000351"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:08.886238" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:08.886341" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:01:08.886450" 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-10-11T01:01:08.882076" elapsed="0.004399"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:08.887360" 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-10-11T01:01:08.887115" elapsed="0.000274"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:08.887790" 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-10-11T01:01:08.887561" elapsed="0.000255"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:01:08.888012" elapsed="0.000280"/>
</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-10-11T01:01:08.886718" elapsed="0.001629"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:08.876482" elapsed="0.011914"/>
</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-10-11T01:01:08.773051" elapsed="0.115398"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:08.889156" 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-10-11T01:01:08.889309" 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-10-11T01:01:08.888989" elapsed="0.000347"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:08.889658" 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-10-11T01:01:08.889775" 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-10-11T01:01:08.889520" elapsed="0.000280"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:08.891550" 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-10-11T01:01:08.891676" 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-10-11T01:01:08.889963" elapsed="0.001739"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:01:08.892060" 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-10-11T01:01:08.891868" elapsed="0.000218"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:08.892394" 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-10-11T01:01:08.892529" 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-10-11T01:01:08.892253" elapsed="0.000301"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:01:08.892885" 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-10-11T01:01:08.892716" elapsed="0.000194"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:08.893343" 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-10-11T01:01:08.893116" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:08.893855" 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-10-11T01:01:08.893636" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:08.894320" level="INFO">ffffffffffffffffffffffffffffffff005a0200000043c0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:08.894105" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:08.894780" level="INFO">ffffffffffffffffffffffffffffffff0054020000003dc0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:08.894566" elapsed="0.000255"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:01:08.894959" elapsed="0.002164"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:08.908679" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T01:01:08.908741" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:08.908831" 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-10-11T01:01:08.897285" elapsed="0.011570"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:08.909352" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:08.909076" elapsed="0.000317"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:08.914140" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:08.914251" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:08.914344" 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-10-11T01:01:08.909571" elapsed="0.004797"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:08.914864" 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-10-11T01:01:08.914592" elapsed="0.000344"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:08.919859" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:08.919967" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:08.920069" 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-10-11T01:01:08.915871" elapsed="0.004222"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:08.920594" 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-10-11T01:01:08.920297" elapsed="0.000342"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:08.920802" elapsed="0.000339"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:01:08.923676" level="INFO">${update} = ffffffffffffffffffffffffffffffff005a0200000043c0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:01:08.921290" elapsed="0.002413"/>
</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-10-11T01:01:08.923882" elapsed="0.000305"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:01:08.924232" elapsed="0.000030"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:01:08.915563" elapsed="0.008773"/>
</kw>
<msg time="2026-10-11T01:01:08.924428" 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-10-11T01:01:08.915135" elapsed="0.009319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:08.924875" level="INFO">ffffffffffffffffffffffffffffffff005a0200000043c0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:08.924655" elapsed="0.000262"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:01:08.925725" level="INFO">Length is 180.</msg>
<msg time="2026-10-11T01:01:08.925794" 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-10-11T01:01:08.925485" elapsed="0.000331"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:01:08.926212" level="INFO">Length is 180.</msg>
<msg time="2026-10-11T01:01:08.926279" 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-10-11T01:01:08.925972" elapsed="0.000328"/>
</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-10-11T01:01:08.926503" elapsed="0.000266"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:01:08.927090" 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-10-11T01:01:08.926916" elapsed="0.000197"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:01:08.927433" 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-10-11T01:01:08.927256" 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-10-11T01:01:08.927637" elapsed="0.000262"/>
</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-10-11T01:01:08.925137" elapsed="0.002816"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:01:08.928132" elapsed="0.002044"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:08.934510" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:08.934619" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:08.934716" 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-10-11T01:01:08.930829" elapsed="0.003911"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:08.935237" 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-10-11T01:01:08.934943" elapsed="0.000339"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:08.935459" elapsed="0.000325"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:08.939391" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:08.939517" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:08.939612" 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-10-11T01:01:08.935943" elapsed="0.003693"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:08.940131" 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-10-11T01:01:08.939841" elapsed="0.000334"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:08.940338" elapsed="0.000342"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T01:01:08.940900" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:08.940750" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:08.940731" elapsed="0.000230"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:08.946703" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:08.946745" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:08.946833" 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-10-11T01:01:08.941119" elapsed="0.005739"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:01:08.930375" elapsed="0.016571"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:08.952116" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:08.952218" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:08.952303" 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-10-11T01:01:08.947868" elapsed="0.004458"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:08.952827" 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-10-11T01:01:08.952550" elapsed="0.000320"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:08.953044" elapsed="0.000322"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:01:08.955663" level="INFO">${update} = ffffffffffffffffffffffffffffffff0054020000003dc0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:01:08.953540" elapsed="0.002157"/>
</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-10-11T01:01:08.955912" elapsed="0.000346"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:01:08.956305" elapsed="0.000035"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:01:08.947561" elapsed="0.008882"/>
</kw>
<msg time="2026-10-11T01:01:08.956520" 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-10-11T01:01:08.947140" elapsed="0.009405"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:08.956973" level="INFO">ffffffffffffffffffffffffffffffff0054020000003dc0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:08.956752" elapsed="0.000277"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:01:08.957859" level="INFO">Length is 168.</msg>
<msg time="2026-10-11T01:01:08.957928" 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-10-11T01:01:08.957612" elapsed="0.000338"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:01:08.958371" level="INFO">Length is 168.</msg>
<msg time="2026-10-11T01:01:08.958465" 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-10-11T01:01:08.958136" 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-10-11T01:01:08.958672" elapsed="0.000266"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:01:08.959261" 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-10-11T01:01:08.959099" elapsed="0.000185"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:01:08.959603" 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-10-11T01:01:08.959445" elapsed="0.000182"/>
</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-10-11T01:01:08.959807" elapsed="0.000280"/>
</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-10-11T01:01:08.957248" elapsed="0.002894"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:08.964338" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:08.964525" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:08.964612" 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-10-11T01:01:08.960699" elapsed="0.003938"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:08.965146" 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-10-11T01:01:08.964842" elapsed="0.000347"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:08.965352" elapsed="0.000343"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:08.970754" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:08.970857" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:08.970950" 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-10-11T01:01:08.965855" elapsed="0.005120"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:08.971502" 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-10-11T01:01:08.971202" elapsed="0.000344"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:08.971708" elapsed="0.000335"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T01:01:08.972273" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T01:01:08.972118" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:08.972098" elapsed="0.000253"/>
</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-10-11T01:01:08.972524" elapsed="0.000020"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:01:08.960380" elapsed="0.012225"/>
</kw>
<arg>pmsi_pim_sm_tree</arg>
<status status="PASS" start="2026-10-11T01:01:08.888688" elapsed="0.083960"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:08.772030" elapsed="0.200720"/>
</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-10-11T01:01:08.974664" elapsed="0.000199"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:01:08.974391" 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-10-11T01:01:08.975840" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:08.975750" elapsed="0.000133"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:08.975732" elapsed="0.000171"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:08.977982" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:08.977898" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:08.977880" elapsed="0.000182"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:08.978989" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:01:08.978660" elapsed="0.000373"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:01:08.979470" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:01:08.979189" elapsed="0.000306"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:01:08.979534" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:01:08.979665" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:01:08.978276" elapsed="0.001413"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:08.982489" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:08.982387" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:08.982369" elapsed="0.000186"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:08.983796" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:08.983679" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:08.983661" elapsed="0.000288"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:01:08.984493" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:01:08.984117" elapsed="0.000436"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:01:08.985143" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:01:08.984901" elapsed="0.000303"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:01:09.017703" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:01:08.986711" elapsed="0.031124"/>
</kw>
<msg time="2026-10-11T01:01:09.017968" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:01:09.018072" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:08.985528" elapsed="0.032615"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:01:09.049390" 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-10-11T01:01:09.019786" elapsed="0.029746"/>
</kw>
<msg time="2026-10-11T01:01:09.049652" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:01:09.049741" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:09.018570" elapsed="0.031242"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:09.050458" elapsed="0.000067"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:09.050125" elapsed="0.000466"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:09.050103" elapsed="0.000547"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:09.051344" 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-10-11T01:01:09.050845" elapsed="0.000633"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:09.051932" elapsed="0.000075"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:09.051643" elapsed="0.000429"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:09.051625" elapsed="0.000502"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:01:09.052163" 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-10-11T01:01:09.055891" elapsed="0.000136"/>
</kw>
<msg time="2026-10-11T01:01:09.056068" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:09.055283" 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-10-11T01:01:09.056365" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:09.056685" 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-10-11T01:01:09.054547" elapsed="0.002352"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:01:09.052498" elapsed="0.004482"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:01:08.983315" elapsed="0.073878"/>
</kw>
<msg time="2026-10-11T01:01:09.057279" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:09.057319" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:08.982712" elapsed="0.074685"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:01:09.057573" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T01:01:09.057485" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:09.057467" elapsed="0.000185"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:09.058065" 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-10-11T01:01:09.058486" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:01:09.058553" 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-10-11T01:01:08.982093" elapsed="0.076550"/>
</kw>
<msg time="2026-10-11T01:01:09.058730" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:09.058771" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:08.980090" elapsed="0.078717"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:09.059116" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:09.058876" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:09.058859" elapsed="0.000328"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:01:08.979930" elapsed="0.079279"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:01:08.979779" elapsed="0.079461"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:01:08.977601" elapsed="0.081690"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:01:08.975494" elapsed="0.083850"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:08.975078" elapsed="0.084306"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:01:08.974046" elapsed="0.085405"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:09.063817" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:09.063952" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:09.064053" 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-10-11T01:01:09.059866" elapsed="0.004211"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:09.064251" elapsed="0.000585"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:09.069678" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:09.069783" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:01:09.069876" 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-10-11T01:01:09.065033" elapsed="0.004868"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:09.070835" 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-10-11T01:01:09.070565" elapsed="0.000296"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:09.071265" 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-10-11T01:01:09.071031" elapsed="0.000260"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:01:09.071491" elapsed="0.000280"/>
</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-10-11T01:01:09.070156" elapsed="0.001671"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:09.059593" elapsed="0.012283"/>
</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-10-11T01:01:08.973594" elapsed="0.098320"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:09.072589" 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-10-11T01:01:09.072734" 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-10-11T01:01:09.072436" elapsed="0.000324"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:09.080917" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:09.080613" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:01:09.081662" 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-10-11T01:01:09.081456" elapsed="0.000278">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-10-11T01:01:09.081840" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:01:09.081119" elapsed="0.000744"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:09.082370" 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-10-11T01:01:09.082055" elapsed="0.000340"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:09.082696" 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-10-11T01:01:09.082814" 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-10-11T01:01:09.082586" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:09.083276" 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-10-11T01:01:09.083046" elapsed="0.000280"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:01:09.083669" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:09.083388" elapsed="0.000333"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:09.084172" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:09.083892" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:09.083744" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:09.083370" elapsed="0.000911"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:09.084869" 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-10-11T01:01:09.084473" elapsed="0.000423"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:01:09.084940" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:01:09.085083" 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-10-11T01:01:09.080177" elapsed="0.004930"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:09.085429" 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-10-11T01:01:09.085547" 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-10-11T01:01:09.085275" elapsed="0.000297"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:09.085870" 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-10-11T01:01:09.085980" 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-10-11T01:01:09.085734" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:09.086458" 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-10-11T01:01:09.086221" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:09.086918" 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-10-11T01:01:09.086703" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:09.087401" level="INFO">ffffffffffffffffffffffffffffffff005a0200000043c0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:09.087188" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:09.087857" level="INFO">ffffffffffffffffffffffffffffffff0054020000003dc0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:09.087648" elapsed="0.000250"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:01:09.088051" elapsed="0.002632"/>
</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-10-11T01:01:09.090829" elapsed="0.002335"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:09.097800" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:09.097936" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:09.098044" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T01:01:09.094113" elapsed="0.004287">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:09.098601" elapsed="0.000020"/>
</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-10-11T01:01:09.098812" elapsed="0.000022"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T01:01:09.093795" elapsed="0.005133">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:11.108442" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:11.108749" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:11.108966" 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-10-11T01:01:11.100586" elapsed="0.008460"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T01:01:11.110062" 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-10-11T01:01:11.110320" 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-10-11T01:01:11.109474" elapsed="0.000971"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:11.112824" 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-10-11T01:01:11.111810" elapsed="0.001077"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:11.114191" 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-10-11T01:01:11.113255" elapsed="0.000996"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:01:11.114697" elapsed="0.000655"/>
</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-10-11T01:01:11.110901" elapsed="0.004609"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T01:01:11.099604" elapsed="0.016108"/>
</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-10-11T01:01:09.093362" elapsed="2.022449"/>
</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-10-11T01:01:11.116163" elapsed="0.003547"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:11.127269" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:11.127547" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:11.127743" 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-10-11T01:01:11.121796" elapsed="0.005999"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:11.128201" elapsed="0.000834"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:11.135914" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:11.136190" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:01:11.136404" 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-10-11T01:01:11.129394" elapsed="0.007106"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:11.138548" 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-10-11T01:01:11.137951" elapsed="0.000657"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:11.140045" 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-10-11T01:01:11.138952" elapsed="0.001154"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:01:11.141178" 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-10-11T01:01:11.141672" 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-10-11T01:01:11.140549" elapsed="0.001347">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-10-11T01:01:11.137020" elapsed="0.005225">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-10-11T01:01:11.121147" elapsed="0.021413">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-10-11T01:01:13.151784" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:13.152092" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:13.152306" 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-10-11T01:01:13.144133" elapsed="0.008229"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:13.152860" elapsed="0.000955"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:13.160375" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:13.160652" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:01:13.160865" 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-10-11T01:01:13.154210" elapsed="0.006710"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:13.163033" 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-10-11T01:01:13.162348" elapsed="0.000749"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:13.164062" 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-10-11T01:01:13.163479" elapsed="0.000643"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:01:13.164661" elapsed="0.000664"/>
</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-10-11T01:01:13.161443" elapsed="0.004045"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:13.143259" elapsed="0.022347"/>
</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-10-11T01:01:11.120155" elapsed="2.045531"/>
</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-10-11T01:01:13.166867" elapsed="0.004420"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:13.180482" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:13.180718" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:13.180929" 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-10-11T01:01:13.173920" elapsed="0.007065"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:13.181400" elapsed="0.000822"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:13.189216" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:13.189480" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:01:13.189694" 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-10-11T01:01:13.182617" elapsed="0.007133"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:13.191770" 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-10-11T01:01:13.191195" elapsed="0.000635"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:13.192737" 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-10-11T01:01:13.192191" elapsed="0.000605"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:01:13.193229" elapsed="0.000716"/>
</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-10-11T01:01:13.190230" elapsed="0.003872"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:13.172771" elapsed="0.021438"/>
</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-10-11T01:01:13.171793" elapsed="0.022493"/>
</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-10-11T01:01:13.166074" elapsed="0.028321"/>
</kw>
<arg>pmsi_pim_sm_tree</arg>
<status status="PASS" start="2026-10-11T01:01:09.072119" elapsed="4.122403"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:08.973097" elapsed="4.221633"/>
</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-10-11T01:01:13.198914" elapsed="0.000470"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:01:13.198306" elapsed="0.001230"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:13.201775" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:13.201564" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:13.201518" 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-10-11T01:01:13.206824" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:13.206636" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:13.206597" elapsed="0.000370"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:13.209148" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:01:13.208364" elapsed="0.000844"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:01:13.210210" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:01:13.209587" elapsed="0.000678"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:01:13.210354" elapsed="0.000098"/>
</return>
<msg time="2026-10-11T01:01:13.210682" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:01:13.207490" elapsed="0.003245"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:13.215344" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:13.215226" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:13.215201" 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-10-11T01:01:13.217190" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:13.217029" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:13.216987" elapsed="0.000417"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:01:13.218206" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:01:13.217677" elapsed="0.000611"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:01:13.219141" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:01:13.218806" elapsed="0.000416"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:01:13.255086" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:01:13.221326" elapsed="0.033889"/>
</kw>
<msg time="2026-10-11T01:01:13.255345" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:01:13.255454" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:13.219677" elapsed="0.035850"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:01:13.291875" 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-10-11T01:01:13.257143" elapsed="0.034873"/>
</kw>
<msg time="2026-10-11T01:01:13.292139" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:01:13.292226" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:13.255928" elapsed="0.036368"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:13.292913" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:13.292609" elapsed="0.000448"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:13.292589" elapsed="0.000524"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:13.293817" 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-10-11T01:01:13.293306" elapsed="0.000628"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:13.294434" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:13.294123" elapsed="0.000443"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:13.294104" elapsed="0.000518"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:01:13.294656" 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-10-11T01:01:13.298339" elapsed="0.000136"/>
</kw>
<msg time="2026-10-11T01:01:13.298550" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:13.297801" 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-10-11T01:01:13.298852" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:13.299104" 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-10-11T01:01:13.296914" elapsed="0.002404"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:01:13.294946" elapsed="0.004452"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:01:13.216534" elapsed="0.083085"/>
</kw>
<msg time="2026-10-11T01:01:13.299709" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:13.299748" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:13.215681" elapsed="0.084104"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:01:13.299941" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:01:13.299854" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:13.299836" elapsed="0.000195"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:13.300432" 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-10-11T01:01:13.300813" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:01:13.300878" 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-10-11T01:01:13.214797" elapsed="0.086168"/>
</kw>
<msg time="2026-10-11T01:01:13.301070" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:13.301110" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:13.211536" elapsed="0.089609"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:13.301475" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:13.301211" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:13.301195" elapsed="0.000353"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:01:13.211179" elapsed="0.090390"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:01:13.210842" elapsed="0.090755"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:01:13.205915" elapsed="0.095730"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:01:13.200934" elapsed="0.100761"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:13.199925" elapsed="0.101813"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:01:13.197505" elapsed="0.104279"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:13.307273" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:13.307400" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:13.307508" 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-10-11T01:01:13.302207" elapsed="0.005325"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:13.307710" elapsed="0.000368"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:13.312612" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:13.312715" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:01:13.312809" 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-10-11T01:01:13.308276" elapsed="0.004558"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:13.313721" 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-10-11T01:01:13.313455" elapsed="0.000293"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:13.314155" 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-10-11T01:01:13.313903" elapsed="0.000278"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:01:13.314363" elapsed="0.000298"/>
</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-10-11T01:01:13.313055" elapsed="0.001661"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:13.301917" elapsed="0.012848"/>
</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-10-11T01:01:13.196447" elapsed="0.118355"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:13.315519" 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-10-11T01:01:13.315678" 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-10-11T01:01:13.315350" elapsed="0.000355"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:13.316017" 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-10-11T01:01:13.316135" 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-10-11T01:01:13.315868" elapsed="0.000292"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:13.316472" 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-10-11T01:01:13.316587" 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-10-11T01:01:13.316321" elapsed="0.000290"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:01:13.316948" 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-10-11T01:01:13.316772" elapsed="0.000200"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:13.317281" 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-10-11T01:01:13.317396" 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-10-11T01:01:13.317146" elapsed="0.000290"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:01:13.317795" 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-10-11T01:01:13.317596" elapsed="0.000223"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:13.318251" 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-10-11T01:01:13.318027" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:13.318732" 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-10-11T01:01:13.318512" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:13.319195" level="INFO">ffffffffffffffffffffffffffffffff005a0200000043c0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:13.318971" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:13.319652" level="INFO">ffffffffffffffffffffffffffffffff0054020000003dc0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:13.319440" elapsed="0.000253"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:01:13.319832" elapsed="0.002401"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:13.330961" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T01:01:13.331042" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:13.331132" 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-10-11T01:01:13.322446" elapsed="0.008710"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:13.331712" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:13.331367" elapsed="0.000383"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:13.335978" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:13.336163" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:13.336259" 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-10-11T01:01:13.331909" elapsed="0.004376"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:13.336789" 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-10-11T01:01:13.336511" elapsed="0.000324"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:13.343185" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:13.343295" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:13.343383" 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-10-11T01:01:13.337806" elapsed="0.005620"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:13.343917" 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-10-11T01:01:13.343640" elapsed="0.000322"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:13.344140" elapsed="0.000354"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:01:13.347061" level="INFO">${update} = </msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:01:13.344648" elapsed="0.002439"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:01:13.347626" level="FAIL"> == </msg>
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="FAIL" start="2026-10-11T01:01:13.347247" elapsed="0.000447"> == </status>
</kw>
<return>
<value>${update}</value>
<status status="NOT RUN" start="2026-10-11T01:01:13.347747" elapsed="0.000021"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="FAIL" start="2026-10-11T01:01:13.337483" elapsed="0.010375"> == </status>
</kw>
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:15.357459" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:15.357765" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:15.357981" 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-10-11T01:01:15.349608" elapsed="0.008450"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:15.359405" 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-10-11T01:01:15.358666" elapsed="0.000878"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:15.359921" elapsed="0.000823"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:01:15.364515" level="INFO">${update} = ffffffffffffffffffffffffffffffff005a0200000043c0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:01:15.361111" elapsed="0.003480"/>
</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-10-11T01:01:15.365038" elapsed="0.000755"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:01:15.365901" elapsed="0.000077"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:01:15.348648" elapsed="0.017530"/>
</kw>
<msg time="2026-10-11T01:01:15.366342" 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-10-11T01:01:13.337035" elapsed="2.029362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:15.367524" level="INFO">ffffffffffffffffffffffffffffffff005a0200000043c0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:15.366931" elapsed="0.000692"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:01:15.369504" level="INFO">Length is 180.</msg>
<msg time="2026-10-11T01:01:15.369661" 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-10-11T01:01:15.368914" elapsed="0.000797"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:01:15.370626" level="INFO">Length is 180.</msg>
<msg time="2026-10-11T01:01:15.370775" 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-10-11T01:01:15.370084" elapsed="0.000739"/>
</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-10-11T01:01:15.371254" elapsed="0.000668"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:01:15.372717" 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-10-11T01:01:15.372296" elapsed="0.000475"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:01:15.373496" 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-10-11T01:01:15.373118" elapsed="0.000431"/>
</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-10-11T01:01:15.373947" elapsed="0.000652"/>
</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-10-11T01:01:15.368132" elapsed="0.006586"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:01:15.375148" elapsed="0.002828"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:15.385791" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:15.386103" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:15.386302" 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-10-11T01:01:15.379187" elapsed="0.007168"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:15.387916" 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-10-11T01:01:15.386851" elapsed="0.001260"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:15.388517" elapsed="0.000761"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:15.395789" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:15.396065" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:15.396280" 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-10-11T01:01:15.389670" elapsed="0.006663"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:15.397545" 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-10-11T01:01:15.396823" elapsed="0.000824"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:15.398037" elapsed="0.000762"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T01:01:15.399327" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:15.398964" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:15.398920" elapsed="0.000576"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:15.407888" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:15.407991" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:15.408276" 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-10-11T01:01:15.399824" elapsed="0.008509"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:01:15.378542" elapsed="0.029996"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:15.416946" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:15.417238" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:15.417478" 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-10-11T01:01:15.410726" elapsed="0.006819"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:15.418690" 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-10-11T01:01:15.418030" elapsed="0.000758"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:15.419212" elapsed="0.000767"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:01:15.425928" level="INFO">${update} = ffffffffffffffffffffffffffffffff0054020000003dc0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:01:15.420440" elapsed="0.005550"/>
</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-10-11T01:01:15.426452" elapsed="0.000697"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:01:15.427250" elapsed="0.000072"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:01:15.409978" elapsed="0.017571"/>
</kw>
<msg time="2026-10-11T01:01:15.427715" 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-10-11T01:01:15.408966" elapsed="0.018803"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:15.428818" level="INFO">ffffffffffffffffffffffffffffffff0054020000003dc0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:15.428243" elapsed="0.000671"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:01:15.430855" level="INFO">Length is 168.</msg>
<msg time="2026-10-11T01:01:15.431031" 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-10-11T01:01:15.430290" elapsed="0.000793"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:01:15.431976" level="INFO">Length is 168.</msg>
<msg time="2026-10-11T01:01:15.432148" 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-10-11T01:01:15.431462" elapsed="0.000737"/>
</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-10-11T01:01:15.432639" elapsed="0.000617"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:01:15.433964" 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-10-11T01:01:15.433612" elapsed="0.000425"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:01:15.434735" 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-10-11T01:01:15.434359" elapsed="0.000428"/>
</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-10-11T01:01:15.435209" elapsed="0.000619"/>
</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-10-11T01:01:15.429478" elapsed="0.006474"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:15.443066" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:15.443211" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:15.443329" 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-10-11T01:01:15.437196" elapsed="0.006167"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:15.444452" 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-10-11T01:01:15.443779" elapsed="0.000772"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:15.444911" elapsed="0.000781"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:15.455140" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:15.455371" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:15.455714" 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-10-11T01:01:15.446071" elapsed="0.009701"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:15.456972" 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-10-11T01:01:15.456312" elapsed="0.000781"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:15.457487" elapsed="0.000749"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T01:01:15.458862" elapsed="0.000071"/>
</return>
<status status="PASS" start="2026-10-11T01:01:15.458448" elapsed="0.000583"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:15.458360" elapsed="0.000739"/>
</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-10-11T01:01:15.459530" elapsed="0.000051"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:01:15.436516" elapsed="0.023205"/>
</kw>
<arg>pmsi_bidir_pim_tree</arg>
<status status="PASS" start="2026-10-11T01:01:13.315050" elapsed="2.144764"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:13.195435" elapsed="2.264604"/>
</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-10-11T01:01:15.464042" elapsed="0.000353"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:01:15.463551" elapsed="0.000957"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:15.465859" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:15.465735" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:15.465709" 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-10-11T01:01:15.468939" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:15.468820" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:15.468796" elapsed="0.000255"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:15.470362" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:01:15.469870" elapsed="0.000528"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:01:15.471040" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:01:15.470638" elapsed="0.000437"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:01:15.471131" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T01:01:15.471310" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:01:15.469344" elapsed="0.001998"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:15.475261" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:15.475141" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:15.475116" 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-10-11T01:01:15.477080" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:15.476895" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:15.476870" elapsed="0.000428"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:01:15.478067" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:01:15.477554" elapsed="0.000598"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:01:15.479027" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:01:15.478683" elapsed="0.000428"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:01:15.513727" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:01:15.481223" elapsed="0.032625"/>
</kw>
<msg time="2026-10-11T01:01:15.513994" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:01:15.514105" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:15.479581" elapsed="0.034593"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:01:15.551969" 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-10-11T01:01:15.515934" elapsed="0.036176"/>
</kw>
<msg time="2026-10-11T01:01:15.552232" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:01:15.552320" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:15.514598" elapsed="0.037790"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:15.553059" elapsed="0.000071"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:15.552714" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:15.552693" elapsed="0.000561"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:15.553969" 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-10-11T01:01:15.553474" elapsed="0.000629"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:15.554606" elapsed="0.000067"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:15.554276" elapsed="0.000464"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:15.554257" elapsed="0.000540"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:01:15.554832" 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-10-11T01:01:15.558799" elapsed="0.000124"/>
</kw>
<msg time="2026-10-11T01:01:15.558964" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:15.558256" elapsed="0.000786"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:15.559278" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:15.559581" 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-10-11T01:01:15.557347" elapsed="0.002455"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:01:15.555344" 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-10-11T01:01:15.476477" elapsed="0.083624"/>
</kw>
<msg time="2026-10-11T01:01:15.560188" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:15.560228" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:15.475590" elapsed="0.084671"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:01:15.560440" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-10-11T01:01:15.560330" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:15.560312" 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-10-11T01:01:15.560915" 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-10-11T01:01:15.561316" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:01:15.561382" 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-10-11T01:01:15.474704" elapsed="0.086836"/>
</kw>
<msg time="2026-10-11T01:01:15.561628" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:15.561667" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:15.471843" elapsed="0.089857"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:15.561994" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:15.561768" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:15.561752" elapsed="0.000329"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:01:15.471631" elapsed="0.090505"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:01:15.471428" elapsed="0.090739"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:01:15.468361" elapsed="0.093856"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:01:15.465340" elapsed="0.096926"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:15.464750" elapsed="0.097555"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:01:15.462383" elapsed="0.099968"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:15.567428" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:15.567555" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:15.567645" 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-10-11T01:01:15.562785" elapsed="0.004887"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:15.567846" elapsed="0.000558"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:15.572657" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:15.572760" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:01:15.572854" 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-10-11T01:01:15.568600" elapsed="0.004278"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:15.573779" 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-10-11T01:01:15.573498" elapsed="0.000308"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:15.574206" 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-10-11T01:01:15.573958" elapsed="0.000275"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:01:15.574432" elapsed="0.000286"/>
</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-10-11T01:01:15.573100" elapsed="0.001674"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:15.562511" elapsed="0.012310"/>
</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-10-11T01:01:15.461392" elapsed="0.113464"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:15.575546" 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-10-11T01:01:15.575697" 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-10-11T01:01:15.575375" elapsed="0.000349"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:15.583763" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:15.583459" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:01:15.584507" 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-10-11T01:01:15.584287" elapsed="0.000296">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-10-11T01:01:15.584669" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:01:15.583949" elapsed="0.000743"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:15.585188" 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-10-11T01:01:15.584865" elapsed="0.000348"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:15.585505" 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-10-11T01:01:15.585624" 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-10-11T01:01:15.585380" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:15.586092" 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-10-11T01:01:15.585847" 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-10-11T01:01:15.586476" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:15.586203" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:15.586961" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:15.586700" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:15.586552" elapsed="0.000477"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:15.586186" elapsed="0.000864"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:15.587617" 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-10-11T01:01:15.587214" elapsed="0.000430"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:01:15.587687" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:01:15.587814" 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-10-11T01:01:15.582979" elapsed="0.004859"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:15.588154" 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-10-11T01:01:15.588269" 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-10-11T01:01:15.588016" elapsed="0.000278"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:15.588609" 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-10-11T01:01:15.588749" 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-10-11T01:01:15.588471" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:15.589204" 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-10-11T01:01:15.588970" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:15.589679" 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-10-11T01:01:15.589464" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:15.590143" level="INFO">ffffffffffffffffffffffffffffffff005a0200000043c0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:15.589918" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:15.590600" level="INFO">ffffffffffffffffffffffffffffffff0054020000003dc0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:15.590373" elapsed="0.000268"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:01:15.590780" elapsed="0.002685"/>
</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-10-11T01:01:15.593616" elapsed="0.002285"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:15.600629" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:15.600734" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:15.600826" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T01:01:15.596892" elapsed="0.004311">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:15.601387" elapsed="0.000036"/>
</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-10-11T01:01:15.601617" elapsed="0.000022"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T01:01:15.596575" elapsed="0.005161">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:17.611065" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:17.611497" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:17.611719" 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-10-11T01:01:17.603311" elapsed="0.008464"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T01:01:17.612796" 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-10-11T01:01:17.613073" 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-10-11T01:01:17.612192" elapsed="0.000980"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:17.615596" 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-10-11T01:01:17.614573" elapsed="0.001086"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:17.616939" 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-10-11T01:01:17.616023" elapsed="0.000977"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:01:17.617484" elapsed="0.000662"/>
</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-10-11T01:01:17.613658" elapsed="0.004617"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T01:01:17.602386" elapsed="0.016002"/>
</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-10-11T01:01:15.596126" elapsed="2.022391"/>
</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-10-11T01:01:17.618847" elapsed="0.003111"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:17.630591" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:17.630829" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:17.631045" 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-10-11T01:01:17.624057" elapsed="0.007044"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:17.631521" elapsed="0.000803"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:17.639978" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:17.640257" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:01:17.640509" 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-10-11T01:01:17.632791" elapsed="0.007778"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:17.642552" 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-10-11T01:01:17.641953" elapsed="0.000662"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:17.644047" 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-10-11T01:01:17.642952" elapsed="0.001158"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:01:17.645172" 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-10-11T01:01:17.645663" 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-10-11T01:01:17.644551" elapsed="0.001270">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-10-11T01:01:17.641048" elapsed="0.005122">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-10-11T01:01:17.623382" elapsed="0.023102">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-10-11T01:01:19.655257" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:19.655601" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:19.655819" 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-10-11T01:01:19.648057" elapsed="0.007820"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:19.656321" elapsed="0.000913"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:19.664981" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:19.665248" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:01:19.665496" 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-10-11T01:01:19.657634" elapsed="0.007920"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:19.667591" 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-10-11T01:01:19.666954" elapsed="0.000698"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:19.668569" 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-10-11T01:01:19.667994" elapsed="0.000634"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:01:19.669073" elapsed="0.000656"/>
</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-10-11T01:01:19.666046" elapsed="0.003811"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:19.647183" elapsed="0.022784"/>
</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-10-11T01:01:17.622489" elapsed="2.047583"/>
</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-10-11T01:01:19.671205" elapsed="0.003243"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:19.683578" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:19.683815" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:19.684054" 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-10-11T01:01:19.677107" elapsed="0.007003"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:19.684548" elapsed="0.000782"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:19.691945" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:19.692205" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:01:19.692443" 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-10-11T01:01:19.685729" elapsed="0.006772"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:19.694527" 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-10-11T01:01:19.693926" elapsed="0.000663"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:19.695500" 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-10-11T01:01:19.694930" 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-10-11T01:01:19.695968" elapsed="0.000684"/>
</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-10-11T01:01:19.692959" elapsed="0.003818"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:19.675919" elapsed="0.020966"/>
</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-10-11T01:01:19.674944" elapsed="0.022017"/>
</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-10-11T01:01:19.670474" elapsed="0.026618"/>
</kw>
<arg>pmsi_bidir_pim_tree</arg>
<status status="PASS" start="2026-10-11T01:01:15.575071" elapsed="4.122116"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:15.460480" elapsed="4.236914"/>
</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-10-11T01:01:19.702169" elapsed="0.000485"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:01:19.701573" elapsed="0.001208"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:19.704932" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:19.704720" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:19.704673" 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-10-11T01:01:19.709752" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:19.709566" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:19.709527" elapsed="0.000365"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:19.712129" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:01:19.711235" elapsed="0.000952"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:01:19.713194" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:01:19.712573" elapsed="0.000675"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:01:19.713337" elapsed="0.000102"/>
</return>
<msg time="2026-10-11T01:01:19.713672" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:01:19.710377" elapsed="0.003347"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:19.718113" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:19.717975" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:19.717950" 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-10-11T01:01:19.719884" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:19.719718" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:19.719692" elapsed="0.000436"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:01:19.720882" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:01:19.720350" elapsed="0.000614"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:01:19.721952" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:01:19.721617" elapsed="0.000441"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:01:19.755851" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:01:19.724192" elapsed="0.031785"/>
</kw>
<msg time="2026-10-11T01:01:19.756142" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:01:19.756233" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:19.722541" elapsed="0.033764"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:01:19.793543" 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-10-11T01:01:19.757965" elapsed="0.035746"/>
</kw>
<msg time="2026-10-11T01:01:19.793858" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:01:19.793947" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:19.756736" elapsed="0.037297"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:19.794707" elapsed="0.000067"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:19.794339" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:19.794311" elapsed="0.000589"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:19.795646" 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-10-11T01:01:19.795108" elapsed="0.000657"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:19.796243" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:19.795933" elapsed="0.000440"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:19.795914" elapsed="0.000535"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:01:19.796487" 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-10-11T01:01:19.800162" elapsed="0.000125"/>
</kw>
<msg time="2026-10-11T01:01:19.800327" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:19.799629" elapsed="0.000763"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:19.800767" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:19.800976" 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-10-11T01:01:19.798804" elapsed="0.002403"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:01:19.796823" elapsed="0.004465"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:01:19.719266" elapsed="0.082190"/>
</kw>
<msg time="2026-10-11T01:01:19.801545" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:19.801586" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:19.718439" elapsed="0.083184"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:01:19.801787" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:01:19.801695" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:19.801677" elapsed="0.000187"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:19.802269" 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-10-11T01:01:19.802678" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:01:19.802787" 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-10-11T01:01:19.717571" elapsed="0.085307"/>
</kw>
<msg time="2026-10-11T01:01:19.802966" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:19.803022" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:19.714547" elapsed="0.088513"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:19.803354" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:19.803130" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:19.803113" elapsed="0.000330"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:01:19.714190" elapsed="0.089276"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:01:19.713837" elapsed="0.089661"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:01:19.708862" elapsed="0.094688"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:01:19.704103" elapsed="0.099499"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:19.703146" elapsed="0.100499"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:01:19.700732" elapsed="0.102963"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:19.808332" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:19.808491" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:19.808581" 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-10-11T01:01:19.804123" elapsed="0.004482"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:19.808781" elapsed="0.000382"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:19.813822" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:19.813925" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:01:19.814030" 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-10-11T01:01:19.809326" elapsed="0.004730"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:19.814937" 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-10-11T01:01:19.814671" elapsed="0.000293"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:19.815370" 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-10-11T01:01:19.815133" elapsed="0.000263"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:01:19.815601" elapsed="0.000287"/>
</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-10-11T01:01:19.814263" elapsed="0.001713"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:19.803836" elapsed="0.012202"/>
</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-10-11T01:01:19.699358" elapsed="0.116718"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:19.816790" 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-10-11T01:01:19.816941" 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-10-11T01:01:19.816637" elapsed="0.000331"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:19.817286" 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-10-11T01:01:19.817403" 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-10-11T01:01:19.817146" elapsed="0.000302"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:19.817752" 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-10-11T01:01:19.817869" 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-10-11T01:01:19.817614" elapsed="0.000280"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:01:19.818253" 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-10-11T01:01:19.818072" elapsed="0.000205"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:19.818597" 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-10-11T01:01:19.818712" 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-10-11T01:01:19.818459" elapsed="0.000278"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:01:19.819110" 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-10-11T01:01:19.818897" elapsed="0.000238"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:19.819590" 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-10-11T01:01:19.819333" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:19.820071" 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-10-11T01:01:19.819838" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:19.820577" level="INFO">ffffffffffffffffffffffffffffffff0056020000003fc01609000604e380ac0c7b034001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:19.820342" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:19.821039" level="INFO">ffffffffffffffffffffffffffffffff00500200000039c01609000604e380ac0c7b034001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:19.820810" elapsed="0.000271"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:01:19.821221" elapsed="0.002657"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:19.832656" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T01:01:19.832718" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:19.832802" 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-10-11T01:01:19.824057" elapsed="0.008768"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:19.833329" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:19.833051" elapsed="0.000318"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:19.838118" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:19.838227" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:19.838322" 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-10-11T01:01:19.833548" elapsed="0.004798"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:19.838849" 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-10-11T01:01:19.838570" elapsed="0.000324"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:19.844165" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:19.844302" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:19.844390" 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-10-11T01:01:19.839823" elapsed="0.004610"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:19.844922" 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-10-11T01:01:19.844642" elapsed="0.000325"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:19.845142" elapsed="0.000342"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:01:19.847847" level="INFO">${update} = ffffffffffffffffffffffffffffffff0056020000003fc01609000604e380ac0c7b034001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:01:19.845635" elapsed="0.002240"/>
</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-10-11T01:01:19.848056" elapsed="0.000313"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:01:19.848435" elapsed="0.000030"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:01:19.839515" elapsed="0.009025"/>
</kw>
<msg time="2026-10-11T01:01:19.848609" 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-10-11T01:01:19.839090" elapsed="0.009543"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:19.849061" level="INFO">ffffffffffffffffffffffffffffffff0056020000003fc01609000604e380ac0c7b034001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:19.848832" elapsed="0.000270"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:01:19.849902" level="INFO">Length is 172.</msg>
<msg time="2026-10-11T01:01:19.849970" 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-10-11T01:01:19.849667" elapsed="0.000324"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:01:19.850388" level="INFO">Length is 172.</msg>
<msg time="2026-10-11T01:01:19.850477" 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-10-11T01:01:19.850161" elapsed="0.000338"/>
</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-10-11T01:01:19.850679" elapsed="0.000266"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:01:19.851266" 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-10-11T01:01:19.851103" elapsed="0.000187"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:01:19.851604" 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-10-11T01:01:19.851447" elapsed="0.000180"/>
</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-10-11T01:01:19.851804" elapsed="0.000273"/>
</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-10-11T01:01:19.849316" elapsed="0.002815"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:01:19.852269" elapsed="0.002282"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:19.859261" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:19.859370" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:19.859504" 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-10-11T01:01:19.855047" elapsed="0.004482"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:19.860031" 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-10-11T01:01:19.859735" elapsed="0.000343"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:19.860242" elapsed="0.000344"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:19.864859" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:19.864967" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:19.865077" 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-10-11T01:01:19.860746" elapsed="0.004356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:19.865604" 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-10-11T01:01:19.865308" elapsed="0.000340"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:19.865811" elapsed="0.000331"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T01:01:19.866359" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:19.866211" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:19.866192" elapsed="0.000244"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:19.874752" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:19.874793" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:19.874881" 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-10-11T01:01:19.866586" elapsed="0.008320"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:01:19.854741" elapsed="0.020224"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:19.880369" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:19.880491" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:19.880576" 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-10-11T01:01:19.875888" elapsed="0.004712"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:19.881278" 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-10-11T01:01:19.880837" elapsed="0.000486"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:19.881506" elapsed="0.000330"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:01:19.884305" level="INFO">${update} = ffffffffffffffffffffffffffffffff00500200000039c01609000604e380ac0c7b034001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:01:19.881986" elapsed="0.002347"/>
</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-10-11T01:01:19.884509" elapsed="0.000313"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:01:19.884867" elapsed="0.000028"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:01:19.875579" elapsed="0.009389"/>
</kw>
<msg time="2026-10-11T01:01:19.885051" 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-10-11T01:01:19.875160" elapsed="0.009916"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:19.885508" level="INFO">ffffffffffffffffffffffffffffffff00500200000039c01609000604e380ac0c7b034001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:19.885274" elapsed="0.000275"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:01:19.886327" level="INFO">Length is 160.</msg>
<msg time="2026-10-11T01:01:19.886396" 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-10-11T01:01:19.886094" elapsed="0.000345"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:01:19.886823" level="INFO">Length is 160.</msg>
<msg time="2026-10-11T01:01:19.886891" 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-10-11T01:01:19.886596" elapsed="0.000316"/>
</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-10-11T01:01:19.887106" elapsed="0.000263"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:01:19.887688" 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-10-11T01:01:19.887534" elapsed="0.000177"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:01:19.888003" 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-10-11T01:01:19.887853" elapsed="0.000186"/>
</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-10-11T01:01:19.888217" elapsed="0.000278"/>
</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-10-11T01:01:19.885754" elapsed="0.002794"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:19.893353" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:19.893474" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:19.893558" 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-10-11T01:01:19.889073" elapsed="0.004509"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:19.894075" 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-10-11T01:01:19.893788" elapsed="0.000329"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:19.894277" elapsed="0.000337"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:19.899235" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:19.899379" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:19.899493" 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-10-11T01:01:19.894771" elapsed="0.004746"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:19.899996" 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-10-11T01:01:19.899723" elapsed="0.000329"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:19.900215" elapsed="0.000340"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T01:01:19.900771" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-11T01:01:19.900624" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:19.900606" elapsed="0.000245"/>
</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-10-11T01:01:19.900998" elapsed="0.000032"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:01:19.888768" elapsed="0.012322"/>
</kw>
<arg>pmsi_ingress_replication</arg>
<status status="PASS" start="2026-10-11T01:01:19.816318" elapsed="0.084813"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:19.698111" elapsed="0.203114"/>
</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-10-11T01:01:19.902998" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:01:19.902748" elapsed="0.000508"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:19.904329" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:19.904241" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:19.904223" elapsed="0.000169"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:19.906484" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:19.906386" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:19.906369" elapsed="0.000178"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:19.907466" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:01:19.907123" elapsed="0.000368"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:01:19.907909" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:01:19.907646" elapsed="0.000287"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:01:19.907972" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:01:19.908111" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:01:19.906755" elapsed="0.001379"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:19.910713" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:19.910628" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:19.910610" elapsed="0.000169"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:19.911917" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:19.911804" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:19.911787" elapsed="0.000292"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:01:19.912600" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:01:19.912231" elapsed="0.000427"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:01:19.913240" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:01:19.913004" elapsed="0.000294"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:01:19.949769" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:01:19.914785" elapsed="0.035105"/>
</kw>
<msg time="2026-10-11T01:01:19.950060" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:01:19.950149" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:19.913621" elapsed="0.036598"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:01:19.992840" 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-10-11T01:01:19.951841" elapsed="0.041163"/>
</kw>
<msg time="2026-10-11T01:01:19.993159" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:01:19.993248" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:19.950631" elapsed="0.042687"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:19.993989" elapsed="0.000080"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:19.993651" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:19.993624" elapsed="0.000571"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:19.994919" 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-10-11T01:01:19.994387" elapsed="0.000684"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:19.995558" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:19.995243" elapsed="0.000450"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:19.995224" elapsed="0.000526"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:01:19.995787" 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-10-11T01:01:19.999739" elapsed="0.000123"/>
</kw>
<msg time="2026-10-11T01:01:19.999901" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:19.999103" elapsed="0.000861"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:20.000211" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:20.000432" 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-10-11T01:01:19.998275" 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-10-11T01:01:19.996118" elapsed="0.004610"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:01:19.911520" elapsed="0.089356"/>
</kw>
<msg time="2026-10-11T01:01:20.000960" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:20.001000" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:19.910933" elapsed="0.090117"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:01:20.001205" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:01:20.001120" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:20.001102" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:20.001706" 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-10-11T01:01:20.002107" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:01:20.002173" 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-10-11T01:01:19.910325" elapsed="0.091935"/>
</kw>
<msg time="2026-10-11T01:01:20.002345" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:20.002386" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:19.908490" elapsed="0.093949"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:20.002775" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:20.002551" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:20.002534" elapsed="0.000313"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:01:19.908330" elapsed="0.094539"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:01:19.908184" elapsed="0.094715"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:01:19.906094" elapsed="0.096856"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:01:19.903970" elapsed="0.099031"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:19.903405" elapsed="0.099654"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:01:19.902392" elapsed="0.100716"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:20.007886" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:20.008033" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:20.008132" 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-10-11T01:01:20.003535" elapsed="0.004621"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:20.008330" elapsed="0.000378"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:20.013144" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:20.013245" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:01:20.013336" 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-10-11T01:01:20.008870" elapsed="0.004491"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:20.014248" 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-10-11T01:01:20.013969" elapsed="0.000306"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:20.014676" 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-10-11T01:01:20.014445" elapsed="0.000256"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:01:20.014884" elapsed="0.000294"/>
</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-10-11T01:01:20.013588" elapsed="0.001646"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:20.003244" elapsed="0.012038"/>
</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-10-11T01:01:19.901957" elapsed="0.113361"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:20.015972" 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-10-11T01:01:20.016156" 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-10-11T01:01:20.015822" elapsed="0.000361"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:20.025892" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:20.025585" elapsed="0.000335"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:01:20.026638" 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-10-11T01:01:20.026435" elapsed="0.000273">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-10-11T01:01:20.026793" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:01:20.026095" elapsed="0.000720"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:20.027323" 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-10-11T01:01:20.026994" elapsed="0.000355"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:20.027645" 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-10-11T01:01:20.027763" 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-10-11T01:01:20.027535" elapsed="0.000254"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:20.028226" 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-10-11T01:01:20.027990" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:01:20.028614" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:20.028338" elapsed="0.000329"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:20.029119" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:20.028842" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:20.028691" elapsed="0.000485"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:20.028319" elapsed="0.000877"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:20.029761" 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-10-11T01:01:20.029363" elapsed="0.000425"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:01:20.029833" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:01:20.029961" 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-10-11T01:01:20.025140" elapsed="0.004846"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:20.030328" 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-10-11T01:01:20.030460" 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-10-11T01:01:20.030190" elapsed="0.000321"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:20.030816" 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-10-11T01:01:20.030928" 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-10-11T01:01:20.030679" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:20.031386" 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-10-11T01:01:20.031165" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:20.031870" 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-10-11T01:01:20.031656" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:20.032343" level="INFO">ffffffffffffffffffffffffffffffff0056020000003fc01609000604e380ac0c7b034001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:20.032130" elapsed="0.000254"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:20.032811" level="INFO">ffffffffffffffffffffffffffffffff00500200000039c01609000604e380ac0c7b034001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:20.032601" elapsed="0.000251"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:01:20.032989" elapsed="0.002305"/>
</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-10-11T01:01:20.035458" elapsed="0.002334"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:20.042820" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:20.042928" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:20.043040" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T01:01:20.038735" elapsed="0.004652">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:20.043586" elapsed="0.000021"/>
</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-10-11T01:01:20.043803" elapsed="0.000022"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T01:01:20.038432" elapsed="0.005512">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:22.054313" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:22.054654" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:22.054891" 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-10-11T01:01:22.045541" elapsed="0.009406"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T01:01:22.055958" 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-10-11T01:01:22.056236" 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-10-11T01:01:22.055360" elapsed="0.000972"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:22.058980" 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-10-11T01:01:22.057757" elapsed="0.001316"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:22.060358" 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-10-11T01:01:22.059459" elapsed="0.000995"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:01:22.060878" elapsed="0.000695"/>
</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-10-11T01:01:22.056815" elapsed="0.004888"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T01:01:22.044581" elapsed="0.017231"/>
</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-10-11T01:01:20.037991" elapsed="2.023915"/>
</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-10-11T01:01:22.062265" elapsed="0.003382"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:22.074677" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:22.074928" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:22.075238" 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-10-11T01:01:22.067757" elapsed="0.007537"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:22.075715" elapsed="0.000849"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:22.084037" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:22.084288" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:01:22.084548" 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-10-11T01:01:22.076926" elapsed="0.007682"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:22.086576" 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-10-11T01:01:22.085979" elapsed="0.000658"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:22.088046" 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-10-11T01:01:22.086974" elapsed="0.001132"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:01:22.089171" 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-10-11T01:01:22.089659" 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-10-11T01:01:22.088548" elapsed="0.001273">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-10-11T01:01:22.085093" elapsed="0.005077">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-10-11T01:01:22.067098" elapsed="0.023476">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-10-11T01:01:24.099812" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:24.100124" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:24.100361" 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-10-11T01:01:24.092181" elapsed="0.008270"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:24.100870" elapsed="0.000909"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:24.108630" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:24.108859" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:01:24.109092" 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-10-11T01:01:24.102169" elapsed="0.006980"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:24.111173" 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-10-11T01:01:24.110580" elapsed="0.000655"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:24.112152" 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-10-11T01:01:24.111615" elapsed="0.000596"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:01:24.112665" elapsed="0.000660"/>
</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-10-11T01:01:24.109650" elapsed="0.003831"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:24.091269" elapsed="0.022326"/>
</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-10-11T01:01:22.066146" elapsed="2.047530"/>
</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-10-11T01:01:24.114800" elapsed="0.003261"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:24.125969" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:24.126229" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:24.126539" 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-10-11T01:01:24.120185" elapsed="0.006415"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:24.126981" elapsed="0.000817"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:24.134527" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:24.134762" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:01:24.134965" 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-10-11T01:01:24.128201" elapsed="0.006844"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:24.137104" 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-10-11T01:01:24.136507" elapsed="0.000669"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:24.138345" 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-10-11T01:01:24.137571" elapsed="0.000885"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:01:24.138899" elapsed="0.000747"/>
</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-10-11T01:01:24.135532" elapsed="0.004243"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:24.119489" elapsed="0.020396"/>
</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-10-11T01:01:24.118563" elapsed="0.021400"/>
</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-10-11T01:01:24.114063" elapsed="0.026082"/>
</kw>
<arg>pmsi_ingress_replication</arg>
<status status="PASS" start="2026-10-11T01:01:20.015522" elapsed="4.124723"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:19.901507" elapsed="4.238981"/>
</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-10-11T01:01:24.144651" elapsed="0.000947"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:01:24.144049" elapsed="0.001668"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:24.147880" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:24.147661" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:24.147616" elapsed="0.000432"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:24.152741" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:24.152552" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:24.152514" elapsed="0.000367"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.154992" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:01:24.154227" elapsed="0.000849"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.156061" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:01:24.155451" elapsed="0.000652"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:01:24.156161" elapsed="0.000047"/>
</return>
<msg time="2026-10-11T01:01:24.156351" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:01:24.153370" elapsed="0.003012"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:24.159981" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:24.159862" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:24.159839" 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-10-11T01:01:24.161811" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:24.161651" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:24.161626" elapsed="0.000422"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:01:24.162790" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:01:24.162266" elapsed="0.000607"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:01:24.163744" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:01:24.163400" elapsed="0.000425"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:01:24.199223" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:01:24.165931" elapsed="0.033469"/>
</kw>
<msg time="2026-10-11T01:01:24.199609" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:01:24.199731" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:24.164266" elapsed="0.035562"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:01:24.235279" 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-10-11T01:01:24.201624" elapsed="0.033801"/>
</kw>
<msg time="2026-10-11T01:01:24.235549" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:01:24.235637" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:24.200402" elapsed="0.035305"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:24.236320" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:24.236005" elapsed="0.000462"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:24.235984" elapsed="0.000540"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.237216" 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-10-11T01:01:24.236718" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:24.237941" elapsed="0.000067"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:24.237526" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:24.237507" elapsed="0.000640"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:01:24.238181" 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-10-11T01:01:24.241817" elapsed="0.000121"/>
</kw>
<msg time="2026-10-11T01:01:24.241978" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:24.241316" 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-10-11T01:01:24.242292" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:24.242582" 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-10-11T01:01:24.240589" elapsed="0.002208"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:01:24.238484" elapsed="0.004392"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:01:24.161221" elapsed="0.081815"/>
</kw>
<msg time="2026-10-11T01:01:24.243122" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:24.243162" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:24.160367" elapsed="0.082831"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:01:24.243354" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:01:24.243267" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:24.243249" elapsed="0.000198"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:24.243861" 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-10-11T01:01:24.244261" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:01:24.244328" 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-10-11T01:01:24.159464" elapsed="0.085007"/>
</kw>
<msg time="2026-10-11T01:01:24.244559" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:24.244599" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:24.156881" elapsed="0.087753"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:24.244927" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:24.244701" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:24.244685" elapsed="0.000315"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:01:24.156679" elapsed="0.088355"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:01:24.156474" elapsed="0.088589"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:01:24.151812" elapsed="0.093302"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:01:24.147042" elapsed="0.098123"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:24.146085" elapsed="0.099121"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:01:24.143212" elapsed="0.102041"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:24.250263" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:24.250426" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:24.250527" 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-10-11T01:01:24.245676" elapsed="0.004874"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:24.250725" elapsed="0.000368"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:24.255215" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:24.255317" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:01:24.255428" 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-10-11T01:01:24.251255" elapsed="0.004200"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:24.256323" 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-10-11T01:01:24.256063" elapsed="0.000287"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:24.256787" 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-10-11T01:01:24.256550" elapsed="0.000263"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:01:24.256996" elapsed="0.000289"/>
</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-10-11T01:01:24.255662" elapsed="0.001680"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:24.245388" elapsed="0.012003"/>
</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-10-11T01:01:24.142157" elapsed="0.115288"/>
</kw>
<kw name="Odl_To_Play_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:24.258149" 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-10-11T01:01:24.258300" 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-10-11T01:01:24.257985" elapsed="0.000342"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:24.258644" 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-10-11T01:01:24.258761" 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-10-11T01:01:24.258507" elapsed="0.000278"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:24.259099" 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-10-11T01:01:24.259214" 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-10-11T01:01:24.258948" elapsed="0.000290"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:01:24.259592" 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-10-11T01:01:24.259399" elapsed="0.000218"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:24.260144" 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-10-11T01:01:24.260264" 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-10-11T01:01:24.259781" elapsed="0.000508"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:01:24.260637" 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-10-11T01:01:24.260467" elapsed="0.000195"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.261093" 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-10-11T01:01:24.260858" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.261572" 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-10-11T01:01:24.261339" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.262069" level="INFO">ffffffffffffffffffffffffffffffff005c0200000045c0160f000704e380010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:24.261842" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.262533" level="INFO">ffffffffffffffffffffffffffffffff0056020000003fc0160f000704e380010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:24.262303" elapsed="0.000271"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:01:24.262713" elapsed="0.002499"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:24.274123" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.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-10-11T01:01:24.274215" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:24.274346" 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-10-11T01:01:24.265376" elapsed="0.009001"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.275112" level="INFO"/>
<arg>${resp.content}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:24.274715" elapsed="0.000449"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:24.281089" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:24.281216" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:24.281315" 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-10-11T01:01:24.275372" elapsed="0.005968"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.281851" 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-10-11T01:01:24.281572" elapsed="0.000324"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:24.288485" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:24.288637" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:24.288727" 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-10-11T01:01:24.282887" elapsed="0.005864"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.289256" 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-10-11T01:01:24.288959" elapsed="0.000342"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:24.289481" elapsed="0.000343"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:01:24.292443" level="INFO">${update} = ffffffffffffffffffffffffffffffff005c0200000045c0160f000704e380010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:01:24.289981" elapsed="0.002491"/>
</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-10-11T01:01:24.292633" elapsed="0.000321"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:01:24.293001" elapsed="0.000057"/>
</return>
<arg>${ALLOWED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:01:24.282560" elapsed="0.010582"/>
</kw>
<msg time="2026-10-11T01:01:24.293215" 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-10-11T01:01:24.282103" elapsed="0.011135"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.293684" level="INFO">ffffffffffffffffffffffffffffffff005c0200000045c0160f000704e380010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${aupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:24.293459" elapsed="0.000268"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.294563" level="INFO">Length is 184.</msg>
<msg time="2026-10-11T01:01:24.294633" 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-10-11T01:01:24.294297" elapsed="0.000358"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.295055" level="INFO">Length is 184.</msg>
<msg time="2026-10-11T01:01:24.295123" 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-10-11T01:01:24.294812" elapsed="0.000333"/>
</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-10-11T01:01:24.295329" elapsed="0.000288"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:01:24.296066" 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-10-11T01:01:24.295768" elapsed="0.000334"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:01:24.296442" 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-10-11T01:01:24.296260" 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-10-11T01:01:24.296649" elapsed="0.000269"/>
</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-10-11T01:01:24.293946" elapsed="0.003027"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:01:24.297127" elapsed="0.002230"/>
</kw>
<kw name="Remove_Configured_Routes">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:24.304981" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:24.305106" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:24.305234" 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-10-11T01:01:24.299878" elapsed="0.005381"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.305764" 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-10-11T01:01:24.305483" elapsed="0.000327"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:24.305976" elapsed="0.000339"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:24.311065" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:24.311173" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:24.311269" 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-10-11T01:01:24.306491" elapsed="0.004802"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.311798" 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-10-11T01:01:24.311520" elapsed="0.000323"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:24.312075" elapsed="0.000325"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="NOT RUN" start="2026-10-11T01:01:24.312651" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:24.312493" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:24.312472" elapsed="0.000241"/>
</if>
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:24.318332" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:24.318374" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:24.318484" 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-10-11T01:01:24.312862" elapsed="0.005647"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:01:24.299584" elapsed="0.018985"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get_Update_Content">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:24.325307" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:24.325428" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:24.325514" 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-10-11T01:01:24.319495" elapsed="0.006043"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.326065" 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-10-11T01:01:24.325775" elapsed="0.000333"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${expected_status_codes}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:24.326270" elapsed="0.000338"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:01:24.329238" level="INFO">${update} = ffffffffffffffffffffffffffffffff0056020000003fc0160f000704e380010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:01:24.326756" elapsed="0.002510"/>
</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-10-11T01:01:24.329443" elapsed="0.000312"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:01:24.329798" elapsed="0.000029"/>
</return>
<arg>${DELETED_STATUS_CODES}</arg>
<doc>Gets received data from odl's peer</doc>
<status status="PASS" start="2026-10-11T01:01:24.319172" elapsed="0.010730"/>
</kw>
<msg time="2026-10-11T01:01:24.329973" 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-10-11T01:01:24.318750" elapsed="0.011246"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.330451" level="INFO">ffffffffffffffffffffffffffffffff0056020000003fc0160f000704e380010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b</msg>
<arg>${wupdate}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:24.330215" elapsed="0.000278"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.331274" level="INFO">Length is 172.</msg>
<msg time="2026-10-11T01:01:24.331341" 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-10-11T01:01:24.331040" elapsed="0.000323"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.331772" level="INFO">Length is 172.</msg>
<msg time="2026-10-11T01:01:24.331839" 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-10-11T01:01:24.331540" elapsed="0.000321"/>
</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-10-11T01:01:24.332052" elapsed="0.000263"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:01:24.332641" 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-10-11T01:01:24.332478" elapsed="0.000186"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:01:24.332960" 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-10-11T01:01:24.332804" elapsed="0.000179"/>
</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-10-11T01:01:24.333193" elapsed="0.000279"/>
</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-10-11T01:01:24.330701" elapsed="0.002826"/>
</kw>
<kw name="Remove_Configured_Routes" type="TEARDOWN">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:24.338274" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:24.338377" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:24.338481" 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-10-11T01:01:24.334062" elapsed="0.004443"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.338986" 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-10-11T01:01:24.338713" elapsed="0.000336"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:24.339211" elapsed="0.000339"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:24.344071" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:24.344209" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:24.344304" 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-10-11T01:01:24.339708" elapsed="0.004620"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.344829" 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-10-11T01:01:24.344554" elapsed="0.000318"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ALLOWED_DELETE_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:24.345052" elapsed="0.000323"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} in ${DELETED_STATUS_CODES}">
<return>
<status status="PASS" start="2026-10-11T01:01:24.345612" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T01:01:24.345462" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:24.345442" elapsed="0.000247"/>
</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-10-11T01:01:24.345837" elapsed="0.000020"/>
</kw>
<doc>Removes the route if present. First GET is for debug purposes.</doc>
<status status="PASS" start="2026-10-11T01:01:24.333754" elapsed="0.012165"/>
</kw>
<arg>pmsi_mldp_mp2mp_lsp</arg>
<status status="PASS" start="2026-10-11T01:01:24.257681" elapsed="0.088286"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:24.141097" elapsed="0.204986"/>
</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-10-11T01:01:24.347999" elapsed="0.000223"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:01:24.347746" 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-10-11T01:01:24.349225" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:24.349124" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:24.349105" elapsed="0.000185"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:24.351382" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:24.351298" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:24.351282" elapsed="0.000180"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.352443" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:01:24.352097" elapsed="0.000373"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.352884" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:01:24.352625" elapsed="0.000282"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:01:24.352947" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:01:24.353090" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:01:24.351675" elapsed="0.001438"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:24.355883" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:24.355797" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:24.355778" elapsed="0.000171"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:24.357185" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:24.357071" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:24.357053" elapsed="0.000284"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:01:24.357870" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:01:24.357514" elapsed="0.000415"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:01:24.358545" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:01:24.358297" elapsed="0.000348"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:01:24.393368" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:01:24.360151" elapsed="0.033350"/>
</kw>
<msg time="2026-10-11T01:01:24.393626" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:01:24.393731" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:24.358955" elapsed="0.034847"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:01:24.430030" 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-10-11T01:01:24.395391" elapsed="0.034777"/>
</kw>
<msg time="2026-10-11T01:01:24.430295" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:01:24.430383" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:24.394202" elapsed="0.036272"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:24.431092" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:24.430770" elapsed="0.000454"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:24.430749" elapsed="0.000530"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.431987" 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-10-11T01:01:24.431487" elapsed="0.000631"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:24.432609" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:24.432288" elapsed="0.000451"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:24.432269" elapsed="0.000527"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:01:24.432829" 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-10-11T01:01:24.436480" elapsed="0.000121"/>
</kw>
<msg time="2026-10-11T01:01:24.436642" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:24.435965" elapsed="0.000741"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:24.436942" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:24.437165" 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-10-11T01:01:24.435089" elapsed="0.002289"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:01:24.433126" 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-10-11T01:01:24.356768" elapsed="0.080883"/>
</kw>
<msg time="2026-10-11T01:01:24.437737" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:24.437777" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:24.356119" elapsed="0.081694"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:01:24.437982" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:01:24.437889" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:24.437870" 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-10-11T01:01:24.438538" 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-10-11T01:01:24.438921" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:01:24.438992" 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-10-11T01:01:24.355503" elapsed="0.083591"/>
</kw>
<msg time="2026-10-11T01:01:24.439215" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:24.439255" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:24.353473" elapsed="0.085817"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:24.439600" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:24.439357" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:24.439341" elapsed="0.000330"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:01:24.353312" elapsed="0.086380"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:01:24.353165" elapsed="0.086557"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:01:24.350989" elapsed="0.088782"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:01:24.348845" elapsed="0.090976"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:24.348439" elapsed="0.091423"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:01:24.347376" elapsed="0.092532"/>
</kw>
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:24.445231" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:24.445368" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:24.445471" 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-10-11T01:01:24.440331" elapsed="0.005165"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:24.445670" elapsed="0.000571"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:24.450826" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:24.450930" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:01:24.451037" 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-10-11T01:01:24.446429" elapsed="0.004633"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:24.451945" 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-10-11T01:01:24.451675" elapsed="0.000297"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:24.452371" 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-10-11T01:01:24.452137" elapsed="0.000260"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:01:24.452601" elapsed="0.000283"/>
</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-10-11T01:01:24.451273" elapsed="0.001667"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:24.440060" elapsed="0.012928"/>
</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-10-11T01:01:24.346887" elapsed="0.106187"/>
</kw>
<kw name="Play_To_Odl_Template">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:24.453730" 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-10-11T01:01:24.453875" 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-10-11T01:01:24.453577" elapsed="0.000324"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.461986" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:24.461680" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:01:24.462735" 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-10-11T01:01:24.462528" elapsed="0.000280">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-10-11T01:01:24.462893" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:01:24.462187" elapsed="0.000729"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.463432" 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-10-11T01:01:24.463109" elapsed="0.000349"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:24.463735" 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-10-11T01:01:24.463851" 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-10-11T01:01:24.463627" elapsed="0.000249"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.464305" 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-10-11T01:01:24.464087" elapsed="0.000265"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:01:24.464687" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:24.464427" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.465207" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:24.464915" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:24.464762" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:24.464395" elapsed="0.000889"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.465850" 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-10-11T01:01:24.465462" elapsed="0.000414"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:01:24.465920" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:01:24.466062" 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-10-11T01:01:24.461243" elapsed="0.004844"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:24.466390" 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-10-11T01:01:24.466551" 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-10-11T01:01:24.466253" elapsed="0.000323"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:24.466877" 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-10-11T01:01:24.466988" 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-10-11T01:01:24.466739" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.467460" 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-10-11T01:01:24.467225" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.467918" 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-10-11T01:01:24.467705" elapsed="0.000259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.468381" level="INFO">ffffffffffffffffffffffffffffffff005c0200000045c0160f000704e380010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
</msg>
<arg>${announce_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:24.468168" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:24.468840" level="INFO">ffffffffffffffffffffffffffffffff0056020000003fc0160f000704e380010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
</msg>
<arg>${withdraw_hex}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:24.468628" elapsed="0.000253"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:01:24.469033" elapsed="0.002663"/>
</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-10-11T01:01:24.471844" elapsed="0.002122"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Loc_Rib_Presence">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:24.478570" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:24.478674" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:24.478763" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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-10-11T01:01:24.474911" elapsed="0.004217">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:24.479312" elapsed="0.000020"/>
</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-10-11T01:01:24.479539" elapsed="0.000022"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="FAIL" start="2026-10-11T01:01:24.474609" elapsed="0.005075">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:26.488845" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:26.489171" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/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-10-11T01:01:26.489386" 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-10-11T01:01:26.481273" elapsed="0.008202"/>
</kw>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T01:01:26.490541" 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-10-11T01:01:26.490793" 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-10-11T01:01:26.489869" elapsed="0.001021"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:26.493305" 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-10-11T01:01:26.492284" elapsed="0.001085"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:26.494678" 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-10-11T01:01:26.493746" elapsed="0.000992"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:01:26.495185" elapsed="0.000664"/>
</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-10-11T01:01:26.491370" elapsed="0.004607"/>
</kw>
<arg>${data_json}</arg>
<doc>Verifies if loc-rib contains expected data</doc>
<status status="PASS" start="2026-10-11T01:01:26.480336" elapsed="0.015847"/>
</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-10-11T01:01:24.474177" elapsed="2.022103"/>
</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-10-11T01:01:26.496640" elapsed="0.003490"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:26.509077" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:26.509313" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:26.509543" 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-10-11T01:01:26.502232" elapsed="0.007373"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:26.510112" elapsed="0.001273"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:26.518004" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:26.518289" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:01:26.518539" 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-10-11T01:01:26.511782" elapsed="0.006818"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:26.520593" 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-10-11T01:01:26.519981" elapsed="0.000673"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:26.522084" 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-10-11T01:01:26.520993" elapsed="0.001154"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:01:26.523249" 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-10-11T01:01:26.523738" 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-10-11T01:01:26.522589" elapsed="0.001309">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-10-11T01:01:26.519078" elapsed="0.005159">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-10-11T01:01:26.501602" elapsed="0.023016">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-10-11T01:01:28.533997" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:28.534311" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:28.534559" 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-10-11T01:01:28.526216" elapsed="0.008399"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:28.535044" elapsed="0.000882"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:28.543001" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:28.543263" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:01:28.543516" 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-10-11T01:01:28.536324" elapsed="0.007249"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:28.545600" 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-10-11T01:01:28.544977" elapsed="0.000684"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:28.546575" 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-10-11T01:01:28.546000" 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-10-11T01:01:28.547078" elapsed="0.000668"/>
</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-10-11T01:01:28.544061" elapsed="0.003810"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:28.525360" elapsed="0.022622"/>
</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-10-11T01:01:26.500633" elapsed="2.047595"/>
</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-10-11T01:01:28.549446" elapsed="0.003776"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Test_Preconditions">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:28.564185" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 path_url=/rests/data/bgp-rib:application-rib=10.30.170.173/tables=odl-bgp-evpn%3Al2vpn-address-family,odl-bgp-evpn%3Aevpn-subsequent-address-family/odl-bgp-evpn:evpn-routes?content=config 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:28.564458" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:28.564765" 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-10-11T01:01:28.558282" elapsed="0.006540"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${DELETED_STATUS_CODES}</arg>
<arg>${resp.status_code}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-11T01:01:28.565236" elapsed="0.000830"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:28.572605" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Type': 'application/json', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:28.572833" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib: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-10-11T01:01:28.573067" 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-10-11T01:01:28.566467" elapsed="0.006658"/>
</kw>
<kw name="Normalize_Jsons_And_Compare" owner="TemplatedRequests">
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:28.575156" 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-10-11T01:01:28.574590" elapsed="0.000627"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:01:28.576130" 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-10-11T01:01:28.575589" 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-10-11T01:01:28.576628" elapsed="0.000665"/>
</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-10-11T01:01:28.573619" elapsed="0.003831"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:28.557590" elapsed="0.019972"/>
</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-10-11T01:01:28.553734" elapsed="0.023905"/>
</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-10-11T01:01:28.548670" elapsed="0.029078"/>
</kw>
<arg>pmsi_mldp_mp2mp_lsp</arg>
<status status="PASS" start="2026-10-11T01:01:24.453263" elapsed="4.124577"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:24.346390" elapsed="4.231678"/>
</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-10-11T01:01:28.581162" elapsed="0.000485"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:01:28.580574" elapsed="0.001186"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:28.583900" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:28.583689" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:28.583643" elapsed="0.000441"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:28.588787" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:28.588602" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:28.588564" elapsed="0.000363"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:28.591133" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:01:28.590283" elapsed="0.000909"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:01:28.592204" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:01:28.591568" elapsed="0.000691"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:01:28.592348" elapsed="0.000099"/>
</return>
<msg time="2026-10-11T01:01:28.592680" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:01:28.589448" elapsed="0.003285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:28.596781" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:28.596663" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:28.596638" elapsed="0.000230"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:28.598473" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:28.598325" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:28.598300" elapsed="0.000262"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:01:28.599009" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:01:28.598772" elapsed="0.000306"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:01:28.599533" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:01:28.599313" elapsed="0.000253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:01:28.633899" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:01:28.600268" elapsed="0.033801"/>
</kw>
<msg time="2026-10-11T01:01:28.634355" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:01:28.634434" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:28.599787" elapsed="0.034688"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:01:28.666808" 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-10-11T01:01:28.635003" elapsed="0.031908"/>
</kw>
<msg time="2026-10-11T01:01:28.667075" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:01:28.667117" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:28.634650" elapsed="0.032502"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:28.667458" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:28.667222" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:28.667204" elapsed="0.000328"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:28.667946" 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-10-11T01:01:28.667715" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:28.668294" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:28.668093" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:28.668073" elapsed="0.000292"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:01:28.668395" 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-10-11T01:01:28.670865" elapsed="0.000115"/>
</kw>
<msg time="2026-10-11T01:01:28.671051" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:28.669795" 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-10-11T01:01:28.671513" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:28.671849" 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-10-11T01:01:28.669184" 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-10-11T01:01:28.668703" elapsed="0.003406"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:01:28.597942" elapsed="0.074241"/>
</kw>
<msg time="2026-10-11T01:01:28.672264" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:28.672303" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:28.597101" elapsed="0.075237"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:01:28.672516" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:01:28.672428" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:28.672389" elapsed="0.000204"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:28.672917" elapsed="0.000054"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:28.673270" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:01:28.673335" 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-10-11T01:01:28.596237" elapsed="0.077209"/>
</kw>
<msg time="2026-10-11T01:01:28.673532" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:28.673572" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:28.593435" elapsed="0.080172"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:28.673896" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:28.673675" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:28.673659" elapsed="0.000307"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:01:28.593200" elapsed="0.080788"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:01:28.592843" elapsed="0.081189"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:01:28.587885" elapsed="0.086200"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:01:28.583078" elapsed="0.091056"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:28.582124" elapsed="0.092050"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:01:28.579736" elapsed="0.094485"/>
</kw>
<kw name="Kill_BGP_Speaker" owner="BGPSpeaker">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:28.675672" 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-10-11T01:01:28.675178" elapsed="0.000521"/>
</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-10-11T01:01:28.675856" 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-10-11T01:01:28.674880" elapsed="0.001250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:01:28.705878" level="INFO">^C
[?2004h[jenkins@releng-26932-423-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-10-11T01:01:28.676663" elapsed="0.029271"/>
</kw>
<msg time="2026-10-11T01:01:28.706032" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:28.706073" level="INFO">${message} = ^C
[?2004h[jenkins@releng-26932-423-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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:28.676299" elapsed="0.029798"/>
</kw>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:28.706715" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-10-11T01:01:28.720124" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:01:28.720258" level="INFO">${output_log} = 2026-10-11 00:58:30,067 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:58:30,068 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 00:58:30,068 DEBUG BGP-Threa...</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-10-11T01:01:28.706599" elapsed="0.013685"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:28.720809" level="INFO">2026-10-11 00:58:30,067 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:58:30,068 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 00:58:30,068 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 00:58:30,068 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 00:58:30,068 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 00:58:30,069 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:58:30,072 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:58:30,072 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400010080010400190046400200b44700
2026-10-11 00:58:30,072 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:58:30,072 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-10-11 00:58:30,073 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-10-11 00:58:30,073 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 00:58:30,073 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 00:58:30,073 INFO BGP-Thread-1 (job):   My BGP Identifier: 169782023
2026-10-11 00:58:30,073 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 00:58:30,073 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 00:58:30,073 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 00:58:30,073 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 00:58:30,073 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 00:58:30,073 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 00:58:30,073 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-10-11 00:58:30,073 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-10-11 00:58:30,073 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 00:58:30,073 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 00:58:30,073 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 00:58:30,073 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:58:30,074 DEBUG BGP-Thread-1 (job):   Length=53 (0x0035)
2026-10-11 00:58:30,074 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 00:58:30,074 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 00:58:30,074 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-10-11 00:58:30,074 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 00:58:30,074 DEBUG BGP-Thread-1 (job):   BGP Identifier=169782023 (0x0a1eab07)
2026-10-11 00:58:30,074 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=24 (0x18)
2026-10-11 00:58:30,074 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x02060104000100010206010400190046020641040000fbf0
2026-10-11 00:58:30,074 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff00350104fbf000b40a1eab071802060104000100010206010400190046020641040000fbf0'
2026-10-11 00:58:30,074 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff00350104fbf000b40a1eab071802060104000100010206010400190046020641040000fbf0
2026-10-11 00:58:30,076 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:58:30,076 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:58:30,076 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:58:30,076 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:58:30,076 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:58:30,077 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:58:30,077 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:58:30,077 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:58:30,077 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:58:30,077 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:58:30,077 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 00:58:30,077 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:30,077 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:30,077 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:30,084 INFO BGP-Thread-1 (job): ... idle for 0.006s
2026-10-11 00:58:30,084 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.006s
2026-10-11 00:58:30,084 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 00:58:30,084 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:30,084 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:30,084 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 00:58:30,084 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:58:30,084 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:58:30,085 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03001946
2026-10-11 00:58:30,085 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:30,085 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:30,085 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 00:58:30,085 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:58:30,085 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:58:30,085 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:30,085 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:30,085 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:31,087 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:31,087 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.008s
2026-10-11 00:58:31,087 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:31,087 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:31,087 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:32,088 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:32,089 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 2.009s
2026-10-11 00:58:32,089 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:32,089 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:32,089 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:33,090 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:33,091 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 3.010s
2026-10-11 00:58:33,091 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:33,091 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:33,091 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:34,092 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:34,093 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 4.011s
2026-10-11 00:58:34,093 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:34,093 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:34,093 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:35,094 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:35,094 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 5.012s
2026-10-11 00:58:35,095 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:35,095 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:35,095 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:36,096 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:36,096 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.013s
2026-10-11 00:58:36,096 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:36,096 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:36,097 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:36] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:36] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:36,160 INFO BGP-Thread-1 (job): ... idle for 0.064s
2026-10-11 00:58:36,161 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.077s
2026-10-11 00:58:36,161 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-10-11 00:58:36,161 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:36,161 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:36,161 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-10-11 00:58:36,161 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:58:36,161 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:58:36,161 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:36,161 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:36,161 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:37,163 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:37,163 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 7.078s
2026-10-11 00:58:37,163 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:37,163 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:37,163 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:38] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:38,164 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:38,165 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.079s
2026-10-11 00:58:38,165 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:38,165 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:38,165 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:38] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:38,207 INFO BGP-Thread-1 (job): ... idle for 0.042s
2026-10-11 00:58:38,207 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.121s
2026-10-11 00:58:38,207 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 00:58:38,207 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:38,207 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:38,207 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-10-11 00:58:38,207 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:58:38,207 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:58:38,208 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:38,208 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:38,208 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:38] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:38] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:38] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:39,209 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:39,209 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 9.122s
2026-10-11 00:58:39,209 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-10-11 00:58:39,210 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:39,210 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:39,210 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:40,211 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:40,212 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.123s
2026-10-11 00:58:40,212 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:40,212 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:40,212 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:40] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:41,213 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:41,214 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 11.124s
2026-10-11 00:58:41,214 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 00:58:41,214 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:41,214 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:41,214 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:42,215 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:42,218 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 12.125s
2026-10-11 00:58:42,218 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:42,218 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:42,219 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:42] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:42] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:42,643 INFO BGP-Thread-1 (job): ... idle for 0.424s
2026-10-11 00:58:42,643 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 12.550s
2026-10-11 00:58:42,643 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 00:58:42,643 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a62900041700021999999900010501010101000007d000202b2b2b2b
2026-10-11 00:58:42,643 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:42,643 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:42,643 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-10-11 00:58:42,644 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:58:42,644 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:58:42,644 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:42,644 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:42,644 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:42] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:42] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:42,692 INFO BGP-Thread-1 (job): ... idle for 0.048s
2026-10-11 00:58:42,692 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 12.597s
2026-10-11 00:58:42,692 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c001946041700021999999900010501010101000007d000202b2b2b2b
2026-10-11 00:58:42,692 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:42,692 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:42,692 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-10-11 00:58:42,692 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:58:42,692 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:58:42,692 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:42,693 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:42,693 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:42] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:42] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:42] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:43,694 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:43,694 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 13.599s
2026-10-11 00:58:43,694 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a62900041700021999999900010501010101000007d000202b2b2b2b
2026-10-11 00:58:43,694 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:43,694 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:43,694 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:44,696 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:44,696 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 14.600s
2026-10-11 00:58:44,696 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:44,696 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:44,696 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:44] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:45,697 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:45,698 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 15.601s
2026-10-11 00:58:45,698 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c001946041700021999999900010501010101000007d000202b2b2b2b
2026-10-11 00:58:45,698 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:45,698 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:45,698 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:46,699 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:46,700 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 16.602s
2026-10-11 00:58:46,700 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:46,700 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:46,700 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:46] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:47] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:47,148 INFO BGP-Thread-1 (job): ... idle for 0.448s
2026-10-11 00:58:47,148 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 17.050s
2026-10-11 00:58:47,148 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c001946041700021999999900010501010101000007d000202b2b2b2b
2026-10-11 00:58:47,148 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000101f20cdd809ff7001600202b2b2b2b
2026-10-11 00:58:47,148 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:47,149 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:47,149 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-10-11 00:58:47,149 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:58:47,149 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:58:47,149 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:47,149 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:47,149 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:47] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:47] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:47,191 INFO BGP-Thread-1 (job): ... idle for 0.042s
2026-10-11 00:58:47,191 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 17.092s
2026-10-11 00:58:47,191 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000101f20cdd809ff7001600202b2b2b2b
2026-10-11 00:58:47,191 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:47,191 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:47,191 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-10-11 00:58:47,192 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:58:47,192 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:58:47,192 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:47,192 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:47,192 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:47] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:47] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:47] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:48,193 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:48,193 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 18.093s
2026-10-11 00:58:48,193 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000101f20cdd809ff7001600202b2b2b2b
2026-10-11 00:58:48,194 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:48,194 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:48,194 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:49,195 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:49,195 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 19.094s
2026-10-11 00:58:49,195 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:49,195 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:49,195 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:49] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:50,197 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:50,197 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.095s
2026-10-11 00:58:50,197 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000101f20cdd809ff7001600202b2b2b2b
2026-10-11 00:58:50,197 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:50,197 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:50,197 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:51,198 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:51,199 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 21.096s
2026-10-11 00:58:51,199 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:51,199 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:51,199 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:51] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:51] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:51,652 INFO BGP-Thread-1 (job): ... idle for 0.453s
2026-10-11 00:58:51,652 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 21.549s
2026-10-11 00:58:51,652 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000101f20cdd809ff7001600202b2b2b2b
2026-10-11 00:58:51,652 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000102f20cdd809ff7001400202b2b2b2b
2026-10-11 00:58:51,652 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:51,652 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:51,652 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-10-11 00:58:51,653 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:58:51,653 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:58:51,653 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:51,653 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:51,653 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:51] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:51] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:51,701 INFO BGP-Thread-1 (job): ... idle for 0.048s
2026-10-11 00:58:51,702 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 21.597s
2026-10-11 00:58:51,702 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000102f20cdd809ff7001400202b2b2b2b
2026-10-11 00:58:51,702 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:51,702 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:51,702 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-10-11 00:58:51,702 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:58:51,702 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:58:51,702 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:51,702 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:51,702 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:51] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:51] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:51] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:52,704 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:52,707 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 22.598s
2026-10-11 00:58:52,707 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000102f20cdd809ff7001400202b2b2b2b
2026-10-11 00:58:52,708 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:52,708 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:52,708 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:53,709 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:53,709 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 23.599s
2026-10-11 00:58:53,709 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:53,709 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:53,709 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:53] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:54,710 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:54,711 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 24.601s
2026-10-11 00:58:54,711 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000102f20cdd809ff7001400202b2b2b2b
2026-10-11 00:58:54,711 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:54,711 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:54,711 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:55,712 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:55,712 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 25.602s
2026-10-11 00:58:55,713 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:55,713 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:55,713 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:55] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:56] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:56,119 INFO BGP-Thread-1 (job): ... idle for 0.406s
2026-10-11 00:58:56,119 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 26.008s
2026-10-11 00:58:56,119 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000102f20cdd809ff7001400202b2b2b2b
2026-10-11 00:58:56,120 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000103f20cdd809ff70007d0202b2b2b2b
2026-10-11 00:58:56,120 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:56,120 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:56,120 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-10-11 00:58:56,120 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:58:56,120 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:58:56,120 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:56,120 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:56,120 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:56] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:56] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:56,157 INFO BGP-Thread-1 (job): ... idle for 0.037s
2026-10-11 00:58:56,157 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 26.045s
2026-10-11 00:58:56,157 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000103f20cdd809ff70007d0202b2b2b2b
2026-10-11 00:58:56,157 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:56,158 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:56,158 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-10-11 00:58:56,158 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:58:56,158 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:58:56,158 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:56,158 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:56,158 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:56] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:56] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:56] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:57,159 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:57,159 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 27.046s
2026-10-11 00:58:57,160 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000103f20cdd809ff70007d0202b2b2b2b
2026-10-11 00:58:57,160 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:57,160 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:57,160 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:58,161 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:58,161 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 28.047s
2026-10-11 00:58:58,161 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:58,161 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:58,162 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:58] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:59,163 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:59,163 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 29.048s
2026-10-11 00:58:59,163 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000103f20cdd809ff70007d0202b2b2b2b
2026-10-11 00:58:59,163 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:59,163 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:59,164 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:00,165 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:00,165 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 30.049s
2026-10-11 00:59:00,165 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:00,165 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:00,165 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:00] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:00] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:00,573 INFO BGP-Thread-1 (job): ... idle for 0.408s
2026-10-11 00:59:00,573 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 30.457s
2026-10-11 00:59:00,574 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000103f20cdd809ff70007d0202b2b2b2b
2026-10-11 00:59:00,574 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a6290004170002199999990001042b2b2b2b000007d000202b2b2b2b
2026-10-11 00:59:00,574 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:00,574 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:00,574 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-10-11 00:59:00,574 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:00,574 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:00,574 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:00,574 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:00,574 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:00] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:00] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:00,619 INFO BGP-Thread-1 (job): ... idle for 0.045s
2026-10-11 00:59:00,619 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 30.502s
2026-10-11 00:59:00,619 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c00194604170002199999990001042b2b2b2b000007d000202b2b2b2b
2026-10-11 00:59:00,619 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:00,619 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:00,620 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-10-11 00:59:00,620 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:00,620 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:00,620 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:00,620 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:00,620 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:00] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:00] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:00] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:01,621 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:01,621 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 31.503s
2026-10-11 00:59:01,622 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a6290004170002199999990001042b2b2b2b000007d000202b2b2b2b
2026-10-11 00:59:01,622 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:01,622 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:01,622 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:02,623 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:02,623 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 32.504s
2026-10-11 00:59:02,623 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:02,623 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:02,623 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:02] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:03,625 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:03,625 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 33.505s
2026-10-11 00:59:03,625 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c00194604170002199999990001042b2b2b2b000007d000202b2b2b2b
2026-10-11 00:59:03,625 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:03,626 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:03,626 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:04,627 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:04,627 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 34.506s
2026-10-11 00:59:04,627 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:04,627 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:04,627 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:05] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:05,033 INFO BGP-Thread-1 (job): ... idle for 0.405s
2026-10-11 00:59:05,033 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 34.912s
2026-10-11 00:59:05,033 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c00194604170002199999990001042b2b2b2b000007d000202b2b2b2b
2026-10-11 00:59:05,033 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001000000000000000000000000000a05dc10
2026-10-11 00:59:05,033 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:05,033 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:05,033 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004c' (76)
2026-10-11 00:59:05,033 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:05,033 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:05,034 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:05,034 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:05,034 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:05] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:05] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:05,076 INFO BGP-Thread-1 (job): ... idle for 0.042s
2026-10-11 00:59:05,076 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 34.954s
2026-10-11 00:59:05,077 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001000000000000000000000000000a05dc10
2026-10-11 00:59:05,077 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:05,077 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:05,077 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-10-11 00:59:05,077 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:05,077 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:05,077 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:05,077 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:05,077 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:05] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:05] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:05] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:06,078 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:06,079 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 35.955s
2026-10-11 00:59:06,079 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001000000000000000000000000000a05dc10
2026-10-11 00:59:06,079 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:06,079 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:06,079 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:07,080 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:07,080 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 36.956s
2026-10-11 00:59:07,080 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:07,081 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:07,081 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:07] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:08,082 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:08,082 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 37.957s
2026-10-11 00:59:08,082 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001000000000000000000000000000a05dc10
2026-10-11 00:59:08,082 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:08,082 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:08,082 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:09,084 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:09,084 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 38.958s
2026-10-11 00:59:09,084 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:09,084 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:09,084 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:09] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:09,498 INFO BGP-Thread-1 (job): ... idle for 0.414s
2026-10-11 00:59:09,498 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 39.372s
2026-10-11 00:59:09,499 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001000000000000000000000000000a05dc10
2026-10-11 00:59:09,499 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a62900011900021999999900010501010101000007d0000000000a05dc10
2026-10-11 00:59:09,499 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:09,499 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:09,499 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004c' (76)
2026-10-11 00:59:09,499 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:09,499 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:09,499 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:09,499 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:09,499 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:09] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:09,550 INFO BGP-Thread-1 (job): ... idle for 0.051s
2026-10-11 00:59:09,550 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 39.423s
2026-10-11 00:59:09,550 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e001946011900021999999900010501010101000007d0000000000a05dc10
2026-10-11 00:59:09,551 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:09,551 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:09,551 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-10-11 00:59:09,551 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:09,551 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:09,551 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:09,551 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:09,551 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:09] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:10,552 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:10,552 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 40.424s
2026-10-11 00:59:10,553 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a62900011900021999999900010501010101000007d0000000000a05dc10
2026-10-11 00:59:10,553 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:10,553 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:10,553 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:11,554 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:11,554 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 41.425s
2026-10-11 00:59:11,554 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:11,554 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:11,555 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:11] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:12,556 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:12,556 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 42.426s
2026-10-11 00:59:12,556 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e001946011900021999999900010501010101000007d0000000000a05dc10
2026-10-11 00:59:12,556 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:12,556 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:12,556 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:13,558 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:13,558 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 43.428s
2026-10-11 00:59:13,558 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:13,558 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:13,558 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:13] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:13] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:13,999 INFO BGP-Thread-1 (job): ... idle for 0.441s
2026-10-11 00:59:13,999 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 43.869s
2026-10-11 00:59:14,000 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e001946011900021999999900010501010101000007d0000000000a05dc10
2026-10-11 00:59:14,000 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10
2026-10-11 00:59:14,000 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:14,000 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:14,000 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004c' (76)
2026-10-11 00:59:14,000 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:14,000 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:14,000 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:14,000 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:14,000 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:14] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:14] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:14,045 INFO BGP-Thread-1 (job): ... idle for 0.045s
2026-10-11 00:59:14,045 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 43.914s
2026-10-11 00:59:14,045 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10
2026-10-11 00:59:14,045 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:14,046 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:14,046 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-10-11 00:59:14,046 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:14,046 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:14,046 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:14,046 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:14,046 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:14] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:14] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:14] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:15,047 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:15,048 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 44.915s
2026-10-11 00:59:15,048 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10
2026-10-11 00:59:15,048 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:15,048 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:15,048 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:16,049 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:16,050 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 45.916s
2026-10-11 00:59:16,050 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:16,050 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:16,050 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:16] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:17,051 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:17,051 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 46.917s
2026-10-11 00:59:17,051 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10
2026-10-11 00:59:17,052 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:17,052 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:17,052 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:18,053 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:18,053 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 47.918s
2026-10-11 00:59:18,053 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:18,053 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:18,053 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:18] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:18] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:18,458 INFO BGP-Thread-1 (job): ... idle for 0.404s
2026-10-11 00:59:18,458 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 48.322s
2026-10-11 00:59:18,458 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10
2026-10-11 00:59:18,458 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000
2026-10-11 00:59:18,458 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:18,458 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:18,458 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0057' (87)
2026-10-11 00:59:18,458 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:18,458 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:18,458 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:18,458 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:18,459 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:18] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:18] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:18,497 INFO BGP-Thread-1 (job): ... idle for 0.038s
2026-10-11 00:59:18,497 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 48.360s
2026-10-11 00:59:18,497 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000
2026-10-11 00:59:18,497 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:18,497 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:18,497 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-10-11 00:59:18,498 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:18,498 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:18,498 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:18,498 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:18,498 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:18] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:18] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:18] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:19,499 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:19,503 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 49.361s
2026-10-11 00:59:19,503 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000
2026-10-11 00:59:19,503 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:19,503 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:19,503 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:20,505 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:20,505 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 50.363s
2026-10-11 00:59:20,505 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:20,505 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:20,505 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:20] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:21,506 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:21,507 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 51.364s
2026-10-11 00:59:21,507 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000
2026-10-11 00:59:21,507 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:21,507 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:21,507 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:22,509 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:22,509 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 52.365s
2026-10-11 00:59:22,509 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:22,509 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:22,509 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:22] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:22,915 INFO BGP-Thread-1 (job): ... idle for 0.405s
2026-10-11 00:59:22,915 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 52.770s
2026-10-11 00:59:22,915 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000
2026-10-11 00:59:22,915 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10
2026-10-11 00:59:22,915 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:22,915 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:22,915 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0057' (87)
2026-10-11 00:59:22,915 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:22,915 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:22,916 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:22,916 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:22,916 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:22] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:22,950 INFO BGP-Thread-1 (job): ... idle for 0.034s
2026-10-11 00:59:22,950 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 52.805s
2026-10-11 00:59:22,951 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10
2026-10-11 00:59:22,951 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:22,951 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:22,951 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-10-11 00:59:22,951 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:22,951 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:22,951 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:22,951 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:22,951 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:23] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:23] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:23,953 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:23,953 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 53.806s
2026-10-11 00:59:23,953 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10
2026-10-11 00:59:23,953 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:23,953 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:23,953 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:24,955 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:24,956 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 54.807s
2026-10-11 00:59:24,957 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:24,957 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:24,957 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:25] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:25,958 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:25,958 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 55.808s
2026-10-11 00:59:25,959 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10
2026-10-11 00:59:25,959 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:25,959 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:25,959 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:26,960 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:26,961 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 56.809s
2026-10-11 00:59:26,961 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:26,961 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:26,961 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:27] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:27] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:27,384 INFO BGP-Thread-1 (job): ... idle for 0.423s
2026-10-11 00:59:27,384 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 57.232s
2026-10-11 00:59:27,385 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10
2026-10-11 00:59:27,385 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8
2026-10-11 00:59:27,385 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:27,385 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:27,385 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0057' (87)
2026-10-11 00:59:27,385 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:27,385 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:27,385 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:27,385 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:27,385 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:27] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:27] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:27,421 INFO BGP-Thread-1 (job): ... idle for 0.035s
2026-10-11 00:59:27,421 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 57.268s
2026-10-11 00:59:27,421 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8
2026-10-11 00:59:27,421 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:27,421 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:27,421 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-10-11 00:59:27,421 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:27,422 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:27,422 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:27,422 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:27,422 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:27] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:27] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:27] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:28,423 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:28,423 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 58.269s
2026-10-11 00:59:28,423 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8
2026-10-11 00:59:28,424 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:28,424 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:28,424 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:29,425 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:29,425 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 59.270s
2026-10-11 00:59:29,426 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:29,426 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:29,426 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:29] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:30,427 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:30,427 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 60.271s
2026-10-11 00:59:30,427 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8
2026-10-11 00:59:30,427 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:30,428 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:30,428 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:31,429 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:31,429 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 61.272s
2026-10-11 00:59:31,429 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:31,430 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:31,430 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:31] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:31] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:31] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:31,860 INFO BGP-Thread-1 (job): ... idle for 0.430s
2026-10-11 00:59:31,860 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 61.702s
2026-10-11 00:59:31,861 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8
2026-10-11 00:59:31,861 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000
2026-10-11 00:59:31,861 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:31,861 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:31,861 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0057' (87)
2026-10-11 00:59:31,861 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:31,861 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:31,861 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:31,861 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:31,861 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:32,863 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:32,863 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 62.704s
2026-10-11 00:59:32,863 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:32,863 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:32,863 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:33,864 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:33,864 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 63.705s
2026-10-11 00:59:33,865 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:33,865 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:33,865 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:33] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:33] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:33,929 INFO BGP-Thread-1 (job): ... idle for 0.065s
2026-10-11 00:59:33,930 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 63.769s
2026-10-11 00:59:33,930 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000
2026-10-11 00:59:33,930 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:33,930 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:33,930 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-10-11 00:59:33,930 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:33,930 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:33,930 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:33,930 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:33,930 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:33] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:34] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:34] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:34,932 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:34,932 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 64.770s
2026-10-11 00:59:34,932 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000
2026-10-11 00:59:34,932 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:34,932 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:34,932 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:35,934 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:35,936 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 65.772s
2026-10-11 00:59:35,936 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:35,936 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:35,936 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:36] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:36,937 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:36,938 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 66.773s
2026-10-11 00:59:36,938 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000
2026-10-11 00:59:36,938 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:36,938 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:36,938 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:37,939 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:37,940 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 67.774s
2026-10-11 00:59:37,940 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:37,940 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:37,940 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:38] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:38] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:38] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:38,410 INFO BGP-Thread-1 (job): ... idle for 0.470s
2026-10-11 00:59:38,410 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 68.244s
2026-10-11 00:59:38,410 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000
2026-10-11 00:59:38,410 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8
2026-10-11 00:59:38,410 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:38,410 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:38,410 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0057' (87)
2026-10-11 00:59:38,410 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:38,411 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:38,411 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:38,411 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:38,411 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:39,412 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:39,412 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 69.245s
2026-10-11 00:59:39,412 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:39,412 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:39,413 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:40,414 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:40,414 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 70.246s
2026-10-11 00:59:40,414 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:40,414 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:40,414 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:40] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:40,485 INFO BGP-Thread-1 (job): ... idle for 0.070s
2026-10-11 00:59:40,485 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 70.316s
2026-10-11 00:59:40,485 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8
2026-10-11 00:59:40,485 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:40,485 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:40,485 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-10-11 00:59:40,485 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:40,485 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:40,485 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:40,485 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:40,486 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:40] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:41,487 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:41,487 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 71.317s
2026-10-11 00:59:41,487 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8
2026-10-11 00:59:41,487 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:41,487 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:41,487 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:42,489 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:42,489 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 72.318s
2026-10-11 00:59:42,489 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:42,489 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:42,489 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:42] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:43,490 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:43,490 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 73.319s
2026-10-11 00:59:43,491 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8
2026-10-11 00:59:43,491 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:43,491 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:43,491 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:44,492 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:44,492 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 74.321s
2026-10-11 00:59:44,492 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:44,492 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:44,493 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:44] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:44] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:44,915 INFO BGP-Thread-1 (job): ... idle for 0.422s
2026-10-11 00:59:44,915 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 74.743s
2026-10-11 00:59:44,915 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8
2026-10-11 00:59:44,915 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000102f20cdd809ff70014000000000a05dc10
2026-10-11 00:59:44,915 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:44,915 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:44,916 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004c' (76)
2026-10-11 00:59:44,916 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:44,916 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:44,916 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:44,916 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:44,916 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:44] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:44] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:44,953 INFO BGP-Thread-1 (job): ... idle for 0.037s
2026-10-11 00:59:44,953 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 74.780s
2026-10-11 00:59:44,953 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000102f20cdd809ff70014000000000a05dc10
2026-10-11 00:59:44,953 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:44,954 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:44,954 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-10-11 00:59:44,954 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:44,954 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:44,954 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:44,954 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:44,954 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:44] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:45] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:45] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:45,955 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:45,955 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 75.781s
2026-10-11 00:59:45,955 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000102f20cdd809ff70014000000000a05dc10
2026-10-11 00:59:45,956 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:45,956 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:45,956 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:46,957 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:46,957 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 76.782s
2026-10-11 00:59:46,957 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:46,957 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:46,957 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:47] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:47,959 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:47,959 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 77.783s
2026-10-11 00:59:47,959 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000102f20cdd809ff70014000000000a05dc10
2026-10-11 00:59:47,959 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:47,959 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:47,959 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:48,961 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:48,961 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 78.784s
2026-10-11 00:59:48,961 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:48,961 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:48,961 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:49] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:49] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:49,350 INFO BGP-Thread-1 (job): ... idle for 0.389s
2026-10-11 00:59:49,350 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 79.173s
2026-10-11 00:59:49,350 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000102f20cdd809ff70014000000000a05dc10
2026-10-11 00:59:49,351 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000103f20cdd809ff70007d00000000a05dc10
2026-10-11 00:59:49,351 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:49,351 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:49,351 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004c' (76)
2026-10-11 00:59:49,351 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:49,351 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:49,351 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:49,351 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:49,351 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:49] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:49] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:49,393 INFO BGP-Thread-1 (job): ... idle for 0.041s
2026-10-11 00:59:49,393 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 79.215s
2026-10-11 00:59:49,393 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000103f20cdd809ff70007d00000000a05dc10
2026-10-11 00:59:49,393 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:49,393 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:49,393 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-10-11 00:59:49,393 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:49,394 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:49,394 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:49,394 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:49,394 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:49] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:49] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:49] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:50,395 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:50,395 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 80.216s
2026-10-11 00:59:50,395 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000103f20cdd809ff70007d00000000a05dc10
2026-10-11 00:59:50,395 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:50,395 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:50,395 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:51,397 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:51,397 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 81.217s
2026-10-11 00:59:51,397 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:51,397 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:51,397 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:51] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:52,398 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:52,399 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 82.218s
2026-10-11 00:59:52,399 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000103f20cdd809ff70007d00000000a05dc10
2026-10-11 00:59:52,399 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:52,399 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:52,399 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:53,400 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:53,400 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 83.219s
2026-10-11 00:59:53,400 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:53,401 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:53,401 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:53] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:53] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:53,791 INFO BGP-Thread-1 (job): ... idle for 0.390s
2026-10-11 00:59:53,791 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 83.609s
2026-10-11 00:59:53,791 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000103f20cdd809ff70007d00000000a05dc10
2026-10-11 00:59:53,791 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001042b2b2b2b000007d0000000000a05dc10
2026-10-11 00:59:53,791 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:53,791 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:53,791 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004c' (76)
2026-10-11 00:59:53,791 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:53,792 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:53,792 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:53,792 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:53,792 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:53] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:53] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:53,831 INFO BGP-Thread-1 (job): ... idle for 0.039s
2026-10-11 00:59:53,831 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 83.648s
2026-10-11 00:59:53,831 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001042b2b2b2b000007d0000000000a05dc10
2026-10-11 00:59:53,831 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:53,831 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:53,831 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-10-11 00:59:53,831 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:53,831 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:53,832 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:53,832 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:53,832 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:53] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:53] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:53] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:54,833 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:54,833 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 84.649s
2026-10-11 00:59:54,833 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001042b2b2b2b000007d0000000000a05dc10
2026-10-11 00:59:54,833 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:54,833 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:54,834 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:55,835 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:55,835 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 85.650s
2026-10-11 00:59:55,835 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:55,835 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:55,835 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:56] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:56,836 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:56,837 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 86.651s
2026-10-11 00:59:56,837 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001042b2b2b2b000007d0000000000a05dc10
2026-10-11 00:59:56,837 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:56,837 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:56,837 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:57,838 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:57,838 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 87.653s
2026-10-11 00:59:57,839 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:57,839 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:57,839 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:58] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:58] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:58,225 INFO BGP-Thread-1 (job): ... idle for 0.386s
2026-10-11 00:59:58,225 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 88.039s
2026-10-11 00:59:58,225 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001042b2b2b2b000007d0000000000a05dc10
2026-10-11 00:59:58,225 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-10-11 00:59:58,225 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:58,226 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:58,226 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-10-11 00:59:58,226 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:58,226 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:58,226 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:58,226 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:58,226 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:58] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:58] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:58,265 INFO BGP-Thread-1 (job): ... idle for 0.039s
2026-10-11 00:59:58,266 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 88.078s
2026-10-11 00:59:58,266 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 00:59:58,266 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:58,266 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:58,266 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-10-11 00:59:58,266 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:58,266 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:58,266 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:58,266 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:58,266 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:58] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:58] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:58] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:59,268 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:59,268 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 89.079s
2026-10-11 00:59:59,268 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-10-11 00:59:59,268 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:59,268 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:59,268 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:00,269 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:00,270 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 90.080s
2026-10-11 01:00:00,270 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:00,270 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:00,270 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:00] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:01,271 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:01,271 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 91.081s
2026-10-11 01:00:01,271 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:01,271 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:01,271 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:01,272 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:02,273 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:02,273 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 92.082s
2026-10-11 01:00:02,273 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:02,273 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:02,273 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:02] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:02] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:02,667 INFO BGP-Thread-1 (job): ... idle for 0.394s
2026-10-11 01:00:02,667 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 92.476s
2026-10-11 01:00:02,667 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:02,668 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:02,668 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:02,668 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:02,668 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-10-11 01:00:02,668 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:02,668 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:02,668 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:02,668 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:02,668 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:02] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:02] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:02,710 INFO BGP-Thread-1 (job): ... idle for 0.042s
2026-10-11 01:00:02,710 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 92.518s
2026-10-11 01:00:02,710 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:02,711 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:02,711 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:02,711 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-10-11 01:00:02,711 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:02,711 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:02,711 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:02,711 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:02,711 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:02] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:02] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:02] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:03,712 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:03,712 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 93.519s
2026-10-11 01:00:03,713 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:03,713 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:03,713 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:03,713 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:04,714 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:04,714 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 94.520s
2026-10-11 01:00:04,714 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:04,714 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:04,714 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:04] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:05,716 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:05,716 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 95.521s
2026-10-11 01:00:05,716 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:05,716 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:05,716 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:05,716 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:06,718 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:06,718 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 96.522s
2026-10-11 01:00:06,718 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:06,718 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:06,718 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:06] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:07] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:07,131 INFO BGP-Thread-1 (job): ... idle for 0.413s
2026-10-11 01:00:07,131 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 96.935s
2026-10-11 01:00:07,131 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:07,131 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:07,131 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:07,131 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:07,131 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-10-11 01:00:07,131 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:07,132 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:07,132 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:07,132 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:07,132 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:07] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:07] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:07,170 INFO BGP-Thread-1 (job): ... idle for 0.038s
2026-10-11 01:00:07,170 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 96.973s
2026-10-11 01:00:07,171 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:07,171 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:07,171 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:07,171 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-10-11 01:00:07,171 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:07,171 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:07,171 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:07,171 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:07,171 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:07] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:07] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:07] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:08,172 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:08,173 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 97.974s
2026-10-11 01:00:08,173 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:08,173 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:08,173 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:08,173 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:09,174 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:09,174 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 98.976s
2026-10-11 01:00:09,174 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:09,175 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:09,175 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:09] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:10,176 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:10,176 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 99.977s
2026-10-11 01:00:10,176 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:10,176 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:10,176 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:10,177 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:11,178 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:11,178 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 100.978s
2026-10-11 01:00:11,178 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:11,178 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:11,178 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:11] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:11] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:11,575 INFO BGP-Thread-1 (job): ... idle for 0.397s
2026-10-11 01:00:11,576 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 101.375s
2026-10-11 01:00:11,576 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:11,576 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:11,576 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:11,576 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:11,576 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-10-11 01:00:11,576 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:11,576 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:11,577 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:11,577 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:11,577 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:11] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:11] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:11,617 INFO BGP-Thread-1 (job): ... idle for 0.040s
2026-10-11 01:00:11,617 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 101.415s
2026-10-11 01:00:11,617 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:11,617 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:11,617 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:11,617 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-10-11 01:00:11,617 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:11,617 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:11,617 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:11,618 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:11,618 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:11] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:11] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:11] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:12,619 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:12,619 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 102.416s
2026-10-11 01:00:12,619 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:12,619 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:12,620 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:12,620 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:13,621 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:13,621 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 103.417s
2026-10-11 01:00:13,621 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:13,621 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:13,621 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:13] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:14,622 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:14,623 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 104.418s
2026-10-11 01:00:14,623 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:14,623 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:14,623 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:14,623 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:15,624 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:15,624 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 105.419s
2026-10-11 01:00:15,625 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:15,625 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:15,625 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:15] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:16] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:16,013 INFO BGP-Thread-1 (job): ... idle for 0.389s
2026-10-11 01:00:16,014 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 105.808s
2026-10-11 01:00:16,014 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:16,014 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:16,014 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:16,014 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:16,014 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-10-11 01:00:16,014 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:16,015 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:16,015 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:16,015 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:16,015 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:16] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:16] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:16,056 INFO BGP-Thread-1 (job): ... idle for 0.041s
2026-10-11 01:00:16,056 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 105.849s
2026-10-11 01:00:16,057 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:16,057 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:16,057 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:16,057 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-10-11 01:00:16,057 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:16,057 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:16,058 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:16,058 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:16,058 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:16] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:16] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:16] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:17,059 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:17,059 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 106.850s
2026-10-11 01:00:17,059 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:17,059 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:17,059 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:17,060 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:18,061 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:18,061 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 107.851s
2026-10-11 01:00:18,061 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:18,061 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:18,061 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:18] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:19,063 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:19,063 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 108.852s
2026-10-11 01:00:19,063 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:19,063 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:19,063 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:19,063 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:20,065 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:20,065 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 109.853s
2026-10-11 01:00:20,065 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:20,065 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:20,065 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:20] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:20] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:20,447 INFO BGP-Thread-1 (job): ... idle for 0.381s
2026-10-11 01:00:20,447 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 110.235s
2026-10-11 01:00:20,447 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:20,447 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:20,447 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:20,447 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:20,447 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-10-11 01:00:20,447 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:20,448 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:20,448 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:20,448 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:20,448 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:20] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:20] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:20,489 INFO BGP-Thread-1 (job): ... idle for 0.041s
2026-10-11 01:00:20,489 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 110.276s
2026-10-11 01:00:20,489 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:20,489 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:20,490 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:20,490 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-10-11 01:00:20,490 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:20,490 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:20,490 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:20,490 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:20,490 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:20] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:20] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:20] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:21,491 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:21,491 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 111.277s
2026-10-11 01:00:21,492 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:21,492 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:21,492 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:21,492 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:22,493 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:22,493 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 112.278s
2026-10-11 01:00:22,493 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:22,494 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:22,494 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:22] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:23,495 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:23,495 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 113.279s
2026-10-11 01:00:23,495 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:23,495 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:23,495 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:23,495 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:24,497 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:24,497 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 114.280s
2026-10-11 01:00:24,497 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:24,497 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:24,497 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:24] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:24] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:24,896 INFO BGP-Thread-1 (job): ... idle for 0.399s
2026-10-11 01:00:24,896 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 114.679s
2026-10-11 01:00:24,897 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:24,897 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:24,897 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:24,897 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:24,897 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005b' (91)
2026-10-11 01:00:24,897 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:24,897 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:24,897 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:24,897 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:24,897 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:24] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:24] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:24,933 INFO BGP-Thread-1 (job): ... idle for 0.035s
2026-10-11 01:00:24,933 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 114.715s
2026-10-11 01:00:24,933 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:24,933 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:24,933 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:24,933 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0055' (85)
2026-10-11 01:00:24,934 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:24,934 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:24,934 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:24,934 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:24,934 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:24] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:25] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:25] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:25,935 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:25,935 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 115.716s
2026-10-11 01:00:25,936 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:25,936 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:25,936 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:25,936 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:26,937 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:26,937 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 116.717s
2026-10-11 01:00:26,937 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:26,938 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:26,938 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:27] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:27,939 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:27,939 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 117.718s
2026-10-11 01:00:27,939 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:27,939 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:27,939 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:27,940 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:28,941 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:28,941 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 118.719s
2026-10-11 01:00:28,941 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:28,941 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:28,941 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:29] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:29] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:29,293 INFO BGP-Thread-1 (job): ... idle for 0.351s
2026-10-11 01:00:29,293 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 119.071s
2026-10-11 01:00:29,293 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:29,293 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a62900022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:29,293 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:29,293 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:29,294 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005b' (91)
2026-10-11 01:00:29,294 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:29,294 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:29,294 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:29,294 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:29,294 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:29] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:29] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:29,329 INFO BGP-Thread-1 (job): ... idle for 0.035s
2026-10-11 01:00:29,330 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 119.106s
2026-10-11 01:00:29,330 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d001946022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:29,330 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:29,330 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:29,330 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0055' (85)
2026-10-11 01:00:29,330 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:29,330 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:29,330 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:29,330 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:29,330 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:29] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:29] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:29] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:30,332 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:30,332 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 120.107s
2026-10-11 01:00:30,332 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a62900022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:30,332 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:30,332 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:30,332 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:31,334 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:31,334 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 121.108s
2026-10-11 01:00:31,334 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:31,334 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:31,334 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:31] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:32,335 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:32,336 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 122.109s
2026-10-11 01:00:32,336 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d001946022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:32,336 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:32,336 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:32,336 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:33,337 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:33,338 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 123.111s
2026-10-11 01:00:33,338 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:33,338 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:33,338 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:33] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:33] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:33,708 INFO BGP-Thread-1 (job): ... idle for 0.370s
2026-10-11 01:00:33,709 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 123.481s
2026-10-11 01:00:33,709 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d001946022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:33,709 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:33,709 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:33,709 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:33,709 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005b' (91)
2026-10-11 01:00:33,709 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:33,709 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:33,709 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:33,709 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:33,709 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:33] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:33] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:33,744 INFO BGP-Thread-1 (job): ... idle for 0.034s
2026-10-11 01:00:33,744 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 123.515s
2026-10-11 01:00:33,744 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:33,744 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:33,744 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:33,744 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0055' (85)
2026-10-11 01:00:33,744 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:33,744 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:33,745 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:33,745 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:33,745 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:33] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:33] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:33] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:34,746 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:34,746 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 124.516s
2026-10-11 01:00:34,746 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:34,746 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:34,746 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:34,747 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:35,748 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:35,748 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 125.518s
2026-10-11 01:00:35,748 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:35,748 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:35,748 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:35] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:36,749 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:36,750 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 126.519s
2026-10-11 01:00:36,750 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:36,750 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:36,750 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:36,750 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:37,751 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:37,751 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 127.519s
2026-10-11 01:00:37,751 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:37,751 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:37,751 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:37] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:38] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:38,131 INFO BGP-Thread-1 (job): ... idle for 0.380s
2026-10-11 01:00:38,132 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 127.899s
2026-10-11 01:00:38,132 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:38,132 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:38,132 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:38,132 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:38,132 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005b' (91)
2026-10-11 01:00:38,132 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:38,132 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:38,132 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:38,132 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:38,132 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:38] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:38] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:38,172 INFO BGP-Thread-1 (job): ... idle for 0.040s
2026-10-11 01:00:38,172 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 127.939s
2026-10-11 01:00:38,172 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:38,172 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:38,173 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:38,173 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0055' (85)
2026-10-11 01:00:38,173 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:38,173 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:38,173 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:38,173 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:38,173 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:38] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:38] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:38] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:39,174 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:39,174 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 128.940s
2026-10-11 01:00:39,175 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:39,175 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:39,175 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:39,175 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:40,176 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:40,176 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 129.941s
2026-10-11 01:00:40,177 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:40,177 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:40,177 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:40] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:41,178 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:41,178 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 130.942s
2026-10-11 01:00:41,178 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:41,178 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:41,179 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:41,179 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:42,180 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:42,180 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 131.943s
2026-10-11 01:00:42,180 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:42,180 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:42,180 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:42] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:42] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:42,556 INFO BGP-Thread-1 (job): ... idle for 0.376s
2026-10-11 01:00:42,556 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 132.319s
2026-10-11 01:00:42,556 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:42,556 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:42,557 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:42,557 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:42,557 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005b' (91)
2026-10-11 01:00:42,557 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:42,557 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:42,557 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:42,557 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:42,557 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:42] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:42] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:42,598 INFO BGP-Thread-1 (job): ... idle for 0.040s
2026-10-11 01:00:42,598 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 132.359s
2026-10-11 01:00:42,598 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:42,598 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:42,598 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:42,598 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0055' (85)
2026-10-11 01:00:42,598 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:42,598 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:42,598 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:42,598 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:42,598 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:42] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:42] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:42] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:43,600 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:43,600 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 133.361s
2026-10-11 01:00:43,600 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:43,600 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:43,600 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:43,600 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:44,602 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:44,602 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 134.362s
2026-10-11 01:00:44,602 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:44,602 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:44,602 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:44] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:45,603 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:45,604 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 135.363s
2026-10-11 01:00:45,604 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:45,604 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:45,604 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:45,604 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:46,605 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:46,606 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 136.364s
2026-10-11 01:00:46,606 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:46,606 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:46,606 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:46] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:46] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:46,979 INFO BGP-Thread-1 (job): ... idle for 0.374s
2026-10-11 01:00:46,980 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 136.738s
2026-10-11 01:00:46,980 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:46,980 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:46,980 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:46,980 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:46,980 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005b' (91)
2026-10-11 01:00:46,980 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:46,980 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:46,980 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:46,981 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:46,981 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:46] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:46] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:47,018 INFO BGP-Thread-1 (job): ... idle for 0.037s
2026-10-11 01:00:47,018 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 136.775s
2026-10-11 01:00:47,018 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:47,018 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:47,018 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:47,019 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0055' (85)
2026-10-11 01:00:47,019 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:47,019 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:47,019 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:47,019 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:47,019 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:47] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:47] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:47] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:48,020 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:48,020 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 137.776s
2026-10-11 01:00:48,021 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:48,021 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:48,021 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:48,021 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:49,022 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:49,022 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 138.777s
2026-10-11 01:00:49,022 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:49,022 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:49,022 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:49] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:50,024 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:50,024 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 139.778s
2026-10-11 01:00:50,024 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:50,024 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:50,024 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:50,024 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:51,026 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:51,026 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 140.779s
2026-10-11 01:00:51,026 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:51,026 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:51,026 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:51] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:51] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:51] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:51,429 INFO BGP-Thread-1 (job): ... idle for 0.403s
2026-10-11 01:00:51,429 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 141.182s
2026-10-11 01:00:51,430 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:51,430 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005e0200000047c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:00:51,430 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:51,430 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:51,430 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005e' (94)
2026-10-11 01:00:51,430 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:51,430 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:51,430 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:51,430 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:51,431 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:52,431 INFO BGP-Thread-1 (job): ... idle for 1.000s
2026-10-11 01:00:52,431 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 142.183s
2026-10-11 01:00:52,431 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:52,431 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:52,431 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:53,432 INFO BGP-Thread-1 (job): ... idle for 1.000s
2026-10-11 01:00:53,432 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 143.183s
2026-10-11 01:00:53,432 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:53,432 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:53,432 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:53] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:53] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:53,494 INFO BGP-Thread-1 (job): ... idle for 0.062s
2026-10-11 01:00:53,494 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 143.245s
2026-10-11 01:00:53,494 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00580200000041c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:00:53,494 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:53,494 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:53,494 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0058' (88)
2026-10-11 01:00:53,495 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:53,495 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:53,495 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:53,495 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:53,495 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:53] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:53] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:53] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:54,496 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:54,496 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 144.246s
2026-10-11 01:00:54,496 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005e0200000047c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:00:54,497 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:54,497 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:54,497 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:55,498 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:55,498 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 145.247s
2026-10-11 01:00:55,498 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:55,498 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:55,499 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:55] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:56,500 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:56,500 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 146.248s
2026-10-11 01:00:56,500 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00580200000041c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:00:56,500 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:56,500 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:56,500 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:57,502 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:57,502 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 147.249s
2026-10-11 01:00:57,502 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:57,502 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:57,502 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:57] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:57] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:57,933 INFO BGP-Thread-1 (job): ... idle for 0.431s
2026-10-11 01:00:57,933 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 147.680s
2026-10-11 01:00:57,933 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00580200000041c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:00:57,933 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0066020000004fc01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:00:57,934 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:57,934 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:57,934 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0066' (102)
2026-10-11 01:00:57,934 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:57,934 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:57,934 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:57,934 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:57,934 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:57] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:57] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:57,964 INFO BGP-Thread-1 (job): ... idle for 0.029s
2026-10-11 01:00:57,964 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 147.709s
2026-10-11 01:00:57,964 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00600200000049c01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:00:57,964 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:57,964 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:57,964 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0060' (96)
2026-10-11 01:00:57,964 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:57,964 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:57,965 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:57,965 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:57,965 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:57] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:58] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:58] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:58,966 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:58,966 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 148.710s
2026-10-11 01:00:58,966 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0066020000004fc01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:00:58,966 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:58,967 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:58,967 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:59,968 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:59,968 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 149.711s
2026-10-11 01:00:59,968 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:59,968 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:59,968 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:00] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:00,970 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:00,970 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 150.712s
2026-10-11 01:01:00,970 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00600200000049c01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:00,970 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:00,970 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:00,970 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:01:01,972 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:01,972 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 151.713s
2026-10-11 01:01:01,972 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:01,972 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:01,972 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:02] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:02] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:02] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:02,421 INFO BGP-Thread-1 (job): ... idle for 0.449s
2026-10-11 01:01:02,421 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 152.162s
2026-10-11 01:01:02,421 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00600200000049c01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:02,421 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005a0200000043c0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:02,421 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:01:02,421 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:01:02,421 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005a' (90)
2026-10-11 01:01:02,422 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:01:02,422 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:01:02,422 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:02,422 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:02,422 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:01:03,423 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:03,423 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 153.163s
2026-10-11 01:01:03,423 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:03,423 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:03,424 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:01:04,425 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:04,425 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 154.164s
2026-10-11 01:01:04,425 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:04,425 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:04,425 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:04] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:04,495 INFO BGP-Thread-1 (job): ... idle for 0.070s
2026-10-11 01:01:04,495 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 154.234s
2026-10-11 01:01:04,495 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0054020000003dc0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:04,495 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:01:04,496 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:01:04,496 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0054' (84)
2026-10-11 01:01:04,496 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:01:04,496 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:01:04,496 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:04,496 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:04,496 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:04] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:05,497 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:05,497 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 155.235s
2026-10-11 01:01:05,497 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005a0200000043c0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:05,498 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:05,498 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:05,498 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:01:06,499 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:06,499 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 156.236s
2026-10-11 01:01:06,499 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:06,499 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:06,500 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:06] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:07,501 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:07,501 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 157.238s
2026-10-11 01:01:07,501 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0054020000003dc0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:07,501 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:07,501 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:07,501 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:01:08,503 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:08,503 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 158.239s
2026-10-11 01:01:08,503 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:08,503 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:08,503 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:08] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:08] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:08,923 INFO BGP-Thread-1 (job): ... idle for 0.420s
2026-10-11 01:01:08,923 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 158.658s
2026-10-11 01:01:08,923 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0054020000003dc0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:08,923 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005a0200000043c0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:08,923 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:01:08,923 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:01:08,923 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005a' (90)
2026-10-11 01:01:08,924 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:01:08,924 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:01:08,924 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:08,924 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:08,924 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:08] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:08] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:08,951 INFO BGP-Thread-1 (job): ... idle for 0.027s
2026-10-11 01:01:08,951 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 158.685s
2026-10-11 01:01:08,951 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0054020000003dc0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:08,951 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:01:08,951 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:01:08,951 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0054' (84)
2026-10-11 01:01:08,951 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:01:08,951 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:01:08,951 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:08,952 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:08,952 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:08] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:09] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:09,953 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:09,953 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 159.686s
2026-10-11 01:01:09,953 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005a0200000043c0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:09,953 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:09,953 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:09,953 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:01:10,955 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:10,955 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 160.687s
2026-10-11 01:01:10,955 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:10,955 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:10,955 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:11] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:11,956 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:11,957 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 161.688s
2026-10-11 01:01:11,957 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0054020000003dc0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:11,957 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:11,957 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:11,957 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:01:12,958 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:12,958 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 162.689s
2026-10-11 01:01:12,959 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:12,959 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:12,959 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:13] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:13] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:13] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:13,349 INFO BGP-Thread-1 (job): ... idle for 0.390s
2026-10-11 01:01:13,349 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 163.079s
2026-10-11 01:01:13,349 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0054020000003dc0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:13,349 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005a0200000043c0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:13,349 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:01:13,349 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:01:13,349 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005a' (90)
2026-10-11 01:01:13,349 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:01:13,349 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:01:13,349 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:13,349 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:13,350 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:01:14,351 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:14,351 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 164.080s
2026-10-11 01:01:14,351 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:14,351 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:14,351 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:01:15,352 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:15,352 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 165.081s
2026-10-11 01:01:15,353 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:15,353 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:15,353 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:15] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:15] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:15,411 INFO BGP-Thread-1 (job): ... idle for 0.058s
2026-10-11 01:01:15,411 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 165.139s
2026-10-11 01:01:15,411 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0054020000003dc0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:15,411 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:01:15,411 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:01:15,411 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0054' (84)
2026-10-11 01:01:15,411 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:01:15,411 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:01:15,411 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:15,411 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:15,411 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:15] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:15] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:15] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:16,413 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:16,413 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 166.140s
2026-10-11 01:01:16,413 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005a0200000043c0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:16,413 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:16,413 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:16,413 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:01:17,414 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:17,415 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 167.142s
2026-10-11 01:01:17,415 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:17,415 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:17,415 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:17] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:18,416 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:18,416 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 168.143s
2026-10-11 01:01:18,416 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0054020000003dc0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:18,416 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:18,417 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:18,417 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:01:19,418 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:19,418 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 169.144s
2026-10-11 01:01:19,418 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:19,418 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:19,418 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:19] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:19] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:19,843 INFO BGP-Thread-1 (job): ... idle for 0.425s
2026-10-11 01:01:19,843 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 169.569s
2026-10-11 01:01:19,844 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0054020000003dc0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:19,844 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0056020000003fc01609000604e380ac0c7b034001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:19,844 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:01:19,844 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:01:19,844 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0056' (86)
2026-10-11 01:01:19,844 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:01:19,844 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:01:19,844 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:19,844 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:19,844 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:19] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:19] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:19,878 INFO BGP-Thread-1 (job): ... idle for 0.034s
2026-10-11 01:01:19,878 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 169.602s
2026-10-11 01:01:19,878 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00500200000039c01609000604e380ac0c7b034001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:19,878 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:01:19,878 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:01:19,878 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0050' (80)
2026-10-11 01:01:19,878 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:01:19,878 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:01:19,878 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:19,879 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:19,879 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:19] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:20] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:20] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:20,880 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:20,880 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 170.603s
2026-10-11 01:01:20,880 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0056020000003fc01609000604e380ac0c7b034001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:20,880 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:20,880 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:20,880 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:01:21,882 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:21,882 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 171.605s
2026-10-11 01:01:21,882 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:21,882 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:21,882 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:22] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:22,883 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:22,883 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 172.606s
2026-10-11 01:01:22,883 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00500200000039c01609000604e380ac0c7b034001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:22,884 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:22,884 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:22,884 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:01:23,885 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:23,885 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 173.607s
2026-10-11 01:01:23,885 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:23,885 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:23,885 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:24] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:24] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:24,285 INFO BGP-Thread-1 (job): ... idle for 0.400s
2026-10-11 01:01:24,286 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 174.007s
2026-10-11 01:01:24,286 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00500200000039c01609000604e380ac0c7b034001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:24,286 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005c0200000045c0160f000704e380010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:24,286 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:01:24,286 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:01:24,286 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005c' (92)
2026-10-11 01:01:24,286 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:01:24,286 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:01:24,286 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:24,286 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:24,287 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:24] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:24] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:24,322 INFO BGP-Thread-1 (job): ... idle for 0.035s
2026-10-11 01:01:24,322 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 174.042s
2026-10-11 01:01:24,322 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0056020000003fc0160f000704e380010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:24,322 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:01:24,322 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:01:24,322 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0056' (86)
2026-10-11 01:01:24,323 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:01:24,323 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:01:24,323 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:24,323 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:24,323 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:24] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:24] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:24] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:25,324 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:25,324 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 175.043s
2026-10-11 01:01:25,324 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005c0200000045c0160f000704e380010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:25,324 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:25,325 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:25,325 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:01:26,326 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:26,326 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 176.044s
2026-10-11 01:01:26,326 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:26,326 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:26,326 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:26] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:27,328 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:27,328 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 177.045s
2026-10-11 01:01:27,328 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0056020000003fc0160f000704e380010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:27,328 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:27,328 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:27,329 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:01:28,330 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:28,330 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 178.047s
2026-10-11 01:01:28,330 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:28,330 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:28,330 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:28] "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-10-11T01:01:28.720542" elapsed="0.002259"/>
</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-10-11T01:01:28.706276" elapsed="0.016585"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<status status="PASS" start="2026-10-11T01:01:28.723064" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-10-11T01:01:28.722928" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:28.722908" elapsed="0.000242"/>
</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-10-11T01:01:28.723338" elapsed="0.000020"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was not seen within timeout period.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:28.723524" elapsed="0.000019"/>
</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-10-11T01:01:28.674575" elapsed="0.049022"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:28.727000" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-10-11T01:01:28.771015" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:01:28.771165" level="INFO">${output_log} = 2026-10-11 00:58:30,067 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:58:30,068 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 00:58:30,068 DEBUG BGP-Threa...</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-10-11T01:01:28.726887" elapsed="0.044312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:28.771832" level="INFO">2026-10-11 00:58:30,067 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 00:58:30,068 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 00:58:30,068 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 00:58:30,068 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 00:58:30,068 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 00:58:30,069 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 00:58:30,072 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 00:58:30,072 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00410104fbf000b4c000020224022241040000fbf006000200010400010001010400010080010400190046400200b44700
2026-10-11 00:58:30,072 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 00:58:30,072 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-10-11 00:58:30,073 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-10-11 00:58:30,073 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 00:58:30,073 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 00:58:30,073 INFO BGP-Thread-1 (job):   My BGP Identifier: 169782023
2026-10-11 00:58:30,073 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 00:58:30,073 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 00:58:30,073 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 00:58:30,073 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 00:58:30,073 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 00:58:30,073 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 00:58:30,073 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-10-11 00:58:30,073 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-10-11 00:58:30,073 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 00:58:30,073 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 00:58:30,073 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 00:58:30,073 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:58:30,074 DEBUG BGP-Thread-1 (job):   Length=53 (0x0035)
2026-10-11 00:58:30,074 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 00:58:30,074 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 00:58:30,074 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-10-11 00:58:30,074 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 00:58:30,074 DEBUG BGP-Thread-1 (job):   BGP Identifier=169782023 (0x0a1eab07)
2026-10-11 00:58:30,074 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=24 (0x18)
2026-10-11 00:58:30,074 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x02060104000100010206010400190046020641040000fbf0
2026-10-11 00:58:30,074 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff00350104fbf000b40a1eab071802060104000100010206010400190046020641040000fbf0'
2026-10-11 00:58:30,074 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff00350104fbf000b40a1eab071802060104000100010206010400190046020641040000fbf0
2026-10-11 00:58:30,076 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:58:30,076 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:58:30,076 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:58:30,076 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:58:30,076 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:58:30,077 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 00:58:30,077 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 00:58:30,077 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 00:58:30,077 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 00:58:30,077 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 00:58:30,077 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 00:58:30,077 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:30,077 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:30,077 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:30,084 INFO BGP-Thread-1 (job): ... idle for 0.006s
2026-10-11 00:58:30,084 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.006s
2026-10-11 00:58:30,084 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 00:58:30,084 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:30,084 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:30,084 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 00:58:30,084 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:58:30,084 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:58:30,085 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03001946
2026-10-11 00:58:30,085 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:30,085 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:30,085 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 00:58:30,085 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:58:30,085 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:58:30,085 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:30,085 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:30,085 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:31,087 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:31,087 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.008s
2026-10-11 00:58:31,087 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:31,087 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:31,087 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:32,088 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:32,089 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 2.009s
2026-10-11 00:58:32,089 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:32,089 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:32,089 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:33,090 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:33,091 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 3.010s
2026-10-11 00:58:33,091 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:33,091 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:33,091 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:34,092 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:34,093 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 4.011s
2026-10-11 00:58:34,093 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:34,093 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:34,093 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:35,094 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:35,094 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 5.012s
2026-10-11 00:58:35,095 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:35,095 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:35,095 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:36,096 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:36,096 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.013s
2026-10-11 00:58:36,096 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:36,096 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:36,097 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:36] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:36] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:36,160 INFO BGP-Thread-1 (job): ... idle for 0.064s
2026-10-11 00:58:36,161 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.077s
2026-10-11 00:58:36,161 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-10-11 00:58:36,161 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:36,161 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:36,161 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-10-11 00:58:36,161 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:58:36,161 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:58:36,161 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:36,161 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:36,161 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:37,163 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:37,163 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 7.078s
2026-10-11 00:58:37,163 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:37,163 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:37,163 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:38] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:38,164 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:38,165 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.079s
2026-10-11 00:58:38,165 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:38,165 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:38,165 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:38] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:38,207 INFO BGP-Thread-1 (job): ... idle for 0.042s
2026-10-11 00:58:38,207 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.121s
2026-10-11 00:58:38,207 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 00:58:38,207 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:38,207 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:38,207 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-10-11 00:58:38,207 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:58:38,207 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:58:38,208 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:38,208 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:38,208 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:38] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:38] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:38] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:39,209 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:39,209 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 9.122s
2026-10-11 00:58:39,209 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-10-11 00:58:39,210 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:39,210 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:39,210 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:40,211 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:40,212 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.123s
2026-10-11 00:58:40,212 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:40,212 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:40,212 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:40] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:41,213 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:41,214 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 11.124s
2026-10-11 00:58:41,214 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 00:58:41,214 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:41,214 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:41,214 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:42,215 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:42,218 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 12.125s
2026-10-11 00:58:42,218 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:42,218 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:42,219 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:42] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:42] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:42,643 INFO BGP-Thread-1 (job): ... idle for 0.424s
2026-10-11 00:58:42,643 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 12.550s
2026-10-11 00:58:42,643 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 00:58:42,643 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a62900041700021999999900010501010101000007d000202b2b2b2b
2026-10-11 00:58:42,643 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:42,643 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:42,643 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-10-11 00:58:42,644 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:58:42,644 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:58:42,644 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:42,644 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:42,644 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:42] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:42] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:42,692 INFO BGP-Thread-1 (job): ... idle for 0.048s
2026-10-11 00:58:42,692 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 12.597s
2026-10-11 00:58:42,692 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c001946041700021999999900010501010101000007d000202b2b2b2b
2026-10-11 00:58:42,692 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:42,692 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:42,692 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-10-11 00:58:42,692 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:58:42,692 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:58:42,692 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:42,693 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:42,693 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:42] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:42] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:42] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:43,694 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:43,694 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 13.599s
2026-10-11 00:58:43,694 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a62900041700021999999900010501010101000007d000202b2b2b2b
2026-10-11 00:58:43,694 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:43,694 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:43,694 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:44,696 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:44,696 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 14.600s
2026-10-11 00:58:44,696 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:44,696 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:44,696 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:44] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:45,697 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:45,698 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 15.601s
2026-10-11 00:58:45,698 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c001946041700021999999900010501010101000007d000202b2b2b2b
2026-10-11 00:58:45,698 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:45,698 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:45,698 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:46,699 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:46,700 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 16.602s
2026-10-11 00:58:46,700 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:46,700 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:46,700 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:46] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:47] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:47,148 INFO BGP-Thread-1 (job): ... idle for 0.448s
2026-10-11 00:58:47,148 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 17.050s
2026-10-11 00:58:47,148 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c001946041700021999999900010501010101000007d000202b2b2b2b
2026-10-11 00:58:47,148 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000101f20cdd809ff7001600202b2b2b2b
2026-10-11 00:58:47,148 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:47,149 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:47,149 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-10-11 00:58:47,149 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:58:47,149 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:58:47,149 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:47,149 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:47,149 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:47] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:47] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:47,191 INFO BGP-Thread-1 (job): ... idle for 0.042s
2026-10-11 00:58:47,191 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 17.092s
2026-10-11 00:58:47,191 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000101f20cdd809ff7001600202b2b2b2b
2026-10-11 00:58:47,191 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:47,191 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:47,191 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-10-11 00:58:47,192 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:58:47,192 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:58:47,192 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:47,192 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:47,192 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:47] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:47] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:47] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:48,193 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:48,193 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 18.093s
2026-10-11 00:58:48,193 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000101f20cdd809ff7001600202b2b2b2b
2026-10-11 00:58:48,194 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:48,194 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:48,194 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:49,195 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:49,195 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 19.094s
2026-10-11 00:58:49,195 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:49,195 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:49,195 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:49] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:50,197 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:50,197 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.095s
2026-10-11 00:58:50,197 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000101f20cdd809ff7001600202b2b2b2b
2026-10-11 00:58:50,197 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:50,197 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:50,197 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:51,198 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:51,199 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 21.096s
2026-10-11 00:58:51,199 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:51,199 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:51,199 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:51] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:51] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:51,652 INFO BGP-Thread-1 (job): ... idle for 0.453s
2026-10-11 00:58:51,652 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 21.549s
2026-10-11 00:58:51,652 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000101f20cdd809ff7001600202b2b2b2b
2026-10-11 00:58:51,652 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000102f20cdd809ff7001400202b2b2b2b
2026-10-11 00:58:51,652 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:51,652 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:51,652 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-10-11 00:58:51,653 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:58:51,653 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:58:51,653 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:51,653 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:51,653 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:51] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:51] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:51,701 INFO BGP-Thread-1 (job): ... idle for 0.048s
2026-10-11 00:58:51,702 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 21.597s
2026-10-11 00:58:51,702 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000102f20cdd809ff7001400202b2b2b2b
2026-10-11 00:58:51,702 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:51,702 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:51,702 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-10-11 00:58:51,702 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:58:51,702 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:58:51,702 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:51,702 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:51,702 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:51] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:51] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:51] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:52,704 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:52,707 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 22.598s
2026-10-11 00:58:52,707 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000102f20cdd809ff7001400202b2b2b2b
2026-10-11 00:58:52,708 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:52,708 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:52,708 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:53,709 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:53,709 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 23.599s
2026-10-11 00:58:53,709 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:53,709 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:53,709 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:53] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:54,710 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:54,711 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 24.601s
2026-10-11 00:58:54,711 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000102f20cdd809ff7001400202b2b2b2b
2026-10-11 00:58:54,711 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:54,711 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:54,711 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:55,712 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:55,712 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 25.602s
2026-10-11 00:58:55,713 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:55,713 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:55,713 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:55] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:56] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:56,119 INFO BGP-Thread-1 (job): ... idle for 0.406s
2026-10-11 00:58:56,119 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 26.008s
2026-10-11 00:58:56,119 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000102f20cdd809ff7001400202b2b2b2b
2026-10-11 00:58:56,120 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000103f20cdd809ff70007d0202b2b2b2b
2026-10-11 00:58:56,120 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:56,120 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:56,120 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-10-11 00:58:56,120 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:58:56,120 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:58:56,120 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:56,120 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:56,120 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:56] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:56] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:56,157 INFO BGP-Thread-1 (job): ... idle for 0.037s
2026-10-11 00:58:56,157 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 26.045s
2026-10-11 00:58:56,157 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000103f20cdd809ff70007d0202b2b2b2b
2026-10-11 00:58:56,157 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:58:56,158 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:58:56,158 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-10-11 00:58:56,158 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:58:56,158 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:58:56,158 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:56,158 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:56,158 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:56] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:56] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:58:56] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:57,159 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:57,159 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 27.046s
2026-10-11 00:58:57,160 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a629000417000219999999000103f20cdd809ff70007d0202b2b2b2b
2026-10-11 00:58:57,160 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:57,160 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:57,160 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:58:58,161 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:58,161 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 28.047s
2026-10-11 00:58:58,161 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:58,161 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:58,162 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:58:58] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:58:59,163 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:58:59,163 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 29.048s
2026-10-11 00:58:59,163 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000103f20cdd809ff70007d0202b2b2b2b
2026-10-11 00:58:59,163 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:58:59,163 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:58:59,164 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:00,165 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:00,165 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 30.049s
2026-10-11 00:59:00,165 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:00,165 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:00,165 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:00] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:00] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:00,573 INFO BGP-Thread-1 (job): ... idle for 0.408s
2026-10-11 00:59:00,573 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 30.457s
2026-10-11 00:59:00,574 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c0019460417000219999999000103f20cdd809ff70007d0202b2b2b2b
2026-10-11 00:59:00,574 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a6290004170002199999990001042b2b2b2b000007d000202b2b2b2b
2026-10-11 00:59:00,574 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:00,574 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:00,574 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-10-11 00:59:00,574 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:00,574 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:00,574 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:00,574 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:00,574 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:00] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:00] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:00,619 INFO BGP-Thread-1 (job): ... idle for 0.045s
2026-10-11 00:59:00,619 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 30.502s
2026-10-11 00:59:00,619 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c00194604170002199999990001042b2b2b2b000007d000202b2b2b2b
2026-10-11 00:59:00,619 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:00,619 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:00,620 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-10-11 00:59:00,620 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:00,620 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:00,620 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:00,620 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:00,620 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:00] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:00] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:00] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:01,621 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:01,621 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 31.503s
2026-10-11 00:59:01,622 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a02000000334001010040020040050400000064800e2200194604c714a6290004170002199999990001042b2b2b2b000007d000202b2b2b2b
2026-10-11 00:59:01,622 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:01,622 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:01,622 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:02,623 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:02,623 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 32.504s
2026-10-11 00:59:02,623 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:02,623 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:02,623 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:02] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:03,625 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:03,625 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 33.505s
2026-10-11 00:59:03,625 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c00194604170002199999990001042b2b2b2b000007d000202b2b2b2b
2026-10-11 00:59:03,625 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:03,626 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:03,626 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:04,627 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:04,627 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 34.506s
2026-10-11 00:59:04,627 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:04,627 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:04,627 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:05] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:05,033 INFO BGP-Thread-1 (job): ... idle for 0.405s
2026-10-11 00:59:05,033 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 34.912s
2026-10-11 00:59:05,033 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800f1c00194604170002199999990001042b2b2b2b000007d000202b2b2b2b
2026-10-11 00:59:05,033 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001000000000000000000000000000a05dc10
2026-10-11 00:59:05,033 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:05,033 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:05,033 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004c' (76)
2026-10-11 00:59:05,033 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:05,033 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:05,034 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:05,034 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:05,034 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:05] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:05] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:05,076 INFO BGP-Thread-1 (job): ... idle for 0.042s
2026-10-11 00:59:05,076 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 34.954s
2026-10-11 00:59:05,077 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001000000000000000000000000000a05dc10
2026-10-11 00:59:05,077 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:05,077 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:05,077 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-10-11 00:59:05,077 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:05,077 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:05,077 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:05,077 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:05,077 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:05] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:05] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:05] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:06,078 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:06,079 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 35.955s
2026-10-11 00:59:06,079 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001000000000000000000000000000a05dc10
2026-10-11 00:59:06,079 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:06,079 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:06,079 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:07,080 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:07,080 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 36.956s
2026-10-11 00:59:07,080 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:07,081 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:07,081 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:07] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:08,082 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:08,082 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 37.957s
2026-10-11 00:59:08,082 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001000000000000000000000000000a05dc10
2026-10-11 00:59:08,082 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:08,082 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:08,082 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:09,084 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:09,084 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 38.958s
2026-10-11 00:59:09,084 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:09,084 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:09,084 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:09] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:09,498 INFO BGP-Thread-1 (job): ... idle for 0.414s
2026-10-11 00:59:09,498 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 39.372s
2026-10-11 00:59:09,499 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001000000000000000000000000000a05dc10
2026-10-11 00:59:09,499 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a62900011900021999999900010501010101000007d0000000000a05dc10
2026-10-11 00:59:09,499 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:09,499 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:09,499 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004c' (76)
2026-10-11 00:59:09,499 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:09,499 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:09,499 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:09,499 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:09,499 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:09] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:09,550 INFO BGP-Thread-1 (job): ... idle for 0.051s
2026-10-11 00:59:09,550 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 39.423s
2026-10-11 00:59:09,550 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e001946011900021999999900010501010101000007d0000000000a05dc10
2026-10-11 00:59:09,551 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:09,551 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:09,551 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-10-11 00:59:09,551 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:09,551 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:09,551 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:09,551 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:09,551 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:09] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:10,552 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:10,552 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 40.424s
2026-10-11 00:59:10,553 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a62900011900021999999900010501010101000007d0000000000a05dc10
2026-10-11 00:59:10,553 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:10,553 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:10,553 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:11,554 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:11,554 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 41.425s
2026-10-11 00:59:11,554 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:11,554 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:11,555 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:11] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:12,556 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:12,556 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 42.426s
2026-10-11 00:59:12,556 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e001946011900021999999900010501010101000007d0000000000a05dc10
2026-10-11 00:59:12,556 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:12,556 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:12,556 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:13,558 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:13,558 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 43.428s
2026-10-11 00:59:13,558 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:13,558 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:13,558 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:13] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:13] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:13,999 INFO BGP-Thread-1 (job): ... idle for 0.441s
2026-10-11 00:59:13,999 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 43.869s
2026-10-11 00:59:14,000 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e001946011900021999999900010501010101000007d0000000000a05dc10
2026-10-11 00:59:14,000 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10
2026-10-11 00:59:14,000 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:14,000 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:14,000 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004c' (76)
2026-10-11 00:59:14,000 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:14,000 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:14,000 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:14,000 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:14,000 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:14] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:14] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:14,045 INFO BGP-Thread-1 (job): ... idle for 0.045s
2026-10-11 00:59:14,045 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 43.914s
2026-10-11 00:59:14,045 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10
2026-10-11 00:59:14,045 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:14,046 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:14,046 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-10-11 00:59:14,046 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:14,046 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:14,046 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:14,046 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:14,046 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:14] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:14] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:14] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:15,047 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:15,048 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 44.915s
2026-10-11 00:59:15,048 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10
2026-10-11 00:59:15,048 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:15,048 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:15,048 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:16,049 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:16,050 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 45.916s
2026-10-11 00:59:16,050 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:16,050 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:16,050 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:16] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:17,051 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:17,051 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 46.917s
2026-10-11 00:59:17,051 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10
2026-10-11 00:59:17,052 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:17,052 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:17,052 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:18,053 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:18,053 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 47.918s
2026-10-11 00:59:18,053 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:18,053 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:18,053 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:18] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:18] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:18,458 INFO BGP-Thread-1 (job): ... idle for 0.404s
2026-10-11 00:59:18,458 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 48.322s
2026-10-11 00:59:18,458 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10
2026-10-11 00:59:18,458 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000
2026-10-11 00:59:18,458 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:18,458 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:18,458 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0057' (87)
2026-10-11 00:59:18,458 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:18,458 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:18,458 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:18,458 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:18,459 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:18] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:18] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:18,497 INFO BGP-Thread-1 (job): ... idle for 0.038s
2026-10-11 00:59:18,497 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 48.360s
2026-10-11 00:59:18,497 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000
2026-10-11 00:59:18,497 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:18,497 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:18,497 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-10-11 00:59:18,498 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:18,498 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:18,498 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:18,498 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:18,498 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:18] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:18] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:18] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:19,499 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:19,503 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 49.361s
2026-10-11 00:59:19,503 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000
2026-10-11 00:59:19,503 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:19,503 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:19,503 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:20,505 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:20,505 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 50.363s
2026-10-11 00:59:20,505 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:20,505 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:20,505 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:20] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:21,506 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:21,507 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 51.364s
2026-10-11 00:59:21,507 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000
2026-10-11 00:59:21,507 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:21,507 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:21,507 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:22,509 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:22,509 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 52.365s
2026-10-11 00:59:22,509 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:22,509 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:22,509 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:22] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:22,915 INFO BGP-Thread-1 (job): ... idle for 0.405s
2026-10-11 00:59:22,915 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 52.770s
2026-10-11 00:59:22,915 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008030d000000000000
2026-10-11 00:59:22,915 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10
2026-10-11 00:59:22,915 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:22,915 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:22,915 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0057' (87)
2026-10-11 00:59:22,915 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:22,915 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:22,916 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:22,916 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:22,916 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:22] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:22,950 INFO BGP-Thread-1 (job): ... idle for 0.034s
2026-10-11 00:59:22,950 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 52.805s
2026-10-11 00:59:22,951 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10
2026-10-11 00:59:22,951 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:22,951 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:22,951 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-10-11 00:59:22,951 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:22,951 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:22,951 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:22,951 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:22,951 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:22] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:23] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:23] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:23,953 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:23,953 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 53.806s
2026-10-11 00:59:23,953 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10
2026-10-11 00:59:23,953 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:23,953 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:23,953 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:24,955 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:24,956 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 54.807s
2026-10-11 00:59:24,957 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:24,957 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:24,957 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:25] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:25,958 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:25,958 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 55.808s
2026-10-11 00:59:25,959 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10
2026-10-11 00:59:25,959 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:25,959 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:25,959 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:26,960 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:26,961 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 56.809s
2026-10-11 00:59:26,961 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:26,961 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:26,961 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:27] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:27] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:27,384 INFO BGP-Thread-1 (job): ... idle for 0.423s
2026-10-11 00:59:27,384 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 57.232s
2026-10-11 00:59:27,385 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c01008060101000005dc10
2026-10-11 00:59:27,385 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8
2026-10-11 00:59:27,385 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:27,385 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:27,385 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0057' (87)
2026-10-11 00:59:27,385 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:27,385 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:27,385 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:27,385 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:27,385 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:27] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:27] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:27,421 INFO BGP-Thread-1 (job): ... idle for 0.035s
2026-10-11 00:59:27,421 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 57.268s
2026-10-11 00:59:27,421 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8
2026-10-11 00:59:27,421 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:27,421 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:27,421 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-10-11 00:59:27,421 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:27,422 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:27,422 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:27,422 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:27,422 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:27] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:27] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:27] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:28,423 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:28,423 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 58.269s
2026-10-11 00:59:28,423 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8
2026-10-11 00:59:28,424 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:28,424 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:28,424 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:29,425 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:29,425 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 59.270s
2026-10-11 00:59:29,426 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:29,426 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:29,426 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:29] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:30,427 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:30,427 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 60.271s
2026-10-11 00:59:30,427 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8
2026-10-11 00:59:30,427 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:30,428 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:30,428 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:31,429 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:31,429 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 61.272s
2026-10-11 00:59:31,429 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:31,430 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:31,430 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:31] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:31] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:31] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:31,860 INFO BGP-Thread-1 (job): ... idle for 0.430s
2026-10-11 00:59:31,860 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 61.702s
2026-10-11 00:59:31,861 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010080602f20cdd809ff8
2026-10-11 00:59:31,861 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000
2026-10-11 00:59:31,861 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:31,861 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:31,861 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0057' (87)
2026-10-11 00:59:31,861 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:31,861 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:31,861 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:31,861 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:31,861 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:32,863 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:32,863 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 62.704s
2026-10-11 00:59:32,863 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:32,863 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:32,863 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:33,864 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:33,864 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 63.705s
2026-10-11 00:59:33,865 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:33,865 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:33,865 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:33] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:33] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:33,929 INFO BGP-Thread-1 (job): ... idle for 0.065s
2026-10-11 00:59:33,930 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 63.769s
2026-10-11 00:59:33,930 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000
2026-10-11 00:59:33,930 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:33,930 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:33,930 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-10-11 00:59:33,930 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:33,930 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:33,930 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:33,930 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:33,930 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:33] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:34] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:34] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:34,932 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:34,932 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 64.770s
2026-10-11 00:59:34,932 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000
2026-10-11 00:59:34,932 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:34,932 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:34,932 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:35,934 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:35,936 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 65.772s
2026-10-11 00:59:35,936 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:35,936 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:35,936 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:36] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:36,937 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:36,938 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 66.773s
2026-10-11 00:59:36,938 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000
2026-10-11 00:59:36,938 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:36,938 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:36,938 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:37,939 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:37,940 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 67.774s
2026-10-11 00:59:37,940 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:37,940 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:37,940 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:38] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:38] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:38] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:38,410 INFO BGP-Thread-1 (job): ... idle for 0.470s
2026-10-11 00:59:38,410 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 68.244s
2026-10-11 00:59:38,410 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c010084604000700c80000
2026-10-11 00:59:38,410 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8
2026-10-11 00:59:38,410 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:38,410 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:38,410 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0057' (87)
2026-10-11 00:59:38,410 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:38,411 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:38,411 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:38,411 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:38,411 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:39,412 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:39,412 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 69.245s
2026-10-11 00:59:39,412 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:39,412 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:39,413 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:40,414 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:40,414 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 70.246s
2026-10-11 00:59:40,414 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:40,414 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:40,414 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:40] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:40,485 INFO BGP-Thread-1 (job): ... idle for 0.070s
2026-10-11 00:59:40,485 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 70.316s
2026-10-11 00:59:40,485 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8
2026-10-11 00:59:40,485 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:40,485 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:40,485 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-10-11 00:59:40,485 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:40,485 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:40,485 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:40,485 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:40,486 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:40] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:41,487 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:41,487 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 71.317s
2026-10-11 00:59:41,487 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005702000000404001010040020040050400000064800e2400194604c714a629000119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8
2026-10-11 00:59:41,487 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:41,487 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:41,487 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:42,489 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:42,489 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 72.318s
2026-10-11 00:59:42,489 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:42,489 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:42,489 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:42] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:43,490 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:43,490 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 73.319s
2026-10-11 00:59:43,491 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8
2026-10-11 00:59:43,491 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:43,491 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:43,491 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:44,492 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:44,492 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 74.321s
2026-10-11 00:59:44,492 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:44,492 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:44,493 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:44] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:44] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:44,915 INFO BGP-Thread-1 (job): ... idle for 0.422s
2026-10-11 00:59:44,915 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 74.743s
2026-10-11 00:59:44,915 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a4001010040020040050400000064800f1e0019460119000219999999000101f20cdd809ff70016000000000a05dc10c0100806000100000000c8
2026-10-11 00:59:44,915 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000102f20cdd809ff70014000000000a05dc10
2026-10-11 00:59:44,915 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:44,915 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:44,916 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004c' (76)
2026-10-11 00:59:44,916 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:44,916 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:44,916 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:44,916 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:44,916 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:44] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:44] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:44,953 INFO BGP-Thread-1 (job): ... idle for 0.037s
2026-10-11 00:59:44,953 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 74.780s
2026-10-11 00:59:44,953 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000102f20cdd809ff70014000000000a05dc10
2026-10-11 00:59:44,953 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:44,954 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:44,954 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-10-11 00:59:44,954 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:44,954 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:44,954 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:44,954 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:44,954 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:44] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:45] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:45] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:45,955 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:45,955 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 75.781s
2026-10-11 00:59:45,955 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000102f20cdd809ff70014000000000a05dc10
2026-10-11 00:59:45,956 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:45,956 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:45,956 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:46,957 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:46,957 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 76.782s
2026-10-11 00:59:46,957 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:46,957 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:46,957 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:47] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:47,959 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:47,959 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 77.783s
2026-10-11 00:59:47,959 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000102f20cdd809ff70014000000000a05dc10
2026-10-11 00:59:47,959 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:47,959 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:47,959 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:48,961 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:48,961 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 78.784s
2026-10-11 00:59:48,961 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:48,961 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:48,961 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:49] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:49] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:49,350 INFO BGP-Thread-1 (job): ... idle for 0.389s
2026-10-11 00:59:49,350 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 79.173s
2026-10-11 00:59:49,350 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000102f20cdd809ff70014000000000a05dc10
2026-10-11 00:59:49,351 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000103f20cdd809ff70007d00000000a05dc10
2026-10-11 00:59:49,351 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:49,351 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:49,351 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004c' (76)
2026-10-11 00:59:49,351 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:49,351 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:49,351 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:49,351 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:49,351 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:49] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:49] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:49,393 INFO BGP-Thread-1 (job): ... idle for 0.041s
2026-10-11 00:59:49,393 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 79.215s
2026-10-11 00:59:49,393 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000103f20cdd809ff70007d00000000a05dc10
2026-10-11 00:59:49,393 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:49,393 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:49,393 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-10-11 00:59:49,393 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:49,394 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:49,394 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:49,394 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:49,394 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:49] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:49] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:49] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:50,395 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:50,395 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 80.216s
2026-10-11 00:59:50,395 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a629000119000219999999000103f20cdd809ff70007d00000000a05dc10
2026-10-11 00:59:50,395 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:50,395 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:50,395 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:51,397 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:51,397 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 81.217s
2026-10-11 00:59:51,397 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:51,397 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:51,397 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:51] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:52,398 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:52,399 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 82.218s
2026-10-11 00:59:52,399 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000103f20cdd809ff70007d00000000a05dc10
2026-10-11 00:59:52,399 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:52,399 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:52,399 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:53,400 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:53,400 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 83.219s
2026-10-11 00:59:53,400 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:53,401 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:53,401 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:53] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:53] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:53,791 INFO BGP-Thread-1 (job): ... idle for 0.390s
2026-10-11 00:59:53,791 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 83.609s
2026-10-11 00:59:53,791 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e0019460119000219999999000103f20cdd809ff70007d00000000a05dc10
2026-10-11 00:59:53,791 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001042b2b2b2b000007d0000000000a05dc10
2026-10-11 00:59:53,791 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:53,791 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:53,791 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004c' (76)
2026-10-11 00:59:53,791 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:53,792 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:53,792 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:53,792 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:53,792 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:53] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:53] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:53,831 INFO BGP-Thread-1 (job): ... idle for 0.039s
2026-10-11 00:59:53,831 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 83.648s
2026-10-11 00:59:53,831 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001042b2b2b2b000007d0000000000a05dc10
2026-10-11 00:59:53,831 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:53,831 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:53,831 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-10-11 00:59:53,831 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:53,831 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:53,832 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:53,832 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:53,832 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:53] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:53] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:53] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:54,833 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:54,833 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 84.649s
2026-10-11 00:59:54,833 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004c02000000354001010040020040050400000064800e2400194604c714a6290001190002199999990001042b2b2b2b000007d0000000000a05dc10
2026-10-11 00:59:54,833 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:54,833 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:54,834 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:55,835 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:55,835 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 85.650s
2026-10-11 00:59:55,835 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:55,835 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:55,835 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:56] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:56,836 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:56,837 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 86.651s
2026-10-11 00:59:56,837 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001042b2b2b2b000007d0000000000a05dc10
2026-10-11 00:59:56,837 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:56,837 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:56,837 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 00:59:57,838 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:57,838 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 87.653s
2026-10-11 00:59:57,839 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:57,839 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:57,839 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:58] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:58] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:58,225 INFO BGP-Thread-1 (job): ... idle for 0.386s
2026-10-11 00:59:58,225 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 88.039s
2026-10-11 00:59:58,225 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f4001010040020040050400000064800f1e00194601190002199999990001042b2b2b2b000007d0000000000a05dc10
2026-10-11 00:59:58,225 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-10-11 00:59:58,225 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:58,226 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:58,226 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-10-11 00:59:58,226 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:58,226 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:58,226 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:58,226 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:58,226 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:58] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:58] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:58,265 INFO BGP-Thread-1 (job): ... idle for 0.039s
2026-10-11 00:59:58,266 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 88.078s
2026-10-11 00:59:58,266 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 00:59:58,266 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 00:59:58,266 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 00:59:58,266 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-10-11 00:59:58,266 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 00:59:58,266 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 00:59:58,266 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:58,266 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:58,266 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 00:59:58] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:58] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 00:59:58] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 00:59:59,268 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 00:59:59,268 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 89.079s
2026-10-11 00:59:59,268 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-10-11 00:59:59,268 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 00:59:59,268 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 00:59:59,268 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:00,269 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:00,270 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 90.080s
2026-10-11 01:00:00,270 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:00,270 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:00,270 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:00] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:01,271 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:01,271 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 91.081s
2026-10-11 01:00:01,271 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:01,271 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:01,271 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:01,272 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:02,273 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:02,273 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 92.082s
2026-10-11 01:00:02,273 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:02,273 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:02,273 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:02] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:02] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:02,667 INFO BGP-Thread-1 (job): ... idle for 0.394s
2026-10-11 01:00:02,667 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 92.476s
2026-10-11 01:00:02,667 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:02,668 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:02,668 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:02,668 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:02,668 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-10-11 01:00:02,668 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:02,668 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:02,668 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:02,668 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:02,668 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:02] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:02] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:02,710 INFO BGP-Thread-1 (job): ... idle for 0.042s
2026-10-11 01:00:02,710 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 92.518s
2026-10-11 01:00:02,710 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:02,711 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:02,711 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:02,711 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-10-11 01:00:02,711 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:02,711 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:02,711 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:02,711 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:02,711 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:02] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:02] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:02] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:03,712 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:03,712 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 93.519s
2026-10-11 01:00:03,713 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:03,713 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:03,713 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:03,713 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:04,714 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:04,714 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 94.520s
2026-10-11 01:00:04,714 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:04,714 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:04,714 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:04] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:05,716 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:05,716 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 95.521s
2026-10-11 01:00:05,716 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:05,716 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:05,716 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:05,716 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:06,718 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:06,718 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 96.522s
2026-10-11 01:00:06,718 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:06,718 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:06,718 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:06] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:07] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:07,131 INFO BGP-Thread-1 (job): ... idle for 0.413s
2026-10-11 01:00:07,131 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 96.935s
2026-10-11 01:00:07,131 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:07,131 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:07,131 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:07,131 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:07,131 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-10-11 01:00:07,131 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:07,132 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:07,132 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:07,132 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:07,132 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:07] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:07] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:07,170 INFO BGP-Thread-1 (job): ... idle for 0.038s
2026-10-11 01:00:07,170 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 96.973s
2026-10-11 01:00:07,171 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:07,171 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:07,171 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:07,171 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-10-11 01:00:07,171 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:07,171 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:07,171 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:07,171 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:07,171 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:07] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:07] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:07] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:08,172 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:08,173 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 97.974s
2026-10-11 01:00:08,173 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:08,173 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:08,173 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:08,173 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:09,174 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:09,174 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 98.976s
2026-10-11 01:00:09,174 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:09,175 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:09,175 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:09] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:10,176 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:10,176 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 99.977s
2026-10-11 01:00:10,176 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:10,176 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:10,176 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:10,177 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:11,178 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:11,178 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 100.978s
2026-10-11 01:00:11,178 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:11,178 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:11,178 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:11] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:11] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:11,575 INFO BGP-Thread-1 (job): ... idle for 0.397s
2026-10-11 01:00:11,576 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 101.375s
2026-10-11 01:00:11,576 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:11,576 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:11,576 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:11,576 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:11,576 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-10-11 01:00:11,576 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:11,576 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:11,577 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:11,577 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:11,577 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:11] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:11] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:11,617 INFO BGP-Thread-1 (job): ... idle for 0.040s
2026-10-11 01:00:11,617 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 101.415s
2026-10-11 01:00:11,617 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:11,617 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:11,617 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:11,617 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-10-11 01:00:11,617 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:11,617 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:11,617 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:11,618 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:11,618 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:11] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:11] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:11] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:12,619 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:12,619 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 102.416s
2026-10-11 01:00:12,619 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:12,619 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:12,620 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:12,620 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:13,621 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:13,621 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 103.417s
2026-10-11 01:00:13,621 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:13,621 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:13,621 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:13] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:14,622 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:14,623 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 104.418s
2026-10-11 01:00:14,623 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:14,623 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:14,623 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:14,623 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:15,624 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:15,624 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 105.419s
2026-10-11 01:00:15,625 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:15,625 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:15,625 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:15] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:16] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:16,013 INFO BGP-Thread-1 (job): ... idle for 0.389s
2026-10-11 01:00:16,014 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 105.808s
2026-10-11 01:00:16,014 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:16,014 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:16,014 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:16,014 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:16,014 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-10-11 01:00:16,014 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:16,015 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:16,015 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:16,015 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:16,015 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:16] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:16] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:16,056 INFO BGP-Thread-1 (job): ... idle for 0.041s
2026-10-11 01:00:16,056 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 105.849s
2026-10-11 01:00:16,057 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:16,057 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:16,057 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:16,057 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-10-11 01:00:16,057 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:16,057 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:16,058 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:16,058 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:16,058 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:16] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:16] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:16] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:17,059 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:17,059 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 106.850s
2026-10-11 01:00:17,059 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:17,059 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:17,059 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:17,060 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:18,061 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:18,061 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 107.851s
2026-10-11 01:00:18,061 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:18,061 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:18,061 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:18] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:19,063 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:19,063 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 108.852s
2026-10-11 01:00:19,063 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:19,063 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:19,063 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:19,063 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:20,065 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:20,065 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 109.853s
2026-10-11 01:00:20,065 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:20,065 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:20,065 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:20] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:20] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:20,447 INFO BGP-Thread-1 (job): ... idle for 0.381s
2026-10-11 01:00:20,447 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 110.235s
2026-10-11 01:00:20,447 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:20,447 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:20,447 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:20,447 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:20,447 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0044' (68)
2026-10-11 01:00:20,447 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:20,448 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:20,448 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:20,448 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:20,448 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:20] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:20] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:20,489 INFO BGP-Thread-1 (job): ... idle for 0.041s
2026-10-11 01:00:20,489 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 110.276s
2026-10-11 01:00:20,489 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:20,489 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:20,490 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:20,490 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-10-11 01:00:20,490 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:20,490 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:20,490 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:20,490 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:20,490 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:20] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:20] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:20] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:21,491 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:21,491 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 111.277s
2026-10-11 01:00:21,492 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0044020000002d4001010040020040050400000064800e1c00194604c714a62900031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:21,492 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:21,492 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:21,492 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:22,493 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:22,493 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 112.278s
2026-10-11 01:00:22,493 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:22,494 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:22,494 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:22] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:23,495 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:23,495 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 113.279s
2026-10-11 01:00:23,495 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:23,495 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:23,495 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:23,495 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:24,497 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:24,497 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 114.280s
2026-10-11 01:00:24,497 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:24,497 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:24,497 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:24] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:24] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:24,896 INFO BGP-Thread-1 (job): ... idle for 0.399s
2026-10-11 01:00:24,896 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 114.679s
2026-10-11 01:00:24,897 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800f16001946031100021999999900010000000a202b2b2b2b
2026-10-11 01:00:24,897 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:24,897 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:24,897 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:24,897 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005b' (91)
2026-10-11 01:00:24,897 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:24,897 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:24,897 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:24,897 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:24,897 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:24] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:24] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:24,933 INFO BGP-Thread-1 (job): ... idle for 0.035s
2026-10-11 01:00:24,933 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 114.715s
2026-10-11 01:00:24,933 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:24,933 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:24,933 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:24,933 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0055' (85)
2026-10-11 01:00:24,934 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:24,934 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:24,934 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:24,934 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:24,934 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:24] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:25] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:25] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:25,935 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:25,935 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 115.716s
2026-10-11 01:00:25,936 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:25,936 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:25,936 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:25,936 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:26,937 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:26,937 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 116.717s
2026-10-11 01:00:26,937 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:26,938 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:26,938 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:27] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:27,939 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:27,939 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 117.718s
2026-10-11 01:00:27,939 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:27,939 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:27,939 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:27,940 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:28,941 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:28,941 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 118.719s
2026-10-11 01:00:28,941 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:28,941 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:28,941 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:29] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:29] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:29,293 INFO BGP-Thread-1 (job): ... idle for 0.351s
2026-10-11 01:00:29,293 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 119.071s
2026-10-11 01:00:29,293 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001000000000000000000000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:29,293 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a62900022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:29,293 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:29,293 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:29,294 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005b' (91)
2026-10-11 01:00:29,294 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:29,294 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:29,294 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:29,294 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:29,294 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:29] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:29] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:29,329 INFO BGP-Thread-1 (job): ... idle for 0.035s
2026-10-11 01:00:29,330 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 119.106s
2026-10-11 01:00:29,330 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d001946022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:29,330 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:29,330 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:29,330 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0055' (85)
2026-10-11 01:00:29,330 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:29,330 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:29,330 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:29,330 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:29,330 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:29] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:29] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:29] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:30,332 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:30,332 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 120.107s
2026-10-11 01:00:30,332 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a62900022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:30,332 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:30,332 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:30,332 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:31,334 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:31,334 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 121.108s
2026-10-11 01:00:31,334 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:31,334 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:31,334 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:31] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:32,335 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:32,336 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 122.109s
2026-10-11 01:00:32,336 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d001946022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:32,336 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:32,336 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:32,336 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:33,337 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:33,338 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 123.111s
2026-10-11 01:00:33,338 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:33,338 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:33,338 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:33] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:33] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:33,708 INFO BGP-Thread-1 (job): ... idle for 0.370s
2026-10-11 01:00:33,709 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 123.481s
2026-10-11 01:00:33,709 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d001946022800021999999900010501010101000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:33,709 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:33,709 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:33,709 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:33,709 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005b' (91)
2026-10-11 01:00:33,709 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:33,709 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:33,709 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:33,709 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:33,709 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:33] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:33] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:33,744 INFO BGP-Thread-1 (job): ... idle for 0.034s
2026-10-11 01:00:33,744 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 123.515s
2026-10-11 01:00:33,744 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:33,744 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:33,744 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:33,744 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0055' (85)
2026-10-11 01:00:33,744 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:33,744 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:33,745 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:33,745 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:33,745 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:33] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:33] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:33] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:34,746 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:34,746 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 124.516s
2026-10-11 01:00:34,746 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:34,746 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:34,746 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:34,747 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:35,748 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:35,748 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 125.518s
2026-10-11 01:00:35,748 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:35,748 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:35,748 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:35] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:36,749 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:36,750 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 126.519s
2026-10-11 01:00:36,750 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:36,750 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:36,750 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:36,750 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:37,751 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:37,751 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 127.519s
2026-10-11 01:00:37,751 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:37,751 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:37,751 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:37] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:38] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:38,131 INFO BGP-Thread-1 (job): ... idle for 0.380s
2026-10-11 01:00:38,132 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 127.899s
2026-10-11 01:00:38,132 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000101f20cdd809ff70016000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:38,132 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:38,132 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:38,132 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:38,132 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005b' (91)
2026-10-11 01:00:38,132 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:38,132 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:38,132 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:38,132 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:38,132 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:38] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:38] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:38,172 INFO BGP-Thread-1 (job): ... idle for 0.040s
2026-10-11 01:00:38,172 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 127.939s
2026-10-11 01:00:38,172 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:38,172 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:38,173 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:38,173 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0055' (85)
2026-10-11 01:00:38,173 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:38,173 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:38,173 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:38,173 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:38,173 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:38] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:38] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:38] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:39,174 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:39,174 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 128.940s
2026-10-11 01:00:39,175 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:39,175 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:39,175 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:39,175 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:40,176 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:40,176 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 129.941s
2026-10-11 01:00:40,177 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:40,177 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:40,177 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:40] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:41,178 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:41,178 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 130.942s
2026-10-11 01:00:41,178 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:41,178 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:41,179 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:41,179 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:42,180 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:42,180 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 131.943s
2026-10-11 01:00:42,180 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:42,180 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:42,180 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:42] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:42] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:42,556 INFO BGP-Thread-1 (job): ... idle for 0.376s
2026-10-11 01:00:42,556 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 132.319s
2026-10-11 01:00:42,556 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000102f20cdd809ff70014000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:42,556 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:42,557 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:42,557 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:42,557 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005b' (91)
2026-10-11 01:00:42,557 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:42,557 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:42,557 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:42,557 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:42,557 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:42] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:42] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:42,598 INFO BGP-Thread-1 (job): ... idle for 0.040s
2026-10-11 01:00:42,598 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 132.359s
2026-10-11 01:00:42,598 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:42,598 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:42,598 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:42,598 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0055' (85)
2026-10-11 01:00:42,598 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:42,598 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:42,598 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:42,598 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:42,598 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:42] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:42] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:42] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:43,600 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:43,600 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 133.361s
2026-10-11 01:00:43,600 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a629000228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:43,600 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:43,600 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:43,600 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:44,602 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:44,602 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 134.362s
2026-10-11 01:00:44,602 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:44,602 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:44,602 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:44] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:45,603 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:45,604 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 135.363s
2026-10-11 01:00:45,604 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:45,604 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:45,604 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:45,604 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:46,605 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:46,606 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 136.364s
2026-10-11 01:00:46,606 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:46,606 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:46,606 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:46] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:46] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:46,979 INFO BGP-Thread-1 (job): ... idle for 0.374s
2026-10-11 01:00:46,980 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 136.738s
2026-10-11 01:00:46,980 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d0019460228000219999999000103f20cdd809ff70007d00000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:46,980 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:46,980 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:46,980 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:46,980 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005b' (91)
2026-10-11 01:00:46,980 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:46,980 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:46,980 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:46,981 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:46,981 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:46] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:46] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:47,018 INFO BGP-Thread-1 (job): ... idle for 0.037s
2026-10-11 01:00:47,018 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 136.775s
2026-10-11 01:00:47,018 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:47,018 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:47,018 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:47,019 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0055' (85)
2026-10-11 01:00:47,019 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:47,019 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:47,019 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:47,019 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:47,019 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:47] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:47] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:47] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:48,020 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:48,020 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 137.776s
2026-10-11 01:00:48,021 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005b02000000444001010040020040050400000064800e3300194604c714a6290002280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:48,021 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:48,021 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:48,021 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:49,022 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:49,022 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 138.777s
2026-10-11 01:00:49,022 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:49,022 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:49,022 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:49] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:50,024 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:50,024 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 139.778s
2026-10-11 01:00:50,024 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:50,024 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:50,024 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:50,024 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:51,026 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:51,026 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 140.779s
2026-10-11 01:00:51,026 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:51,026 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:51,026 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:51] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:51] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:51] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:51,429 INFO BGP-Thread-1 (job): ... idle for 0.403s
2026-10-11 01:00:51,429 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 141.182s
2026-10-11 01:00:51,430 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0055020000003e4001010040020040050400000064800f2d00194602280002199999990001042b2b2b2b000007d0000000000a30f20cdd809ff7202b2b2b2b05dc2005dc30
2026-10-11 01:00:51,430 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005e0200000047c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:00:51,430 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:51,430 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:51,430 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005e' (94)
2026-10-11 01:00:51,430 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:51,430 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:51,430 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:51,430 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:51,431 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:52,431 INFO BGP-Thread-1 (job): ... idle for 1.000s
2026-10-11 01:00:52,431 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 142.183s
2026-10-11 01:00:52,431 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:52,431 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:52,431 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:53,432 INFO BGP-Thread-1 (job): ... idle for 1.000s
2026-10-11 01:00:53,432 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 143.183s
2026-10-11 01:00:53,432 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:53,432 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:53,432 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:53] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:53] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:53,494 INFO BGP-Thread-1 (job): ... idle for 0.062s
2026-10-11 01:00:53,494 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 143.245s
2026-10-11 01:00:53,494 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00580200000041c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:00:53,494 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:53,494 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:53,494 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0058' (88)
2026-10-11 01:00:53,495 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:53,495 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:53,495 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:53,495 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:53,495 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:53] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:53] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:53] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:54,496 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:54,496 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 144.246s
2026-10-11 01:00:54,496 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005e0200000047c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:00:54,497 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:54,497 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:54,497 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:55,498 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:55,498 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 145.247s
2026-10-11 01:00:55,498 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:55,498 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:55,499 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:55] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:56,500 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:56,500 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 146.248s
2026-10-11 01:00:56,500 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00580200000041c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:00:56,500 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:56,500 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:56,500 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:57,502 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:57,502 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 147.249s
2026-10-11 01:00:57,502 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:57,502 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:57,502 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:57] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:57] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:57,933 INFO BGP-Thread-1 (job): ... idle for 0.431s
2026-10-11 01:00:57,933 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 147.680s
2026-10-11 01:00:57,933 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00580200000041c01611010104e380423a35c700002b670a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:00:57,933 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0066020000004fc01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:00:57,934 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:57,934 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:57,934 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0066' (102)
2026-10-11 01:00:57,934 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:57,934 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:57,934 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:57,934 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:57,934 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:57] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:57] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:57,964 INFO BGP-Thread-1 (job): ... idle for 0.029s
2026-10-11 01:00:57,964 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 147.709s
2026-10-11 01:00:57,964 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00600200000049c01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:00:57,964 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:00:57,964 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:00:57,964 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0060' (96)
2026-10-11 01:00:57,964 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:00:57,964 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:00:57,965 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:57,965 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:57,965 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:00:57] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:58] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:00:58] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:00:58,966 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:58,966 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 148.710s
2026-10-11 01:00:58,966 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0066020000004fc01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:00:58,966 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:58,967 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:58,967 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:00:59,968 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:00:59,968 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 149.711s
2026-10-11 01:00:59,968 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:00:59,968 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:00:59,968 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:00] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:00,970 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:00,970 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 150.712s
2026-10-11 01:01:00,970 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00600200000049c01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:00,970 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:00,970 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:00,970 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:01:01,972 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:01,972 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 151.713s
2026-10-11 01:01:01,972 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:01,972 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:01,972 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:02] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:02] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:02] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:02,421 INFO BGP-Thread-1 (job): ... idle for 0.449s
2026-10-11 01:01:02,421 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 152.162s
2026-10-11 01:01:02,421 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00600200000049c01619010204e380060001040a0a0a0a000a010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:02,421 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005a0200000043c0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:02,421 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:01:02,421 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:01:02,421 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005a' (90)
2026-10-11 01:01:02,422 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:01:02,422 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:01:02,422 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:02,422 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:02,422 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:01:03,423 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:03,423 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 153.163s
2026-10-11 01:01:03,423 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:03,423 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:03,424 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:01:04,425 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:04,425 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 154.164s
2026-10-11 01:01:04,425 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:04,425 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:04,425 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:04] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:04,495 INFO BGP-Thread-1 (job): ... idle for 0.070s
2026-10-11 01:01:04,495 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 154.234s
2026-10-11 01:01:04,495 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0054020000003dc0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:04,495 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:01:04,496 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:01:04,496 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0054' (84)
2026-10-11 01:01:04,496 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:01:04,496 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:01:04,496 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:04,496 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:04,496 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:04] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:05,497 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:05,497 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 155.235s
2026-10-11 01:01:05,497 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005a0200000043c0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:05,498 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:05,498 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:05,498 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:01:06,499 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:06,499 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 156.236s
2026-10-11 01:01:06,499 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:06,499 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:06,500 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:06] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:07,501 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:07,501 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 157.238s
2026-10-11 01:01:07,501 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0054020000003dc0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:07,501 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:07,501 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:07,501 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:01:08,503 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:08,503 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 158.239s
2026-10-11 01:01:08,503 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:08,503 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:08,503 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:08] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:08] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:08,923 INFO BGP-Thread-1 (job): ... idle for 0.420s
2026-10-11 01:01:08,923 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 158.658s
2026-10-11 01:01:08,923 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0054020000003dc0160d010304e3800b0c0d0e0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:08,923 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005a0200000043c0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:08,923 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:01:08,923 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:01:08,923 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005a' (90)
2026-10-11 01:01:08,924 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:01:08,924 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:01:08,924 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:08,924 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:08,924 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:08] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:08] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:08,951 INFO BGP-Thread-1 (job): ... idle for 0.027s
2026-10-11 01:01:08,951 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 158.685s
2026-10-11 01:01:08,951 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0054020000003dc0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:08,951 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:01:08,951 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:01:08,951 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0054' (84)
2026-10-11 01:01:08,951 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:01:08,951 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:01:08,951 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:08,952 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:08,952 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:08] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:09] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:09,953 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:09,953 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 159.686s
2026-10-11 01:01:09,953 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005a0200000043c0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:09,953 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:09,953 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:09,953 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:01:10,955 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:10,955 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 160.687s
2026-10-11 01:01:10,955 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:10,955 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:10,955 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:11] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:11,956 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:11,957 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 161.688s
2026-10-11 01:01:11,957 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0054020000003dc0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:11,957 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:11,957 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:11,957 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:01:12,958 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:12,958 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 162.689s
2026-10-11 01:01:12,959 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:12,959 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:12,959 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:13] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:13] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:13] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:13,349 INFO BGP-Thread-1 (job): ... idle for 0.390s
2026-10-11 01:01:13,349 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 163.079s
2026-10-11 01:01:13,349 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0054020000003dc0160d010404e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:13,349 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005a0200000043c0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:13,349 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:01:13,349 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:01:13,349 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005a' (90)
2026-10-11 01:01:13,349 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:01:13,349 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:01:13,349 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:13,349 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:13,350 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:01:14,351 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:14,351 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 164.080s
2026-10-11 01:01:14,351 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:14,351 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:14,351 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:01:15,352 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:15,352 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 165.081s
2026-10-11 01:01:15,353 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:15,353 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:15,353 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:15] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:15] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:15,411 INFO BGP-Thread-1 (job): ... idle for 0.058s
2026-10-11 01:01:15,411 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 165.139s
2026-10-11 01:01:15,411 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0054020000003dc0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:15,411 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:01:15,411 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:01:15,411 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0054' (84)
2026-10-11 01:01:15,411 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:01:15,411 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:01:15,411 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:15,411 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:15,411 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:15] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:15] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:15] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:16,413 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:16,413 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 166.140s
2026-10-11 01:01:16,413 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005a0200000043c0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:16,413 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:16,413 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:16,413 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:01:17,414 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:17,415 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 167.142s
2026-10-11 01:01:17,415 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:17,415 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:17,415 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:17] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:18,416 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:18,416 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 168.143s
2026-10-11 01:01:18,416 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0054020000003dc0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:18,416 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:18,417 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:18,417 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:01:19,418 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:19,418 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 169.144s
2026-10-11 01:01:19,418 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:19,418 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:19,418 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:19] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:19] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:19,843 INFO BGP-Thread-1 (job): ... idle for 0.425s
2026-10-11 01:01:19,843 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 169.569s
2026-10-11 01:01:19,844 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0054020000003dc0160d010504e3802b2b2b2b0a0a0a0a4001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:19,844 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0056020000003fc01609000604e380ac0c7b034001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:19,844 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:01:19,844 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:01:19,844 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0056' (86)
2026-10-11 01:01:19,844 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:01:19,844 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:01:19,844 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:19,844 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:19,844 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:19] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:19] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:19,878 INFO BGP-Thread-1 (job): ... idle for 0.034s
2026-10-11 01:01:19,878 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 169.602s
2026-10-11 01:01:19,878 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00500200000039c01609000604e380ac0c7b034001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:19,878 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:01:19,878 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:01:19,878 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0050' (80)
2026-10-11 01:01:19,878 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:01:19,878 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:01:19,878 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:19,879 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:19,879 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:19] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:20] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:20] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:20,880 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:20,880 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 170.603s
2026-10-11 01:01:20,880 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0056020000003fc01609000604e380ac0c7b034001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:20,880 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:20,880 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:20,880 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:01:21,882 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:21,882 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 171.605s
2026-10-11 01:01:21,882 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:21,882 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:21,882 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:22] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:22,883 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:22,883 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 172.606s
2026-10-11 01:01:22,883 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00500200000039c01609000604e380ac0c7b034001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:22,884 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:22,884 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:22,884 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:01:23,885 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:23,885 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 173.607s
2026-10-11 01:01:23,885 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:23,885 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:23,885 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:24] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:24] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:24,285 INFO BGP-Thread-1 (job): ... idle for 0.400s
2026-10-11 01:01:24,286 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 174.007s
2026-10-11 01:01:24,286 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00500200000039c01609000604e380ac0c7b034001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:24,286 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005c0200000045c0160f000704e380010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:24,286 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:01:24,286 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:01:24,286 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'005c' (92)
2026-10-11 01:01:24,286 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:01:24,286 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:01:24,286 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:24,286 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:24,287 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:24] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:24] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:24,322 INFO BGP-Thread-1 (job): ... idle for 0.035s
2026-10-11 01:01:24,322 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 174.042s
2026-10-11 01:01:24,322 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0056020000003fc0160f000704e380010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:24,322 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:01:24,322 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:01:24,322 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0056' (86)
2026-10-11 01:01:24,323 DEBUG BGP-Thread-1 (job): Evpn True
2026-10-11 01:01:24,323 DEBUG BGP-Thread-1 (job): Skipping update decoding due to evpn data expected
2026-10-11 01:01:24,323 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:24,323 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:24,323 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:24] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:24] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:01:24] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:25,324 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:25,324 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 175.043s
2026-10-11 01:01:25,324 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005c0200000045c0160f000704e380010007010101010101014001010040020040050400000064800e2200194604c714a629000417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:25,324 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:25,325 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:25,325 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:01:26,326 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:26,326 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 176.044s
2026-10-11 01:01:26,326 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:26,326 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:26,326 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:26] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:01:27,328 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:27,328 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 177.045s
2026-10-11 01:01:27,328 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0056020000003fc0160f000704e380010007010101010101014001010040020040050400000064800f1c0019460417000219999999000100000000000000000000202b2b2b2b
2026-10-11 01:01:27,328 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:27,328 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:27,329 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:01:28,330 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:01:28,330 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 178.047s
2026-10-11 01:01:28,330 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:01:28,330 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:01:28,330 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:01:28] "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-10-11T01:01:28.771509" elapsed="0.003281"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:28.775761" 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-10-11T01:01:28.775093" elapsed="0.000744"/>
</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-10-11T01:01:28.726529" elapsed="0.049385"/>
</kw>
<doc>Abort the Python speaker</doc>
<status status="PASS" start="2026-10-11T01:01:28.578690" elapsed="0.197381"/>
</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-10-11T01:01:28.778095" elapsed="0.000281"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:01:28.777730" elapsed="0.000739"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:28.779780" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:28.779657" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:28.779632" 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-10-11T01:01:28.782946" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:28.782828" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:28.782804" elapsed="0.000250"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:28.784367" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:01:28.783881" elapsed="0.000521"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:01:28.785015" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:01:28.784643" elapsed="0.000420"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:01:28.785122" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T01:01:28.785303" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:01:28.783352" elapsed="0.001985"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:28.788917" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:28.788799" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:28.788774" elapsed="0.000232"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:28.790522" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:28.790373" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:28.790349" elapsed="0.000259"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:01:28.791070" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:01:28.790814" elapsed="0.000291"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:01:28.791557" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:01:28.791335" elapsed="0.000255"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:01:28.824783" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:01:28.792301" elapsed="0.032578"/>
</kw>
<msg time="2026-10-11T01:01:28.825043" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:01:28.825086" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:28.791809" elapsed="0.033312"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:01:28.873797" 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-10-11T01:01:28.825655" elapsed="0.048247"/>
</kw>
<msg time="2026-10-11T01:01:28.874062" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:01:28.874103" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:28.825290" elapsed="0.048848"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:28.874472" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:28.874206" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:28.874189" elapsed="0.000358"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:28.874954" 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-10-11T01:01:28.874729" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:28.875299" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:28.875097" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:28.875080" elapsed="0.000290"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:01:28.875400" 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-10-11T01:01:28.877865" elapsed="0.000270"/>
</kw>
<msg time="2026-10-11T01:01:28.878196" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:28.876793" 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-10-11T01:01:28.878662" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:28.878995" elapsed="0.000086"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:01:28.876182" elapsed="0.003014"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:01:28.875696" 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-10-11T01:01:28.790000" elapsed="0.089328"/>
</kw>
<msg time="2026-10-11T01:01:28.879430" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:28.879472" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:28.789233" elapsed="0.090275"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:01:28.879661" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:01:28.879576" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:28.879558" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:28.880080" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:28.880381" elapsed="0.000046"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:01:28.880471" 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-10-11T01:01:28.788380" elapsed="0.092177"/>
</kw>
<msg time="2026-10-11T01:01:28.880641" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:28.880681" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:28.785829" elapsed="0.094887"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:28.881004" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:28.880781" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:28.880765" elapsed="0.000324"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:01:28.785628" elapsed="0.095482"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:01:28.785425" elapsed="0.095714"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:01:28.782396" elapsed="0.098792"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:01:28.779279" elapsed="0.101959"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:28.778682" elapsed="0.102596"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:01:28.777221" elapsed="0.104103"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:01:28.882063" level="INFO">&amp;{mapping} = { IP=10.30.171.7 | 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-10-11T01:01:28.881648" elapsed="0.000442"/>
</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-10-11T01:01:28.895480" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:28.895163" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:01:28.896189" 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-10-11T01:01:28.895984" elapsed="0.000283">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-10-11T01:01:28.896352" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:01:28.895667" elapsed="0.000708"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:28.896872" 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-10-11T01:01:28.896565" elapsed="0.000331"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:28.897189" 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-10-11T01:01:28.897315" 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-10-11T01:01:28.897078" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:28.897772" 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-10-11T01:01:28.897553" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:28.898731" level="INFO">mapping: {'IP': '10.30.171.7', '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-10-11T01:01:28.898498" elapsed="0.000274"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:01:28.899210" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:01:28.898948" elapsed="0.000286"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:01:28.899839" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:01:28.899570" elapsed="0.000294"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:01:28.900763" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:01:28.900572" elapsed="0.000216"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:01:28.900833" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:01:28.900958" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:01:28.900065" elapsed="0.000917"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:01:28.901162" elapsed="0.000185"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T01:01:28.899435" elapsed="0.001950"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:01:28.901906" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:01:28.901634" elapsed="0.000297"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:01:28.902627" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:01:28.902448" elapsed="0.000204"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:01:28.902696" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:01:28.902819" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:01:28.902123" elapsed="0.000719"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:01:28.903006" elapsed="0.000182"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:01:28.901501" elapsed="0.001724"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:01:28.899277" elapsed="0.004011"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:01:28.903329" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:01:28.903475" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:01:28.898142" elapsed="0.005357"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:28.897874" elapsed="0.005654"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:28.903701" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:28.903551" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:28.897856" elapsed="0.005915"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:28.904485" 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-10-11T01:01:28.903932" elapsed="0.000579"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:01:28.904556" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:01:28.894643" elapsed="0.010012"/>
</kw>
<msg time="2026-10-11T01:01:28.904703" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:28.890234" elapsed="0.014512"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:01:28.908941" 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/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-10-11T01:01:28.913191" 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/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-10-11T01:01:28.917345" elapsed="0.000023"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:28.917539" 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-10-11T01:01:28.917721" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:28.918071" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:28.917911" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:01:28.917897" 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-10-11T01:01:28.918298" 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-10-11T01:01:28.918493" 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-10-11T01:01:28.918657" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:01:28.917872" elapsed="0.000832"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:01:28.917787" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:28.918878" elapsed="0.000046"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:01:28.918975" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:01:28.919102" 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-10-11T01:01:28.889603" elapsed="0.029525"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:28.920140" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:28.919902" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:28.928789" level="INFO">DELETE Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:28.928847" level="INFO">DELETE Response : url=http://10.30.170.173: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.171.7 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:28.928962" 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-10-11T01:01:28.920485" elapsed="0.008503"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:28.920242" elapsed="0.008804"/>
</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-10-11T01:01:28.929253" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:28.929075" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:28.920226" elapsed="0.009105"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:28.930646" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:28.930332" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:28.930083" elapsed="0.000635"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:28.930064" elapsed="0.000677"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:28.931315" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:28.931047" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:28.930791" elapsed="0.000597"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:28.930776" elapsed="0.000649"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:28.932212" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:01:28.931614" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:28.932539" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:28.932301" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:28.933080" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:01:28.932783" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:28.932616" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:28.932284" elapsed="0.000879"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:28.933698" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:01:28.933340" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:28.933996" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:28.933786" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:28.934523" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:01:28.934244" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:28.934081" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:28.933769" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:28.934790" elapsed="0.000309"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:01:28.935512" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:01:28.935262" elapsed="0.000275"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:01:28.935692" elapsed="0.000213"/>
</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-10-11T01:01:28.929706" elapsed="0.006256"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:01:28.936005" elapsed="0.000046"/>
</return>
<msg time="2026-10-11T01:01:28.936198" 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-10-11T01:01:28.919365" elapsed="0.016858"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:01:28.936270" elapsed="0.000024"/>
</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-10-11T01:01:28.882297" elapsed="0.054070"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-10-11T01:01:28.776469" elapsed="0.160018"/>
</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-10-11T01:01:28.937900" elapsed="0.000214"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:01:28.937650" elapsed="0.000515"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:28.939127" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:28.938979" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:28.938962" 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-10-11T01:01:28.941224" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:28.941142" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:28.941125" elapsed="0.000160"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:28.942198" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:01:28.941864" elapsed="0.000360"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:01:28.942653" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:01:28.942376" elapsed="0.000302"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:01:28.942718" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:01:28.942842" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:01:28.941509" elapsed="0.001355"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:28.945569" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:28.945485" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:28.945467" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:28.946702" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:28.946620" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:28.946603" elapsed="0.000160"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:01:28.947092" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:01:28.946910" elapsed="0.000206"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:01:28.947437" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:01:28.947280" elapsed="0.000182"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:01:28.980044" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:01:28.947945" elapsed="0.032201"/>
</kw>
<msg time="2026-10-11T01:01:28.980305" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:01:28.980389" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:28.947619" elapsed="0.032827"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:01:29.010948" 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-10-11T01:01:28.980977" elapsed="0.030085"/>
</kw>
<msg time="2026-10-11T01:01:29.011213" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:01:29.011254" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:28.980622" elapsed="0.030667"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:29.011597" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:29.011359" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:29.011340" elapsed="0.000330"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.012116" 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-10-11T01:01:29.011853" elapsed="0.000328"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:29.012459" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:29.012242" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:29.012224" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:01:29.012561" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:01:29.014989" elapsed="0.000133"/>
</kw>
<msg time="2026-10-11T01:01:29.015179" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:29.013925" elapsed="0.001386"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:29.015641" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:29.015975" 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-10-11T01:01:29.013319" 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-10-11T01:01:29.012839" elapsed="0.003396"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:01:28.946342" elapsed="0.069966"/>
</kw>
<msg time="2026-10-11T01:01:29.016390" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:29.016450" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:28.945784" elapsed="0.070703"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:01:29.016641" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:01:29.016555" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:29.016538" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:29.017060" 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-10-11T01:01:29.017362" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:01:29.017452" 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-10-11T01:01:28.945181" elapsed="0.072357"/>
</kw>
<msg time="2026-10-11T01:01:29.017622" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:29.017662" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:28.943211" elapsed="0.074488"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:29.018035" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:29.017800" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:29.017782" elapsed="0.000325"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:01:28.943069" elapsed="0.075061"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:01:28.942913" elapsed="0.075243"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:01:28.940842" elapsed="0.077363"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:01:28.938729" elapsed="0.079525"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:28.938315" elapsed="0.079979"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:01:28.937290" elapsed="0.081050"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.019032" level="INFO">&amp;{mapping} = { IP=10.30.170.173 | 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-10-11T01:01:29.018625" elapsed="0.000434"/>
</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-10-11T01:01:29.032925" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:29.032621" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:01:29.033670" 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-10-11T01:01:29.033464" elapsed="0.000284">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-10-11T01:01:29.033833" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:01:29.033128" elapsed="0.000728"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.034371" 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-10-11T01:01:29.034058" elapsed="0.000337"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:29.034691" 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-10-11T01:01:29.034830" 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-10-11T01:01:29.034578" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.035281" 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-10-11T01:01:29.035059" elapsed="0.000265"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.036243" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:01:29.035992" elapsed="0.000293"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.036724" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:01:29.036475" elapsed="0.000273"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.037340" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:01:29.037072" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:01:29.038052" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:01:29.037858" elapsed="0.000219"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:01:29.038121" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:01:29.038246" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:01:29.037549" elapsed="0.000720"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:01:29.038447" elapsed="0.000173"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:01:29.036927" elapsed="0.001761"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.039205" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:01:29.038922" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:01:29.039899" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:01:29.039722" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:01:29.039966" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:01:29.040114" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:01:29.039397" elapsed="0.000741"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:01:29.040307" elapsed="0.000182"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:01:29.038791" elapsed="0.001735"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:01:29.036791" elapsed="0.003773"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:01:29.040603" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:01:29.040730" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:01:29.035654" elapsed="0.005100"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:29.035385" elapsed="0.005397"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:29.040955" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:29.040805" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:29.035367" elapsed="0.005672"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.041888" 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-10-11T01:01:29.041202" elapsed="0.000714"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:01:29.041960" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:01:29.032099" elapsed="0.009976"/>
</kw>
<msg time="2026-10-11T01:01:29.042125" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:29.027714" elapsed="0.014454"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:01:29.046350" 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/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-10-11T01:01:29.050523" 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/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-10-11T01:01:29.054667" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:29.054849" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:29.055043" 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-10-11T01:01:29.055431" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:29.055270" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:01:29.055256" 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-10-11T01:01:29.055661" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:29.055839" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:29.056002" elapsed="0.000044"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:01:29.055231" elapsed="0.000847"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:01:29.055142" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:29.056255" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:01:29.056320" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:01:29.056446" 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-10-11T01:01:29.027075" elapsed="0.029397"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.057480" 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.173</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:29.057242" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:29.064000" level="INFO">DELETE Request : url=http://10.30.170.173: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.173 
 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.173 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kbwyjw8fcfl2alf3njq8kbw619.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:29.064059" level="INFO">DELETE Response : url=http://10.30.170.173: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.173 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:29.064144" 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-10-11T01:01:29.057809" elapsed="0.006359"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:29.057582" elapsed="0.006621"/>
</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-10-11T01:01:29.064376" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:29.064227" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:29.057566" elapsed="0.006906"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.065670" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:29.065382" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:29.065143" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:29.065124" elapsed="0.000639"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.066323" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:29.066058" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:29.065811" elapsed="0.000582"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:29.065797" elapsed="0.000633"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.066945" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:01:29.066607" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:29.067271" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:29.067060" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.067835" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:01:29.067570" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:29.067386" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:29.067014" elapsed="0.000898"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.068451" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:01:29.068101" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:29.068747" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:29.068539" elapsed="0.000259"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.069259" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:01:29.068981" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:29.068820" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:29.068523" elapsed="0.000812"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:29.069494" elapsed="0.000292"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:01:29.070194" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:01:29.069945" elapsed="0.000274"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:01:29.070372" elapsed="0.000226"/>
</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-10-11T01:01:29.064794" elapsed="0.005859"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:01:29.070694" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:01:29.070866" 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-10-11T01:01:29.056709" elapsed="0.014181"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:01:29.070936" elapsed="0.000024"/>
</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-10-11T01:01:29.019262" elapsed="0.051783"/>
</kw>
<doc>Revert the BGP configuration to the original state: without application peer</doc>
<status status="PASS" start="2026-10-11T01:01:28.936772" elapsed="0.134369"/>
</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-10-11T01:01:29.072144" elapsed="0.000407"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:29.072766" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects </doc>
<status status="PASS" start="2026-10-11T01:01:29.072700" elapsed="0.000140"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-10-11T01:01:29.071766" elapsed="0.001123"/>
</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-10-11T00:58:27.846603" elapsed="181.226312"/>
</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-10-11T01:01:29.101448" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:01:29.099862" elapsed="0.001629"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-10-11T01:01:29.099632" elapsed="0.001915"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.103940" 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-10-11T01:01:29.102510" elapsed="0.001455"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-10-11T01:01:29.104131" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:29.104048" elapsed="0.000122"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:29.104029" elapsed="0.000162"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.104704" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:01:29.104366" elapsed="0.000377"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.105192" 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-10-11T01:01:29.104903" elapsed="0.000345"/>
</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-10-11T01:01:29.105761" elapsed="0.000247"/>
</kw>
<msg time="2026-10-11T01:01:29.106110" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:29.106153" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:29.105427" elapsed="0.000747"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.106676" 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-10-11T01:01:29.106346" elapsed="0.000354"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.107568" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:01:29.107304" elapsed="0.000289"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.107971" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:01:29.107734" elapsed="0.000261"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.108460" 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-10-11T01:01:29.108178" elapsed="0.000307"/>
</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-10-11T01:01:29.109323" elapsed="0.000171"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.109924" level="INFO">${member_ip} = 10.30.170.173</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:01:29.109650" elapsed="0.000299"/>
</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-10-11T01:01:29.110123" elapsed="0.000165"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.110996" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:29.110736" elapsed="0.000314"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-11T01:01:29.111094" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:01:29.111222" 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-10-11T01:01:29.110476" elapsed="0.000769"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:29.111741" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x74344543c390&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-10-11T01:01:29.111429" elapsed="0.000426"/>
</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-10-11T01:01:29.112012" elapsed="0.000160"/>
</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-10-11T01:01:29.108876" elapsed="0.003349"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:01:29.108707" elapsed="0.003556"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-10-11T01:01:29.108531" elapsed="0.003759"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.112839" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:01:29.112490" elapsed="0.000388"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.113430" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.173'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:01:29.113071" elapsed="0.000399"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.113984" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:01:29.113650" elapsed="0.000384"/>
</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-10-11T01:01:29.106920" elapsed="0.007168"/>
</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-10-11T01:01:29.102183" elapsed="0.011956"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:29.114284" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:29.114197" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:29.114180" elapsed="0.000164"/>
</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-10-11T01:01:29.115583" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:01:29.115251" elapsed="0.000357"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.116014" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:01:29.115758" elapsed="0.000294"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:01:29.116093" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:01:29.116218" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:01:29.114942" elapsed="0.001298"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:01:29.117230" level="INFO">${member_ip} = 10.30.170.173</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-10-11T01:01:29.116863" elapsed="0.000392"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:01:29.117964" 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-10-11T01:01:29.118068" 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-10-11T01:01:29.117823" elapsed="0.000271"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:29.121121" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:29.120551" elapsed="0.000651"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:29.120532" elapsed="0.000706"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:01:29.121919" 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-10-11T01:01:29.122170" 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-10-11T01:01:29.121494" elapsed="0.000726"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.123345" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.173" 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-10-11T01:01:29.122688" elapsed="0.000817"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:01:29.124621" 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-10-11T01:01:29.123790" elapsed="0.000879"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.126290" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T01:01:29.126638" 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-10-11T01:01:29.125948" elapsed="0.000733"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:29.127007" elapsed="0.000441"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T01:01:29.128545" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T01:01:29.746568" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 01:01:29 UTC 2026

  System load:  0.13               Processes:             121
  Usage of /:   14.2% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.173
  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.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:58:28 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T01:01:29.128248" elapsed="0.618451"/>
</kw>
<msg time="2026-10-11T01:01:29.746775" 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-10-11T01:01:29.127788" elapsed="0.619124"/>
</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-10-11T01:01:29.125093" elapsed="0.622036"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:29.748009" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-10-11T01:01:29.761258" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-10-11T01:01:29.761455" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T01:01:29.761555" 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-10-11T01:01:29.747547" elapsed="0.014055"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:01:29.761909" elapsed="0.000694"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.764308" 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-10-11T01:01:29.763517" elapsed="0.000990"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T01:01:29.765064" elapsed="0.000096"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:29.764730" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:29.764696" elapsed="0.000628"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T01:01:29.765733" elapsed="0.000113"/>
</return>
<status status="PASS" start="2026-10-11T01:01:29.765460" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:29.765436" elapsed="0.000577"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T01:01:29.766112" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:29.767937" elapsed="0.000668"/>
</kw>
<kw name="Open 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-10-11T01:01:29.769046" elapsed="0.000403"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:01:29.769811" elapsed="0.000310"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:01:29.766923" elapsed="0.003285"/>
</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-10-11T01:01:29.119685" elapsed="0.650673"/>
</kw>
<msg time="2026-10-11T01:01:29.770507" 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-10-11T01:01:29.119107" elapsed="0.651475"/>
</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-10-11T01:01:29.118714" elapsed="0.651967"/>
</kw>
<msg time="2026-10-11T01:01:29.770732" 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-10-11T01:01:29.118247" elapsed="0.652543"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:29.771714" elapsed="0.000401"/>
</kw>
<kw name="Open 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-10-11T01:01:29.772370" elapsed="0.000218"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:01:29.772784" 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-10-11T01:01:29.771197" elapsed="0.001776"/>
</kw>
<msg time="2026-10-11T01:01:29.773104" 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-10-11T01:01:29.117472" elapsed="0.655665"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.773789" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:29.773478" elapsed="0.000365"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-11T01:01:29.773895" elapsed="0.000038"/>
</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-10-11T01:01:29.116560" elapsed="0.657492"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:01:29.116386" elapsed="0.657713"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:01:29.116286" elapsed="0.657860"/>
</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-10-11T01:01:29.114567" elapsed="0.659651"/>
</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-10-11T01:01:29.774449" elapsed="0.000284"/>
</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-10-11T01:01:29.782444" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:29.782304" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:29.782279" elapsed="0.000255"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:01:29.782981" 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-10-11T01:01:29.783130" 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-10-11T01:01:29.782809" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.783767" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:29.783449" elapsed="0.000376"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.784426" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:29.784103" elapsed="0.000383"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:01:29.785481" 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-10-11T01:01:29.785212" elapsed="0.000413">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-10-11T01:01:29.785760" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T01:01:29.785817" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:29.784703" elapsed="0.001143"/>
</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-10-11T01:01:29.786283" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:29.785940" elapsed="0.000436"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:29.785916" elapsed="0.000510"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:01:29.787583" level="INFO">${ip_address} = 10.30.170.173</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-10-11T01:01:29.787043" elapsed="0.000565"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-10-11T01:01:29.787653" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:01:29.787777" level="INFO">${odl_ip} = 10.30.170.173</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-10-11T01:01:29.786684" elapsed="0.001115"/>
</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-10-11T01:01:29.787978" elapsed="0.000345"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:01:29.788647" level="INFO">index=4
host=10.30.170.173
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-10-11T01:01:29.788736" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.173
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-10-11T01:01:29.788549" elapsed="0.000211"/>
</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-10-11T01:01:29.788921" elapsed="0.000261"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-10-11T01:01:29.789586" level="INFO">Logging into '10.30.170.173:8101' as 'karaf'.</msg>
<msg time="2026-10-11T01:01:29.962950" 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-10-11T01:01:29.789370" elapsed="0.173704"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:29.964335" elapsed="0.000292"/>
</kw>
<kw name="Open 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-10-11T01:01:29.964815" elapsed="0.000139"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:01:29.965169" elapsed="0.000093"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:01:29.963957" elapsed="0.001352"/>
</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-10-11T01:01:29.963399" elapsed="0.001951"/>
</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-10-11T01:01:29.781960" elapsed="0.183436"/>
</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-10-11T01:01:29.775812" elapsed="0.189645"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:29.775266" elapsed="0.190239"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:01:29.775066" elapsed="0.190474"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-10-11T01:01:29.774862" elapsed="0.190711"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-10-11T01:01:29.101794" elapsed="0.863833"/>
</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-10-11T01:01:29.966485" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:29.966377" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:29.966356" 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-10-11T01:01:29.968715" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:29.968632" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:29.968614" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.969657" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:01:29.969309" elapsed="0.000373"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:01:29.970114" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:01:29.969835" elapsed="0.000303"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:01:29.970178" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:01:29.970309" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:01:29.968988" elapsed="0.001344"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:29.972820" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:29.972734" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:29.972717" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:29.973929" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:29.973843" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:29.973825" elapsed="0.000167"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:01:29.974457" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:01:29.974166" elapsed="0.000317"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:01:29.974838" 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-10-11T01:01:29.974651" elapsed="0.000211"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:01:30.007821" 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-10-11T01:01:29.975545" elapsed="0.032406"/>
</kw>
<msg time="2026-10-11T01:01:30.008098" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:01:30.008145" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:29.975032" elapsed="0.033149"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:01:30.082042" 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-10-11T01:01:30.009018" elapsed="0.073220"/>
</kw>
<msg time="2026-10-11T01:01:30.082374" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:01:30.082432" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:30.008349" elapsed="0.074121"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:30.082760" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:30.082542" elapsed="0.000360"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:30.082523" elapsed="0.000405"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:30.083526" 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-10-11T01:01:30.083144" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:30.083878" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:30.083675" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:30.083657" elapsed="0.000458"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:01:30.084147" 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">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:30.085985" elapsed="0.000446"/>
</kw>
<kw name="Open 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-10-11T01:01:30.086791" elapsed="0.000434"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:01:30.087566" elapsed="0.000221"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:01:30.085261" elapsed="0.002610"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:01:30.084441" 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-10-11T01:01:29.973639" elapsed="0.114458"/>
</kw>
<msg time="2026-10-11T01:01:30.088180" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:30.088219" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:29.973049" elapsed="0.115206"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:01:30.088426" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-11T01:01:30.088325" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:30.088307" elapsed="0.000200"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:30.088838" 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-10-11T01:01:30.089155" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:01:30.089220" 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-10-11T01:01:29.972503" elapsed="0.116803"/>
</kw>
<msg time="2026-10-11T01:01:30.089389" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:30.089445" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:29.970687" elapsed="0.118795"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:30.089770" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:30.089550" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:30.089533" elapsed="0.000307"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:01:29.970543" elapsed="0.119318"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:01:29.970381" elapsed="0.119506"/>
</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-10-11T01:01:29.968387" elapsed="0.121548"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-10-11T01:01:29.966197" elapsed="0.123840"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:29.965781" elapsed="0.124297"/>
</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-10-11T01:01:29.099354" elapsed="0.990773"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:01:30.090867" 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-10-11T01:01:30.090303" elapsed="0.000588"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:30.091388" level="INFO">${mininet_conn_id} = 7</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:01:30.091096" elapsed="0.000347"/>
</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-10-11T01:01:30.092979" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T01:01:30.093065" 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-10-11T01:01:30.092721" elapsed="0.000372"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:30.093245" elapsed="0.000325"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T01:01:30.094352" level="INFO">Logging into '10.30.171.7:22' as 'jenkins'.</msg>
<msg time="2026-10-11T01:01:30.693563" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Sun Oct 11 01:01:30 UTC 2026

  System load:  0.02               Processes:             105
  Usage of /:   19.9% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.7
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 00:58:29 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T01:01:30.094118" elapsed="0.599548"/>
</kw>
<msg time="2026-10-11T01:01:30.693735" 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-10-11T01:01:30.093736" elapsed="0.600062"/>
</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-10-11T01:01:30.092305" elapsed="0.601583"/>
</kw>
<msg time="2026-10-11T01:01:30.693935" 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-10-11T01:01:30.091929" elapsed="0.602049"/>
</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-10-11T01:01:30.091624" elapsed="0.602440"/>
</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-10-11T01:01:30.697636" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:30.697323" elapsed="0.000340"/>
</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-10-11T01:01:30.698990" level="INFO">Executing command 'cd '.' &amp;&amp; virtualenv /tmp/defaultvenv'.</msg>
<msg time="2026-10-11T01:01:31.005181" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:01:31.005474" level="INFO">${stdout} = created virtual environment CPython3.10.12.final.0-64 in 133ms
  creator CPython3Posix(dest=/tmp/defaultvenv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=b...</msg>
<msg time="2026-10-11T01:01:31.005574" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T01:01:31.005658" 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-10-11T01:01:30.698832" elapsed="0.306875"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T01:01:31.007555" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T01:01:31.006940" elapsed="0.000713"/>
</kw>
<msg time="2026-10-11T01:01:31.007844" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T01:01:31.007931" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:31.006147" elapsed="0.001829"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:31.009264" 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-10-11T01:01:31.008430" elapsed="0.000889"/>
</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-10-11T01:01:31.011587" level="INFO">created virtual environment CPython3.10.12.final.0-64 in 133ms
  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-10-11T01:01:31.011048" elapsed="0.000643"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:31.012655" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:31.012139" elapsed="0.000602"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:31.013742" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:31.013227" elapsed="0.000605"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T01:01:31.010236" elapsed="0.003707"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:31.009613" elapsed="0.004404"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:31.009474" elapsed="0.004624"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T01:01:31.014390" elapsed="0.000075"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:31.014214" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:31.014180" elapsed="0.000396"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T01:01:31.014839" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-10-11T01:01:31.014684" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:31.014650" elapsed="0.000360"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:31.015368" 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-10-11T01:01:30.698327" elapsed="0.317289"/>
</kw>
<msg time="2026-10-11T01:01:31.015727" 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-10-11T01:01:30.697820" elapsed="0.318005"/>
</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-10-11T01:01:30.696809" elapsed="0.319255"/>
</kw>
<msg time="2026-10-11T01:01:31.016176" 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-10-11T01:01:30.694976" elapsed="0.321289"/>
</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-10-11T01:01:30.694643" elapsed="0.321862"/>
</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-10-11T01:01:31.025725" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:31.025053" elapsed="0.000732"/>
</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-10-11T01:01:31.029343" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate'.</msg>
<msg time="2026-10-11T01:01:33.049468" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:01:33.049949" level="INFO">${stdout} = Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Using cached pip-26.2.1-py3-none-any.whl (1.8 MB)
Installing collected packages: pip
  Att...</msg>
<msg time="2026-10-11T01:01:33.050141" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T01:01:33.050287" 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-10-11T01:01:31.028671" elapsed="2.021698"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T01:01:33.055826" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T01:01:33.054740" elapsed="0.001369"/>
</kw>
<msg time="2026-10-11T01:01:33.056696" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T01:01:33.056869" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:33.051208" elapsed="0.005742"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:33.060087" 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-10-11T01:01:33.057661" elapsed="0.002518"/>
</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-10-11T01:01:33.065176" level="INFO">Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Using cached pip-26.2.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.2.1</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:33.064254" elapsed="0.001131"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:33.067196" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:33.066361" elapsed="0.001031"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:33.069190" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:33.068371" elapsed="0.001017"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T01:01:33.062130" elapsed="0.007532"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:33.060698" elapsed="0.009178"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:33.060641" elapsed="0.009297"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T01:01:33.070307" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:33.070085" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:33.070046" elapsed="0.000603"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T01:01:33.070958" elapsed="0.000093"/>
</return>
<status status="PASS" start="2026-10-11T01:01:33.070758" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:33.070726" elapsed="0.000595"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:33.071774" 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-10-11T01:01:31.027533" elapsed="2.044625"/>
</kw>
<msg time="2026-10-11T01:01:33.072274" 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-10-11T01:01:31.026164" elapsed="2.046222"/>
</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-10-11T01:01:31.023883" elapsed="2.048740"/>
</kw>
<msg time="2026-10-11T01:01:33.072728" 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-10-11T01:01:31.020361" elapsed="2.052459"/>
</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-10-11T01:01:31.019342" elapsed="2.053633"/>
</kw>
<msg time="2026-10-11T01:01:33.073094" 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-10-11T01:01:31.018528" elapsed="2.054657"/>
</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-10-11T01:01:31.017782" elapsed="2.055554"/>
</kw>
<msg time="2026-10-11T01:01:33.073458" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:31.016836" elapsed="2.056716"/>
</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-10-11T01:01:30.694316" elapsed="2.379384"/>
</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-10-11T01:01:33.083674" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:33.082978" elapsed="0.000757"/>
</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-10-11T01:01:33.087298" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate'.</msg>
<msg time="2026-10-11T01:01:33.834292" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:01:33.834842" 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-10-11T01:01:33.834940" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T01:01:33.835051" 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-10-11T01:01:33.086583" elapsed="0.748522"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T01:01:33.840363" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T01:01:33.839070" elapsed="0.001578"/>
</kw>
<msg time="2026-10-11T01:01:33.840953" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T01:01:33.841071" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:33.835832" elapsed="0.005291"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:33.843952" 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-10-11T01:01:33.841781" elapsed="0.002228"/>
</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-10-11T01:01:33.848716" 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-10-11T01:01:33.847886" elapsed="0.000979"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:33.850457" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:33.849739" elapsed="0.000856"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:33.852165" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:33.851487" elapsed="0.000815"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T01:01:33.845760" elapsed="0.006736"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:33.844337" elapsed="0.008360"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:33.844282" elapsed="0.008475"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T01:01:33.853083" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:33.852877" elapsed="0.000415"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:33.852840" elapsed="0.000503"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T01:01:33.853683" elapsed="0.000067"/>
</return>
<status status="PASS" start="2026-10-11T01:01:33.853522" elapsed="0.000406"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:33.853486" elapsed="0.000497"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:33.854350" 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-10-11T01:01:33.085447" elapsed="0.769211"/>
</kw>
<msg time="2026-10-11T01:01:33.854772" 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-10-11T01:01:33.084110" elapsed="0.770770"/>
</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-10-11T01:01:33.081839" elapsed="0.773257"/>
</kw>
<msg time="2026-10-11T01:01:33.855209" 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-10-11T01:01:33.078194" elapsed="0.777106"/>
</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-10-11T01:01:33.077178" elapsed="0.778375"/>
</kw>
<msg time="2026-10-11T01:01:33.855652" 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-10-11T01:01:33.076330" elapsed="0.779412"/>
</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-10-11T01:01:33.075574" elapsed="0.780342"/>
</kw>
<msg time="2026-10-11T01:01:33.856116" 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-10-11T01:01:33.074735" elapsed="0.781478"/>
</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-10-11T01:01:33.074119" elapsed="0.782260"/>
</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-10-11T01:01:33.866636" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:33.865944" elapsed="0.000752"/>
</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-10-11T01:01:33.870355" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==3.4.16; deactivate'.</msg>
<msg time="2026-10-11T01:01:35.203791" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:01:35.204345" 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-10-11T01:01:35.204507" 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-10-11T01:01:35.204612" 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-10-11T01:01:33.869637" elapsed="1.335026"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T01:01:35.209980" level="INFO">Length is 1862.</msg>
<msg time="2026-10-11T01:01:35.211083" 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-qna_7mpa/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-qna_7mpa/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-qna_7mpa/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-qna_7mpa/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())  # noqa: S102 # exec is intentional here
        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-10-11T01:01:35.208709" elapsed="0.003077">'  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-qna_7mpa/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-qna_7mpa/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-qna_7mpa/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-qna_7mpa/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())  # noqa: S102 # exec is intentional here
        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-10-11T01:01:35.212181" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-10-11T01:01:35.212283" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:35.205366" elapsed="0.006972"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:35.214936" 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-10-11T01:01:35.212881" elapsed="0.002110"/>
</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-10-11T01:01:35.219587" 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-10-11T01:01:35.218849" elapsed="0.000884"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:35.221283" 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-qna_7mpa/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-qna_7mpa/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-qna_7mpa/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-qna_7mpa/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())  # noqa: S102 # exec is intentional here
        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-10-11T01:01:35.220603" elapsed="0.000894"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:35.222977" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:35.222294" elapsed="0.000845"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T01:01:35.216785" elapsed="0.006500"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:35.215312" elapsed="0.008382"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:35.215258" elapsed="0.008498"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T01:01:35.224086" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:35.223877" elapsed="0.000420"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:35.223841" elapsed="0.000508"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T01:01:35.224652" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-10-11T01:01:35.224492" elapsed="0.000393"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:35.224454" elapsed="0.000486"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:35.225300" elapsed="0.000044"/>
</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-10-11T01:01:33.868446" elapsed="1.357172"/>
</kw>
<msg time="2026-10-11T01:01:35.225733" 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-10-11T01:01:33.867084" elapsed="1.358750"/>
</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-10-11T01:01:33.864790" elapsed="1.361228"/>
</kw>
<msg time="2026-10-11T01:01:35.226152" 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-10-11T01:01:33.860992" elapsed="1.365253"/>
</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-10-11T01:01:33.859966" elapsed="1.366487"/>
</kw>
<msg time="2026-10-11T01:01:35.226553" 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-10-11T01:01:33.859021" elapsed="1.367622"/>
</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-10-11T01:01:33.858244" elapsed="1.368569"/>
</kw>
<msg time="2026-10-11T01:01:35.226896" 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-10-11T01:01:33.857392" elapsed="1.369588"/>
</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-10-11T01:01:33.856831" elapsed="1.370439"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:35.228201" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x743447254710&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-10-11T01:01:35.227699" elapsed="0.000874"/>
</kw>
<kw name="Upload_Config_Files">
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T01:01:35.253665" level="INFO">[chan 5] Opened sftp connection (server version 3)</msg>
<msg time="2026-10-11T01:01:35.264973" 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-10-11T01:01:35.229567" elapsed="0.035551"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T01:01:35.275647" 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-10-11T01:01:35.265563" elapsed="0.010207"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-10-11T01:01:35.288857" 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-10-11T01:01:35.289100" 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-10-11T01:01:35.276123" elapsed="0.013031"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:35.290287" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-10-11T01:01:35.304230" 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-10-11T01:01:35.289990" elapsed="0.014369"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:35.305166" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-10-11T01:01:35.358724" 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-10-11T01:01:35.304846" elapsed="0.053997"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:35.359593" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/enable/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-10-11T01:01:35.406737" 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-10-11T01:01:35.359298" elapsed="0.047558"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:35.407605" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-10-11T01:01:35.459095" 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-10-11T01:01:35.407307" elapsed="0.051907"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:35.459931" level="INFO">Executing command 'cat bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-10-11T01:01:35.507046" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:01:35.507238" level="INFO">${stdout} = neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0.1/3...</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-10-11T01:01:35.459683" elapsed="0.047607"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:35.508385" level="INFO">neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
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-10-11T01:01:35.507834" elapsed="0.000689"/>
</kw>
<var name="${cfgfile}">bgp-flowspec-redirect.cfg</var>
<status status="PASS" start="2026-10-11T01:01:35.289607" elapsed="0.218986"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:35.509538" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-10-11T01:01:35.555005" 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-10-11T01:01:35.509230" elapsed="0.045917"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:35.555922" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-10-11T01:01:35.603256" 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-10-11T01:01:35.555642" elapsed="0.047747"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:35.604179" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/enable/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-10-11T01:01:35.655225" 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-10-11T01:01:35.603878" elapsed="0.051484"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:35.656168" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-10-11T01:01:35.703117" 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-10-11T01:01:35.655863" elapsed="0.047473"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:35.704121" level="INFO">Executing command 'cat bgp-flowspec.cfg'.</msg>
<msg time="2026-10-11T01:01:35.751386" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:01:35.751636" level="INFO">${stdout} = neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0.1/3...</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-10-11T01:01:35.703826" elapsed="0.047867"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:35.752798" level="INFO">neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
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-10-11T01:01:35.752217" elapsed="0.000693"/>
</kw>
<var name="${cfgfile}">bgp-flowspec.cfg</var>
<status status="PASS" start="2026-10-11T01:01:35.508824" elapsed="0.244156"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:35.753969" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-10-11T01:01:35.799136" 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-10-11T01:01:35.753684" elapsed="0.045586"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:35.800089" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-10-11T01:01:35.847115" 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-10-11T01:01:35.799760" elapsed="0.047487"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:35.848053" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/enable/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-10-11T01:01:35.895143" 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-10-11T01:01:35.847764" elapsed="0.047511"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:35.896057" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-10-11T01:01:35.943220" 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-10-11T01:01:35.895766" elapsed="0.047587"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:35.944145" level="INFO">Executing command 'cat bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-10-11T01:01:35.991194" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:01:35.991446" level="INFO">${stdout} = neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
local-as 64496;
peer-as 64496;
  family {
    ipv4 mpls-vpn;
  }
  static {
    route 1.1.1.0/24 {
      next-hop 10.0.255.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-10-11T01:01:35.943847" elapsed="0.047661"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:35.992588" level="INFO">neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
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-10-11T01:01:35.991994" elapsed="0.000695"/>
</kw>
<var name="${cfgfile}">bgp-l3vpn-ipv4.cfg</var>
<status status="PASS" start="2026-10-11T01:01:35.753238" elapsed="0.239523"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:35.993717" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' exa-md5.cfg'.</msg>
<msg time="2026-10-11T01:01:36.039186" 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-10-11T01:01:35.993401" elapsed="0.045918"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:36.040215" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' exa-md5.cfg'.</msg>
<msg time="2026-10-11T01:01:36.091211" 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-10-11T01:01:36.039838" elapsed="0.051507"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:36.092123" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/enable/g' exa-md5.cfg'.</msg>
<msg time="2026-10-11T01:01:36.139119" 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-10-11T01:01:36.091833" elapsed="0.047433"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:36.139894" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exa-md5.cfg'.</msg>
<msg time="2026-10-11T01:01:36.187165" 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-10-11T01:01:36.139650" elapsed="0.047645"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:36.188076" level="INFO">Executing command 'cat exa-md5.cfg'.</msg>
<msg time="2026-10-11T01:01:36.235210" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:01:36.235498" level="INFO">${stdout} = neighbor 10.30.170.173 {
  router-id 10.30.171.7;
  local-address 10.30.171.7;
  local-as 64496;
  peer-as 64496;
  md5-password topsecret;

  capability {
    route-refresh disable;
    add-path disa...</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-10-11T01:01:36.187785" elapsed="0.047777"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.236845" level="INFO">neighbor 10.30.170.173 {
  router-id 10.30.171.7;
  local-address 10.30.171.7;
  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-10-11T01:01:36.236175" elapsed="0.000906"/>
</kw>
<var name="${cfgfile}">exa-md5.cfg</var>
<status status="PASS" start="2026-10-11T01:01:35.992987" elapsed="0.244173"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:36.238172" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' exa.cfg'.</msg>
<msg time="2026-10-11T01:01:36.282860" 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-10-11T01:01:36.237863" elapsed="0.045130"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:36.283836" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' exa.cfg'.</msg>
<msg time="2026-10-11T01:01:36.338765" 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-10-11T01:01:36.283526" elapsed="0.055372"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:36.339719" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/enable/g' exa.cfg'.</msg>
<msg time="2026-10-11T01:01:36.390977" 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-10-11T01:01:36.339445" elapsed="0.051695"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:36.391890" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exa.cfg'.</msg>
<msg time="2026-10-11T01:01:36.443134" 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-10-11T01:01:36.391622" elapsed="0.051660"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:36.444123" level="INFO">Executing command 'cat exa.cfg'.</msg>
<msg time="2026-10-11T01:01:36.499113" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:01:36.499329" level="INFO">${stdout} = neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
local-as 64496;
peer-as 64496;
  capability {
    route-refresh enable;
    add-path disable;
  }

  family {
    ipv4 unicas...</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-10-11T01:01:36.443809" elapsed="0.055578"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.500581" level="INFO">neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
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.171.7;
    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-10-11T01:01:36.499953" elapsed="0.000730"/>
</kw>
<var name="${cfgfile}">exa.cfg</var>
<status status="PASS" start="2026-10-11T01:01:36.237459" elapsed="0.263295"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:36.501721" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' gobgp.cfg'.</msg>
<msg time="2026-10-11T01:01:36.547352" 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-10-11T01:01:36.501432" elapsed="0.046091"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:36.548380" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' gobgp.cfg'.</msg>
<msg time="2026-10-11T01:01:36.599077" 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-10-11T01:01:36.547972" elapsed="0.051242"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:36.599987" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/enable/g' gobgp.cfg'.</msg>
<msg time="2026-10-11T01:01:36.647015" 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-10-11T01:01:36.599716" elapsed="0.047481"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:36.648100" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' gobgp.cfg'.</msg>
<msg time="2026-10-11T01:01:36.694854" 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-10-11T01:01:36.647730" elapsed="0.047255"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:01:36.695778" level="INFO">Executing command 'cat gobgp.cfg'.</msg>
<msg time="2026-10-11T01:01:36.743188" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:01:36.743405" level="INFO">${stdout} = [global.config]
    as = 64496
    router-id = "10.30.171.7"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.173"
        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-10-11T01:01:36.695504" elapsed="0.047999"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.744674" level="INFO">[global.config]
    as = 64496
    router-id = "10.30.171.7"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.173"
        local-as = 64496
    [neighbors.transport.config]
        local-address = "10.30.171.7"
        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-10-11T01:01:36.744063" elapsed="0.000716"/>
</kw>
<var name="${cfgfile}">gobgp.cfg</var>
<status status="PASS" start="2026-10-11T01:01:36.500997" elapsed="0.243853"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-10-11T01:01:35.289270" elapsed="1.455649"/>
</for>
<doc>Uploads exabgp config files</doc>
<status status="PASS" start="2026-10-11T01:01:35.229001" elapsed="1.516068"/>
</kw>
<doc>Suite setup keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:29.099101" elapsed="7.646074"/>
</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-10-11T01:01:36.748065" elapsed="0.000503"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:01:36.747478" elapsed="0.001204"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:36.751370" elapsed="0.000068"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:36.751140" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:36.751095" elapsed="0.000466"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:36.756160" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:36.755944" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:36.755907" elapsed="0.000393"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.758536" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:01:36.757684" elapsed="0.000909"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.759588" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:01:36.758937" elapsed="0.000705"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:01:36.759734" elapsed="0.000073"/>
</return>
<msg time="2026-10-11T01:01:36.760054" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:01:36.756790" elapsed="0.003318"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:36.766130" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:36.765914" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:36.765873" elapsed="0.000401"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:36.768733" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:36.768543" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:36.768502" elapsed="0.000370"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:01:36.769689" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:01:36.769263" elapsed="0.000481"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:01:36.770481" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:01:36.770135" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:01:36.806059" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:01:36.771696" elapsed="0.034494"/>
</kw>
<msg time="2026-10-11T01:01:36.806440" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:01:36.806503" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:36.770888" elapsed="0.035662"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:01:36.841830" 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-10-11T01:01:36.807278" elapsed="0.034693"/>
</kw>
<msg time="2026-10-11T01:01:36.842173" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:01:36.842217" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:36.806784" elapsed="0.035469"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:36.842648" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:36.842341" elapsed="0.000361"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:36.842315" elapsed="0.000412"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.843212" 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-10-11T01:01:36.842915" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:36.843560" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:36.843340" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:36.843323" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:01:36.843666" 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-10-11T01:01:36.846351" elapsed="0.000140"/>
</kw>
<msg time="2026-10-11T01:01:36.846550" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:36.845221" 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-10-11T01:01:36.846996" elapsed="0.000103"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:36.847362" 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-10-11T01:01:36.844604" elapsed="0.002979"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:01:36.844078" elapsed="0.003583"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:01:36.767900" elapsed="0.079843"/>
</kw>
<msg time="2026-10-11T01:01:36.847829" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:36.847870" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:36.766649" elapsed="0.081257"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:01:36.848087" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T01:01:36.847977" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:36.847959" 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-10-11T01:01:36.848541" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:36.848848" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:01:36.848913" 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-10-11T01:01:36.765232" elapsed="0.083768"/>
</kw>
<msg time="2026-10-11T01:01:36.849101" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:36.849142" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:36.760880" elapsed="0.088299"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:36.849489" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:36.849247" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:36.849232" elapsed="0.000328"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:01:36.760563" elapsed="0.089020"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:01:36.760216" elapsed="0.089401"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:01:36.755263" elapsed="0.094408"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:01:36.750517" elapsed="0.099206"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:36.749047" elapsed="0.100718"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:01:36.746625" elapsed="0.103189"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.850658" 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.173 | BGP_RIB_OPENCONFIG=example-bgp-rib | IP=10.30.170.173 }</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-10-11T01:01:36.850003" elapsed="0.000683"/>
</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-10-11T01:01:36.861390" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:36.861083" elapsed="0.000348"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:01:36.862196" 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-10-11T01:01:36.861954" elapsed="0.000316">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-10-11T01:01:36.862354" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:01:36.861629" elapsed="0.000748"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.862879" 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-10-11T01:01:36.862567" elapsed="0.000338"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:36.863200" 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-10-11T01:01:36.863346" 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-10-11T01:01:36.863087" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.863802" 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-10-11T01:01:36.863580" elapsed="0.000265"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.864762" 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.173', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.173'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:36.864527" elapsed="0.000278"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.865240" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:01:36.864977" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.865881" 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-10-11T01:01:36.865608" elapsed="0.000298"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:01:36.866604" 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-10-11T01:01:36.866394" elapsed="0.000234"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:01:36.866672" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:01:36.866798" 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-10-11T01:01:36.866086" elapsed="0.000734"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:01:36.866985" elapsed="0.000197"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T01:01:36.865475" elapsed="0.001744"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.867732" 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-10-11T01:01:36.867462" elapsed="0.000294"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:01:36.868437" 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-10-11T01:01:36.868245" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:01:36.868505" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:01:36.868628" 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-10-11T01:01:36.867923" elapsed="0.000728"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:01:36.868813" elapsed="0.000165"/>
</kw>
<var name="${key}">APP_PEER_NAME</var>
<var name="${value}">example-bgp-peer-app</var>
<status status="PASS" start="2026-10-11T01:01:36.867317" elapsed="0.001696"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.869721" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:01:36.869271" elapsed="0.000474"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:01:36.870425" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:01:36.870234" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:01:36.870495" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:01:36.870622" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:01:36.869913" elapsed="0.000732"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:01:36.870842" elapsed="0.000169"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:01:36.869142" elapsed="0.001918"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.871576" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:01:36.871291" elapsed="0.000310"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:01:36.872266" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:01:36.872088" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:01:36.872334" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:01:36.872474" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:01:36.871768" elapsed="0.000730"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:01:36.872662" elapsed="0.000164"/>
</kw>
<var name="${key}">APP_PEER_ID</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:01:36.871162" elapsed="0.001701"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.873372" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:01:36.873103" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:01:36.874075" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:01:36.873886" elapsed="0.000213"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:01:36.874142" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:01:36.874265" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:01:36.873579" elapsed="0.000708"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:01:36.874474" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:01:36.872962" elapsed="0.001714"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.875196" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:01:36.874903" elapsed="0.000317"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:01:36.875885" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:01:36.875710" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:01:36.875952" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:01:36.876090" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:01:36.875386" elapsed="0.000727"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:01:36.876274" elapsed="0.000180"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:01:36.874774" elapsed="0.001717"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:01:36.865310" elapsed="0.011214"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:01:36.876560" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:01:36.876690" 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.173', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:01:36.864170" elapsed="0.012544"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:36.863906" elapsed="0.012837"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:36.876913" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:36.876765" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:36.863889" elapsed="0.013093"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.877773" 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-10-11T01:01:36.877153" elapsed="0.000647"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:01:36.877844" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:01:36.860560" elapsed="0.017383"/>
</kw>
<msg time="2026-10-11T01:01:36.878023" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:36.856165" elapsed="0.021917"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:01:36.882344" 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/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-10-11T01:01:36.886445" 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/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-10-11T01:01:36.890518" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:36.890701" 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-10-11T01:01:36.890881" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:36.891266" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:36.891118" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:01:36.891104" 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-10-11T01:01:36.891511" 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-10-11T01:01:36.891690" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:36.891852" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:01:36.891077" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:01:36.890949" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:36.892085" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:01:36.892152" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:01:36.892261" 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-10-11T01:01:36.855559" elapsed="0.036727"/>
</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-10-11T01:01:36.901193" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:36.900876" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:01:36.901875" 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-10-11T01:01:36.901706" elapsed="0.000260">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-10-11T01:01:36.902079" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:01:36.901374" elapsed="0.000729"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.902600" 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-10-11T01:01:36.902275" elapsed="0.000350"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:36.902897" 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-10-11T01:01:36.903011" 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-10-11T01:01:36.902789" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.903477" 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-10-11T01:01:36.903244" elapsed="0.000277"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:01:36.903826" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:36.903581" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.904325" 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.173', '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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:36.904062" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:36.903901" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:36.903564" elapsed="0.000853"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.905148" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.173&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-10-11T01:01:36.904580" elapsed="0.000597"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:01:36.905220" 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-10-11T01:01:36.900358" elapsed="0.004963"/>
</kw>
<msg time="2026-10-11T01:01:36.905367" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:36.896055" elapsed="0.009372"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:01:36.909627" 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/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-10-11T01:01:36.913712" 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/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-10-11T01:01:36.917776" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:36.917987" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:36.918180" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:36.918529" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:36.918370" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:01:36.918357" 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-10-11T01:01:36.918755" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:36.918930" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:36.919104" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:01:36.918332" elapsed="0.000819"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:01:36.918245" elapsed="0.000929"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:36.919323" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:01:36.919387" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:01:36.919510" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.173&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-10-11T01:01:36.895334" elapsed="0.024203"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:01:36.920649" 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-10-11T01:01:36.920463" elapsed="0.000245">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-10-11T01:01:36.920791" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:01:36.920125" elapsed="0.000689"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:36.921108" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:36.920878" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.921628" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:01:36.921349" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:36.921182" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:36.920861" elapsed="0.000843"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.922211" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:01:36.921864" elapsed="0.000370"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:01:36.922278" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:01:36.922401" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:01:36.919812" elapsed="0.002627"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.923668" 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.173</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:36.923447" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.924142" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.173&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-10-11T01:01:36.923901" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.924608" 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-10-11T01:01:36.924375" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.925103" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:36.924872" elapsed="0.000272"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:01:36.925857" 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-10-11T01:01:36.925694" elapsed="0.000188"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:01:36.926196" 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-10-11T01:01:36.926049" elapsed="0.000171"/>
</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-10-11T01:01:36.926385" elapsed="0.000170"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.926968" 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-10-11T01:01:36.926748" elapsed="0.000260"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:01:36.927058" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:01:36.927187" 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-10-11T01:01:36.925323" elapsed="0.001887"/>
</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-10-11T01:01:36.941332" level="INFO">PUT Request : url=http://10.30.170.173: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.173 
 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.173 
 headers={'User-Agent': 'python-requests/2.34.2', '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.173&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-10-11T01:01:36.941388" level="INFO">PUT Response : url=http://10.30.170.173: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.173 
 status=201, reason=Created 
 headers={'Set-Cookie': 'JSESSIONID=node0s78hdllzxevl1i9hzwy2mssl20.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Sat, 10-Oct-2026 01:01:36 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:36.941507" 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-10-11T01:01:36.927516" elapsed="0.014015"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:36.927271" elapsed="0.014302"/>
</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-10-11T01:01:36.941751" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:36.941598" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:36.927255" elapsed="0.014576"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.942995" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:36.942721" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:36.942478" elapsed="0.000604"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:36.942461" elapsed="0.000643"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.943672" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:36.943390" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:36.943154" elapsed="0.000589"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:36.943139" elapsed="0.000625"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.944298" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:01:36.943940" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:36.944612" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:36.944385" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.945123" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:01:36.944845" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:36.944685" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:36.944369" elapsed="0.000830"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.945722" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:01:36.945372" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:36.946075" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:36.945810" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.946594" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:01:36.946314" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:36.946151" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:36.945792" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:36.946811" elapsed="0.000319"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:01:36.947536" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:01:36.947291" elapsed="0.000270"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:01:36.947712" elapsed="0.000214"/>
</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-10-11T01:01:36.942167" elapsed="0.005814"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:01:36.948137" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:01:36.948053" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:36.948023" elapsed="0.000190"/>
</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-10-11T01:01:36.948358" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:01:36.948434" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:01:36.948593" 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-10-11T01:01:36.922737" elapsed="0.025880"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:01:36.948673" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:01:36.948793" 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-10-11T01:01:36.851547" elapsed="0.097269"/>
</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-10-11T01:01:36.949121" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:36.948900" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:36.948884" elapsed="0.000319"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:01:36.949233" elapsed="0.000024"/>
</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-10-11T01:01:36.850934" elapsed="0.098394"/>
</kw>
<doc>Configures bgp application peer. Openconfig is used for carbon and above.</doc>
<status status="PASS" start="2026-10-11T01:01:36.745307" elapsed="0.204140"/>
</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-10-11T01:01:36.950934" elapsed="0.000264"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:01:36.950670" elapsed="0.000578"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:36.952227" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:36.952141" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:36.952124" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:36.954456" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:36.954356" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:36.954339" elapsed="0.000179"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.955438" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:01:36.955100" elapsed="0.000364"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:01:36.955876" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:01:36.955616" elapsed="0.000284"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:01:36.955976" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:01:36.956119" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:01:36.954724" elapsed="0.001419"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:36.958629" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:36.958545" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:36.958527" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:01:36.959737" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:36.959653" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:36.959636" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:01:36.960128" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:01:36.959944" elapsed="0.000208"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:01:36.960469" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:01:36.960315" elapsed="0.000178"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:01:36.994882" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:01:36.960977" elapsed="0.034001"/>
</kw>
<msg time="2026-10-11T01:01:36.995181" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:01:36.995222" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:36.960648" elapsed="0.034609"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:01:37.039839" 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-10-11T01:01:36.995786" elapsed="0.044210"/>
</kw>
<msg time="2026-10-11T01:01:37.040222" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:01:37.040264" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:36.995444" elapsed="0.044855"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.040686" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:37.040392" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.040363" elapsed="0.000400"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.041246" 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-10-11T01:01:37.040946" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.041602" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:37.041378" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.041361" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:01:37.041707" 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-10-11T01:01:37.044337" elapsed="0.000304"/>
</kw>
<msg time="2026-10-11T01:01:37.044701" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:37.043203" elapsed="0.001634"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.045221" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.045587" 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-10-11T01:01:37.042580" elapsed="0.003219"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:01:37.042054" elapsed="0.003806"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:01:36.959376" elapsed="0.086605"/>
</kw>
<msg time="2026-10-11T01:01:37.046096" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:37.046137" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:36.958840" elapsed="0.087333"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:01:37.046327" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:01:37.046242" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.046224" elapsed="0.000199"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.046753" elapsed="0.000022"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.047068" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:01:37.047132" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T01:01:36.958247" elapsed="0.088968"/>
</kw>
<msg time="2026-10-11T01:01:37.047299" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:01:37.047339" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:36.956483" elapsed="0.090890"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.047702" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:37.047481" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.047464" elapsed="0.000309"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:01:36.956326" elapsed="0.091469"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:01:36.956189" elapsed="0.091636"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:01:36.954061" elapsed="0.093815"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:01:36.951870" elapsed="0.096056"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:36.951434" elapsed="0.096533"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:01:36.950303" elapsed="0.097712"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.048842" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.171.7 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | RIB_INSTANCE_NAME=example-bgp-rib | 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>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-10-11T01:01:37.048215" 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-10-11T01:01:37.059281" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:37.058961" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:01:37.060008" 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-10-11T01:01:37.059798" elapsed="0.000309">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-10-11T01:01:37.060192" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:01:37.059480" elapsed="0.000734"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.060707" 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-10-11T01:01:37.060384" elapsed="0.000348"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:37.061061" 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-10-11T01:01:37.061208" 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-10-11T01:01:37.060935" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.061662" 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-10-11T01:01:37.061441" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.062785" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', '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-10-11T01:01:37.062367" elapsed="0.000462"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.063266" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:01:37.063003" elapsed="0.000288"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.063966" 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-10-11T01:01:37.063676" elapsed="0.000315"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:01:37.064696" 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-10-11T01:01:37.064504" elapsed="0.000216"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:01:37.064764" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:01:37.064888" 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-10-11T01:01:37.064178" elapsed="0.000732"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:01:37.065088" elapsed="0.000185"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T01:01:37.063536" elapsed="0.001773"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.065816" 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-10-11T01:01:37.065551" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:01:37.066515" 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-10-11T01:01:37.066324" elapsed="0.000215"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:01:37.066582" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:01:37.066702" 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-10-11T01:01:37.066004" elapsed="0.000721"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:01:37.066884" elapsed="0.000177"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-10-11T01:01:37.065421" elapsed="0.001675"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.067601" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:01:37.067320" elapsed="0.000305"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:01:37.068297" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:01:37.068119" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:01:37.068363" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:01:37.068501" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:01:37.067788" elapsed="0.000736"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:01:37.068685" elapsed="0.000163"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T01:01:37.067193" elapsed="0.001692"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.069387" 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-10-11T01:01:37.069122" elapsed="0.000303"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:01:37.070086" 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-10-11T01:01:37.069895" elapsed="0.000215"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:01:37.070152" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:01:37.070311" 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-10-11T01:01:37.069591" elapsed="0.000743"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:01:37.070510" elapsed="0.000167"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T01:01:37.068982" elapsed="0.001732"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.071221" 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-10-11T01:01:37.070941" elapsed="0.000304"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:01:37.071904" 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-10-11T01:01:37.071731" elapsed="0.000196"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:01:37.071970" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:01:37.072104" 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-10-11T01:01:37.071425" elapsed="0.000702"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:01:37.072286" elapsed="0.000178"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T01:01:37.070814" elapsed="0.001687"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.073167" 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-10-11T01:01:37.072727" elapsed="0.000463"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:01:37.073866" 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-10-11T01:01:37.073690" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:01:37.073933" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:01:37.074071" 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-10-11T01:01:37.073358" elapsed="0.000736"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:01:37.074256" elapsed="0.000180"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T01:01:37.072601" elapsed="0.001882"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.074978" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:01:37.074712" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:01:37.075679" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:01:37.075504" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:01:37.075746" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:01:37.075868" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:01:37.075182" elapsed="0.000709"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:01:37.076065" elapsed="0.000166"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:01:37.074583" elapsed="0.001685"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.076774" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:01:37.076509" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:01:37.077471" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:01:37.077278" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:01:37.077538" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:01:37.077658" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:01:37.076961" elapsed="0.000719"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:01:37.077841" elapsed="0.000163"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:01:37.076366" elapsed="0.001688"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.078570" 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-10-11T01:01:37.078281" elapsed="0.000313"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:01:37.079269" 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-10-11T01:01:37.079090" elapsed="0.000203"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:01:37.079337" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:01:37.079511" 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-10-11T01:01:37.078758" 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-10-11T01:01:37.079697" elapsed="0.000164"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T01:01:37.078153" elapsed="0.001745"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:01:37.063339" elapsed="0.016589"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:01:37.079966" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:01:37.080110" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'BGP_RIB...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:01:37.062014" elapsed="0.018121"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:37.061765" elapsed="0.018399"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.080335" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:37.080186" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.061747" elapsed="0.018657"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.081239" 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-10-11T01:01:37.080579" elapsed="0.000686"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:01:37.081309" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:01:37.058462" elapsed="0.022959"/>
</kw>
<msg time="2026-10-11T01:01:37.081471" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:37.054137" elapsed="0.027378"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:01:37.085746" 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/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-10-11T01:01:37.089818" 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/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-10-11T01:01:37.093911" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.094102" 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-10-11T01:01:37.094282" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.094634" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:37.094489" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:01:37.094476" 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-10-11T01:01:37.094860" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.095083" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.095249" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:01:37.094449" elapsed="0.000849"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:01:37.094348" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.095489" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:01:37.095557" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:01:37.095666" 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-10-11T01:01:37.053541" elapsed="0.042150"/>
</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-10-11T01:01:37.104604" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:37.104288" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:01:37.105281" 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-10-11T01:01:37.105113" elapsed="0.000226">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-10-11T01:01:37.105435" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:01:37.104784" elapsed="0.000675"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.105936" 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-10-11T01:01:37.105628" elapsed="0.000333"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:37.106246" 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-10-11T01:01:37.106362" 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-10-11T01:01:37.106139" elapsed="0.000249"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.106813" 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-10-11T01:01:37.106597" elapsed="0.000271"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:01:37.107188" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:37.106927" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.107689" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', 'HOLDTIME': '180', 'PEER_PORT': '17900', 'INITIATE': 'false', 'RIB_INSTANCE_NAME': 'example-bgp-rib', 'BGP_RIB...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:01:37.107421" elapsed="0.000294"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:37.107263" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.106910" elapsed="0.000885"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.108682" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflecto...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:01:37.107959" elapsed="0.000751"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:01:37.108754" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:01:37.103777" elapsed="0.005077"/>
</kw>
<msg time="2026-10-11T01:01:37.108906" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:37.099469" elapsed="0.009480"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:01:37.114382" 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/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-10-11T01:01:37.118453" 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/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-10-11T01:01:37.122485" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.122665" 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-10-11T01:01:37.122845" 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-10-11T01:01:37.123244" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:37.123090" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:01:37.123022" elapsed="0.000294"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.123487" 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-10-11T01:01:37.123668" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.123829" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:01:37.122997" elapsed="0.000880"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:01:37.122910" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.124068" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:01:37.124136" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:01:37.124256" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflecto...</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-10-11T01:01:37.098743" elapsed="0.025540"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:01:37.125438" 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-10-11T01:01:37.125236" elapsed="0.000262">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-10-11T01:01:37.125582" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:01:37.124897" elapsed="0.000708"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.125887" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:37.125668" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.126417" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:01:37.126142" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:37.125960" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.125651" elapsed="0.000844"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.126990" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:01:37.126655" elapsed="0.000359"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:01:37.127071" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:01:37.127194" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:01:37.124598" elapsed="0.002619"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.128466" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:37.128224" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.128917" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T01:01:37.128701" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.129393" 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-10-11T01:01:37.129175" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.129852" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:37.129636" elapsed="0.000256"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:01:37.130623" 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-10-11T01:01:37.130459" elapsed="0.000188"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:01:37.130944" 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-10-11T01:01:37.130801" elapsed="0.000167"/>
</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-10-11T01:01:37.131149" elapsed="0.000167"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.131752" 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-10-11T01:01:37.131529" elapsed="0.000263"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:01:37.131830" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:01:37.131958" 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-10-11T01:01:37.130087" elapsed="0.001894"/>
</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-10-11T01:01:37.143670" level="INFO">PUT Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0s78hdllzxevl1i9hzwy2mssl20.node0', 'Content-Length': '1088', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T01:01:37.143735" level="INFO">PUT Response : url=http://10.30.170.173: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.171.7 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:37.143827" 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-10-11T01:01:37.132337" elapsed="0.011513"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:37.132101" elapsed="0.011790"/>
</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-10-11T01:01:37.144086" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:37.143914" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.132083" elapsed="0.012085"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.145379" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:37.145106" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:37.144805" elapsed="0.000662"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.144788" elapsed="0.000702"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.146048" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:37.145774" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:37.145540" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.145525" elapsed="0.000617"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.146680" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:01:37.146318" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.146979" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:37.146767" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.147509" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:01:37.147233" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:37.147068" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.146751" elapsed="0.000834"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.148113" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:01:37.147759" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.148419" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:37.148200" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.148913" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:01:37.148653" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:37.148494" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.148184" elapsed="0.000804"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:37.149145" elapsed="0.000306"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:01:37.149863" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:01:37.149639" elapsed="0.000248"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:01:37.150051" elapsed="0.000216"/>
</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-10-11T01:01:37.144517" elapsed="0.005805"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:01:37.150483" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:01:37.150382" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.150365" elapsed="0.000196"/>
</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-10-11T01:01:37.150702" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:01:37.150762" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:01:37.150920" 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-10-11T01:01:37.127525" elapsed="0.023419"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:01:37.150999" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:01:37.151133" 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-10-11T01:01:37.049797" elapsed="0.101359"/>
</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-10-11T01:01:37.151456" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:37.151242" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.151226" elapsed="0.000313"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:01:37.151569" elapsed="0.000024"/>
</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-10-11T01:01:37.049131" elapsed="0.102533"/>
</kw>
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="PASS" start="2026-10-11T01:01:36.949750" elapsed="0.202017"/>
</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-10-11T01:01:37.153244" level="INFO">${app_rib} = 10.30.170.173</msg>
<var>${app_rib}</var>
<arg>${ODL_SYSTEM_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:01:37.152947" elapsed="0.000327"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.154079" level="INFO">&amp;{mapping} = { PREFIX=1.1.1.1/32 | APP_RIB=10.30.170.173 }</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-10-11T01:01:37.153647" elapsed="0.000460"/>
</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-10-11T01:01:37.164765" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:37.164465" elapsed="0.000326"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:01:37.165482" 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-10-11T01:01:37.165279" elapsed="0.000263">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-10-11T01:01:37.165626" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:01:37.164946" elapsed="0.000703"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.166140" 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-10-11T01:01:37.165819" elapsed="0.000347"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:37.166450" 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-10-11T01:01:37.166606" 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-10-11T01:01:37.166328" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.167066" 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-10-11T01:01:37.166821" 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-10-11T01:01:37.168002" level="INFO">mapping: {'PREFIX': '1.1.1.1/32', 'APP_RIB': '10.30.170.173'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:37.167775" elapsed="0.000280"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.168488" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:01:37.168227" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.169288" 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-10-11T01:01:37.168818" elapsed="0.000494"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:01:37.170298" 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-10-11T01:01:37.169882" elapsed="0.000454"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:01:37.170465" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:01:37.170643" 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-10-11T01:01:37.169503" 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-10-11T01:01:37.170830" elapsed="0.000286"/>
</kw>
<var name="${key}">PREFIX</var>
<var name="${value}">1.1.1.1/32</var>
<status status="PASS" start="2026-10-11T01:01:37.168690" elapsed="0.002465"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.171858" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:01:37.171385" elapsed="0.000497"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:01:37.172859" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:01:37.172465" elapsed="0.000432"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:01:37.173006" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T01:01:37.173196" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:01:37.172063" 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-10-11T01:01:37.173382" elapsed="0.000289"/>
</kw>
<var name="${key}">APP_RIB</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:01:37.171255" elapsed="0.002454"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:01:37.168554" elapsed="0.005186"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:01:37.173777" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:01:37.173903" level="INFO">${mapping_to_use} = {'PREFIX': '1.1.1.1/32', 'APP_RIB': '10.30.170.173'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:01:37.167436" elapsed="0.006490"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:37.167172" elapsed="0.006783"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.174165" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:37.173977" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.167154" elapsed="0.007082"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.175127" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:37.174404" elapsed="0.000750"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:01:37.175197" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:01:37.163937" elapsed="0.011359"/>
</kw>
<msg time="2026-10-11T01:01:37.175344" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:37.159598" elapsed="0.015790"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:01:37.179559" 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/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-10-11T01:01:37.183673" 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/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-10-11T01:01:37.187754" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.187933" 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-10-11T01:01:37.188122" 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-10-11T01:01:37.188474" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:37.188317" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:01:37.188303" 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-10-11T01:01:37.188702" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.188882" elapsed="0.000017"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.189073" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:01:37.188278" elapsed="0.000846"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:01:37.188189" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.189297" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:01:37.189363" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:01:37.189484" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:37.158976" elapsed="0.030533"/>
</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-10-11T01:01:37.198488" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:37.198167" elapsed="0.000348"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:01:37.199176" 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-10-11T01:01:37.198987" elapsed="0.000247">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-10-11T01:01:37.199317" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:01:37.198670" elapsed="0.000669"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.199867" 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-10-11T01:01:37.199556" elapsed="0.000336"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:37.200200" 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-10-11T01:01:37.200321" 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-10-11T01:01:37.200089" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.200781" 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-10-11T01:01:37.200561" elapsed="0.000270"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:01:37.201154" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:37.200893" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.201655" level="INFO">${mapping_to_use} = {'PREFIX': '1.1.1.1/32', 'APP_RIB': '10.30.170.173'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:01:37.201374" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:37.201229" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.200875" elapsed="0.000857"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.202455" 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-10-11T01:01:37.201893" elapsed="0.000591"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:01:37.202529" 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/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-10-11T01:01:37.197616" elapsed="0.005014"/>
</kw>
<msg time="2026-10-11T01:01:37.202679" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:37.193258" elapsed="0.009464"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:01:37.206983" 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/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-10-11T01:01:37.211126" 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/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-10-11T01:01:37.215205" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.215430" 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-10-11T01:01:37.215614" 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-10-11T01:01:37.215949" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:37.215805" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:01:37.215791" 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-10-11T01:01:37.216192" 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-10-11T01:01:37.216370" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.216549" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:01:37.215766" elapsed="0.000831"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:01:37.215680" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.216769" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:01:37.216834" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:01:37.216946" 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-10-11T01:01:37.192558" elapsed="0.024415"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:01:37.218103" 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-10-11T01:01:37.217896" elapsed="0.000268">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-10-11T01:01:37.218248" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:01:37.217572" elapsed="0.000698"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.218569" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:37.218334" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.219087" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:01:37.218807" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:37.218643" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.218316" elapsed="0.000847"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.219681" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:01:37.219324" elapsed="0.000381"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:01:37.219749" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:01:37.219873" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:01:37.217258" elapsed="0.002637"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.221229" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:37.220994" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.221689" 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-10-11T01:01:37.221475" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.222219" 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-10-11T01:01:37.221966" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.222684" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:37.222466" elapsed="0.000258"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:01:37.223450" 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-10-11T01:01:37.223271" elapsed="0.000204"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:01:37.223767" 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-10-11T01:01:37.223626" elapsed="0.000165"/>
</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-10-11T01:01:37.223951" elapsed="0.000168"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.224553" 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-10-11T01:01:37.224312" elapsed="0.000281"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:01:37.224631" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:01:37.224759" 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-10-11T01:01:37.222902" elapsed="0.001880"/>
</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-10-11T01:01:37.241732" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0s78hdllzxevl1i9hzwy2mssl20.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-10-11T01:01:37.241791" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:37.241873" 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-10-11T01:01:37.225086" elapsed="0.016812"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:37.224844" elapsed="0.017095"/>
</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-10-11T01:01:37.242143" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:37.241964" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.224828" elapsed="0.017397"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.243635" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:37.243303" elapsed="0.000373"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:37.243017" elapsed="0.000691"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.242998" elapsed="0.000732"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.244306" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:37.244014" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:37.243780" elapsed="0.000601"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.243765" elapsed="0.000660"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.244984" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:01:37.244619" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.245317" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:37.245105" elapsed="0.000264"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.245839" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:01:37.245572" elapsed="0.000292"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:37.245392" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.245087" elapsed="0.000879"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.246512" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:01:37.246157" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.246810" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:37.246600" elapsed="0.000261"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.247325" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:01:37.247061" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:37.246883" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.246583" elapsed="0.000818"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:37.247569" elapsed="0.000297"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:01:37.248277" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:01:37.248038" elapsed="0.000263"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:01:37.248469" elapsed="0.000219"/>
</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-10-11T01:01:37.242616" elapsed="0.006131"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:01:37.248897" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-10-11T01:01:37.248813" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.248796" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.249140" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:01:37.249204" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:01:37.249373" 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-10-11T01:01:37.220205" elapsed="0.029192"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:01:37.249477" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T01:01:37.249616" 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-10-11T01:01:37.154981" elapsed="0.094658"/>
</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-10-11T01:01:37.249940" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:37.249735" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.249718" elapsed="0.000320"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:01:37.250070" elapsed="0.000024"/>
</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-10-11T01:01:37.154341" elapsed="0.095829"/>
</kw>
<var name="${prefix}">1.1.1.1/32</var>
<status status="PASS" start="2026-10-11T01:01:37.153457" elapsed="0.096750"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.250870" level="INFO">&amp;{mapping} = { PREFIX=2.2.2.2/32 | APP_RIB=10.30.170.173 }</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-10-11T01:01:37.250478" elapsed="0.000418"/>
</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-10-11T01:01:37.261703" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:37.261387" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:01:37.262477" 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-10-11T01:01:37.262260" elapsed="0.000288">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-10-11T01:01:37.262634" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:01:37.261925" elapsed="0.000732"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.263156" 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-10-11T01:01:37.262830" elapsed="0.000351"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:37.263481" 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-10-11T01:01:37.263620" 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-10-11T01:01:37.263348" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.264071" 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-10-11T01:01:37.263837" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.265011" level="INFO">mapping: {'PREFIX': '2.2.2.2/32', 'APP_RIB': '10.30.170.173'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:37.264783" elapsed="0.000285"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.265505" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:01:37.265243" elapsed="0.000286"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.266380" 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-10-11T01:01:37.265851" elapsed="0.000579"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:01:37.267433" 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-10-11T01:01:37.266983" elapsed="0.000491"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:01:37.267594" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:01:37.267769" 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-10-11T01:01:37.266601" 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-10-11T01:01:37.267958" elapsed="0.000292"/>
</kw>
<var name="${key}">PREFIX</var>
<var name="${value}">2.2.2.2/32</var>
<status status="PASS" start="2026-10-11T01:01:37.265720" elapsed="0.002567"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.268986" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:01:37.268536" elapsed="0.000475"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:01:37.270005" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:01:37.269612" elapsed="0.000446"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:01:37.270168" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:01:37.270341" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:01:37.269194" elapsed="0.001171"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:01:37.270549" elapsed="0.000270"/>
</kw>
<var name="${key}">APP_RIB</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:01:37.268386" elapsed="0.002470"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:01:37.265575" elapsed="0.005312"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:01:37.270924" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:01:37.271066" level="INFO">${mapping_to_use} = {'PREFIX': '2.2.2.2/32', 'APP_RIB': '10.30.170.173'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:01:37.264442" elapsed="0.006649"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:37.264175" elapsed="0.006945"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.271290" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:37.271142" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.264157" elapsed="0.007201"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.272250" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:37.271580" elapsed="0.000726"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:01:37.272352" 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/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-10-11T01:01:37.260874" elapsed="0.011642"/>
</kw>
<msg time="2026-10-11T01:01:37.272566" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:37.256568" elapsed="0.016045"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:01:37.276681" 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/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-10-11T01:01:37.280744" 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/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-10-11T01:01:37.284782" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.284962" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.285151" 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-10-11T01:01:37.285510" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:37.285352" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:01:37.285338" 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-10-11T01:01:37.285737" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.285913" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.286092" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:01:37.285314" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:01:37.285226" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.286311" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:01:37.286377" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:01:37.286499" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:37.255928" elapsed="0.030596"/>
</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-10-11T01:01:37.295496" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:37.295175" elapsed="0.000352"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:01:37.296177" 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-10-11T01:01:37.295994" elapsed="0.000241">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-10-11T01:01:37.296319" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:01:37.295681" elapsed="0.000660"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.296833" 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-10-11T01:01:37.296526" elapsed="0.000332"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:37.297143" 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-10-11T01:01:37.297258" 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-10-11T01:01:37.297021" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.297712" 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-10-11T01:01:37.297495" elapsed="0.000266"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:01:37.298080" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:37.297822" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.298575" level="INFO">${mapping_to_use} = {'PREFIX': '2.2.2.2/32', 'APP_RIB': '10.30.170.173'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:01:37.298299" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:37.298155" elapsed="0.000477"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.297805" elapsed="0.000846"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.299352" 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-10-11T01:01:37.298809" elapsed="0.000571"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:01:37.299440" 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-10-11T01:01:37.294663" elapsed="0.004879"/>
</kw>
<msg time="2026-10-11T01:01:37.299592" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:37.290307" elapsed="0.009329"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:01:37.303892" 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/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-10-11T01:01:37.308003" 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/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-10-11T01:01:37.312097" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.312277" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.312470" 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-10-11T01:01:37.312809" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:37.312664" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:01:37.312650" 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-10-11T01:01:37.313044" 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-10-11T01:01:37.313222" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.313382" elapsed="0.000017"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:01:37.312625" elapsed="0.000818"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:01:37.312537" elapsed="0.000929"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.313612" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:01:37.313677" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:01:37.313788" 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-10-11T01:01:37.289616" elapsed="0.024199"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:01:37.314919" 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-10-11T01:01:37.314734" elapsed="0.000244">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-10-11T01:01:37.315354" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:01:37.314396" elapsed="0.000982"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.315678" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:37.315459" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.316196" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:01:37.315913" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:37.315751" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.315441" elapsed="0.000830"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.316783" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:01:37.316445" elapsed="0.000362"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:01:37.316885" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:01:37.317012" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:01:37.314100" elapsed="0.002947"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.318371" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:37.318148" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.318833" 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-10-11T01:01:37.318621" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.319303" 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-10-11T01:01:37.319085" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.319762" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:37.319545" elapsed="0.000257"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:01:37.320536" 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-10-11T01:01:37.320352" elapsed="0.000209"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:01:37.320853" 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-10-11T01:01:37.320711" elapsed="0.000166"/>
</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-10-11T01:01:37.321050" elapsed="0.000154"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.321632" 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-10-11T01:01:37.321395" elapsed="0.000277"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:01:37.321710" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:01:37.321837" 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-10-11T01:01:37.319982" elapsed="0.001878"/>
</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-10-11T01:01:37.330601" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0s78hdllzxevl1i9hzwy2mssl20.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-10-11T01:01:37.330659" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:37.330740" 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-10-11T01:01:37.322178" elapsed="0.008586"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:37.321922" elapsed="0.008883"/>
</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-10-11T01:01:37.330980" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:37.330828" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.321906" elapsed="0.009169"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.332315" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:37.332039" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:37.331760" elapsed="0.000627"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.331744" elapsed="0.000682"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.332988" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:37.332723" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:37.332478" elapsed="0.000597"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.332462" elapsed="0.000635"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.333626" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:01:37.333270" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.333921" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:37.333714" elapsed="0.000258"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.334464" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:01:37.334186" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:37.333993" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.333698" elapsed="0.000843"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.335101" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:01:37.334711" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:37.335397" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:37.335190" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.335905" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:01:37.335645" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:37.335486" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.335173" elapsed="0.000808"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:37.336141" elapsed="0.000317"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:01:37.336842" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:01:37.336616" elapsed="0.000251"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:01:37.337018" elapsed="0.000231"/>
</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-10-11T01:01:37.331391" elapsed="0.005913"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:01:37.337466" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:01:37.337367" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.337350" elapsed="0.000192"/>
</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-10-11T01:01:37.337683" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:01:37.337742" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:01:37.337899" 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-10-11T01:01:37.317344" elapsed="0.020579"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:01:37.337984" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:01:37.338120" 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-10-11T01:01:37.251865" elapsed="0.086277"/>
</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-10-11T01:01:37.338442" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:37.338232" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.338216" elapsed="0.000352"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:01:37.338599" elapsed="0.000025"/>
</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-10-11T01:01:37.251224" elapsed="0.087474"/>
</kw>
<var name="${prefix}">2.2.2.2/32</var>
<status status="PASS" start="2026-10-11T01:01:37.250298" elapsed="0.088434"/>
</iter>
<var>${prefix}</var>
<value>1.1.1.1/32</value>
<value>2.2.2.2/32</value>
<status status="PASS" start="2026-10-11T01:01:37.153334" elapsed="0.185426"/>
</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-10-11T01:01:37.340285" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:37.339990" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.340736" 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-10-11T01:01:37.340520" elapsed="0.000256"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:01:37.343929" 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-10-11T01:01:37.341336" elapsed="0.002645"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:01:37.348279" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:01:37.348363" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:01:37.344167" elapsed="0.004224"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.348964" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:01:37.348743" elapsed="0.000264"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:37.348476" elapsed="0.000583"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:37.348456" elapsed="0.000626"/>
</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-10-11T01:01:37.340991" elapsed="0.008133"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:01:37.351507" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<msg time="2026-10-11T01:01:37.351585" 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-10-11T01:01:37.349274" elapsed="0.002334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.352021" 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-10-11T01:01:37.351802" elapsed="0.000277"/>
</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-10-11T01:01:37.339692" elapsed="0.012438"/>
</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-10-11T01:01:37.354046" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:37.353734" elapsed="0.000338"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.354548" 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-10-11T01:01:37.354243" elapsed="0.000328"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:37.360843" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0s78hdllzxevl1i9hzwy2mssl20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:37.360988" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:01:37.361095" 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-10-11T01:01:37.354730" elapsed="0.006390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.361627" 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-10-11T01:01:37.361322" elapsed="0.000348"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:01:37.362202" 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-10-11T01:01:37.361839" elapsed="0.000420">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-10-11T01:01:37.353316" elapsed="0.009044">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:40.365356" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:40.364450" elapsed="0.001014"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:40.366630" 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-10-11T01:01:40.365880" elapsed="0.000806"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:40.375185" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0s78hdllzxevl1i9hzwy2mssl20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:40.375560" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:01:40.375796" 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-10-11T01:01:40.367085" elapsed="0.008776"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:40.377327" 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-10-11T01:01:40.376502" elapsed="0.000990"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:01:40.379022" 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-10-11T01:01:40.377964" elapsed="0.001266">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-10-11T01:01:40.363235" elapsed="0.016312">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:43.382535" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:43.381703" elapsed="0.000900"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:43.383729" 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-10-11T01:01:43.383013" elapsed="0.000771"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:43.392593" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0s78hdllzxevl1i9hzwy2mssl20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:43.392856" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:01:43.393072" 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-10-11T01:01:43.384163" elapsed="0.008965"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:43.394287" 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-10-11T01:01:43.393615" elapsed="0.000771"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:01:43.395647" 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-10-11T01:01:43.394796" elapsed="0.000988">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-10-11T01:01:43.380497" elapsed="0.016009">200.0 != 409.0</status>
</kw>
<msg time="2026-10-11T01:01:43.396704" 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-10-11T01:01:37.352848" elapsed="6.044047">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</status>
</kw>
<msg time="2026-10-11T01:01:43.397155" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T01:01:43.397246" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:37.352287" elapsed="6.045009"/>
</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-10-11T01:01:43.399193" level="INFO">[?2004l01:01:37 | 3146   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:01:37 | 3146   | [01;34mversion      [0m | [1m4.2.17  [0m
01:01:37 | 3146   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
01:01:37 | 3146   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
01:01:37 | 3146   | [01;34minstallation [0m | [1m        [0m
01:01:37 | 3146   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
01:01:37 | 3146   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
01:01:37 | 3146   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:01:37 | 3146   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:01:37 | 3146   | [01;31mcli control  [0m | [1m - /run/[0m
01:01:37 | 3146   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:01:37 | 3146   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:01:37 | 3146   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:01:37 | 3146   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:01:37 | 3146   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:01:37 | 3146   | [01;31mcli control  [0m | [1m - /run/[0m
01:01:37 | 3146   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:01:37 | 3146   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:01:37 | 3146   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:01:37 | 3146   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
01:01:37 | 3146   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
01:01:37 | 3146   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
01:01:37 | 3146   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
01:01:37 | 3146   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
01:01:37 | 3146   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
01:01:37 | 3146   | configuration[0m | . router-id        | '10.30.171.7'[0m
01:01:37 | 3146   | configuration[0m | . local-address    | '10.30.171.7'[0m
01:01:37 | 3146   | configuration[0m | . local-as         | '64496'[0m
01:01:37 | 3146   | configuration[0m | . peer-as          | '64496'[0m
01:01:37 | 3146   | configuration[0m | &gt; capability       | [0m
01:01:37 | 3146   | configuration[0m | . route-refresh    | 'enable'[0m
01:01:37 | 3146   | configuration[0m | . add-path         | 'disable'[0m
01:01:37 | 3146   | configuration[0m | &lt; capability       | [0m
01:01:37 | 3146   | configuration[0m | &gt; family           | [0m
01:01:37 | 3146   | configuration[0m | . ipv4             | 'unicast'[0m
01:01:37 | 3146   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
01:01:37 | 3146   | configuration[0m | &lt; family           | [0m
01:01:37 | 3146   | configuration[0m | &gt; process          | 'exarpcserver'[0m
01:01:37 | 3146   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
01:01:37 | 3146   | [01;31mconfiguration[0m | [1m        [0m
01:01:37 | 3146   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
01:01:37 | 3146   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
01:01:37 | 3146   | [01;31mconfiguration[0m | [1m        [0m
01:01:37 | 3146   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:01:43.399541" level="INFO">${output} = [?2004l01:01:37 | 3146   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:01:37 | 3146   | [01;34mversion      [0m | [1m4.2.17  [0m
01:01:37 | 3146   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-10-11T01:01:43.398932" elapsed="0.000672"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:43.400581" level="INFO">[?2004l01:01:37 | 3146   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:01:37 | 3146   | [01;34mversion      [0m | [1m4.2.17  [0m
01:01:37 | 3146   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
01:01:37 | 3146   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
01:01:37 | 3146   | [01;34minstallation [0m | [1m        [0m
01:01:37 | 3146   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
01:01:37 | 3146   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
01:01:37 | 3146   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:01:37 | 3146   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:01:37 | 3146   | [01;31mcli control  [0m | [1m - /run/[0m
01:01:37 | 3146   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:01:37 | 3146   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:01:37 | 3146   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:01:37 | 3146   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:01:37 | 3146   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:01:37 | 3146   | [01;31mcli control  [0m | [1m - /run/[0m
01:01:37 | 3146   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:01:37 | 3146   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:01:37 | 3146   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:01:37 | 3146   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
01:01:37 | 3146   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
01:01:37 | 3146   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
01:01:37 | 3146   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
01:01:37 | 3146   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
01:01:37 | 3146   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
01:01:37 | 3146   | configuration[0m | . router-id        | '10.30.171.7'[0m
01:01:37 | 3146   | configuration[0m | . local-address    | '10.30.171.7'[0m
01:01:37 | 3146   | configuration[0m | . local-as         | '64496'[0m
01:01:37 | 3146   | configuration[0m | . peer-as          | '64496'[0m
01:01:37 | 3146   | configuration[0m | &gt; capability       | [0m
01:01:37 | 3146   | configuration[0m | . route-refresh    | 'enable'[0m
01:01:37 | 3146   | configuration[0m | . add-path         | 'disable'[0m
01:01:37 | 3146   | configuration[0m | &lt; capability       | [0m
01:01:37 | 3146   | configuration[0m | &gt; family           | [0m
01:01:37 | 3146   | configuration[0m | . ipv4             | 'unicast'[0m
01:01:37 | 3146   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
01:01:37 | 3146   | configuration[0m | &lt; family           | [0m
01:01:37 | 3146   | configuration[0m | &gt; process          | 'exarpcserver'[0m
01:01:37 | 3146   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
01:01:37 | 3146   | [01;31mconfiguration[0m | [1m        [0m
01:01:37 | 3146   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
01:01:37 | 3146   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
01:01:37 | 3146   | [01;31mconfiguration[0m | [1m        [0m
01:01:37 | 3146   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:01:43.400027" elapsed="0.000794"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:43.402682" 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-10-11T01:01:43.401977" elapsed="0.000764"/>
</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-10-11T01:01:43.403102" elapsed="0.000463"/>
</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-10-11T01:01:43.401258" elapsed="0.002477"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:01:43.407151" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:01:43.407338" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:01:43.404118" elapsed="0.003278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:43.408373" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:01:43.407851" elapsed="0.000653"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:01:43.411579" 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-10-11T01:01:43.409841" elapsed="0.001853"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:01:43.413748" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:01:43.413930" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-423-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-10-11T01:01:43.412084" elapsed="0.001900"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:43.415299" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-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-10-11T01:01:43.414770" elapsed="0.000625"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:43.414178" elapsed="0.001318"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:43.414137" elapsed="0.001412"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-10-11T01:01:43.409004" elapsed="0.006640"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-10-11T01:01:43.398265" elapsed="0.017481"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:43.397612" elapsed="0.018187"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:43.397563" elapsed="0.018283"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-10-11T01:01:43.416182" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:43.415956" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:43.415922" elapsed="0.000389"/>
</if>
<var name="${idx}">0</var>
<status status="PASS" start="2026-10-11T01:01:37.339534" elapsed="6.076826"/>
</iter>
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:43.418492" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:43.417820" elapsed="0.000729"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:43.419506" 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-10-11T01:01:43.418975" elapsed="0.000621"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:01:43.423828" 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-10-11T01:01:43.420878" elapsed="0.003064"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:01:43.428780" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:01:43.428963" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:01:43.424338" elapsed="0.004679"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:43.430322" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:01:43.429795" elapsed="0.000652"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:43.429176" elapsed="0.001343"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:43.429135" elapsed="0.001434"/>
</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-10-11T01:01:43.420101" elapsed="0.010561"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:01:43.433142" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<msg time="2026-10-11T01:01:43.433257" 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-10-11T01:01:43.430999" elapsed="0.002291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:43.433888" 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-10-11T01:01:43.433581" elapsed="0.000365"/>
</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-10-11T01:01:43.417119" elapsed="0.016895"/>
</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-10-11T01:01:43.438352" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:43.436014" elapsed="0.002375"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:43.439123" 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-10-11T01:01:43.438654" elapsed="0.000504"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:43.445756" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0s78hdllzxevl1i9hzwy2mssl20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:43.445909" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:01:43.446056" 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-10-11T01:01:43.439379" elapsed="0.006712"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:43.446778" 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-10-11T01:01:43.446371" elapsed="0.000467"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:01:43.447600" 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-10-11T01:01:43.447092" elapsed="0.000589">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-10-11T01:01:43.435460" elapsed="0.012356">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:46.450675" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:46.449820" elapsed="0.000932"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:46.451939" 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-10-11T01:01:46.451248" elapsed="0.000746"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:46.461028" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0s78hdllzxevl1i9hzwy2mssl20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:46.461314" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:01:46.461550" 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-10-11T01:01:46.452374" elapsed="0.009230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:46.462772" 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-10-11T01:01:46.462096" elapsed="0.000775"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:01:46.464197" 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-10-11T01:01:46.463310" elapsed="0.001025">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-10-11T01:01:46.448650" elapsed="0.015941">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:49.467196" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:49.466438" elapsed="0.000819"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:49.468401" 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-10-11T01:01:49.467680" elapsed="0.000805"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:49.476392" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0s78hdllzxevl1i9hzwy2mssl20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:49.476688" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:01:49.476976" 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-10-11T01:01:49.468835" elapsed="0.008221"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:49.478201" 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-10-11T01:01:49.477547" elapsed="0.000753"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:01:49.479586" 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-10-11T01:01:49.478708" elapsed="0.001010">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-10-11T01:01:49.465342" elapsed="0.014592">200.0 != 409.0</status>
</kw>
<msg time="2026-10-11T01:01:49.480134" 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-10-11T01:01:43.434807" elapsed="6.045509">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</status>
</kw>
<msg time="2026-10-11T01:01:49.480579" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T01:01:49.480667" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:43.434253" elapsed="6.046462"/>
</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-10-11T01:01:49.482387" level="INFO">[?2004l01:01:43 | 3150   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:01:43 | 3150   | [01;34mversion      [0m | [1m4.2.17  [0m
01:01:43 | 3150   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
01:01:43 | 3150   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
01:01:43 | 3150   | [01;34minstallation [0m | [1m        [0m
01:01:43 | 3150   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
01:01:43 | 3150   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
01:01:43 | 3150   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:01:43 | 3150   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:01:43 | 3150   | [01;31mcli control  [0m | [1m - /run/[0m
01:01:43 | 3150   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:01:43 | 3150   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:01:43 | 3150   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:01:43 | 3150   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:01:43 | 3150   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:01:43 | 3150   | [01;31mcli control  [0m | [1m - /run/[0m
01:01:43 | 3150   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:01:43 | 3150   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:01:43 | 3150   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:01:43 | 3150   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
01:01:43 | 3150   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
01:01:43 | 3150   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
01:01:43 | 3150   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
01:01:43 | 3150   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
01:01:43 | 3150   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
01:01:43 | 3150   | configuration[0m | . router-id        | '10.30.171.7'[0m
01:01:43 | 3150   | configuration[0m | . local-address    | '10.30.171.7'[0m
01:01:43 | 3150   | configuration[0m | . local-as         | '64496'[0m
01:01:43 | 3150   | configuration[0m | . peer-as          | '64496'[0m
01:01:43 | 3150   | configuration[0m | &gt; capability       | [0m
01:01:43 | 3150   | configuration[0m | . route-refresh    | 'enable'[0m
01:01:43 | 3150   | configuration[0m | . add-path         | 'disable'[0m
01:01:43 | 3150   | configuration[0m | &lt; capability       | [0m
01:01:43 | 3150   | configuration[0m | &gt; family           | [0m
01:01:43 | 3150   | configuration[0m | . ipv4             | 'unicast'[0m
01:01:43 | 3150   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
01:01:43 | 3150   | configuration[0m | &lt; family           | [0m
01:01:43 | 3150   | configuration[0m | &gt; process          | 'exarpcserver'[0m
01:01:43 | 3150   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
01:01:43 | 3150   | [01;31mconfiguration[0m | [1m        [0m
01:01:43 | 3150   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
01:01:43 | 3150   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
01:01:43 | 3150   | [01;31mconfiguration[0m | [1m        [0m
01:01:43 | 3150   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:01:49.482737" level="INFO">${output} = [?2004l01:01:43 | 3150   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:01:43 | 3150   | [01;34mversion      [0m | [1m4.2.17  [0m
01:01:43 | 3150   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-10-11T01:01:49.482148" elapsed="0.000649"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:49.483835" level="INFO">[?2004l01:01:43 | 3150   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:01:43 | 3150   | [01;34mversion      [0m | [1m4.2.17  [0m
01:01:43 | 3150   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
01:01:43 | 3150   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
01:01:43 | 3150   | [01;34minstallation [0m | [1m        [0m
01:01:43 | 3150   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
01:01:43 | 3150   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
01:01:43 | 3150   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:01:43 | 3150   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:01:43 | 3150   | [01;31mcli control  [0m | [1m - /run/[0m
01:01:43 | 3150   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:01:43 | 3150   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:01:43 | 3150   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:01:43 | 3150   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:01:43 | 3150   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:01:43 | 3150   | [01;31mcli control  [0m | [1m - /run/[0m
01:01:43 | 3150   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:01:43 | 3150   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:01:43 | 3150   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:01:43 | 3150   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
01:01:43 | 3150   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
01:01:43 | 3150   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
01:01:43 | 3150   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
01:01:43 | 3150   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
01:01:43 | 3150   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
01:01:43 | 3150   | configuration[0m | . router-id        | '10.30.171.7'[0m
01:01:43 | 3150   | configuration[0m | . local-address    | '10.30.171.7'[0m
01:01:43 | 3150   | configuration[0m | . local-as         | '64496'[0m
01:01:43 | 3150   | configuration[0m | . peer-as          | '64496'[0m
01:01:43 | 3150   | configuration[0m | &gt; capability       | [0m
01:01:43 | 3150   | configuration[0m | . route-refresh    | 'enable'[0m
01:01:43 | 3150   | configuration[0m | . add-path         | 'disable'[0m
01:01:43 | 3150   | configuration[0m | &lt; capability       | [0m
01:01:43 | 3150   | configuration[0m | &gt; family           | [0m
01:01:43 | 3150   | configuration[0m | . ipv4             | 'unicast'[0m
01:01:43 | 3150   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
01:01:43 | 3150   | configuration[0m | &lt; family           | [0m
01:01:43 | 3150   | configuration[0m | &gt; process          | 'exarpcserver'[0m
01:01:43 | 3150   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
01:01:43 | 3150   | [01;31mconfiguration[0m | [1m        [0m
01:01:43 | 3150   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
01:01:43 | 3150   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
01:01:43 | 3150   | [01;31mconfiguration[0m | [1m        [0m
01:01:43 | 3150   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:01:49.483299" elapsed="0.000871"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:49.540302" 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-10-11T01:01:49.539734" elapsed="0.000612"/>
</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-10-11T01:01:49.540591" elapsed="0.000295"/>
</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-10-11T01:01:49.484622" elapsed="0.056344"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:01:49.543897" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:01:49.544016" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:01:49.541219" elapsed="0.002910"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:49.544745" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:01:49.544402" elapsed="0.000406"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:01:49.547181" 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-10-11T01:01:49.545674" elapsed="0.001578"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:01:49.548670" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:01:49.548777" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-423-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-10-11T01:01:49.547506" elapsed="0.001304"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:49.549612" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-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-10-11T01:01:49.549276" elapsed="0.000396"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:49.548904" elapsed="0.000810"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:49.548875" elapsed="0.000874"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-10-11T01:01:49.545157" elapsed="0.004652"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-10-11T01:01:49.481500" elapsed="0.068376"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:49.480909" elapsed="0.069000"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:49.480861" elapsed="0.069078"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-10-11T01:01:49.550153" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:49.550009" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:49.549987" elapsed="0.000250"/>
</if>
<var name="${idx}">1</var>
<status status="PASS" start="2026-10-11T01:01:43.416723" elapsed="6.133543"/>
</iter>
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:49.551597" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:49.551185" elapsed="0.000447"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:49.552225" 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-10-11T01:01:49.551904" elapsed="0.000379"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:01:49.555080" 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-10-11T01:01:49.553099" elapsed="0.002053"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:01:49.559735" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:01:49.559848" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:01:49.555386" elapsed="0.004496"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:49.560672" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:01:49.560338" elapsed="0.000394"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:49.559969" elapsed="0.000805"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:49.559944" elapsed="0.000862"/>
</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-10-11T01:01:49.552609" elapsed="0.008261"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:01:49.563192" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<msg time="2026-10-11T01:01:49.563272" 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-10-11T01:01:49.561095" elapsed="0.002200"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:49.563734" 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-10-11T01:01:49.563513" elapsed="0.000262"/>
</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-10-11T01:01:49.550739" elapsed="0.013085"/>
</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-10-11T01:01:49.565602" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:49.565285" elapsed="0.000342"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:49.566160" 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-10-11T01:01:49.565859" elapsed="0.000325"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:49.572457" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0s78hdllzxevl1i9hzwy2mssl20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:49.572602" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:01:49.572699" 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-10-11T01:01:49.566343" elapsed="0.006381"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:49.573228" 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-10-11T01:01:49.572927" elapsed="0.000345"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:01:49.573825" 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-10-11T01:01:49.573454" elapsed="0.000441">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-10-11T01:01:49.564872" elapsed="0.009128">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:52.577461" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:52.576555" elapsed="0.000988"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:52.578718" 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-10-11T01:01:52.577973" elapsed="0.000801"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:52.588241" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0s78hdllzxevl1i9hzwy2mssl20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:52.588602" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:01:52.588801" 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-10-11T01:01:52.579172" elapsed="0.009684"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:52.590099" 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-10-11T01:01:52.589353" elapsed="0.000849"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:01:52.591501" 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-10-11T01:01:52.590614" elapsed="0.001043">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-10-11T01:01:52.575163" elapsed="0.016726">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.595091" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:55.594205" elapsed="0.000958"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.596296" 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-10-11T01:01:55.595608" elapsed="0.000743"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:55.604134" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0s78hdllzxevl1i9hzwy2mssl20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:55.604482" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:01:55.604810" 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-10-11T01:01:55.596732" elapsed="0.008134"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.606082" 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-10-11T01:01:55.605361" elapsed="0.000823"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.607483" 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-10-11T01:01:55.606599" elapsed="0.001038">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-10-11T01:01:55.592913" elapsed="0.014954">200.0 != 409.0</status>
</kw>
<msg time="2026-10-11T01:01:55.608077" 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-10-11T01:01:49.564391" elapsed="6.043877">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</status>
</kw>
<msg time="2026-10-11T01:01:55.608539" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T01:01:55.608628" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:49.563988" elapsed="6.044688"/>
</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-10-11T01:01:55.610397" level="INFO">[?2004l01:01:49 | 3154   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:01:49 | 3154   | [01;34mversion      [0m | [1m4.2.17  [0m
01:01:49 | 3154   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
01:01:49 | 3154   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
01:01:49 | 3154   | [01;34minstallation [0m | [1m        [0m
01:01:49 | 3154   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
01:01:49 | 3154   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
01:01:49 | 3154   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:01:49 | 3154   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:01:49 | 3154   | [01;31mcli control  [0m | [1m - /run/[0m
01:01:49 | 3154   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:01:49 | 3154   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:01:49 | 3154   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:01:49 | 3154   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:01:49 | 3154   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:01:49 | 3154   | [01;31mcli control  [0m | [1m - /run/[0m
01:01:49 | 3154   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:01:49 | 3154   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:01:49 | 3154   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:01:49 | 3154   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
01:01:49 | 3154   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
01:01:49 | 3154   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
01:01:49 | 3154   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
01:01:49 | 3154   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
01:01:49 | 3154   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
01:01:49 | 3154   | configuration[0m | . router-id        | '10.30.171.7'[0m
01:01:49 | 3154   | configuration[0m | . local-address    | '10.30.171.7'[0m
01:01:49 | 3154   | configuration[0m | . local-as         | '64496'[0m
01:01:49 | 3154   | configuration[0m | . peer-as          | '64496'[0m
01:01:49 | 3154   | configuration[0m | &gt; capability       | [0m
01:01:49 | 3154   | configuration[0m | . route-refresh    | 'enable'[0m
01:01:49 | 3154   | configuration[0m | . add-path         | 'disable'[0m
01:01:49 | 3154   | configuration[0m | &lt; capability       | [0m
01:01:49 | 3154   | configuration[0m | &gt; family           | [0m
01:01:49 | 3154   | configuration[0m | . ipv4             | 'unicast'[0m
01:01:49 | 3154   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
01:01:49 | 3154   | configuration[0m | &lt; family           | [0m
01:01:49 | 3154   | configuration[0m | &gt; process          | 'exarpcserver'[0m
01:01:49 | 3154   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
01:01:49 | 3154   | [01;31mconfiguration[0m | [1m        [0m
01:01:49 | 3154   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
01:01:49 | 3154   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
01:01:49 | 3154   | [01;31mconfiguration[0m | [1m        [0m
01:01:49 | 3154   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:01:55.610750" level="INFO">${output} = [?2004l01:01:49 | 3154   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:01:49 | 3154   | [01;34mversion      [0m | [1m4.2.17  [0m
01:01:49 | 3154   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-10-11T01:01:55.610147" elapsed="0.000664"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.612368" level="INFO">[?2004l01:01:49 | 3154   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:01:49 | 3154   | [01;34mversion      [0m | [1m4.2.17  [0m
01:01:49 | 3154   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
01:01:49 | 3154   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
01:01:49 | 3154   | [01;34minstallation [0m | [1m        [0m
01:01:49 | 3154   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
01:01:49 | 3154   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
01:01:49 | 3154   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:01:49 | 3154   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:01:49 | 3154   | [01;31mcli control  [0m | [1m - /run/[0m
01:01:49 | 3154   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:01:49 | 3154   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:01:49 | 3154   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:01:49 | 3154   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:01:49 | 3154   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:01:49 | 3154   | [01;31mcli control  [0m | [1m - /run/[0m
01:01:49 | 3154   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:01:49 | 3154   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:01:49 | 3154   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:01:49 | 3154   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
01:01:49 | 3154   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
01:01:49 | 3154   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
01:01:49 | 3154   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
01:01:49 | 3154   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
01:01:49 | 3154   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
01:01:49 | 3154   | configuration[0m | . router-id        | '10.30.171.7'[0m
01:01:49 | 3154   | configuration[0m | . local-address    | '10.30.171.7'[0m
01:01:49 | 3154   | configuration[0m | . local-as         | '64496'[0m
01:01:49 | 3154   | configuration[0m | . peer-as          | '64496'[0m
01:01:49 | 3154   | configuration[0m | &gt; capability       | [0m
01:01:49 | 3154   | configuration[0m | . route-refresh    | 'enable'[0m
01:01:49 | 3154   | configuration[0m | . add-path         | 'disable'[0m
01:01:49 | 3154   | configuration[0m | &lt; capability       | [0m
01:01:49 | 3154   | configuration[0m | &gt; family           | [0m
01:01:49 | 3154   | configuration[0m | . ipv4             | 'unicast'[0m
01:01:49 | 3154   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
01:01:49 | 3154   | configuration[0m | &lt; family           | [0m
01:01:49 | 3154   | configuration[0m | &gt; process          | 'exarpcserver'[0m
01:01:49 | 3154   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
01:01:49 | 3154   | [01;31mconfiguration[0m | [1m        [0m
01:01:49 | 3154   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
01:01:49 | 3154   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
01:01:49 | 3154   | [01;31mconfiguration[0m | [1m        [0m
01:01:49 | 3154   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:01:55.611322" elapsed="0.001392"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.614596" 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-10-11T01:01:55.613875" elapsed="0.000779"/>
</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-10-11T01:01:55.614987" elapsed="0.000483"/>
</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-10-11T01:01:55.613199" elapsed="0.002412"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:01:55.619094" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:01:55.619287" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:01:55.615974" elapsed="0.003370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.620328" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:01:55.619805" elapsed="0.000650"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:01:55.623908" 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-10-11T01:01:55.621791" elapsed="0.002228"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:01:55.625866" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:01:55.626033" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-423-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-10-11T01:01:55.624481" elapsed="0.001660"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.627442" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-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-10-11T01:01:55.626874" elapsed="0.000670"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:55.626277" elapsed="0.001334"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:55.626238" elapsed="0.001430"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-10-11T01:01:55.620961" elapsed="0.006802"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-10-11T01:01:55.609495" elapsed="0.018369"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:55.608884" elapsed="0.019032"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:55.608831" elapsed="0.019130"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-10-11T01:01:55.628300" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:01:55.628096" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:55.628058" elapsed="0.000405"/>
</if>
<var name="${idx}">2</var>
<status status="PASS" start="2026-10-11T01:01:49.550505" elapsed="6.078007"/>
</iter>
<var>${idx}</var>
<value>${connection_retries}</value>
<status status="PASS" start="2026-10-11T01:01:37.339340" elapsed="18.289240"/>
</for>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.629576" level="FAIL">Unable to connect ExaBgp to ODL</msg>
<arg>Unable to connect ExaBgp to ODL</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-10-11T01:01:55.628932" elapsed="0.000770">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-10-11T01:01:37.339053" elapsed="18.290850">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-10-11T01:01:55.630350" elapsed="0.000046"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:55.630768" elapsed="0.000042"/>
</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-10-11T01:01:55.631213" elapsed="0.000043"/>
</kw>
<arg>${BGP_CFG_NAME}</arg>
<doc>Setup keyword for exa to odl test case</doc>
<status status="FAIL" start="2026-10-11T01:01:37.152621" elapsed="18.478851">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-10-11T01:01:55.633798" level="INFO">${output} =  </msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-10-11T01:01:55.633494" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.634821" level="INFO"> </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:55.634294" elapsed="0.000616"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.636791" 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-10-11T01:01:55.636112" elapsed="0.000736"/>
</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-10-11T01:01:55.637199" elapsed="0.000401"/>
</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-10-11T01:01:55.635380" elapsed="0.002359"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:01:55.640335" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:01:55.640547" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-423-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-10-11T01:01:55.638117" elapsed="0.002487"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.641575" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-423-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-10-11T01:01:55.641028" elapsed="0.000721"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:01:55.644602" 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-10-11T01:01:55.643158" elapsed="0.001513"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:01:55.909353" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:01:55.909470" level="INFO">${output} = [?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-423-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-10-11T01:01:55.644902" elapsed="0.264597"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.910107" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-423-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-10-11T01:01:55.909842" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:55.909570" elapsed="0.000616"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:55.909551" elapsed="0.000659"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-10-11T01:01:55.642277" elapsed="0.267977"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-10-11T01:01:55.632787" elapsed="0.277515"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.910766" level="INFO">${app_rib} = 10.30.170.173</msg>
<var>${app_rib}</var>
<arg>${ODL_SYSTEM_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:01:55.910497" elapsed="0.000294"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.911394" level="INFO">&amp;{mapping} = { PREFIX=http://10.30.170.173:8080 | APP_RIB=10.30.170.173 }</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-10-11T01:01:55.910974" elapsed="0.000461"/>
</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-10-11T01:01:55.924908" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:55.924601" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:01:55.925667" 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-10-11T01:01:55.925448" elapsed="0.000279">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-10-11T01:01:55.925813" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:01:55.925108" elapsed="0.000728"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.926339" 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-10-11T01:01:55.926008" elapsed="0.000357"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:01:55.926658" 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-10-11T01:01:55.926803" 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-10-11T01:01:55.926546" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.927257" 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-10-11T01:01:55.927021" elapsed="0.000277"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.928241" level="INFO">mapping: {'PREFIX': 'http://10.30.170.173:8080', 'APP_RIB': '10.30.170.173'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:55.927995" elapsed="0.000287"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.928721" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:01:55.928473" elapsed="0.000272"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.929358" level="INFO">${value} = http://10.30.170.173:8080</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:01:55.929086" elapsed="0.000296"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:01:55.930101" level="INFO">${encoded} = http%3A//10.30.170.173%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-10-11T01:01:55.929901" elapsed="0.000225"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:01:55.930172" elapsed="0.000032"/>
</return>
<msg time="2026-10-11T01:01:55.930303" level="INFO">${encoded_value} = http%3A//10.30.170.173%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-10-11T01:01:55.929567" elapsed="0.000759"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:01:55.930548" elapsed="0.000188"/>
</kw>
<var name="${key}">PREFIX</var>
<var name="${value}">http://10.30.170.173:8080</var>
<status status="PASS" start="2026-10-11T01:01:55.928942" elapsed="0.001831"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.931284" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:01:55.931002" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:01:55.932382" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:01:55.931822" elapsed="0.000599"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:01:55.932469" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:01:55.932595" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:01:55.931492" elapsed="0.001125"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:01:55.932781" elapsed="0.000167"/>
</kw>
<var name="${key}">APP_RIB</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:01:55.930874" elapsed="0.002110"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:01:55.928791" elapsed="0.004225"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:01:55.933090" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:01:55.933219" level="INFO">${mapping_to_use} = {'PREFIX': 'http%3A//10.30.170.173%3A8080', 'APP_RIB': '10.30.170.173'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:01:55.927630" elapsed="0.005612"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:55.927359" elapsed="0.005911"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:55.933456" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:55.933292" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:55.927342" elapsed="0.006184"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.934225" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:55.933682" elapsed="0.000569"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:01:55.934294" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:01:55.924056" elapsed="0.010337"/>
</kw>
<msg time="2026-10-11T01:01:55.934457" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:55.919695" elapsed="0.014818"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:01:55.938592" 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/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-10-11T01:01:55.942695" 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/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-10-11T01:01:55.946776" elapsed="0.000023"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:55.946989" 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-10-11T01:01:55.947182" 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-10-11T01:01:55.947535" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:55.947376" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:01:55.947362" 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-10-11T01:01:55.947761" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:55.947938" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:55.948111" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:01:55.947337" elapsed="0.000823"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:01:55.947249" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:55.948333" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:01:55.948399" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:01:55.948523" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:55.919022" elapsed="0.029525"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.949585" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:55.949342" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:55.957341" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0s78hdllzxevl1i9hzwy2mssl20.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:55.957387" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:01:55.957500" 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-10-11T01:01:55.949914" elapsed="0.007610"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:55.949687" elapsed="0.007874"/>
</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-10-11T01:01:55.957732" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:55.957584" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:55.949670" elapsed="0.008137"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.959027" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:55.958755" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:55.958516" elapsed="0.000596"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:55.958499" elapsed="0.000636"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.959702" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:01:55.959435" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:55.959183" elapsed="0.000590"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:55.959169" elapsed="0.000626"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.960339" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:01:55.959971" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:55.960652" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:55.960441" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.961205" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:01:55.960922" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:55.960760" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:55.960424" elapsed="0.000858"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.961806" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:01:55.961470" elapsed="0.000361"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:01:55.962147" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:01:55.961893" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.962675" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:01:55.962395" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:55.962221" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:55.961876" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:01:55.962892" elapsed="0.000465"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:01:55.963785" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:01:55.963553" elapsed="0.000257"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:01:55.963966" elapsed="0.000236"/>
</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-10-11T01:01:55.958143" elapsed="0.006115"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:01:55.964300" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:01:55.964490" 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-10-11T01:01:55.948785" elapsed="0.015729"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:01:55.964561" elapsed="0.000023"/>
</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-10-11T01:01:55.911648" elapsed="0.053007"/>
</kw>
<doc>Teardown keyword for exa to odl test case</doc>
<status status="PASS" start="2026-10-11T01:01:55.631971" elapsed="0.332735"/>
</kw>
<doc>Exabgp sends route refresh and count received updates</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-10-11T01:01:37.152075" elapsed="18.812672">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-10-11T01:01:55.967231" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:55.966935" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.967903" 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-10-11T01:01:55.967523" elapsed="0.000423"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:01:55.970147" 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-10-11T01:01:55.968556" elapsed="0.001641"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:01:55.974259" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:01:55.974339" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:01:55.970364" elapsed="0.004000"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.974911" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:01:55.974692" elapsed="0.000263"/>
</kw>
<status status="PASS" start="2026-10-11T01:01:55.974439" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-10-11T01:01:55.974421" elapsed="0.000587"/>
</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-10-11T01:01:55.968196" elapsed="0.006869"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:01:55.976737" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<msg time="2026-10-11T01:01:55.976815" 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-10-11T01:01:55.975218" elapsed="0.001620"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.977267" 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-10-11T01:01:55.977031" elapsed="0.000313"/>
</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-10-11T01:01:55.966637" elapsed="0.010758"/>
</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-10-11T01:01:55.979174" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:55.978860" elapsed="0.000340"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.979667" 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-10-11T01:01:55.979370" elapsed="0.000320"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:55.984288" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0s78hdllzxevl1i9hzwy2mssl20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:55.984447" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:01:55.984532" 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-10-11T01:01:55.979846" elapsed="0.004710"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.985031" 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-10-11T01:01:55.984756" elapsed="0.000336"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:01:55.985633" 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-10-11T01:01:55.985263" elapsed="0.000429">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-10-11T01:01:55.978458" elapsed="0.007478">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:01:58.988136" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:01:58.987695" elapsed="0.000479"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:01:58.988735" 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-10-11T01:01:58.988378" elapsed="0.000382"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:01:58.994590" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0s78hdllzxevl1i9hzwy2mssl20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:01:58.994823" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:01:58.994992" 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-10-11T01:01:58.988924" elapsed="0.006137"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:01:58.995800" 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-10-11T01:01:58.995484" elapsed="0.000362"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:01:58.996419" 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-10-11T01:01:58.996014" elapsed="0.000481">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-10-11T01:01:58.986729" elapsed="0.009876">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:01.998188" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:01.997790" elapsed="0.000433"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:01.998746" 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-10-11T01:02:01.998434" elapsed="0.000400"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:02:02.004982" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0s78hdllzxevl1i9hzwy2mssl20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:02.005237" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:02:02.005329" 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-10-11T01:02:01.998996" elapsed="0.006357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:02.005898" 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-10-11T01:02:02.005588" elapsed="0.000355"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:02:02.006755" 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-10-11T01:02:02.006363" elapsed="0.000462">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-10-11T01:02:01.997153" elapsed="0.009779">200.0 != 409.0</status>
</kw>
<msg time="2026-10-11T01:02:02.007017" 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-10-11T01:01:55.977953" elapsed="6.029163">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</status>
</kw>
<msg time="2026-10-11T01:02:02.007226" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T01:02:02.007266" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:01:55.977568" elapsed="6.029721"/>
</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-10-11T01:02:02.008085" level="INFO">[?2004l01:01:56 | 3165   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:01:56 | 3165   | [01;34mversion      [0m | [1m4.2.17  [0m
01:01:56 | 3165   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
01:01:56 | 3165   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
01:01:56 | 3165   | [01;34minstallation [0m | [1m        [0m
01:01:56 | 3165   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
01:01:56 | 3165   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
01:01:56 | 3165   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:01:56 | 3165   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:01:56 | 3165   | [01;31mcli control  [0m | [1m - /run/[0m
01:01:56 | 3165   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:01:56 | 3165   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:01:56 | 3165   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:01:56 | 3165   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:01:56 | 3165   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:01:56 | 3165   | [01;31mcli control  [0m | [1m - /run/[0m
01:01:56 | 3165   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:01:56 | 3165   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:01:56 | 3165   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:01:56 | 3165   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
01:01:56 | 3165   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
01:01:56 | 3165   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
01:01:56 | 3165   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
01:01:56 | 3165   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
01:01:56 | 3165   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
01:01:56 | 3165   | configuration[0m | . router-id        | '10.30.171.7'[0m
01:01:56 | 3165   | configuration[0m | . local-address    | '10.30.171.7'[0m
01:01:56 | 3165   | configuration[0m | . local-as         | '64496'[0m
01:01:56 | 3165   | configuration[0m | . peer-as          | '64496'[0m
01:01:56 | 3165   | configuration[0m | &gt; capability       | [0m
01:01:56 | 3165   | configuration[0m | . route-refresh    | 'enable'[0m
01:01:56 | 3165   | configuration[0m | . add-path         | 'disable'[0m
01:01:56 | 3165   | configuration[0m | &lt; capability       | [0m
01:01:56 | 3165   | configuration[0m | &gt; family           | [0m
01:01:56 | 3165   | configuration[0m | . ipv4             | 'unicast'[0m
01:01:56 | 3165   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
01:01:56 | 3165   | configuration[0m | &lt; family           | [0m
01:01:56 | 3165   | configuration[0m | &gt; process          | 'exarpcserver'[0m
01:01:56 | 3165   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
01:01:56 | 3165   | [01;31mconfiguration[0m | [1m        [0m
01:01:56 | 3165   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
01:01:56 | 3165   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
01:01:56 | 3165   | [01;31mconfiguration[0m | [1m        [0m
01:01:56 | 3165   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:02.008239" level="INFO">${output} = [?2004l01:01:56 | 3165   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:01:56 | 3165   | [01;34mversion      [0m | [1m4.2.17  [0m
01:01:56 | 3165   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-10-11T01:02:02.007954" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:02.008732" level="INFO">[?2004l01:01:56 | 3165   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:01:56 | 3165   | [01;34mversion      [0m | [1m4.2.17  [0m
01:01:56 | 3165   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
01:01:56 | 3165   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
01:01:56 | 3165   | [01;34minstallation [0m | [1m        [0m
01:01:56 | 3165   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
01:01:56 | 3165   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
01:01:56 | 3165   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:01:56 | 3165   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:01:56 | 3165   | [01;31mcli control  [0m | [1m - /run/[0m
01:01:56 | 3165   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:01:56 | 3165   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:01:56 | 3165   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:01:56 | 3165   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:01:56 | 3165   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:01:56 | 3165   | [01;31mcli control  [0m | [1m - /run/[0m
01:01:56 | 3165   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:01:56 | 3165   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:01:56 | 3165   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:01:56 | 3165   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
01:01:56 | 3165   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
01:01:56 | 3165   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
01:01:56 | 3165   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
01:01:56 | 3165   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
01:01:56 | 3165   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
01:01:56 | 3165   | configuration[0m | . router-id        | '10.30.171.7'[0m
01:01:56 | 3165   | configuration[0m | . local-address    | '10.30.171.7'[0m
01:01:56 | 3165   | configuration[0m | . local-as         | '64496'[0m
01:01:56 | 3165   | configuration[0m | . peer-as          | '64496'[0m
01:01:56 | 3165   | configuration[0m | &gt; capability       | [0m
01:01:56 | 3165   | configuration[0m | . route-refresh    | 'enable'[0m
01:01:56 | 3165   | configuration[0m | . add-path         | 'disable'[0m
01:01:56 | 3165   | configuration[0m | &lt; capability       | [0m
01:01:56 | 3165   | configuration[0m | &gt; family           | [0m
01:01:56 | 3165   | configuration[0m | . ipv4             | 'unicast'[0m
01:01:56 | 3165   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
01:01:56 | 3165   | configuration[0m | &lt; family           | [0m
01:01:56 | 3165   | configuration[0m | &gt; process          | 'exarpcserver'[0m
01:01:56 | 3165   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
01:01:56 | 3165   | [01;31mconfiguration[0m | [1m        [0m
01:01:56 | 3165   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
01:01:56 | 3165   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
01:01:56 | 3165   | [01;31mconfiguration[0m | [1m        [0m
01:01:56 | 3165   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:02.008504" elapsed="0.000341"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:02.009642" 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-10-11T01:02:02.009328" 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-10-11T01:02:02.009819" 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-10-11T01:02:02.009044" elapsed="0.001058"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:02:02.012203" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:02.012288" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:02.010270" elapsed="0.002044"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:02.012949" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:02.012517" elapsed="0.000477"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:02:02.014630" 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-10-11T01:02:02.013594" elapsed="0.001085"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:02:02.015585" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:02.015664" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-423-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-10-11T01:02:02.014844" elapsed="0.000843"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:02.016232" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-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-10-11T01:02:02.015997" elapsed="0.000277"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:02.015748" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:02.015730" elapsed="0.000600"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-10-11T01:02:02.013234" elapsed="0.003138"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-10-11T01:02:02.007666" elapsed="0.008766"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:02.007387" elapsed="0.009071"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:02.007362" elapsed="0.009118"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-10-11T01:02:02.016621" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:02.016529" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:02.016514" elapsed="0.000166"/>
</if>
<var name="${idx}">0</var>
<status status="PASS" start="2026-10-11T01:01:55.966479" elapsed="6.050222"/>
</iter>
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:02.017664" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:02.017337" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:02.018106" 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-10-11T01:02:02.017879" elapsed="0.000268"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:02:02.020120" 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-10-11T01:02:02.018722" elapsed="0.001449"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:02:02.024330" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:02.024422" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:02.020336" elapsed="0.004111"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:02.024978" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:02.024757" elapsed="0.000264"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:02.024507" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:02.024490" elapsed="0.000596"/>
</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-10-11T01:02:02.018370" elapsed="0.006758"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:02:02.026777" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<msg time="2026-10-11T01:02:02.026855" 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-10-11T01:02:02.025279" elapsed="0.001600"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:02.027308" 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-10-11T01:02:02.027083" elapsed="0.000266"/>
</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-10-11T01:02:02.017022" elapsed="0.010376"/>
</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-10-11T01:02:02.029146" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:02.028835" elapsed="0.000336"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:02.029642" 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-10-11T01:02:02.029340" elapsed="0.000326"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:02:02.033649" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0s78hdllzxevl1i9hzwy2mssl20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:02.033755" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:02:02.033847" 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-10-11T01:02:02.029821" elapsed="0.004050"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:02.034361" 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-10-11T01:02:02.034086" elapsed="0.000336"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:02:02.034937" 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-10-11T01:02:02.034595" elapsed="0.000399">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-10-11T01:02:02.028433" elapsed="0.006666">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:05.038004" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:05.037204" elapsed="0.000915"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:05.039753" 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-10-11T01:02:05.038562" elapsed="0.001247"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:02:05.047143" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0s78hdllzxevl1i9hzwy2mssl20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:05.047556" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:02:05.047773" 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-10-11T01:02:05.040189" elapsed="0.007641"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:05.048991" 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-10-11T01:02:05.048315" elapsed="0.000828"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:02:05.050367" 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-10-11T01:02:05.049553" elapsed="0.000983">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-10-11T01:02:05.035982" elapsed="0.014770">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:08.053800" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:08.052953" elapsed="0.000918"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:08.055011" 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-10-11T01:02:08.054313" elapsed="0.000779"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:02:08.062703" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0s78hdllzxevl1i9hzwy2mssl20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:08.062979" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:02:08.063211" 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-10-11T01:02:08.055479" elapsed="0.007786"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:08.064518" 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-10-11T01:02:08.063757" elapsed="0.000862"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:02:08.065923" 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-10-11T01:02:08.064999" elapsed="0.001093">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-10-11T01:02:08.051723" elapsed="0.014589">200.0 != 409.0</status>
</kw>
<msg time="2026-10-11T01:02:08.066528" 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-10-11T01:02:02.027954" elapsed="6.038761">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</status>
</kw>
<msg time="2026-10-11T01:02:08.066947" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T01:02:08.067033" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:02.027571" elapsed="6.039547"/>
</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-10-11T01:02:08.068843" level="INFO">[?2004l01:02:02 | 3172   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:02:02 | 3172   | [01;34mversion      [0m | [1m4.2.17  [0m
01:02:02 | 3172   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
01:02:02 | 3172   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
01:02:02 | 3172   | [01;34minstallation [0m | [1m        [0m
01:02:02 | 3172   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
01:02:02 | 3172   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
01:02:02 | 3172   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:02:02 | 3172   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:02:02 | 3172   | [01;31mcli control  [0m | [1m - /run/[0m
01:02:02 | 3172   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:02:02 | 3172   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:02:02 | 3172   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:02:02 | 3172   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:02:02 | 3172   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:02:02 | 3172   | [01;31mcli control  [0m | [1m - /run/[0m
01:02:02 | 3172   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:02:02 | 3172   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:02:02 | 3172   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:02:02 | 3172   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
01:02:02 | 3172   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
01:02:02 | 3172   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
01:02:02 | 3172   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
01:02:02 | 3172   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
01:02:02 | 3172   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
01:02:02 | 3172   | configuration[0m | . router-id        | '10.30.171.7'[0m
01:02:02 | 3172   | configuration[0m | . local-address    | '10.30.171.7'[0m
01:02:02 | 3172   | configuration[0m | . local-as         | '64496'[0m
01:02:02 | 3172   | configuration[0m | . peer-as          | '64496'[0m
01:02:02 | 3172   | configuration[0m | &gt; capability       | [0m
01:02:02 | 3172   | configuration[0m | . route-refresh    | 'enable'[0m
01:02:02 | 3172   | configuration[0m | . add-path         | 'disable'[0m
01:02:02 | 3172   | configuration[0m | &lt; capability       | [0m
01:02:02 | 3172   | configuration[0m | &gt; family           | [0m
01:02:02 | 3172   | configuration[0m | . ipv4             | 'unicast'[0m
01:02:02 | 3172   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
01:02:02 | 3172   | configuration[0m | &lt; family           | [0m
01:02:02 | 3172   | configuration[0m | &gt; process          | 'exarpcserver'[0m
01:02:02 | 3172   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
01:02:02 | 3172   | [01;31mconfiguration[0m | [1m        [0m
01:02:02 | 3172   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
01:02:02 | 3172   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
01:02:02 | 3172   | [01;31mconfiguration[0m | [1m        [0m
01:02:02 | 3172   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:08.069286" level="INFO">${output} = [?2004l01:02:02 | 3172   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:02:02 | 3172   | [01;34mversion      [0m | [1m4.2.17  [0m
01:02:02 | 3172   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-10-11T01:02:08.068598" elapsed="0.000750"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:08.070323" level="INFO">[?2004l01:02:02 | 3172   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:02:02 | 3172   | [01;34mversion      [0m | [1m4.2.17  [0m
01:02:02 | 3172   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
01:02:02 | 3172   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
01:02:02 | 3172   | [01;34minstallation [0m | [1m        [0m
01:02:02 | 3172   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
01:02:02 | 3172   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
01:02:02 | 3172   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:02:02 | 3172   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:02:02 | 3172   | [01;31mcli control  [0m | [1m - /run/[0m
01:02:02 | 3172   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:02:02 | 3172   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:02:02 | 3172   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:02:02 | 3172   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:02:02 | 3172   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:02:02 | 3172   | [01;31mcli control  [0m | [1m - /run/[0m
01:02:02 | 3172   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:02:02 | 3172   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:02:02 | 3172   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:02:02 | 3172   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
01:02:02 | 3172   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
01:02:02 | 3172   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
01:02:02 | 3172   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
01:02:02 | 3172   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
01:02:02 | 3172   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
01:02:02 | 3172   | configuration[0m | . router-id        | '10.30.171.7'[0m
01:02:02 | 3172   | configuration[0m | . local-address    | '10.30.171.7'[0m
01:02:02 | 3172   | configuration[0m | . local-as         | '64496'[0m
01:02:02 | 3172   | configuration[0m | . peer-as          | '64496'[0m
01:02:02 | 3172   | configuration[0m | &gt; capability       | [0m
01:02:02 | 3172   | configuration[0m | . route-refresh    | 'enable'[0m
01:02:02 | 3172   | configuration[0m | . add-path         | 'disable'[0m
01:02:02 | 3172   | configuration[0m | &lt; capability       | [0m
01:02:02 | 3172   | configuration[0m | &gt; family           | [0m
01:02:02 | 3172   | configuration[0m | . ipv4             | 'unicast'[0m
01:02:02 | 3172   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
01:02:02 | 3172   | configuration[0m | &lt; family           | [0m
01:02:02 | 3172   | configuration[0m | &gt; process          | 'exarpcserver'[0m
01:02:02 | 3172   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
01:02:02 | 3172   | [01;31mconfiguration[0m | [1m        [0m
01:02:02 | 3172   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
01:02:02 | 3172   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
01:02:02 | 3172   | [01;31mconfiguration[0m | [1m        [0m
01:02:02 | 3172   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:08.069802" elapsed="0.000800"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:08.072390" 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-10-11T01:02:08.071711" elapsed="0.000767"/>
</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-10-11T01:02:08.072815" elapsed="0.000440"/>
</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-10-11T01:02:08.071017" elapsed="0.002376"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:02:08.076955" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:08.077167" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:08.073782" elapsed="0.003443"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:08.078232" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:08.077681" elapsed="0.000653"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:02:08.081700" 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-10-11T01:02:08.079931" elapsed="0.001882"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:02:08.083832" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:08.084007" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-423-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-10-11T01:02:08.082206" elapsed="0.001878"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:08.085736" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-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-10-11T01:02:08.084815" elapsed="0.001020"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:08.084222" elapsed="0.001682"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:08.084182" elapsed="0.001776"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-10-11T01:02:08.078866" elapsed="0.007219"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-10-11T01:02:08.067893" elapsed="0.018297"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:08.067313" elapsed="0.018930"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:08.067266" elapsed="0.019024"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-10-11T01:02:08.086635" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:08.086401" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:08.086367" elapsed="0.000401"/>
</if>
<var name="${idx}">1</var>
<status status="PASS" start="2026-10-11T01:02:02.016861" elapsed="6.070013"/>
</iter>
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:08.089004" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:08.088346" elapsed="0.000776"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:08.090175" 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-10-11T01:02:08.089653" elapsed="0.000613"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:02:08.093859" 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-10-11T01:02:08.091585" elapsed="0.002388"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:02:08.098722" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:08.098903" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:08.094371" elapsed="0.004586"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:08.100282" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:08.099712" elapsed="0.000668"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:08.099119" elapsed="0.001382"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:08.099079" elapsed="0.001465"/>
</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-10-11T01:02:08.090782" elapsed="0.009834"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:02:08.102774" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<msg time="2026-10-11T01:02:08.102884" 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-10-11T01:02:08.100829" elapsed="0.002088"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:08.103531" 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-10-11T01:02:08.103204" elapsed="0.000385"/>
</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-10-11T01:02:08.087645" elapsed="0.016014"/>
</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-10-11T01:02:08.106106" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:08.105673" elapsed="0.000469"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:08.106791" 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-10-11T01:02:08.106380" elapsed="0.000444"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:02:08.111556" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0s78hdllzxevl1i9hzwy2mssl20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:08.111701" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:02:08.111829" 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-10-11T01:02:08.107060" elapsed="0.004802"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:08.112570" 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-10-11T01:02:08.112161" elapsed="0.000469"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:02:08.113356" 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-10-11T01:02:08.112864" elapsed="0.000600">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-10-11T01:02:08.105093" elapsed="0.008501">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:11.116467" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:11.115656" elapsed="0.000881"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:11.117660" 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-10-11T01:02:11.116943" elapsed="0.000774"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:02:11.125497" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0s78hdllzxevl1i9hzwy2mssl20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:11.125772" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:02:11.125969" 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-10-11T01:02:11.118089" elapsed="0.007936"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:11.127715" 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-10-11T01:02:11.126543" elapsed="0.001278"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:02:11.129157" 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-10-11T01:02:11.128236" elapsed="0.001062">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-10-11T01:02:11.114475" elapsed="0.015107">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.132483" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:14.131661" elapsed="0.000893"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.133682" 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-10-11T01:02:14.132961" elapsed="0.000779"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:02:14.141077" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0s78hdllzxevl1i9hzwy2mssl20.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:14.141344" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:02:14.141582" 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-10-11T01:02:14.134116" elapsed="0.007530"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.142832" 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-10-11T01:02:14.142168" elapsed="0.000762"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.144203" 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-10-11T01:02:14.143333" elapsed="0.001009">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-10-11T01:02:14.130468" elapsed="0.014124">200.0 != 409.0</status>
</kw>
<msg time="2026-10-11T01:02:14.144775" 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-10-11T01:02:08.104451" elapsed="6.040507">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</status>
</kw>
<msg time="2026-10-11T01:02:14.145218" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T01:02:14.145307" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:08.103877" elapsed="6.041479"/>
</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-10-11T01:02:14.147017" level="INFO">[?2004l01:02:08 | 3176   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:02:08 | 3176   | [01;34mversion      [0m | [1m4.2.17  [0m
01:02:08 | 3176   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
01:02:08 | 3176   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
01:02:08 | 3176   | [01;34minstallation [0m | [1m        [0m
01:02:08 | 3176   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
01:02:08 | 3176   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
01:02:08 | 3176   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:02:08 | 3176   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:02:08 | 3176   | [01;31mcli control  [0m | [1m - /run/[0m
01:02:08 | 3176   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:02:08 | 3176   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:02:08 | 3176   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:02:08 | 3176   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:02:08 | 3176   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:02:08 | 3176   | [01;31mcli control  [0m | [1m - /run/[0m
01:02:08 | 3176   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:02:08 | 3176   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:02:08 | 3176   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:02:08 | 3176   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
01:02:08 | 3176   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
01:02:08 | 3176   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
01:02:08 | 3176   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
01:02:08 | 3176   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
01:02:08 | 3176   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
01:02:08 | 3176   | configuration[0m | . router-id        | '10.30.171.7'[0m
01:02:08 | 3176   | configuration[0m | . local-address    | '10.30.171.7'[0m
01:02:08 | 3176   | configuration[0m | . local-as         | '64496'[0m
01:02:08 | 3176   | configuration[0m | . peer-as          | '64496'[0m
01:02:08 | 3176   | configuration[0m | &gt; capability       | [0m
01:02:08 | 3176   | configuration[0m | . route-refresh    | 'enable'[0m
01:02:08 | 3176   | configuration[0m | . add-path         | 'disable'[0m
01:02:08 | 3176   | configuration[0m | &lt; capability       | [0m
01:02:08 | 3176   | configuration[0m | &gt; family           | [0m
01:02:08 | 3176   | configuration[0m | . ipv4             | 'unicast'[0m
01:02:08 | 3176   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
01:02:08 | 3176   | configuration[0m | &lt; family           | [0m
01:02:08 | 3176   | configuration[0m | &gt; process          | 'exarpcserver'[0m
01:02:08 | 3176   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
01:02:08 | 3176   | [01;31mconfiguration[0m | [1m        [0m
01:02:08 | 3176   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
01:02:08 | 3176   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
01:02:08 | 3176   | [01;31mconfiguration[0m | [1m        [0m
01:02:08 | 3176   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:14.147481" level="INFO">${output} = [?2004l01:02:08 | 3176   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:02:08 | 3176   | [01;34mversion      [0m | [1m4.2.17  [0m
01:02:08 | 3176   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-10-11T01:02:14.146786" elapsed="0.000761"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.148522" level="INFO">[?2004l01:02:08 | 3176   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:02:08 | 3176   | [01;34mversion      [0m | [1m4.2.17  [0m
01:02:08 | 3176   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
01:02:08 | 3176   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
01:02:08 | 3176   | [01;34minstallation [0m | [1m        [0m
01:02:08 | 3176   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
01:02:08 | 3176   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
01:02:08 | 3176   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:02:08 | 3176   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:02:08 | 3176   | [01;31mcli control  [0m | [1m - /run/[0m
01:02:08 | 3176   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:02:08 | 3176   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:02:08 | 3176   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:02:08 | 3176   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:02:08 | 3176   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:02:08 | 3176   | [01;31mcli control  [0m | [1m - /run/[0m
01:02:08 | 3176   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:02:08 | 3176   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:02:08 | 3176   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:02:08 | 3176   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
01:02:08 | 3176   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
01:02:08 | 3176   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
01:02:08 | 3176   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
01:02:08 | 3176   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
01:02:08 | 3176   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
01:02:08 | 3176   | configuration[0m | . router-id        | '10.30.171.7'[0m
01:02:08 | 3176   | configuration[0m | . local-address    | '10.30.171.7'[0m
01:02:08 | 3176   | configuration[0m | . local-as         | '64496'[0m
01:02:08 | 3176   | configuration[0m | . peer-as          | '64496'[0m
01:02:08 | 3176   | configuration[0m | &gt; capability       | [0m
01:02:08 | 3176   | configuration[0m | . route-refresh    | 'enable'[0m
01:02:08 | 3176   | configuration[0m | . add-path         | 'disable'[0m
01:02:08 | 3176   | configuration[0m | &lt; capability       | [0m
01:02:08 | 3176   | configuration[0m | &gt; family           | [0m
01:02:08 | 3176   | configuration[0m | . ipv4             | 'unicast'[0m
01:02:08 | 3176   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
01:02:08 | 3176   | configuration[0m | &lt; family           | [0m
01:02:08 | 3176   | configuration[0m | &gt; process          | 'exarpcserver'[0m
01:02:08 | 3176   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
01:02:08 | 3176   | [01;31mconfiguration[0m | [1m        [0m
01:02:08 | 3176   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
01:02:08 | 3176   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
01:02:08 | 3176   | [01;31mconfiguration[0m | [1m        [0m
01:02:08 | 3176   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:14.147971" elapsed="0.000801"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.150566" 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-10-11T01:02:14.149860" elapsed="0.000769"/>
</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-10-11T01:02:14.150961" elapsed="0.000442"/>
</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-10-11T01:02:14.149210" elapsed="0.002357"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:02:14.154839" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:14.155023" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:14.151918" elapsed="0.003184"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.156073" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:14.155559" elapsed="0.000615"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:02:14.159291" 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-10-11T01:02:14.157515" elapsed="0.001888"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:02:14.161579" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:14.161786" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-423-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-10-11T01:02:14.159809" elapsed="0.002040"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.163177" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-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-10-11T01:02:14.162658" elapsed="0.000617"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:14.161987" elapsed="0.001356"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.161948" elapsed="0.001448"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-10-11T01:02:14.156700" elapsed="0.006821"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-10-11T01:02:14.146131" elapsed="0.017491"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:14.145574" elapsed="0.018101"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.145529" elapsed="0.018192"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-10-11T01:02:14.164026" elapsed="0.000056"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:14.163829" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.163796" elapsed="0.000385"/>
</if>
<var name="${idx}">2</var>
<status status="PASS" start="2026-10-11T01:02:08.087252" elapsed="6.077035"/>
</iter>
<var>${idx}</var>
<value>${connection_retries}</value>
<status status="PASS" start="2026-10-11T01:01:55.966289" elapsed="18.198068"/>
</for>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.165336" level="FAIL">Unable to connect ExaBgp to ODL</msg>
<arg>Unable to connect ExaBgp to ODL</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-10-11T01:02:14.164734" elapsed="0.000756">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-10-11T01:01:55.965969" elapsed="18.199719">Unable to connect ExaBgp to ODL</status>
</kw>
<kw name="Stop_ExaBgp" owner="ExaBgpLib" type="TEARDOWN">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-10-11T01:02:14.167751" level="INFO">${output} =  </msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-10-11T01:02:14.167450" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.168767" level="INFO"> </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:14.168244" elapsed="0.000612"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.170681" 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-10-11T01:02:14.169990" elapsed="0.000749"/>
</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-10-11T01:02:14.171093" elapsed="0.000390"/>
</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-10-11T01:02:14.169290" elapsed="0.002330"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:02:14.174381" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:14.174583" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-423-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-10-11T01:02:14.171970" elapsed="0.002679"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.175643" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-423-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-10-11T01:02:14.175124" elapsed="0.000616"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:02:14.178786" 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-10-11T01:02:14.177092" elapsed="0.001802"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:02:14.342649" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:14.342774" level="INFO">${output} = [?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-423-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-10-11T01:02:14.179250" elapsed="0.163551"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.343480" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-423-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-10-11T01:02:14.343197" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:14.342886" elapsed="0.000671"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.342862" elapsed="0.000718"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-10-11T01:02:14.176239" elapsed="0.167387"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-10-11T01:02:14.166351" elapsed="0.177324"/>
</kw>
<doc>Sends route refresh request and checks if exabgp receives it</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-10-11T01:01:55.965279" elapsed="18.378437">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-10-11T01:02:14.345254" elapsed="0.000293"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:02:14.344983" elapsed="0.000629"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:02:14.346662" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:14.346565" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.346547" elapsed="0.000181"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:02:14.350578" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:14.350489" elapsed="0.000134"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.350471" elapsed="0.000173"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.351597" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:02:14.351243" elapsed="0.000381"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.352064" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:02:14.351778" elapsed="0.000312"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:02:14.352130" elapsed="0.000033"/>
</return>
<msg time="2026-10-11T01:02:14.352265" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:02:14.350858" elapsed="0.001429"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:02:14.354840" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:14.354755" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.354738" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:02:14.355985" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:14.355901" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.355883" elapsed="0.000181"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:02:14.356389" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:02:14.356213" elapsed="0.000222"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:02:14.356751" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:02:14.356610" elapsed="0.000165"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:02:14.394900" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:02:14.357278" elapsed="0.037717"/>
</kw>
<msg time="2026-10-11T01:02:14.395184" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:02:14.395228" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:14.356931" elapsed="0.038332"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:02:14.435521" 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-10-11T01:02:14.395831" elapsed="0.039801"/>
</kw>
<msg time="2026-10-11T01:02:14.435782" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:02:14.435823" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:14.395465" elapsed="0.040393"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:14.436165" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:14.435925" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.435907" elapsed="0.000331"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.436684" 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-10-11T01:02:14.436442" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:14.437031" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:14.436812" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.436796" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:02:14.437151" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:02:14.439722" elapsed="0.000236"/>
</kw>
<msg time="2026-10-11T01:02:14.440019" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:14.438581" elapsed="0.001592"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:14.440515" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:14.440988" 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-10-11T01:02:14.437954" elapsed="0.003252"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:02:14.437472" 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-10-11T01:02:14.355640" elapsed="0.085701"/>
</kw>
<msg time="2026-10-11T01:02:14.441453" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:02:14.441500" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:14.355069" elapsed="0.086467"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:02:14.441737" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:02:14.441647" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.441625" elapsed="0.000190"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:14.442159" 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-10-11T01:02:14.442612" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:02:14.442681" 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-10-11T01:02:14.354467" elapsed="0.088302"/>
</kw>
<msg time="2026-10-11T01:02:14.442854" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:02:14.442894" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:14.352688" elapsed="0.090241"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:14.443235" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:14.442997" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.442980" elapsed="0.000328"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:02:14.352544" elapsed="0.090785"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:02:14.352382" elapsed="0.090975"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:02:14.350166" elapsed="0.093260"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:02:14.346247" elapsed="0.097244"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:14.345775" elapsed="0.097758"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:02:14.344608" elapsed="0.098972"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.444259" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.171.7 | 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-10-11T01:02:14.443769" elapsed="0.000517"/>
</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-10-11T01:02:14.457416" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:14.457099" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:14.458164" 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-10-11T01:02:14.457921" elapsed="0.000318">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-10-11T01:02:14.458324" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:14.457603" elapsed="0.000743"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.458856" 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-10-11T01:02:14.458547" elapsed="0.000335"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:02:14.459176" 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-10-11T01:02:14.459322" 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-10-11T01:02:14.459062" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.459902" 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-10-11T01:02:14.459639" 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-10-11T01:02:14.460869" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', '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-10-11T01:02:14.460638" elapsed="0.000272"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.461348" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:02:14.461101" elapsed="0.000270"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.461972" 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-10-11T01:02:14.461704" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:14.462869" 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-10-11T01:02:14.462678" elapsed="0.000216"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:14.462940" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:02:14.463080" 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-10-11T01:02:14.462181" elapsed="0.000923"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:14.463270" elapsed="0.000202"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T01:02:14.461572" elapsed="0.001937"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.464007" 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-10-11T01:02:14.463737" elapsed="0.000295"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:14.464721" 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-10-11T01:02:14.464543" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:14.464789" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:14.464912" 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-10-11T01:02:14.464219" elapsed="0.000716"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:14.465121" elapsed="0.000166"/>
</kw>
<var name="${key}">BGP_NAME</var>
<var name="${value}">example-bgp-peer</var>
<status status="PASS" start="2026-10-11T01:02:14.463608" elapsed="0.001716"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.465836" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:14.465569" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:14.466537" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:14.466346" elapsed="0.000215"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:14.466604" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:14.466726" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:14.466025" elapsed="0.000724"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:14.466910" elapsed="0.000174"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T01:02:14.465439" elapsed="0.001682"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.467630" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:14.467347" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:14.468308" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:14.468133" elapsed="0.000198"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:14.468374" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:14.468512" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:14.467818" elapsed="0.000716"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:14.468695" elapsed="0.000163"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:02:14.467219" elapsed="0.001675"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:02:14.461429" elapsed="0.007496"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:02:14.468962" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:02:14.469117" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'BGP_NAME': 'example-bgp-peer', 'IP': '10.30.171.7', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:02:14.460280" elapsed="0.008892"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:14.460009" elapsed="0.009194"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:14.469374" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:14.469225" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.459992" elapsed="0.009469"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.470230" 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-10-11T01:02:14.469621" elapsed="0.000636"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:02:14.470300" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:14.456577" elapsed="0.013822"/>
</kw>
<msg time="2026-10-11T01:02:14.470464" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:14.452283" 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/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-10-11T01:02:14.474817" 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-10-11T01:02:14.478946" 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/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-10-11T01:02:14.482997" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:14.483203" 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-10-11T01:02:14.483389" 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-10-11T01:02:14.483783" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:14.483610" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:02:14.483597" 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-10-11T01:02:14.484010" 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-10-11T01:02:14.484205" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:14.484367" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:02:14.483568" elapsed="0.000861"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:02:14.483474" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:14.484604" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:02:14.484713" elapsed="0.000017"/>
</return>
<msg time="2026-10-11T01:02:14.484841" 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-10-11T01:02:14.451656" elapsed="0.033211"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.485920" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:14.485675" 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-10-11T01:02:14.493742" level="INFO">DELETE Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0s78hdllzxevl1i9hzwy2mssl20.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:14.493788" level="INFO">DELETE Response : url=http://10.30.170.173: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.171.7 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:14.493883" 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-10-11T01:02:14.486275" elapsed="0.007632"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:14.486026" elapsed="0.007918"/>
</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-10-11T01:02:14.494137" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:14.493969" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.486009" elapsed="0.008204"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.495446" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:14.495155" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:14.494904" elapsed="0.000614"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.494887" elapsed="0.000654"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.496104" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:14.495825" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:14.495590" elapsed="0.000585"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.495575" elapsed="0.000623"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.496771" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:14.496387" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:14.497083" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:14.496858" elapsed="0.000277"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.497643" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:14.497321" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:14.497157" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.496842" elapsed="0.000882"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.498244" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:14.497898" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:14.498554" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:14.498331" elapsed="0.000275"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.499057" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:14.498786" elapsed="0.000295"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:14.498627" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.498315" elapsed="0.000818"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:14.499276" elapsed="0.000306"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:02:14.500007" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:14.499774" elapsed="0.000257"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:02:14.500195" elapsed="0.000228"/>
</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-10-11T01:02:14.494565" elapsed="0.005915"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:02:14.500520" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:02:14.500694" 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-10-11T01:02:14.485117" elapsed="0.015602"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:02:14.500765" elapsed="0.000024"/>
</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-10-11T01:02:14.444510" elapsed="0.056351"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-10-11T01:02:14.344047" elapsed="0.156919"/>
</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-10-11T01:02:14.502908" elapsed="0.000482"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:02:14.502340" elapsed="0.001121"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:02:14.504363" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:14.504272" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.504255" elapsed="0.000187"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:02:14.506401" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:14.506319" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.506302" elapsed="0.000176"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.507455" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:02:14.507093" elapsed="0.000391"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.507905" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:02:14.507636" elapsed="0.000293"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:02:14.507970" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:02:14.508114" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:02:14.506689" elapsed="0.001448"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:02:14.510624" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:14.510539" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.510522" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:02:14.511764" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:14.511677" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.511660" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:02:14.512227" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:02:14.511972" elapsed="0.000280"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:02:14.512588" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:02:14.512439" elapsed="0.000173"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:02:14.545244" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:02:14.513136" elapsed="0.032206"/>
</kw>
<msg time="2026-10-11T01:02:14.545534" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:02:14.545589" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:14.512767" elapsed="0.032870"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:02:14.580320" 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-10-11T01:02:14.546326" elapsed="0.034122"/>
</kw>
<msg time="2026-10-11T01:02:14.580609" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:02:14.580651" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:14.545927" elapsed="0.034761"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:14.580974" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:14.580761" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.580741" elapsed="0.000321"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.581504" 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-10-11T01:02:14.581246" elapsed="0.000326"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:14.581955" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:14.581634" elapsed="0.000375"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.581617" elapsed="0.000414"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:02:14.582079" 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-10-11T01:02:14.584670" elapsed="0.000121"/>
</kw>
<msg time="2026-10-11T01:02:14.584850" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:14.583520" 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-10-11T01:02:14.585319" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:14.585813" 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-10-11T01:02:14.582879" elapsed="0.003140"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:02:14.582362" elapsed="0.003733"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:02:14.511381" elapsed="0.074790"/>
</kw>
<msg time="2026-10-11T01:02:14.586255" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:02:14.586295" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:14.510836" elapsed="0.075494"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:02:14.586521" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:02:14.586400" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.586382" 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-10-11T01:02:14.586925" 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-10-11T01:02:14.587241" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:02:14.587307" 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-10-11T01:02:14.510240" elapsed="0.077152"/>
</kw>
<msg time="2026-10-11T01:02:14.587604" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:02:14.587645" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:14.508481" elapsed="0.079199"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:14.587990" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:14.587757" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.587734" elapsed="0.000381"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:02:14.508324" elapsed="0.079813"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:02:14.508184" elapsed="0.079980"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:02:14.506016" elapsed="0.082198"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:02:14.504009" elapsed="0.084255"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:14.503613" elapsed="0.084693"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:02:14.501969" elapsed="0.086384"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.589053" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | APP_PEER_NAME=example-bgp-peer-app | IP=10.30.170.173 | 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-10-11T01:02:14.588561" elapsed="0.000520"/>
</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-10-11T01:02:14.602170" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:14.601849" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:14.602897" 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-10-11T01:02:14.602693" elapsed="0.000277">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-10-11T01:02:14.603075" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:14.602356" elapsed="0.000744"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.603600" 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-10-11T01:02:14.603273" elapsed="0.000352"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:02:14.603904" 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-10-11T01:02:14.604055" 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-10-11T01:02:14.603794" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.604509" 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-10-11T01:02:14.604276" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.605641" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'APP_PEER_NAME': 'example-bgp-peer-app', 'IP': '10.30.170.173', '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-10-11T01:02:14.605388" elapsed="0.000296"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.606131" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:02:14.605865" elapsed="0.000290"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.606757" 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-10-11T01:02:14.606485" elapsed="0.000296"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:14.607476" 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-10-11T01:02:14.607276" elapsed="0.000225"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:14.607546" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:02:14.607670" 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-10-11T01:02:14.606952" elapsed="0.000741"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:14.607857" elapsed="0.000171"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T01:02:14.606339" elapsed="0.001769"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.608630" 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-10-11T01:02:14.608342" elapsed="0.000312"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:14.609325" 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-10-11T01:02:14.609147" elapsed="0.000203"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:14.609393" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T01:02:14.609534" 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-10-11T01:02:14.608823" elapsed="0.000734"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:14.609719" elapsed="0.000164"/>
</kw>
<var name="${key}">APP_PEER_NAME</var>
<var name="${value}">example-bgp-peer-app</var>
<status status="PASS" start="2026-10-11T01:02:14.608212" elapsed="0.001708"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.610439" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:14.610158" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:14.611159" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:14.610960" elapsed="0.000223"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:14.611227" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:14.611348" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:14.610653" elapsed="0.000718"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:14.611547" elapsed="0.000164"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:02:14.610018" elapsed="0.001730"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.612287" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:14.611971" elapsed="0.000340"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:14.612978" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:14.612803" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:14.613061" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:02:14.613184" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:14.612496" elapsed="0.000711"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:14.613368" elapsed="0.000181"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:02:14.611844" elapsed="0.001743"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:02:14.606199" elapsed="0.007418"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:02:14.613654" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:02:14.613782" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'APP_PEER_NAME': 'example-bgp-peer-app', 'IP': '10.30.170.173', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:02:14.604859" elapsed="0.008947"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:14.604611" elapsed="0.009224"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:14.614004" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:14.613857" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.604595" elapsed="0.009495"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.614809" 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-10-11T01:02:14.614249" elapsed="0.000587"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:02:14.614880" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:14.601305" elapsed="0.013675"/>
</kw>
<msg time="2026-10-11T01:02:14.615027" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:14.596988" elapsed="0.018098"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:14.619350" 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/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-10-11T01:02:14.623448" 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/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-10-11T01:02:14.627527" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:14.627709" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:14.627891" 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-10-11T01:02:14.628247" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:14.628103" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:02:14.628090" 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-10-11T01:02:14.628486" 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-10-11T01:02:14.628663" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:14.628824" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:02:14.628064" elapsed="0.000807"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:02:14.627957" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:14.629058" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:02:14.629126" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:02:14.629236" 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-10-11T01:02:14.596361" elapsed="0.032900"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.630269" 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.173</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:14.630045" elapsed="0.000268"/>
</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-10-11T01:02:14.638094" level="INFO">DELETE Request : url=http://10.30.170.173: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.173 
 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.173 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0s78hdllzxevl1i9hzwy2mssl20.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:14.638174" level="INFO">DELETE Response : url=http://10.30.170.173: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.173 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:14.638266" 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-10-11T01:02:14.630612" elapsed="0.007679"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:14.630373" elapsed="0.007955"/>
</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-10-11T01:02:14.638537" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:14.638355" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.630357" elapsed="0.008260"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.639831" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:14.639550" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:14.639289" elapsed="0.000613"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.639272" elapsed="0.000652"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.640513" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:14.640226" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:14.639973" elapsed="0.000613"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.639959" elapsed="0.000649"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.641156" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:14.640784" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:14.641484" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:14.641246" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.641983" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:14.641720" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:14.641560" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.641228" elapsed="0.000849"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.642601" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:14.642250" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:14.642900" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:14.642693" elapsed="0.000257"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.643426" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:14.643149" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:14.642972" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.642676" elapsed="0.000827"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:14.643646" elapsed="0.000292"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:02:14.644330" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:14.644108" elapsed="0.000246"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:02:14.644519" elapsed="0.000213"/>
</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-10-11T01:02:14.638936" elapsed="0.005852"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:02:14.644829" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:14.645000" 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-10-11T01:02:14.629504" elapsed="0.015520"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:02:14.645092" elapsed="0.000024"/>
</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-10-11T01:02:14.589290" elapsed="0.055898"/>
</kw>
<doc>Revert the BGP configuration to the original state: without application peer</doc>
<status status="PASS" start="2026-10-11T01:02:14.501373" elapsed="0.143904"/>
</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-10-11T01:02:14.649341" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:14.649051" 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-10-11T01:02:14.650776" level="INFO">Executing command 'cd '.' &amp;&amp; rm -rf /tmp/defaultvenv'.</msg>
<msg time="2026-10-11T01:02:14.703946" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:02:14.704152" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T01:02:14.704207" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T01:02:14.704259" 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-10-11T01:02:14.650615" elapsed="0.053674"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.705509" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T01:02:14.705136" elapsed="0.000434"/>
</kw>
<msg time="2026-10-11T01:02:14.705696" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T01:02:14.705750" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:14.704615" elapsed="0.001165"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.706576" 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-10-11T01:02:14.706026" elapsed="0.000585"/>
</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-10-11T01:02:14.707918" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:14.707609" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.708570" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:14.708253" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.709193" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:14.708881" elapsed="0.000369"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T01:02:14.707112" elapsed="0.002207"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:14.706715" elapsed="0.002649"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.706688" elapsed="0.002709"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T01:02:14.709600" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:14.709489" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.709467" elapsed="0.000220"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T01:02:14.709848" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-10-11T01:02:14.709752" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.709732" elapsed="0.000228"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:14.710183" elapsed="0.000028"/>
</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-10-11T01:02:14.650102" elapsed="0.060215"/>
</kw>
<msg time="2026-10-11T01:02:14.710384" 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-10-11T01:02:14.649595" elapsed="0.060888"/>
</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-10-11T01:02:14.648524" elapsed="0.062058"/>
</kw>
<msg time="2026-10-11T01:02:14.710644" 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-10-11T01:02:14.647063" elapsed="0.063653"/>
</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-10-11T01:02:14.646320" elapsed="0.064493"/>
</kw>
<doc>Deletes a directory with virtual env.</doc>
<status status="PASS" start="2026-10-11T01:02:14.646090" elapsed="0.064789"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-10-11T01:02:14.711090" elapsed="0.000501"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-10-11T01:02:14.711892" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects </doc>
<status status="PASS" start="2026-10-11T01:02:14.711796" elapsed="0.000205"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-10-11T01:02:14.645824" elapsed="0.066301"/>
</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-10-11T01:01:29.073822" elapsed="45.638346"/>
</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-10-11T01:02:14.747001" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:02:14.745103" elapsed="0.001967"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-10-11T01:02:14.744812" elapsed="0.002315"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.749504" 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-10-11T01:02:14.748154" elapsed="0.001376"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-10-11T01:02:14.749685" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:14.749601" elapsed="0.000121"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.749582" elapsed="0.000174"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.750270" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:02:14.749933" elapsed="0.000376"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.750760" 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-10-11T01:02:14.750486" elapsed="0.000298"/>
</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-10-11T01:02:14.751289" elapsed="0.000264"/>
</kw>
<msg time="2026-10-11T01:02:14.751640" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:02:14.751681" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:14.750942" elapsed="0.000760"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.752201" 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-10-11T01:02:14.751875" elapsed="0.000350"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.753091" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:02:14.752833" elapsed="0.000284"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.753513" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:02:14.753259" elapsed="0.000279"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.753974" 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-10-11T01:02:14.753710" elapsed="0.000289"/>
</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-10-11T01:02:14.754894" elapsed="0.000173"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.755513" level="INFO">${member_ip} = 10.30.170.173</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:14.755222" elapsed="0.000316"/>
</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-10-11T01:02:14.755703" elapsed="0.000168"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.757971" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:14.756338" elapsed="0.001659"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-11T01:02:14.758053" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:02:14.758184" 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-10-11T01:02:14.756074" elapsed="0.002134"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:02:14.758715" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x74344564f1d0&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-10-11T01:02:14.758382" elapsed="0.000456"/>
</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-10-11T01:02:14.758999" elapsed="0.000166"/>
</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-10-11T01:02:14.754452" elapsed="0.004767"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:02:14.754266" elapsed="0.004993"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-10-11T01:02:14.754081" elapsed="0.005207"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.759842" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:02:14.759485" elapsed="0.000440"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.760498" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.173'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:02:14.760127" elapsed="0.000412"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.761078" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:02:14.760724" elapsed="0.000394"/>
</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-10-11T01:02:14.752462" elapsed="0.008708"/>
</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-10-11T01:02:14.747834" elapsed="0.013386"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:02:14.761366" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:14.761277" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.761261" elapsed="0.000181"/>
</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-10-11T01:02:14.762644" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:02:14.762289" elapsed="0.000383"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.763111" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:02:14.762824" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:02:14.763175" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:14.763300" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:02:14.761975" elapsed="0.001348"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:02:14.764169" level="INFO">${member_ip} = 10.30.170.173</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-10-11T01:02:14.763950" elapsed="0.000244"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:02:14.764900" 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-10-11T01:02:14.764990" 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-10-11T01:02:14.764758" elapsed="0.000256"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:14.767861" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:14.767298" elapsed="0.000643"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:14.767279" elapsed="0.000700"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:02:14.768691" 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-10-11T01:02:14.768914" 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-10-11T01:02:14.768245" elapsed="0.000720"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.769886" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.173" 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-10-11T01:02:14.769280" elapsed="0.000728"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:02:14.771364" 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-10-11T01:02:14.770313" elapsed="0.001222"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:02:14.773174" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T01:02:14.773345" 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-10-11T01:02:14.772827" elapsed="0.000561"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:14.773791" elapsed="0.000441"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T01:02:14.775373" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T01:02:15.128147" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 01:01:29 UTC 2026

  System load:  0.13               Processes:             121
  Usage of /:   14.2% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.173
  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.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 01:01:29 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T01:02:14.775127" elapsed="0.353170"/>
</kw>
<msg time="2026-10-11T01:02:15.128389" 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-10-11T01:02:14.774640" elapsed="0.353943"/>
</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-10-11T01:02:14.771954" elapsed="0.356801"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:15.129866" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-10-11T01:02:15.142650" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-10-11T01:02:15.142811" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T01:02:15.142907" 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-10-11T01:02:15.129268" elapsed="0.013685"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:02:15.143258" elapsed="0.000494"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:15.144977" 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-10-11T01:02:15.144400" elapsed="0.000712"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T01:02:15.145530" elapsed="0.000073"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:15.145276" elapsed="0.000411"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:15.145249" elapsed="0.000474"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T01:02:15.145993" elapsed="0.000089"/>
</return>
<status status="PASS" start="2026-10-11T01:02:15.145797" elapsed="0.000371"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:15.145782" elapsed="0.000423"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T01:02:15.146260" elapsed="0.000014"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:15.147488" elapsed="0.000422"/>
</kw>
<kw name="Open 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-10-11T01:02:15.148241" elapsed="0.000299"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:02:15.148800" elapsed="0.000209"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:02:15.146736" elapsed="0.002357"/>
</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-10-11T01:02:14.766631" elapsed="0.382567"/>
</kw>
<msg time="2026-10-11T01:02:15.149247" 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-10-11T01:02:14.766029" elapsed="0.383267"/>
</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-10-11T01:02:14.765646" elapsed="0.383721"/>
</kw>
<msg time="2026-10-11T01:02:15.149404" 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-10-11T01:02:14.765179" elapsed="0.384356"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:15.150163" elapsed="0.000292"/>
</kw>
<kw name="Open 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-10-11T01:02:15.150641" elapsed="0.000132"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:02:15.150974" 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-10-11T01:02:15.149815" elapsed="0.001311"/>
</kw>
<msg time="2026-10-11T01:02:15.151208" 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-10-11T01:02:14.764388" elapsed="0.386845"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:15.151681" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:15.151458" elapsed="0.000262"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-11T01:02:15.151758" elapsed="0.000027"/>
</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-10-11T01:02:14.763644" elapsed="0.388215"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:02:14.763484" elapsed="0.388408"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:02:14.763368" elapsed="0.388559"/>
</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-10-11T01:02:14.761642" elapsed="0.390335"/>
</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-10-11T01:02:15.152141" elapsed="0.000204"/>
</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-10-11T01:02:15.158306" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:15.158220" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:15.158203" elapsed="0.000167"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:02:15.158704" 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-10-11T01:02:15.158797" 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-10-11T01:02:15.158581" elapsed="0.000241"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:15.159275" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:15.159011" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:15.159767" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:15.159547" elapsed="0.000261"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:02:15.160529" 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-10-11T01:02:15.160333" elapsed="0.000299">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-10-11T01:02:15.160726" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T01:02:15.160767" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:15.159966" elapsed="0.000822"/>
</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-10-11T01:02:15.161083" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:15.160855" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:15.160839" elapsed="0.000334"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:02:15.161825" level="INFO">${ip_address} = 10.30.170.173</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-10-11T01:02:15.161618" elapsed="0.000232"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-10-11T01:02:15.161892" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:15.162014" level="INFO">${odl_ip} = 10.30.170.173</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-10-11T01:02:15.161356" elapsed="0.000691"/>
</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-10-11T01:02:15.162227" elapsed="0.000336"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:02:15.162876" level="INFO">index=4
host=10.30.170.173
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-10-11T01:02:15.162964" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.173
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-10-11T01:02:15.162779" elapsed="0.000209"/>
</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-10-11T01:02:15.163162" elapsed="0.000241"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-10-11T01:02:15.163841" level="INFO">Logging into '10.30.170.173:8101' as 'karaf'.</msg>
<msg time="2026-10-11T01:02:15.380046" 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-10-11T01:02:15.163643" elapsed="0.216521"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:15.381748" elapsed="0.000279"/>
</kw>
<kw name="Open 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-10-11T01:02:15.382226" elapsed="0.000144"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:02:15.382529" elapsed="0.000093"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:02:15.381377" elapsed="0.001294"/>
</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-10-11T01:02:15.380542" elapsed="0.002174"/>
</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-10-11T01:02:15.157976" elapsed="0.224789"/>
</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-10-11T01:02:15.153088" elapsed="0.229723"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:15.152692" elapsed="0.230169"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:02:15.152549" elapsed="0.230349"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-10-11T01:02:15.152396" elapsed="0.230534"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-10-11T01:02:14.747389" elapsed="0.635595"/>
</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-10-11T01:02:15.383849" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:15.383759" elapsed="0.000134"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:15.383740" elapsed="0.000176"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:02:15.385889" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:15.385807" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:15.385790" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:15.386829" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:02:15.386492" elapsed="0.000364"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:02:15.387292" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:02:15.387008" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:02:15.387358" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:02:15.387506" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:02:15.386172" elapsed="0.001357"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:02:15.390066" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:15.389961" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:15.389943" elapsed="0.000190"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:02:15.391202" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:15.391117" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:15.391099" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:02:15.391772" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:02:15.391431" elapsed="0.000366"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:02:15.392170" 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-10-11T01:02:15.391964" elapsed="0.000230"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:02:15.429517" 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-10-11T01:02:15.392874" elapsed="0.036787"/>
</kw>
<msg time="2026-10-11T01:02:15.429793" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:02:15.429836" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:15.392353" elapsed="0.037519"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:02:15.512525" 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-10-11T01:02:15.430584" elapsed="0.082091"/>
</kw>
<msg time="2026-10-11T01:02:15.512803" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:02:15.512845" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:15.430062" elapsed="0.082818"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:15.513173" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:15.512952" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:15.512933" elapsed="0.000407"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:15.514135" 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-10-11T01:02:15.513730" elapsed="0.000521"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:15.514771" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:15.514323" elapsed="0.000594"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:15.514304" elapsed="0.000638"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:02:15.514984" 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">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:15.517047" 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-10-11T01:02:15.518128" elapsed="0.000312"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:02:15.518771" elapsed="0.000223"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:02:15.516225" elapsed="0.002871"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:02:15.515322" elapsed="0.003901"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:02:15.390898" elapsed="0.128404"/>
</kw>
<msg time="2026-10-11T01:02:15.519390" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:02:15.519459" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:15.390284" elapsed="0.129212"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:02:15.519656" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:02:15.519568" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:15.519550" elapsed="0.000184"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:15.520076" 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-10-11T01:02:15.520548" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:02:15.520616" 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-10-11T01:02:15.389722" elapsed="0.130980"/>
</kw>
<msg time="2026-10-11T01:02:15.520786" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:02:15.520826" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:15.387860" elapsed="0.133001"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:15.521162" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:15.520928" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:15.520912" elapsed="0.000322"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:02:15.387718" elapsed="0.133539"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:02:15.387577" elapsed="0.133708"/>
</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-10-11T01:02:15.385579" elapsed="0.135755"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-10-11T01:02:15.383577" elapsed="0.137806"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:15.383155" elapsed="0.138283"/>
</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-10-11T01:02:14.744539" elapsed="0.776947"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:02:15.521954" 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-10-11T01:02:15.521658" elapsed="0.000320"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:15.522490" level="INFO">${tools_system_conn_id} = 7</msg>
<arg>${tools_system_conn_id}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:02:15.522186" elapsed="0.000343"/>
</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-10-11T01:02:15.524144" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T01:02:15.524214" 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-10-11T01:02:15.523869" elapsed="0.000367"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:15.524385" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T01:02:15.525575" level="INFO">Logging into '10.30.171.7:22' as 'jenkins'.</msg>
<msg time="2026-10-11T01:02:15.885144" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Sun Oct 11 01:01:30 UTC 2026

  System load:  0.02               Processes:             105
  Usage of /:   19.9% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.7
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 01:01:30 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T01:02:15.525331" elapsed="0.360037"/>
</kw>
<msg time="2026-10-11T01:02:15.885513" 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-10-11T01:02:15.524950" elapsed="0.360682"/>
</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-10-11T01:02:15.523497" elapsed="0.362275"/>
</kw>
<msg time="2026-10-11T01:02:15.885827" 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-10-11T01:02:15.523018" elapsed="0.362855"/>
</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-10-11T01:02:15.522709" elapsed="0.363245"/>
</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-10-11T01:02:15.890140" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:15.889821" elapsed="0.000345"/>
</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-10-11T01:02:15.891628" level="INFO">Executing command 'cd '.' &amp;&amp; virtualenv /tmp/defaultvenv'.</msg>
<msg time="2026-10-11T01:02:16.156678" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:02:16.156981" level="INFO">${stdout} = created virtual environment CPython3.10.12.final.0-64 in 122ms
  creator CPython3Posix(dest=/tmp/defaultvenv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=b...</msg>
<msg time="2026-10-11T01:02:16.157097" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T01:02:16.157182" 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-10-11T01:02:15.891457" elapsed="0.265773"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T01:02:16.159199" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T01:02:16.158537" elapsed="0.000760"/>
</kw>
<msg time="2026-10-11T01:02:16.159525" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T01:02:16.159618" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:16.157716" elapsed="0.001951"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:16.160980" 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-10-11T01:02:16.160129" elapsed="0.000927"/>
</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-10-11T01:02:16.163367" level="INFO">created virtual environment CPython3.10.12.final.0-64 in 122ms
  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-10-11T01:02:16.162751" elapsed="0.000753"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:16.164467" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:16.163933" elapsed="0.000625"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:16.165513" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:16.164977" elapsed="0.000626"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T01:02:16.161887" elapsed="0.003829"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:16.161250" elapsed="0.004551"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:16.161194" elapsed="0.004668"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T01:02:16.166183" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:16.165979" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:16.165944" elapsed="0.000382"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T01:02:16.166615" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-10-11T01:02:16.166459" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:16.166398" elapsed="0.000392"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:16.167150" elapsed="0.000044"/>
</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-10-11T01:02:15.890939" elapsed="0.276427"/>
</kw>
<msg time="2026-10-11T01:02:16.167511" 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-10-11T01:02:15.890420" elapsed="0.277195"/>
</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-10-11T01:02:15.889289" elapsed="0.278552"/>
</kw>
<msg time="2026-10-11T01:02:16.167951" 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-10-11T01:02:15.887605" elapsed="0.280518"/>
</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-10-11T01:02:15.887231" elapsed="0.281115"/>
</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-10-11T01:02:16.177689" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:16.177007" elapsed="0.000822"/>
</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-10-11T01:02:16.181649" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install --upgrade pip; deactivate'.</msg>
<msg time="2026-10-11T01:02:18.117670" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:02:18.118298" level="INFO">${stdout} = Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Using cached pip-26.2.1-py3-none-any.whl (1.8 MB)
Installing collected packages: pip
  Att...</msg>
<msg time="2026-10-11T01:02:18.118497" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T01:02:18.118646" 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-10-11T01:02:16.180918" elapsed="1.937812"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T01:02:18.124565" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T01:02:18.123504" elapsed="0.001322"/>
</kw>
<msg time="2026-10-11T01:02:18.125168" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T01:02:18.125322" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:18.119696" elapsed="0.005705"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:18.128745" 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-10-11T01:02:18.126051" elapsed="0.002781"/>
</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-10-11T01:02:18.133802" level="INFO">Requirement already satisfied: pip in /tmp/defaultvenv/lib/python3.10/site-packages (22.0.2)
Collecting pip
  Using cached pip-26.2.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.2.1</msg>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:18.132930" elapsed="0.001084"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:18.135809" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:18.134967" elapsed="0.001040"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:18.137903" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:18.137111" elapsed="0.001020"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T01:02:18.130680" elapsed="0.007648"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:18.129239" elapsed="0.009349"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:18.129181" elapsed="0.009468"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T01:02:18.138987" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:18.138766" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:18.138730" elapsed="0.000585"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T01:02:18.139685" elapsed="0.000074"/>
</return>
<status status="PASS" start="2026-10-11T01:02:18.139482" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:18.139391" elapsed="0.000663"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:18.140394" elapsed="0.000201"/>
</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-10-11T01:02:16.179649" elapsed="1.961261"/>
</kw>
<msg time="2026-10-11T01:02:18.141028" 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-10-11T01:02:16.178214" elapsed="1.962956"/>
</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-10-11T01:02:16.175873" elapsed="1.965469"/>
</kw>
<msg time="2026-10-11T01:02:18.141481" 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-10-11T01:02:16.172244" elapsed="1.969342"/>
</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-10-11T01:02:16.171222" elapsed="1.970551"/>
</kw>
<msg time="2026-10-11T01:02:18.141884" 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-10-11T01:02:16.170390" elapsed="1.971740"/>
</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-10-11T01:02:16.169663" elapsed="1.972632"/>
</kw>
<msg time="2026-10-11T01:02:18.142380" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:16.168718" elapsed="1.973780"/>
</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-10-11T01:02:15.886345" elapsed="2.256301"/>
</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-10-11T01:02:18.153838" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:18.153160" elapsed="0.000741"/>
</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-10-11T01:02:18.157809" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install setuptools==44.0.0; deactivate'.</msg>
<msg time="2026-10-11T01:02:18.894526" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:02:18.895231" 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-10-11T01:02:18.895333" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T01:02:18.895459" 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-10-11T01:02:18.156977" elapsed="0.738538"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T01:02:18.900928" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T01:02:18.899635" elapsed="0.001556"/>
</kw>
<msg time="2026-10-11T01:02:18.901549" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T01:02:18.901643" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:18.896338" elapsed="0.005355"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:18.904279" 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-10-11T01:02:18.902227" elapsed="0.002110"/>
</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-10-11T01:02:18.909009" 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-10-11T01:02:18.908265" elapsed="0.000919"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:18.910823" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:18.910137" elapsed="0.000816"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:18.912528" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:18.911800" elapsed="0.000870"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T01:02:18.906209" elapsed="0.006611"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:18.904705" elapsed="0.008315"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:18.904644" elapsed="0.008459"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T01:02:18.913488" elapsed="0.000043"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:18.913222" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:18.913186" elapsed="0.000568"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T01:02:18.914021" elapsed="0.000100"/>
</return>
<status status="PASS" start="2026-10-11T01:02:18.913862" elapsed="0.000435"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:18.913829" elapsed="0.000524"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:18.914819" elapsed="0.000046"/>
</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-10-11T01:02:18.155743" elapsed="0.759364"/>
</kw>
<msg time="2026-10-11T01:02:18.915223" 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-10-11T01:02:18.154296" elapsed="0.761042"/>
</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-10-11T01:02:18.151956" elapsed="0.763750"/>
</kw>
<msg time="2026-10-11T01:02:18.915823" 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-10-11T01:02:18.147867" elapsed="0.768055"/>
</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-10-11T01:02:18.146377" elapsed="0.769749"/>
</kw>
<msg time="2026-10-11T01:02:18.916230" 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-10-11T01:02:18.145491" elapsed="0.770830"/>
</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-10-11T01:02:18.144697" elapsed="0.771860"/>
</kw>
<msg time="2026-10-11T01:02:18.916653" 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-10-11T01:02:18.143729" elapsed="0.773014"/>
</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-10-11T01:02:18.143096" elapsed="0.773808"/>
</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-10-11T01:02:18.927072" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:18.926372" elapsed="0.000763"/>
</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-10-11T01:02:18.930774" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==3.4.16; deactivate'.</msg>
<msg time="2026-10-11T01:02:20.263601" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:02:20.264204" 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-10-11T01:02:20.264319" 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-10-11T01:02:20.264471" 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-10-11T01:02:18.930021" elapsed="1.334507"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T01:02:20.269856" level="INFO">Length is 1862.</msg>
<msg time="2026-10-11T01:02:20.270928" 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-wnjyvhew/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-wnjyvhew/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-wnjyvhew/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-wnjyvhew/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())  # noqa: S102 # exec is intentional here
        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-10-11T01:02:20.268588" elapsed="0.002884">'  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-wnjyvhew/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-wnjyvhew/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-wnjyvhew/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-wnjyvhew/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())  # noqa: S102 # exec is intentional here
        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-10-11T01:02:20.271950" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-10-11T01:02:20.272077" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:20.265297" elapsed="0.006839"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:20.274924" 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-10-11T01:02:20.272683" elapsed="0.002299"/>
</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-10-11T01:02:20.280491" 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-10-11T01:02:20.279760" elapsed="0.000882"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:20.282234" 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-wnjyvhew/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-wnjyvhew/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 301, in _get_build_requires
          self.run_setup()
        File "/tmp/pip-build-env-wnjyvhew/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-wnjyvhew/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 317, in run_setup
          exec(code, locals())  # noqa: S102 # exec is intentional here
        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-10-11T01:02:20.281527" elapsed="0.001027"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:20.284175" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:20.283384" elapsed="0.000929"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T01:02:20.277394" elapsed="0.007098"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:20.275339" elapsed="0.009358"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:20.275285" elapsed="0.009474"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T01:02:20.285089" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:20.284878" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:20.284841" elapsed="0.000507"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T01:02:20.285681" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-10-11T01:02:20.285519" elapsed="0.000425"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:20.285483" elapsed="0.000523"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:20.286367" elapsed="0.000191"/>
</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-10-11T01:02:18.928879" elapsed="1.357909"/>
</kw>
<msg time="2026-10-11T01:02:20.286923" 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-10-11T01:02:18.927520" elapsed="1.359535"/>
</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-10-11T01:02:18.925222" elapsed="1.362026"/>
</kw>
<msg time="2026-10-11T01:02:20.287357" 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-10-11T01:02:18.921529" elapsed="1.365954"/>
</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-10-11T01:02:18.920472" elapsed="1.367193"/>
</kw>
<msg time="2026-10-11T01:02:20.287838" 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-10-11T01:02:18.919615" elapsed="1.368318"/>
</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-10-11T01:02:18.918828" elapsed="1.369310"/>
</kw>
<msg time="2026-10-11T01:02:20.288228" 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-10-11T01:02:18.917998" elapsed="1.370317"/>
</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-10-11T01:02:18.917336" elapsed="1.371172"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:02:20.289397" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x74344548bfd0&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-10-11T01:02:20.288898" elapsed="0.000874"/>
</kw>
<kw name="Upload_Config_Files">
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T01:02:20.311080" level="INFO">[chan 5] Opened sftp connection (server version 3)</msg>
<msg time="2026-10-11T01:02:20.320014" 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-10-11T01:02:20.290926" elapsed="0.029234"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T01:02:20.328460" 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-10-11T01:02:20.320607" elapsed="0.007976"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-10-11T01:02:20.339170" 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-10-11T01:02:20.339393" 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-10-11T01:02:20.328916" elapsed="0.010571"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:20.340647" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-10-11T01:02:20.353296" 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-10-11T01:02:20.340337" elapsed="0.013106"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:20.354675" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-10-11T01:02:20.401856" 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-10-11T01:02:20.353871" elapsed="0.048125"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:20.402749" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-10-11T01:02:20.450013" 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-10-11T01:02:20.402491" elapsed="0.047665"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:20.450906" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-10-11T01:02:20.497995" 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-10-11T01:02:20.450627" elapsed="0.047528"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:20.498893" level="INFO">Executing command 'cat bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-10-11T01:02:20.548276" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:02:20.548451" level="INFO">${stdout} = neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0.1/3...</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-10-11T01:02:20.498641" elapsed="0.049850"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:20.549316" level="INFO">neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
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-10-11T01:02:20.548871" elapsed="0.000516"/>
</kw>
<var name="${cfgfile}">bgp-flowspec-redirect.cfg</var>
<status status="PASS" start="2026-10-11T01:02:20.339919" elapsed="0.209539"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:20.550081" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-10-11T01:02:20.598279" 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-10-11T01:02:20.549879" elapsed="0.048586"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:20.599461" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-10-11T01:02:20.646015" 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-10-11T01:02:20.598964" elapsed="0.047199"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:20.646934" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-10-11T01:02:20.694028" 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-10-11T01:02:20.646667" elapsed="0.047496"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:20.694911" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-10-11T01:02:20.742492" 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-10-11T01:02:20.694632" elapsed="0.047979"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:20.743313" level="INFO">Executing command 'cat bgp-flowspec.cfg'.</msg>
<msg time="2026-10-11T01:02:20.790117" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:02:20.790313" level="INFO">${stdout} = neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0.1/3...</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-10-11T01:02:20.743067" elapsed="0.047300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:20.791513" level="INFO">neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
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-10-11T01:02:20.790919" elapsed="0.000705"/>
</kw>
<var name="${cfgfile}">bgp-flowspec.cfg</var>
<status status="PASS" start="2026-10-11T01:02:20.549616" elapsed="0.242080"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:20.792643" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-10-11T01:02:20.838071" 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-10-11T01:02:20.792339" elapsed="0.045854"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:20.838939" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-10-11T01:02:20.886155" 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-10-11T01:02:20.838659" elapsed="0.047628"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:20.887075" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-10-11T01:02:20.934162" 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-10-11T01:02:20.886793" elapsed="0.047488"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:20.935097" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-10-11T01:02:20.982069" 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-10-11T01:02:20.934788" elapsed="0.047398"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:20.982914" level="INFO">Executing command 'cat bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-10-11T01:02:21.029751" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:02:21.029943" level="INFO">${stdout} = neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
local-as 64496;
peer-as 64496;
  family {
    ipv4 mpls-vpn;
  }
  static {
    route 1.1.1.0/24 {
      next-hop 10.0.255.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-10-11T01:02:20.982655" elapsed="0.047341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:21.031081" level="INFO">neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
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-10-11T01:02:21.030541" elapsed="0.000638"/>
</kw>
<var name="${cfgfile}">bgp-l3vpn-ipv4.cfg</var>
<status status="PASS" start="2026-10-11T01:02:20.791932" elapsed="0.239315"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:21.032206" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' exa-md5.cfg'.</msg>
<msg time="2026-10-11T01:02:21.078021" 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-10-11T01:02:21.031882" elapsed="0.046276"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:21.078900" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' exa-md5.cfg'.</msg>
<msg time="2026-10-11T01:02:21.126387" 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-10-11T01:02:21.078625" elapsed="0.048026"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:21.127665" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exa-md5.cfg'.</msg>
<msg time="2026-10-11T01:02:21.173922" 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-10-11T01:02:21.127285" elapsed="0.046775"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:21.174805" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exa-md5.cfg'.</msg>
<msg time="2026-10-11T01:02:21.221930" 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-10-11T01:02:21.174528" elapsed="0.047549"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:21.222715" level="INFO">Executing command 'cat exa-md5.cfg'.</msg>
<msg time="2026-10-11T01:02:21.269784" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:02:21.269969" level="INFO">${stdout} = neighbor 10.30.170.173 {
  router-id 10.30.171.7;
  local-address 10.30.171.7;
  local-as 64496;
  peer-as 64496;
  md5-password topsecret;

  capability {
    route-refresh disable;
    add-path disa...</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-10-11T01:02:21.222489" elapsed="0.047527"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:21.271089" level="INFO">neighbor 10.30.170.173 {
  router-id 10.30.171.7;
  local-address 10.30.171.7;
  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-10-11T01:02:21.270530" elapsed="0.000663"/>
</kw>
<var name="${cfgfile}">exa-md5.cfg</var>
<status status="PASS" start="2026-10-11T01:02:21.031499" elapsed="0.239751"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:21.271865" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' exa.cfg'.</msg>
<msg time="2026-10-11T01:02:21.317761" 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-10-11T01:02:21.271690" elapsed="0.046162"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:21.318438" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' exa.cfg'.</msg>
<msg time="2026-10-11T01:02:21.366177" 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-10-11T01:02:21.318222" elapsed="0.048088"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:21.367090" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exa.cfg'.</msg>
<msg time="2026-10-11T01:02:21.413940" 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-10-11T01:02:21.366800" elapsed="0.047308"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:21.414888" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exa.cfg'.</msg>
<msg time="2026-10-11T01:02:21.462206" 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-10-11T01:02:21.414590" elapsed="0.047752"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:21.463172" level="INFO">Executing command 'cat exa.cfg'.</msg>
<msg time="2026-10-11T01:02:21.509843" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:02:21.510121" level="INFO">${stdout} = neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
local-as 64496;
peer-as 64496;
  capability {
    route-refresh disable;
    add-path disable;
  }

  family {
    ipv4 unica...</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-10-11T01:02:21.462834" elapsed="0.047345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:21.511353" level="INFO">neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
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.171.7;
    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-10-11T01:02:21.510717" elapsed="0.000768"/>
</kw>
<var name="${cfgfile}">exa.cfg</var>
<status status="PASS" start="2026-10-11T01:02:21.271442" elapsed="0.240116"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:21.512558" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' gobgp.cfg'.</msg>
<msg time="2026-10-11T01:02:21.557786" 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-10-11T01:02:21.512245" elapsed="0.045664"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:21.558695" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' gobgp.cfg'.</msg>
<msg time="2026-10-11T01:02:21.606385" 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-10-11T01:02:21.558369" elapsed="0.048197"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:21.607315" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' gobgp.cfg'.</msg>
<msg time="2026-10-11T01:02:21.657739" 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-10-11T01:02:21.607056" elapsed="0.050813"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:21.658659" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' gobgp.cfg'.</msg>
<msg time="2026-10-11T01:02:21.706370" 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-10-11T01:02:21.658334" elapsed="0.048193"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:21.707302" level="INFO">Executing command 'cat gobgp.cfg'.</msg>
<msg time="2026-10-11T01:02:21.758073" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:02:21.758275" level="INFO">${stdout} = [global.config]
    as = 64496
    router-id = "10.30.171.7"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.173"
        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-10-11T01:02:21.706987" elapsed="0.051343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:21.759502" level="INFO">[global.config]
    as = 64496
    router-id = "10.30.171.7"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.173"
        local-as = 64496
    [neighbors.transport.config]
        local-address = "10.30.171.7"
        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-10-11T01:02:21.758888" elapsed="0.000816"/>
</kw>
<var name="${cfgfile}">gobgp.cfg</var>
<status status="PASS" start="2026-10-11T01:02:21.511793" elapsed="0.247985"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-10-11T01:02:20.339605" elapsed="1.420239"/>
</for>
<doc>Uploads exabgp config files</doc>
<status status="PASS" start="2026-10-11T01:02:20.290225" elapsed="1.469765"/>
</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-10-11T01:02:21.793112" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:21.792377" elapsed="0.000796"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:21.795127" 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-10-11T01:02:21.794445" elapsed="0.000866">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-10-11T01:02:21.795545" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:21.793622" elapsed="0.001975"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:21.796773" 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-10-11T01:02:21.796007" elapsed="0.000822"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:02:21.797496" 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-10-11T01:02:21.797871" 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-10-11T01:02:21.797220" elapsed="0.000711"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:21.798992" 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-10-11T01:02:21.798396" elapsed="0.000731"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:21.801295" level="INFO">mapping: {'ODLIP': '10.30.170.173', 'EXAIP': '10.30.171.7', 'NPATHS': '2'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:21.800685" elapsed="0.000704"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:21.802312" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:02:21.801835" elapsed="0.000511"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:21.803509" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:21.802843" elapsed="0.000700"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:21.805108" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:21.804499" elapsed="0.000763"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:21.805775" elapsed="0.000055"/>
</return>
<msg time="2026-10-11T01:02:21.805984" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:21.803793" elapsed="0.002223"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:21.806318" elapsed="0.000430"/>
</kw>
<var name="${key}">ODLIP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:02:21.802645" elapsed="0.004157"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:21.807817" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:21.807216" elapsed="0.000638"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:21.809100" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:21.808552" elapsed="0.000697"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:21.809712" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T01:02:21.809911" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:21.808112" elapsed="0.001839"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:21.810261" elapsed="0.000385"/>
</kw>
<var name="${key}">EXAIP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T01:02:21.806976" elapsed="0.003769"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:21.811755" 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-10-11T01:02:21.811165" elapsed="0.000628"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:21.813154" 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-10-11T01:02:21.812595" elapsed="0.000707"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:21.813706" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T01:02:21.813903" 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-10-11T01:02:21.812097" elapsed="0.001847"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:21.814254" elapsed="0.000379"/>
</kw>
<var name="${key}">NPATHS</var>
<var name="${value}">2</var>
<status status="PASS" start="2026-10-11T01:02:21.810908" elapsed="0.003779"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:02:21.802429" elapsed="0.012301"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:02:21.814786" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T01:02:21.814981" level="INFO">${mapping_to_use} = {'ODLIP': '10.30.170.173', 'EXAIP': '10.30.171.7', 'NPATHS': '2'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:02:21.799947" elapsed="0.015071"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:21.799306" elapsed="0.015776"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:21.815329" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:21.815119" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:21.799252" elapsed="0.016211"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:21.816316" 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-10-11T01:02:21.815691" elapsed="0.000664"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:02:21.816449" 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/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-10-11T01:02:21.791315" elapsed="0.025282"/>
</kw>
<msg time="2026-10-11T01:02:21.816666" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:21.781051" elapsed="0.035678"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:21.823071" 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/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-10-11T01:02:21.829267" 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/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-10-11T01:02:21.835355" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:21.835583" 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-10-11T01:02:21.835772" 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-10-11T01:02:21.836205" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:21.836024" elapsed="0.000238"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:02:21.836004" 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-10-11T01:02:21.836476" 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-10-11T01:02:21.836667" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:21.836837" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:02:21.835974" elapsed="0.000913"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:02:21.835878" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:21.837086" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:02:21.837161" elapsed="0.000018"/>
</return>
<msg time="2026-10-11T01:02:21.837285" 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-10-11T01:02:21.779746" elapsed="0.057570"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:21.838550" 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-10-11T01:02:21.838293" elapsed="0.000331">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-10-11T01:02:21.838712" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:21.837897" 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-10-11T01:02:21.839041" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:21.838798" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:21.839590" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:21.839299" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:21.839117" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:21.838781" elapsed="0.000887"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:21.840208" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:02:21.839829" elapsed="0.000404"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:02:21.840278" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:21.840417" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:02:21.837629" elapsed="0.002813"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:21.841588" 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-10-11T01:02:21.841364" elapsed="0.000285">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-10-11T01:02:21.841736" 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-10-11T01:02:21.840934" elapsed="0.000825"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:02:21.841922" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:02:21.841822" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:21.841804" elapsed="0.000195"/>
</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-10-11T01:02:21.842182" 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-10-11T01:02:21.842395" elapsed="0.000036"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:02:21.842473" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:02:21.842599" 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-10-11T01:02:21.840692" elapsed="0.001931"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:21.843832" 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-10-11T01:02:21.843603" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:21.844316" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:21.844080" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:02:21.880709" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:21.881054" level="INFO">GET Response : url=http://10.30.170.173: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=node016uxh7fq2iclat2ero2768d021.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Sat, 10-Oct-2026 01:02:21 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-10-11T01:02:21.881599" 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-10-11T01:02:21.844664" elapsed="0.036972"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:21.844431" elapsed="0.037266"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:21.882011" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:21.881742" elapsed="0.000391"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:21.844399" elapsed="0.037761"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:21.884390" 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-10-11T01:02:21.883799" elapsed="0.000894"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:21.883447" elapsed="0.001293"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:21.883148" elapsed="0.001625"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:21.885682" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:21.885271" elapsed="0.000470"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:21.884845" elapsed="0.000940"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:21.884823" elapsed="0.000994"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:21.886708" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:21.886142" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:21.887141" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:21.886832" elapsed="0.000382"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:21.887856" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:21.887488" elapsed="0.000403"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:21.887244" elapsed="0.000693"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:21.886809" elapsed="0.001155"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:21.888722" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:21.888228" elapsed="0.000529"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:21.889180" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:21.888845" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:21.889904" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:21.889531" elapsed="0.000416"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:21.889288" elapsed="0.000715"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:21.888822" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:21.890289" elapsed="0.000480"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:02:21.891430" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:21.891020" elapsed="0.000450"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:02:21.891705" elapsed="0.000361"/>
</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-10-11T01:02:21.882736" elapsed="0.009423"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:02:21.892385" elapsed="0.000063"/>
</return>
<status status="PASS" start="2026-10-11T01:02:21.892256" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:21.892229" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:21.892761" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:02:21.892865" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:02:21.893402" 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-10-11T01:02:21.842905" elapsed="0.050563"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:02:21.893559" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T01:02:21.893754" 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-10-11T01:02:21.762335" elapsed="0.131461"/>
</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-10-11T01:02:21.894290" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:21.893926" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:21.893890" elapsed="0.000609"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:02:21.894543" elapsed="0.000034"/>
</return>
<msg time="2026-10-11T01:02:21.894719" 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-10-11T01:02:21.761105" elapsed="0.133652"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:21.895490" 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 the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:02:21.895052" elapsed="0.000498"/>
</kw>
<doc>Stores rib configuration</doc>
<status status="PASS" start="2026-10-11T01:02:21.760339" elapsed="0.135282"/>
</kw>
<doc>Suite setup keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:14.744248" elapsed="7.151437"/>
</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-10-11T01:02:21.897764" elapsed="0.000352"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:02:21.897390" 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-10-11T01:02:21.899710" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:21.899589" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:21.899563" 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-10-11T01:02:21.903160" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:21.902969" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:21.902945" elapsed="0.000304"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:21.904588" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:02:21.904107" elapsed="0.000517"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:02:21.905305" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:02:21.904839" elapsed="0.000500"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:02:21.905395" elapsed="0.000059"/>
</return>
<msg time="2026-10-11T01:02:21.905596" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:02:21.903569" elapsed="0.002059"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:02:21.909403" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:21.909286" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:21.909260" 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-10-11T01:02:21.911077" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:21.910940" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:21.910915" elapsed="0.000250"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:02:21.911636" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:02:21.911374" elapsed="0.000296"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:02:21.912137" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:02:21.911900" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:02:21.945004" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:02:21.912895" elapsed="0.032246"/>
</kw>
<msg time="2026-10-11T01:02:21.945313" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:02:21.945355" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:21.912389" elapsed="0.033002"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:02:21.987956" 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-10-11T01:02:21.945985" elapsed="0.042392"/>
</kw>
<msg time="2026-10-11T01:02:21.988646" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:02:21.988690" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:21.945603" elapsed="0.043124"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:21.989206" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:21.988852" elapsed="0.000411"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:21.988810" elapsed="0.000479"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:21.989833" 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-10-11T01:02:21.989492" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:21.990189" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:21.989969" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:21.989951" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:02:21.990297" 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-10-11T01:02:21.993198" elapsed="0.000350"/>
</kw>
<msg time="2026-10-11T01:02:21.993608" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:21.991870" elapsed="0.001876"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:21.994072" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:21.994552" 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-10-11T01:02:21.991235" elapsed="0.003508"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:02:21.990690" elapsed="0.004114"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:02:21.910575" elapsed="0.084302"/>
</kw>
<msg time="2026-10-11T01:02:21.994959" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:02:21.994999" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:21.909726" elapsed="0.085321"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:02:21.995204" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:02:21.995118" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:21.995101" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:21.995689" 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-10-11T01:02:21.996003" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:02:21.996081" 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-10-11T01:02:21.908787" elapsed="0.087380"/>
</kw>
<msg time="2026-10-11T01:02:21.996253" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:02:21.996294" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:21.906179" elapsed="0.090152"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:21.996695" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:21.996397" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:21.996381" elapsed="0.000385"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:02:21.905916" elapsed="0.090872"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:02:21.905696" elapsed="0.091125"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:02:21.902548" elapsed="0.094325"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:02:21.899211" elapsed="0.097751"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:21.898559" elapsed="0.098447"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:02:21.896809" elapsed="0.100261"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:21.997911" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.171.7 | HOLDTIME=180 | PEER_PORT=17900 | INITIATE=false | RIB_INSTANCE_NAME=example-bgp-rib | 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>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-10-11T01:02:21.997261" elapsed="0.000678"/>
</kw>
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="PASS" start="2026-10-11T01:02:21.895769" elapsed="0.102303"/>
</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-10-11T01:02:22.000201" elapsed="0.000218"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:02:21.999849" 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-10-11T01:02:22.001373" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:22.001283" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.001263" 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-10-11T01:02:22.003666" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:22.003583" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.003566" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.004659" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:02:22.004311" elapsed="0.000373"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.005109" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:02:22.004837" elapsed="0.000295"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:02:22.005172" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:02:22.005298" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:02:22.003936" elapsed="0.001384"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.008086" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:22.007990" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.007972" elapsed="0.000177"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.009219" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:22.009135" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.009118" elapsed="0.000236"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:02:22.009983" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.009527" elapsed="0.000491"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:02:22.010661" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:02:22.010327" elapsed="0.000359"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:02:22.037681" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:02:22.012149" elapsed="0.025685"/>
</kw>
<msg time="2026-10-11T01:02:22.037968" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:02:22.038009" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:22.010877" elapsed="0.027179"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:02:22.099749" 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-10-11T01:02:22.039570" elapsed="0.060388"/>
</kw>
<msg time="2026-10-11T01:02:22.100104" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:02:22.100146" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:22.038275" elapsed="0.061907"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.100562" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.100302" elapsed="0.000414"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.100282" elapsed="0.000459"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.101477" 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-10-11T01:02:22.100932" elapsed="0.000654"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.101894" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.101663" elapsed="0.000398"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.101645" elapsed="0.000442"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:02:22.102119" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:02:22.104782" elapsed="0.000122"/>
</kw>
<msg time="2026-10-11T01:02:22.104943" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:22.104138" elapsed="0.000864"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.105246" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.105523" 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-10-11T01:02:22.103273" elapsed="0.002482"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:02:22.102398" elapsed="0.003460"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:02:22.008868" elapsed="0.097066"/>
</kw>
<msg time="2026-10-11T01:02:22.106016" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:02:22.106067" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:22.008300" elapsed="0.097803"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:02:22.106256" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:02:22.106171" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.106154" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.106759" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.107200" elapsed="0.000054"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.107297" elapsed="0.000037"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T01:02:22.007701" elapsed="0.099744"/>
</kw>
<msg time="2026-10-11T01:02:22.107583" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:02:22.107634" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:22.005680" elapsed="0.102006"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.108082" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.107789" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.107749" elapsed="0.000429"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:02:22.005534" elapsed="0.102689"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:02:22.005369" elapsed="0.102893"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:02:22.003276" elapsed="0.105044"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:02:22.001010" elapsed="0.107480"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:22.000619" elapsed="0.107950"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:02:21.999348" elapsed="0.109294"/>
</kw>
<kw name="Configure_Odl_Peer_With_Path_Selection_Mode">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.109691" 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-10-11T01:02:22.109281" elapsed="0.000436"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.110513" level="INFO">&amp;{mapping} = { IP=10.30.171.7 | 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-10-11T01:02:22.109924" elapsed="0.000617"/>
</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-10-11T01:02:22.121864" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.121560" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:22.122633" 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-10-11T01:02:22.122384" elapsed="0.000331">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-10-11T01:02:22.122801" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:22.122062" elapsed="0.000762"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.123319" 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-10-11T01:02:22.122997" elapsed="0.000347"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:02:22.123642" 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-10-11T01:02:22.123798" 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-10-11T01:02:22.123528" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.124254" 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-10-11T01:02:22.124017" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.125230" level="INFO">mapping: {'IP': '10.30.171.7', '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-10-11T01:02:22.124985" elapsed="0.000287"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.125708" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.125460" elapsed="0.000272"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.126558" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:22.126072" elapsed="0.000511"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:22.127620" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.127145" elapsed="0.000514"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:22.127776" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:02:22.127962" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:22.126752" 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-10-11T01:02:22.128162" elapsed="0.000334"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T01:02:22.125926" elapsed="0.002609"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.129240" 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-10-11T01:02:22.128760" elapsed="0.000534"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:22.130484" 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-10-11T01:02:22.130007" elapsed="0.000517"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:22.130643" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:02:22.130830" 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-10-11T01:02:22.129494" 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-10-11T01:02:22.131016" elapsed="0.000318"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T01:02:22.128633" elapsed="0.002739"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.132140" 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-10-11T01:02:22.131673" elapsed="0.000491"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:22.133227" 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-10-11T01:02:22.132771" elapsed="0.000494"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:22.133382" elapsed="0.000066"/>
</return>
<msg time="2026-10-11T01:02:22.133607" 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-10-11T01:02:22.132332" elapsed="0.001298"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.133794" elapsed="0.000309"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T01:02:22.131543" elapsed="0.002597"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.134848" 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-10-11T01:02:22.134369" elapsed="0.000504"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:22.135902" 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-10-11T01:02:22.135462" elapsed="0.000478"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:22.136067" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:02:22.136253" 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-10-11T01:02:22.135056" elapsed="0.001220"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.136460" elapsed="0.000296"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T01:02:22.134240" elapsed="0.002554"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.137554" 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-10-11T01:02:22.137020" elapsed="0.000559"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:22.138647" 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-10-11T01:02:22.138136" elapsed="0.000549"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:22.138802" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:02:22.138986" 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-10-11T01:02:22.137745" 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-10-11T01:02:22.139185" elapsed="0.000330"/>
</kw>
<var name="${key}">MULTIPATH</var>
<var name="${value}">0</var>
<status status="PASS" start="2026-10-11T01:02:22.136893" elapsed="0.002660"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.140250" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:22.139779" elapsed="0.000495"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:22.141296" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.140846" elapsed="0.000488"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:22.141487" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:02:22.141670" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:22.140467" elapsed="0.001226"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.141854" elapsed="0.000309"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:02:22.139652" elapsed="0.002549"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:02:22.125775" elapsed="0.016459"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:02:22.142271" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:22.142458" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', '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-10-11T01:02:22.124628" elapsed="0.017856"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.124357" elapsed="0.018157"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.142685" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.142537" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.124338" elapsed="0.018416"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.143357" 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-10-11T01:02:22.142911" elapsed="0.000472"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:02:22.143492" 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/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-10-11T01:02:22.121027" elapsed="0.022567"/>
</kw>
<msg time="2026-10-11T01:02:22.143645" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:22.116538" elapsed="0.027151"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:22.148167" 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/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-10-11T01:02:22.152394" 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/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-10-11T01:02:22.156678" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.156858" 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-10-11T01:02:22.157053" 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-10-11T01:02:22.157394" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.157249" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:02:22.157236" 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-10-11T01:02:22.157649" 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-10-11T01:02:22.157829" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.157992" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:02:22.157211" elapsed="0.000842"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.157123" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.158226" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.158359" elapsed="0.000017"/>
</return>
<msg time="2026-10-11T01:02:22.158486" 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-10-11T01:02:22.115840" elapsed="0.042672"/>
</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-10-11T01:02:22.167704" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.167386" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:22.168387" 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-10-11T01:02:22.168216" elapsed="0.000291">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-10-11T01:02:22.168604" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:22.167887" elapsed="0.000740"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.169117" 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-10-11T01:02:22.168798" elapsed="0.000344"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:02:22.169433" 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-10-11T01:02:22.169558" 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-10-11T01:02:22.169307" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.169994" 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-10-11T01:02:22.169778" 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-10-11T01:02:22.170371" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.170128" elapsed="0.000481"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.171080" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', '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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.170787" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.170637" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.170110" elapsed="0.001047"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.171993" 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-10-11T01:02:22.171316" elapsed="0.000705"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:02:22.172078" 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/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-10-11T01:02:22.166858" elapsed="0.005321"/>
</kw>
<msg time="2026-10-11T01:02:22.172264" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:22.162357" elapsed="0.009953"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:22.176682" 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/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-10-11T01:02:22.181162" 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/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-10-11T01:02:22.185424" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.185606" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.185850" 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-10-11T01:02:22.186345" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.186155" elapsed="0.000282"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:02:22.186141" elapsed="0.000329"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.186690" elapsed="0.000032"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.186954" 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-10-11T01:02:22.187213" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:02:22.186115" elapsed="0.001149"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.185968" elapsed="0.001340"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.187563" elapsed="0.000030"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.187660" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:02:22.187839" 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-10-11T01:02:22.161645" elapsed="0.026222"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:22.189062" 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-10-11T01:02:22.188857" elapsed="0.000266">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-10-11T01:02:22.189207" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:22.188532" elapsed="0.000698"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.189529" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.189293" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.190040" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.189769" elapsed="0.000297"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.189603" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.189276" elapsed="0.000841"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.190629" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:02:22.190277" elapsed="0.000376"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:02:22.190697" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:02:22.190823" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:02:22.188204" elapsed="0.002641"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.192079" 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-10-11T01:02:22.191848" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.192573" 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-10-11T01:02:22.192332" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.193047" 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-10-11T01:02:22.192817" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.193501" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:22.193274" elapsed="0.000268"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:02:22.194252" 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-10-11T01:02:22.194087" elapsed="0.000189"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:02:22.194588" 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-10-11T01:02:22.194443" elapsed="0.000169"/>
</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-10-11T01:02:22.194770" elapsed="0.000157"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.195352" 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-10-11T01:02:22.195129" elapsed="0.000263"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:02:22.195445" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:02:22.195574" 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-10-11T01:02:22.193724" elapsed="0.001874"/>
</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-10-11T01:02:22.205108" level="INFO">PUT Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.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-10-11T01:02:22.205203" level="INFO">PUT Response : url=http://10.30.170.173: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-10-11T01:02:22.205302" 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-10-11T01:02:22.195888" elapsed="0.009438"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.195660" elapsed="0.009708"/>
</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-10-11T01:02:22.205566" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.205392" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.195644" elapsed="0.010004"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.206808" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:22.206535" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.206283" elapsed="0.000596"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.206266" elapsed="0.000636"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.207484" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:22.207201" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.206951" elapsed="0.000606"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.206936" elapsed="0.000643"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.208122" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:22.207755" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.208437" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.208211" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.208934" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.208673" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.208512" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.208194" elapsed="0.000816"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.209547" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:22.209194" elapsed="0.000377"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.209840" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.209634" elapsed="0.000257"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.210343" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.210082" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.209913" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.209618" elapsed="0.000815"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:22.210576" elapsed="0.000291"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:02:22.211264" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:22.211026" elapsed="0.000262"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.211456" elapsed="0.000217"/>
</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-10-11T01:02:22.205979" elapsed="0.005749"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:02:22.211868" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:02:22.211787" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.211770" elapsed="0.000175"/>
</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-10-11T01:02:22.212101" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.212162" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:02:22.212319" 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-10-11T01:02:22.191159" elapsed="0.021184"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:02:22.212398" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T01:02:22.212573" 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-10-11T01:02:22.111659" elapsed="0.100937"/>
</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-10-11T01:02:22.212884" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.212681" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.212666" elapsed="0.000300"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:02:22.212996" elapsed="0.000023"/>
</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-10-11T01:02:22.110821" elapsed="0.102286"/>
</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-10-11T01:02:22.223824" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.223523" elapsed="0.000327"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:22.224525" 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-10-11T01:02:22.224331" elapsed="0.000254">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-10-11T01:02:22.224668" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:22.224006" elapsed="0.000685"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.225179" 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-10-11T01:02:22.224861" elapsed="0.000343"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:02:22.225492" 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-10-11T01:02:22.225613" 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-10-11T01:02:22.225368" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.226061" 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-10-11T01:02:22.225832" elapsed="0.000272"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.226995" level="INFO">mapping: {'IP': '10.30.171.7', '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-10-11T01:02:22.226765" elapsed="0.000284"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.227488" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.227224" elapsed="0.000288"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.228299" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:22.227826" elapsed="0.000498"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:22.229344" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.228890" elapsed="0.000492"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:22.229517" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:02:22.229704" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:22.228514" elapsed="0.001213"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.229889" elapsed="0.000310"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T01:02:22.227698" elapsed="0.002539"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.230993" 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-10-11T01:02:22.230529" elapsed="0.000489"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:22.232063" 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-10-11T01:02:22.231608" elapsed="0.000494"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:22.232220" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:02:22.232426" 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-10-11T01:02:22.231201" elapsed="0.001250"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.232616" elapsed="0.000302"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T01:02:22.230373" elapsed="0.002588"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.233872" 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-10-11T01:02:22.233201" elapsed="0.000697"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:22.234963" 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-10-11T01:02:22.234524" elapsed="0.000477"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:22.235132" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:02:22.235316" 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-10-11T01:02:22.234078" 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-10-11T01:02:22.235533" elapsed="0.000296"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T01:02:22.233072" elapsed="0.002795"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.236590" 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-10-11T01:02:22.236108" elapsed="0.000506"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:22.237641" 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-10-11T01:02:22.237172" elapsed="0.000507"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:22.237794" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:02:22.237976" 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-10-11T01:02:22.236780" elapsed="0.001219"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.238176" elapsed="0.000323"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T01:02:22.235966" elapsed="0.002571"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.239236" 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-10-11T01:02:22.238765" elapsed="0.000495"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:22.240389" 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-10-11T01:02:22.239933" elapsed="0.000510"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:22.240563" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:02:22.240745" 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-10-11T01:02:22.239541" elapsed="0.001227"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.240933" elapsed="0.000312"/>
</kw>
<var name="${key}">MULTIPATH</var>
<var name="${value}">0</var>
<status status="PASS" start="2026-10-11T01:02:22.238636" elapsed="0.002648"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.242005" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:22.241542" elapsed="0.000500"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:22.243152" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.242613" elapsed="0.000586"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:22.243335" elapsed="0.000032"/>
</return>
<msg time="2026-10-11T01:02:22.243564" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:22.242211" 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-10-11T01:02:22.243752" elapsed="0.000314"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:02:22.241382" elapsed="0.002727"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:02:22.227554" elapsed="0.016589"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:02:22.244215" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:02:22.244350" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', '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-10-11T01:02:22.226424" elapsed="0.017950"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.226163" elapsed="0.018240"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.244623" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.244472" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.226146" elapsed="0.018547"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.245566" 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-10-11T01:02:22.244863" elapsed="0.000731"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:02:22.245638" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:22.222994" elapsed="0.022826"/>
</kw>
<msg time="2026-10-11T01:02:22.245869" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:22.218479" elapsed="0.027441"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:22.251729" 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/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-10-11T01:02:22.256710" 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/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-10-11T01:02:22.261047" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.261234" 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-10-11T01:02:22.261433" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.261773" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.261629" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:02:22.261616" 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-10-11T01:02:22.261998" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.262187" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.262348" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:02:22.261590" elapsed="0.000804"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.261502" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.262627" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.262695" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:02:22.262806" 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-10-11T01:02:22.217856" elapsed="0.044975"/>
</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-10-11T01:02:22.272105" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.271786" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:22.272792" 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-10-11T01:02:22.272619" elapsed="0.000233">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-10-11T01:02:22.272935" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:22.272286" elapsed="0.000671"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.273474" 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-10-11T01:02:22.273147" elapsed="0.000353"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:02:22.273778" 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-10-11T01:02:22.273901" 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-10-11T01:02:22.273669" elapsed="0.000259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.274353" 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-10-11T01:02:22.274134" 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-10-11T01:02:22.274731" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.274485" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.275234" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', '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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.274951" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.274806" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.274468" elapsed="0.000844"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.276130" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflecto...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:22.275493" elapsed="0.000666"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:02:22.276203" 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/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-10-11T01:02:22.271265" elapsed="0.005043"/>
</kw>
<msg time="2026-10-11T01:02:22.276390" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:22.266707" elapsed="0.009745"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:22.280874" 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/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-10-11T01:02:22.285519" 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/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-10-11T01:02:22.289846" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.290038" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.290236" 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-10-11T01:02:22.290617" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.290471" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:02:22.290456" 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-10-11T01:02:22.290843" 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-10-11T01:02:22.291019" 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-10-11T01:02:22.291193" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:02:22.290422" elapsed="0.000818"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.290317" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.291428" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.291497" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:02:22.291620" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflecto...</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-10-11T01:02:22.265969" elapsed="0.025678"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:22.292796" 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-10-11T01:02:22.292585" elapsed="0.000271">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-10-11T01:02:22.292940" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:22.292227" 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-10-11T01:02:22.293307" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.293084" elapsed="0.000275"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.293826" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.293562" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.293381" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.293066" elapsed="0.000837"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.294430" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:02:22.294075" elapsed="0.000380"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:02:22.294500" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:02:22.294625" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:02:22.291915" elapsed="0.002733"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.295858" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:22.295638" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.296318" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T01:02:22.296103" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.296793" 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-10-11T01:02:22.296574" elapsed="0.000259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.297245" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:22.297019" elapsed="0.000266"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:02:22.297989" 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-10-11T01:02:22.297832" elapsed="0.000181"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:02:22.298319" 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-10-11T01:02:22.298177" elapsed="0.000166"/>
</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-10-11T01:02:22.298539" elapsed="0.000159"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.299124" 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-10-11T01:02:22.298891" elapsed="0.000274"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:02:22.299203" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:02:22.299331" 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-10-11T01:02:22.297479" elapsed="0.001875"/>
</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-10-11T01:02:22.308751" level="INFO">PUT Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.node0', 'Content-Length': '869', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T01:02:22.308843" level="INFO">PUT Response : url=http://10.30.170.173: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.171.7 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:22.308942" 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-10-11T01:02:22.299685" elapsed="0.009281"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.299448" elapsed="0.009558"/>
</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-10-11T01:02:22.309207" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.309051" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.299400" elapsed="0.009886"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.310480" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:22.310188" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.309916" elapsed="0.000713"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.309899" elapsed="0.000753"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.311253" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:22.310973" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.310716" elapsed="0.000610"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.310700" elapsed="0.000648"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.311891" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:22.311546" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.312202" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.311980" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.312718" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.312450" elapsed="0.000293"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.312275" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.311963" elapsed="0.000832"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.313334" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:22.312974" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.313645" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.313437" elapsed="0.000260"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.314153" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.313877" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.313718" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.313405" elapsed="0.000825"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:22.314371" elapsed="0.000308"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:02:22.315084" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:22.314839" elapsed="0.000270"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.315261" elapsed="0.000235"/>
</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-10-11T01:02:22.309627" elapsed="0.005924"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:02:22.315692" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:02:22.315610" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.315593" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.315913" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.315972" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:02:22.316143" 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-10-11T01:02:22.294940" elapsed="0.021227"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:02:22.316254" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:22.316380" 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-10-11T01:02:22.213915" elapsed="0.102488"/>
</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-10-11T01:02:22.316710" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.316505" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.316490" elapsed="0.000308"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:02:22.316828" elapsed="0.000025"/>
</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-10-11T01:02:22.213333" elapsed="0.103593"/>
</kw>
<arg>${odl_path_sel_mode}</arg>
<doc>Configures odl peer with path selection mode</doc>
<status status="PASS" start="2026-10-11T01:02:22.108803" elapsed="0.208178"/>
</kw>
<kw name="Configure_App_Peer_With_Routes">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.317728" level="INFO">${app_rib} = 10.30.170.173</msg>
<var>${app_rib}</var>
<arg>${ODL_SYSTEM_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.317466" elapsed="0.000287"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.318487" 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.173 | IP=10.30.170.173 | 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-10-11T01:02:22.317932" elapsed="0.000582"/>
</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-10-11T01:02:22.329755" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.329446" elapsed="0.000336"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:22.330480" 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-10-11T01:02:22.330272" elapsed="0.000270">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-10-11T01:02:22.330627" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:22.329939" elapsed="0.000711"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.331141" 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-10-11T01:02:22.330823" elapsed="0.000343"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:02:22.331453" 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-10-11T01:02:22.331595" 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-10-11T01:02:22.331330" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.332044" 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-10-11T01:02:22.331815" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.332999" 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.173', 'IP': '10.30.170.173', '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-10-11T01:02:22.332763" elapsed="0.000292"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.333497" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.333232" elapsed="0.000289"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.334325" 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-10-11T01:02:22.333842" elapsed="0.000508"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:22.335441" 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-10-11T01:02:22.334960" elapsed="0.000530"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:22.335609" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:02:22.335798" 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-10-11T01:02:22.334577" 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-10-11T01:02:22.335986" elapsed="0.000313"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T01:02:22.333712" elapsed="0.002625"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.337065" 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-10-11T01:02:22.336592" elapsed="0.000498"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:22.338120" 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-10-11T01:02:22.337667" elapsed="0.000492"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:22.338279" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:02:22.338489" 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-10-11T01:02:22.337258" elapsed="0.001255"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.338679" elapsed="0.000299"/>
</kw>
<var name="${key}">APP_PEER_NAME</var>
<var name="${value}">example-bgp-peer-app</var>
<status status="PASS" start="2026-10-11T01:02:22.336461" elapsed="0.002555"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.339971" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:22.339257" elapsed="0.000739"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:22.341050" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.340583" elapsed="0.000507"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:22.341211" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:02:22.341397" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:22.340186" elapsed="0.001265"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.341617" elapsed="0.000296"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:02:22.339127" elapsed="0.002825"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.342673" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:22.342193" elapsed="0.000504"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:22.343738" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.343262" elapsed="0.000514"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:22.343895" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:02:22.344100" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:22.342869" 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-10-11T01:02:22.344289" elapsed="0.000400"/>
</kw>
<var name="${key}">APP_PEER_ID</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:02:22.342063" elapsed="0.002665"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.345450" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:22.344960" elapsed="0.000516"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:22.346525" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.346027" elapsed="0.000537"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:22.346680" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:02:22.346866" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:22.345644" 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-10-11T01:02:22.347063" elapsed="0.000297"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:02:22.344829" elapsed="0.002569"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.348120" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:22.347650" elapsed="0.000494"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:22.349222" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.348766" elapsed="0.000495"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:22.349379" elapsed="0.000093"/>
</return>
<msg time="2026-10-11T01:02:22.349635" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:22.348360" elapsed="0.001299"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.349823" elapsed="0.000307"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:02:22.347520" elapsed="0.002651"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:02:22.333565" elapsed="0.016637"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:02:22.350240" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:02:22.350372" 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.173', 'IP': '10.30.170.173', 'BGP_RIB_OPENCONFIG': 'exam...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:02:22.332399" elapsed="0.017998"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.332149" elapsed="0.018341"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.350663" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.350513" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.332132" elapsed="0.018601"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.351541" 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-10-11T01:02:22.350891" elapsed="0.000677"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:02:22.351612" 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-10-11T01:02:22.328864" elapsed="0.022849"/>
</kw>
<msg time="2026-10-11T01:02:22.351763" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:22.323940" elapsed="0.027868"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:22.356298" 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/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-10-11T01:02:22.360556" 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/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-10-11T01:02:22.364829" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.365010" 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-10-11T01:02:22.365207" 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-10-11T01:02:22.365597" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.365397" elapsed="0.000252"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:02:22.365384" 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-10-11T01:02:22.365827" 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-10-11T01:02:22.366006" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.366181" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:02:22.365359" elapsed="0.000871"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.365273" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.366402" elapsed="0.000035"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.366485" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:02:22.366597" 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-10-11T01:02:22.323325" elapsed="0.043297"/>
</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-10-11T01:02:22.376186" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.375871" elapsed="0.000341"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:22.376875" 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-10-11T01:02:22.376703" elapsed="0.000231">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-10-11T01:02:22.377017" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:22.376369" elapsed="0.000681"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.377711" 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-10-11T01:02:22.377220" elapsed="0.000517"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:02:22.378009" 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-10-11T01:02:22.378136" 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-10-11T01:02:22.377901" elapsed="0.000261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.378590" 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-10-11T01:02:22.378354" elapsed="0.000280"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:02:22.378936" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.378693" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.379444" 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.173', 'IP': '10.30.170.173', '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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.379166" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.379009" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.378676" elapsed="0.000846"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.380240" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.173&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-10-11T01:02:22.379679" elapsed="0.000619"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:02:22.380344" 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-10-11T01:02:22.375353" elapsed="0.005109"/>
</kw>
<msg time="2026-10-11T01:02:22.380511" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:22.370506" elapsed="0.010049"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:22.384925" 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/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-10-11T01:02:22.389219" 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/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-10-11T01:02:22.393458" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.393640" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.393819" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.394393" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.394012" elapsed="0.000448"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:02:22.393999" elapsed="0.000483"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.394639" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.394815" elapsed="0.000017"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.394974" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:02:22.393973" elapsed="0.001048"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.393885" elapsed="0.001171"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.395212" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.395278" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:02:22.395419" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.173&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-10-11T01:02:22.369779" elapsed="0.025669"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:22.396628" 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-10-11T01:02:22.396431" elapsed="0.000256">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-10-11T01:02:22.396771" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:22.396085" elapsed="0.000709"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.397085" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.396857" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.397602" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.397322" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.397159" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.396839" elapsed="0.000838"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.398183" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:02:22.397836" elapsed="0.000371"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:02:22.398251" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:22.398375" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:02:22.395774" elapsed="0.002623"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.399632" 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.173</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:22.399394" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.400085" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.173&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-10-11T01:02:22.399862" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.400560" 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-10-11T01:02:22.400325" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.401005" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:22.400791" elapsed="0.000267"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:02:22.401801" 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-10-11T01:02:22.401641" elapsed="0.000184"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:02:22.402130" 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-10-11T01:02:22.401977" elapsed="0.000176"/>
</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-10-11T01:02:22.402312" elapsed="0.000177"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.402904" 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-10-11T01:02:22.402683" elapsed="0.000261"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:02:22.402981" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T01:02:22.403133" 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-10-11T01:02:22.401238" elapsed="0.001918"/>
</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-10-11T01:02:22.411926" level="INFO">PUT Request : url=http://10.30.170.173: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.173 
 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.173 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.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.173&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-10-11T01:02:22.411979" level="INFO">PUT Response : url=http://10.30.170.173: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.173 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:22.412108" 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-10-11T01:02:22.403553" elapsed="0.008580"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.403218" elapsed="0.008955"/>
</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-10-11T01:02:22.412350" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.412197" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.403202" elapsed="0.009249"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.413609" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:22.413319" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.413081" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.413064" elapsed="0.000637"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.414274" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:22.413997" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.413750" elapsed="0.000596"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.413735" elapsed="0.000633"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.414902" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:22.414559" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.415213" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.414990" elapsed="0.000275"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.415726" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.415463" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.415287" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.414973" elapsed="0.000829"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.416329" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:22.415975" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.416641" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.416431" elapsed="0.000260"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.417152" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.416872" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.416714" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.416399" elapsed="0.000828"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:22.417368" elapsed="0.000306"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:02:22.418064" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:22.417833" elapsed="0.000256"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.418241" elapsed="0.000225"/>
</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-10-11T01:02:22.412781" elapsed="0.005740"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:02:22.418662" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:02:22.418580" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.418563" elapsed="0.000176"/>
</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-10-11T01:02:22.418881" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.418940" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:02:22.419109" 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-10-11T01:02:22.398708" elapsed="0.020425"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:02:22.419188" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:22.419311" 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-10-11T01:02:22.319353" elapsed="0.099980"/>
</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-10-11T01:02:22.419672" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.419470" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.419452" elapsed="0.000303"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:02:22.419785" elapsed="0.000024"/>
</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-10-11T01:02:22.318755" elapsed="0.101128"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.420703" level="INFO">&amp;{route_mapping} = { NEXTHOP=100.100.100.1 | LOCALPREF=100 | PATHID=1 | APP_RIB=10.30.170.173 }</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-10-11T01:02:22.420220" elapsed="0.000510"/>
</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-10-11T01:02:22.431784" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.431480" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:22.432582" 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-10-11T01:02:22.432295" elapsed="0.000364">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-10-11T01:02:22.432832" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:22.431965" elapsed="0.000901"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.433539" 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-10-11T01:02:22.433115" elapsed="0.000451"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:02:22.433973" 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-10-11T01:02:22.434163" 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-10-11T01:02:22.433813" elapsed="0.000388"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.434640" 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-10-11T01:02:22.434396" 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-10-11T01:02:22.435788" level="INFO">mapping: {'NEXTHOP': '100.100.100.1', 'LOCALPREF': '100', 'PATHID': '1', 'APP_RIB': '10.30.170.173'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:22.435342" elapsed="0.000487"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.436432" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.436008" elapsed="0.000449"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.437395" 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-10-11T01:02:22.436805" elapsed="0.000655"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:22.439159" 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-10-11T01:02:22.438770" elapsed="0.000422"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:22.439267" elapsed="0.000073"/>
</return>
<msg time="2026-10-11T01:02:22.439579" 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-10-11T01:02:22.437890" elapsed="0.001728"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.439855" elapsed="0.000433"/>
</kw>
<var name="${key}">NEXTHOP</var>
<var name="${value}">100.100.100.1</var>
<status status="PASS" start="2026-10-11T01:02:22.436645" elapsed="0.003737"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.441311" 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-10-11T01:02:22.440709" elapsed="0.000641"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:22.443237" 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-10-11T01:02:22.442854" elapsed="0.000415"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:22.443339" elapsed="0.000085"/>
</return>
<msg time="2026-10-11T01:02:22.443647" 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-10-11T01:02:22.441857" elapsed="0.001828"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.443917" elapsed="0.000424"/>
</kw>
<var name="${key}">LOCALPREF</var>
<var name="${value}">100</var>
<status status="PASS" start="2026-10-11T01:02:22.440544" elapsed="0.003960"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.445521" 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-10-11T01:02:22.444768" elapsed="0.000792"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:22.447302" 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-10-11T01:02:22.446920" elapsed="0.000413"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:22.447403" elapsed="0.000088"/>
</return>
<msg time="2026-10-11T01:02:22.447712" 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-10-11T01:02:22.445988" elapsed="0.001761"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.447979" elapsed="0.000517"/>
</kw>
<var name="${key}">PATHID</var>
<var name="${value}">1</var>
<status status="PASS" start="2026-10-11T01:02:22.444610" elapsed="0.003982"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.449479" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:22.448855" elapsed="0.000663"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:22.451267" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.450888" elapsed="0.000411"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:22.451369" elapsed="0.000086"/>
</return>
<msg time="2026-10-11T01:02:22.451675" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:22.449945" elapsed="0.001766"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.451942" elapsed="0.000434"/>
</kw>
<var name="${key}">APP_RIB</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:02:22.448697" elapsed="0.003864"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:02:22.436500" elapsed="0.016095"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:02:22.452635" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:02:22.452768" level="INFO">${mapping_to_use} = {'NEXTHOP': '100.100.100.1', 'LOCALPREF': '100', 'PATHID': '1', 'APP_RIB': '10.30.170.173'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:02:22.434989" elapsed="0.017802"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.434741" elapsed="0.018080"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.452993" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.452845" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.434724" elapsed="0.018350"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.453779" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:02:22.453231" elapsed="0.000574"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:02:22.453848" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:22.430870" elapsed="0.023077"/>
</kw>
<msg time="2026-10-11T01:02:22.453994" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:22.426336" elapsed="0.027714"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:22.458431" 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/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-10-11T01:02:22.462858" 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/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-10-11T01:02:22.467121" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.467299" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.467494" 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-10-11T01:02:22.467828" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.467685" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:02:22.467672" 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-10-11T01:02:22.468060" 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-10-11T01:02:22.468274" 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-10-11T01:02:22.468510" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:02:22.467647" elapsed="0.000925"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.467561" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.468825" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.468908" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:02:22.469039" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:02:22.425728" elapsed="0.043338"/>
</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-10-11T01:02:22.478417" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.478102" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:22.479252" 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-10-11T01:02:22.479053" elapsed="0.000258">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-10-11T01:02:22.479394" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:22.478722" elapsed="0.000717"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.479951" 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-10-11T01:02:22.479611" elapsed="0.000366"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:02:22.480263" 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-10-11T01:02:22.480385" 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-10-11T01:02:22.480154" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.480841" 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-10-11T01:02:22.480622" elapsed="0.000271"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:02:22.481214" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.480954" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.481724" level="INFO">${mapping_to_use} = {'NEXTHOP': '100.100.100.1', 'LOCALPREF': '100', 'PATHID': '1', 'APP_RIB': '10.30.170.173'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.481458" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.481289" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.480936" elapsed="0.000864"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.482567" 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-10-11T01:02:22.481960" elapsed="0.000636"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:02:22.482640" 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-10-11T01:02:22.477590" elapsed="0.005152"/>
</kw>
<msg time="2026-10-11T01:02:22.482792" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:22.473101" elapsed="0.009735"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:22.487071" 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/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-10-11T01:02:22.491308" 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/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-10-11T01:02:22.495797" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.496027" 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-10-11T01:02:22.496241" 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-10-11T01:02:22.496595" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.496449" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:02:22.496435" 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-10-11T01:02:22.496820" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.496997" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.497174" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:02:22.496395" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.496308" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.497395" elapsed="0.000039"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.497482" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:02:22.497595" 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-10-11T01:02:22.472390" elapsed="0.025232"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:22.498743" 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-10-11T01:02:22.498549" elapsed="0.000253">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-10-11T01:02:22.498902" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:22.498208" elapsed="0.000716"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.499369" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.498999" elapsed="0.000497"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.500026" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.499702" elapsed="0.000388"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.499519" elapsed="0.000605"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.498981" elapsed="0.001180"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.500817" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:02:22.500380" elapsed="0.000462"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:02:22.500886" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:22.501010" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:02:22.497892" elapsed="0.003151"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.502728" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:02:22.502444" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.503221" 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-10-11T01:02:22.502989" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.503754" 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-10-11T01:02:22.503525" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.504208" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:22.503978" elapsed="0.000269"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:02:22.504988" 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-10-11T01:02:22.504825" elapsed="0.000188"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:02:22.505316" 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-10-11T01:02:22.505173" 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-10-11T01:02:22.505562" elapsed="0.000166"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.506152" 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-10-11T01:02:22.505919" elapsed="0.000273"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:02:22.506231" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:02:22.506357" 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-10-11T01:02:22.504451" elapsed="0.001928"/>
</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-10-11T01:02:22.520530" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.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-10-11T01:02:22.520591" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:02:22.520673" 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-10-11T01:02:22.506689" elapsed="0.014007"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.506458" elapsed="0.014279"/>
</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-10-11T01:02:22.520913" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.520761" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.506441" elapsed="0.014551"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.523331" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:22.523054" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.522779" elapsed="0.000639"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.522761" elapsed="0.000681"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.523999" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:22.523730" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.523492" elapsed="0.000599"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.523477" elapsed="0.000637"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.524657" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:22.524292" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.524956" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.524746" elapsed="0.000263"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.525491" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.525211" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.525043" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.524729" elapsed="0.000871"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.526180" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:22.525774" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.526494" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.526270" elapsed="0.000277"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.526990" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.526729" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.526569" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.526253" elapsed="0.000828"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:22.527223" elapsed="0.000307"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:02:22.527908" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:22.527687" elapsed="0.000245"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.528100" elapsed="0.000221"/>
</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-10-11T01:02:22.521324" elapsed="0.007053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:02:22.528542" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:02:22.528460" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.528442" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.528766" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.528825" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:02:22.528982" 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-10-11T01:02:22.501343" elapsed="0.027663"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:02:22.529084" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:02:22.529206" 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-10-11T01:02:22.421621" elapsed="0.107607"/>
</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-10-11T01:02:22.529530" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.529317" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.529301" elapsed="0.000312"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:02:22.529642" elapsed="0.000024"/>
</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-10-11T01:02:22.420969" elapsed="0.108767"/>
</kw>
<var name="${pathid}">1</var>
<status status="PASS" start="2026-10-11T01:02:22.420059" elapsed="0.109711"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.530514" level="INFO">&amp;{route_mapping} = { NEXTHOP=100.100.100.2 | LOCALPREF=200 | PATHID=2 | APP_RIB=10.30.170.173 }</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-10-11T01:02:22.530004" elapsed="0.000537"/>
</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-10-11T01:02:22.541574" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.541253" elapsed="0.000348"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:22.542340" 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-10-11T01:02:22.542128" elapsed="0.000298">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-10-11T01:02:22.542516" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:22.541795" elapsed="0.000744"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.543023" 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-10-11T01:02:22.542712" elapsed="0.000353"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:02:22.543342" 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-10-11T01:02:22.543483" 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-10-11T01:02:22.543231" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.543936" 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-10-11T01:02:22.543716" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.545119" level="INFO">mapping: {'NEXTHOP': '100.100.100.2', 'LOCALPREF': '200', 'PATHID': '2', 'APP_RIB': '10.30.170.173'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:22.544677" elapsed="0.000484"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.545760" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.545338" elapsed="0.000446"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.546748" 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-10-11T01:02:22.546156" elapsed="0.000630"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:22.548543" 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-10-11T01:02:22.548121" elapsed="0.000454"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:22.548645" elapsed="0.000072"/>
</return>
<msg time="2026-10-11T01:02:22.548950" 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-10-11T01:02:22.547230" 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-10-11T01:02:22.549248" elapsed="0.000439"/>
</kw>
<var name="${key}">NEXTHOP</var>
<var name="${value}">100.100.100.2</var>
<status status="PASS" start="2026-10-11T01:02:22.545979" elapsed="0.003800"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.550661" 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-10-11T01:02:22.550057" elapsed="0.000643"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:22.552551" 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-10-11T01:02:22.552164" elapsed="0.000419"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:22.552652" elapsed="0.000071"/>
</return>
<msg time="2026-10-11T01:02:22.552943" 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-10-11T01:02:22.551148" 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-10-11T01:02:22.553230" elapsed="0.000479"/>
</kw>
<var name="${key}">LOCALPREF</var>
<var name="${value}">200</var>
<status status="PASS" start="2026-10-11T01:02:22.549883" elapsed="0.003919"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.554673" 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-10-11T01:02:22.554081" elapsed="0.000631"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:22.556475" 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-10-11T01:02:22.556089" elapsed="0.000419"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:22.556583" elapsed="0.000071"/>
</return>
<msg time="2026-10-11T01:02:22.556874" 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-10-11T01:02:22.555157" elapsed="0.001753"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.557155" elapsed="0.000694"/>
</kw>
<var name="${key}">PATHID</var>
<var name="${value}">2</var>
<status status="PASS" start="2026-10-11T01:02:22.553908" elapsed="0.004035"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.558821" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:22.558227" elapsed="0.000632"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:22.560689" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.560303" elapsed="0.000418"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:22.560791" elapsed="0.000071"/>
</return>
<msg time="2026-10-11T01:02:22.561099" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:22.559370" elapsed="0.001767"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.561369" elapsed="0.000499"/>
</kw>
<var name="${key}">APP_RIB</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:02:22.558067" elapsed="0.003893"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:02:22.545830" elapsed="0.016164"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:02:22.562049" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:02:22.562183" level="INFO">${mapping_to_use} = {'NEXTHOP': '100.100.100.2', 'LOCALPREF': '200', 'PATHID': '2', 'APP_RIB': '10.30.170.173'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:02:22.544308" elapsed="0.017898"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.544055" elapsed="0.018180"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.562423" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.562258" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.544021" elapsed="0.018473"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.563202" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:02:22.562650" elapsed="0.000578"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:02:22.563273" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:22.540728" elapsed="0.022644"/>
</kw>
<msg time="2026-10-11T01:02:22.563519" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:22.535970" 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/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-10-11T01:02:22.567886" 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/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-10-11T01:02:22.572731" 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/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-10-11T01:02:22.577006" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.577204" 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-10-11T01:02:22.577439" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.577788" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.577642" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:02:22.577628" 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-10-11T01:02:22.578016" 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-10-11T01:02:22.578211" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.578373" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:02:22.577601" elapsed="0.000848"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.577510" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.578627" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.578694" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:02:22.578807" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:02:22.535366" elapsed="0.043466"/>
</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-10-11T01:02:22.588695" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.588371" elapsed="0.000350"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:22.589463" 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-10-11T01:02:22.589223" elapsed="0.000308">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-10-11T01:02:22.589615" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:22.588880" elapsed="0.000757"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.590134" 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-10-11T01:02:22.589808" elapsed="0.000351"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:02:22.590452" 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-10-11T01:02:22.590580" 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-10-11T01:02:22.590324" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.591021" 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-10-11T01:02:22.590803" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:02:22.591425" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.591151" elapsed="0.000370"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.591960" level="INFO">${mapping_to_use} = {'NEXTHOP': '100.100.100.2', 'LOCALPREF': '200', 'PATHID': '2', 'APP_RIB': '10.30.170.173'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.591694" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.591546" elapsed="0.000471"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.591133" elapsed="0.000918"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.592809" 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-10-11T01:02:22.592212" elapsed="0.000627"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:02:22.592884" 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/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-10-11T01:02:22.587845" elapsed="0.005141"/>
</kw>
<msg time="2026-10-11T01:02:22.593051" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:22.582751" elapsed="0.010346"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:22.597365" 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/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-10-11T01:02:22.601653" 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/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-10-11T01:02:22.605906" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.606101" 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-10-11T01:02:22.606286" 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-10-11T01:02:22.606641" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.606494" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:02:22.606480" 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-10-11T01:02:22.606871" 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-10-11T01:02:22.607073" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.607240" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:02:22.606454" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.606352" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.607477" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.607577" elapsed="0.000017"/>
</return>
<msg time="2026-10-11T01:02:22.607695" 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-10-11T01:02:22.582027" elapsed="0.025695"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:22.608919" 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-10-11T01:02:22.608694" elapsed="0.000286">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-10-11T01:02:22.609083" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:22.608350" elapsed="0.000757"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.609395" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.609172" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.609933" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.609666" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.609486" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.609154" elapsed="0.000855"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.610546" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:02:22.610189" elapsed="0.000381"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:02:22.610616" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:22.610740" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:02:22.607999" elapsed="0.002764"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.612297" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:02:22.612072" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.612773" 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-10-11T01:02:22.612555" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.613443" 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-10-11T01:02:22.613099" elapsed="0.000412"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.614147" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:22.613789" elapsed="0.000423"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:02:22.614962" 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-10-11T01:02:22.614795" elapsed="0.000192"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:02:22.615696" 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-10-11T01:02:22.615482" elapsed="0.000243"/>
</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-10-11T01:02:22.615889" elapsed="0.000179"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.616527" 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-10-11T01:02:22.616262" elapsed="0.000306"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:02:22.616613" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:22.616742" 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-10-11T01:02:22.614433" elapsed="0.002370"/>
</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-10-11T01:02:22.625188" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.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-10-11T01:02:22.625248" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:02:22.625332" 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-10-11T01:02:22.617118" elapsed="0.008237"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.616871" elapsed="0.008526"/>
</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-10-11T01:02:22.625598" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.625444" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.616854" elapsed="0.008824"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.626924" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:22.626652" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.626390" elapsed="0.000605"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.626372" elapsed="0.000645"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.627623" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:22.627325" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.627080" elapsed="0.000616"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.627064" elapsed="0.000653"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.628263" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:22.627899" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.628583" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.628351" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.629090" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.628815" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.628656" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.628334" elapsed="0.000835"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.629706" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:22.629341" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.630144" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.629831" elapsed="0.000381"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.630721" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.630456" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.630245" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.629793" elapsed="0.001006"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:22.630941" elapsed="0.000302"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:02:22.631643" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:22.631402" elapsed="0.000266"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.631854" elapsed="0.000232"/>
</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-10-11T01:02:22.626012" elapsed="0.006132"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:02:22.632291" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T01:02:22.632208" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.632191" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.632526" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.632588" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:02:22.632748" 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-10-11T01:02:22.611248" elapsed="0.021524"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:02:22.632832" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:02:22.632956" 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-10-11T01:02:22.531425" elapsed="0.101553"/>
</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-10-11T01:02:22.633293" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.633091" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.633074" elapsed="0.000302"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:02:22.633419" 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-10-11T01:02:22.530774" elapsed="0.102747"/>
</kw>
<var name="${pathid}">2</var>
<status status="PASS" start="2026-10-11T01:02:22.529848" elapsed="0.103709"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.634491" level="INFO">&amp;{route_mapping} = { NEXTHOP=100.100.100.3 | LOCALPREF=300 | PATHID=3 | APP_RIB=10.30.170.173 }</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-10-11T01:02:22.633801" elapsed="0.000717"/>
</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-10-11T01:02:22.645285" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.644965" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:22.646359" 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-10-11T01:02:22.645982" elapsed="0.000487">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-10-11T01:02:22.646588" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:22.645521" elapsed="0.001090"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.647110" 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-10-11T01:02:22.646785" elapsed="0.000350"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:02:22.647424" 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-10-11T01:02:22.647545" 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-10-11T01:02:22.647300" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.648018" 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-10-11T01:02:22.647796" elapsed="0.000280"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.649203" level="INFO">mapping: {'NEXTHOP': '100.100.100.3', 'LOCALPREF': '300', 'PATHID': '3', 'APP_RIB': '10.30.170.173'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:22.648758" elapsed="0.000487"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.649840" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.649443" elapsed="0.000421"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.650826" 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-10-11T01:02:22.650229" elapsed="0.000635"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:22.652619" 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-10-11T01:02:22.652208" elapsed="0.000444"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:22.652721" elapsed="0.000073"/>
</return>
<msg time="2026-10-11T01:02:22.653014" 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-10-11T01:02:22.651319" elapsed="0.001749"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.653303" elapsed="0.000581"/>
</kw>
<var name="${key}">NEXTHOP</var>
<var name="${value}">100.100.100.3</var>
<status status="PASS" start="2026-10-11T01:02:22.650068" elapsed="0.003917"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.654880" 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-10-11T01:02:22.654262" elapsed="0.000656"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:22.656767" 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-10-11T01:02:22.656245" elapsed="0.000554"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:22.656868" elapsed="0.000078"/>
</return>
<msg time="2026-10-11T01:02:22.657179" 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-10-11T01:02:22.655362" elapsed="0.001855"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.657464" elapsed="0.000413"/>
</kw>
<var name="${key}">LOCALPREF</var>
<var name="${value}">300</var>
<status status="PASS" start="2026-10-11T01:02:22.654102" elapsed="0.003867"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.658883" 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-10-11T01:02:22.658244" elapsed="0.000677"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:22.660673" 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-10-11T01:02:22.660220" elapsed="0.000485"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:22.660773" elapsed="0.000070"/>
</return>
<msg time="2026-10-11T01:02:22.661076" 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-10-11T01:02:22.659362" elapsed="0.001751"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.661345" elapsed="0.000428"/>
</kw>
<var name="${key}">PATHID</var>
<var name="${value}">3</var>
<status status="PASS" start="2026-10-11T01:02:22.658084" elapsed="0.003779"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.662809" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:22.662136" elapsed="0.000711"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:22.664617" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.664159" elapsed="0.000490"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:22.664718" elapsed="0.000072"/>
</return>
<msg time="2026-10-11T01:02:22.665007" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:22.663291" 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-10-11T01:02:22.665293" elapsed="0.000429"/>
</kw>
<var name="${key}">APP_RIB</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:02:22.661966" elapsed="0.003848"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:02:22.649909" elapsed="0.015940"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:02:22.665887" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:22.666091" level="INFO">${mapping_to_use} = {'NEXTHOP': '100.100.100.3', 'LOCALPREF': '300', 'PATHID': '3', 'APP_RIB': '10.30.170.173'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:02:22.648390" elapsed="0.017760"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.648138" elapsed="0.018045"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.666364" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.666206" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.648120" elapsed="0.018413"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.667251" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:02:22.666692" elapsed="0.000585"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:02:22.667321" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:22.644461" elapsed="0.022975"/>
</kw>
<msg time="2026-10-11T01:02:22.667492" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:22.639956" elapsed="0.027582"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:22.671989" 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/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-10-11T01:02:22.676226" 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/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-10-11T01:02:22.680448" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.680625" 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-10-11T01:02:22.680803" 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-10-11T01:02:22.681148" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.680991" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:02:22.680977" 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-10-11T01:02:22.681374" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.681570" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.681731" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:02:22.680953" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.680868" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.681948" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.682062" elapsed="0.000017"/>
</return>
<msg time="2026-10-11T01:02:22.682175" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:02:22.639355" elapsed="0.042844"/>
</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-10-11T01:02:22.691918" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.691616" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:22.692643" 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-10-11T01:02:22.692445" elapsed="0.000257">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-10-11T01:02:22.692786" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:22.692116" elapsed="0.000692"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.693300" 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-10-11T01:02:22.692980" elapsed="0.000346"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:02:22.693624" 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-10-11T01:02:22.693740" 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-10-11T01:02:22.693514" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.694196" 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-10-11T01:02:22.693961" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:02:22.694571" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.694307" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.695069" level="INFO">${mapping_to_use} = {'NEXTHOP': '100.100.100.3', 'LOCALPREF': '300', 'PATHID': '3', 'APP_RIB': '10.30.170.173'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.694791" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.694646" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.694290" elapsed="0.000856"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.695905" 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-10-11T01:02:22.695305" elapsed="0.000628"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:02:22.695977" 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/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-10-11T01:02:22.691084" elapsed="0.005008"/>
</kw>
<msg time="2026-10-11T01:02:22.696143" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:22.686476" elapsed="0.009741"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:22.700580" 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/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-10-11T01:02:22.704829" 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/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-10-11T01:02:22.709080" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.709260" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.709452" 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-10-11T01:02:22.709786" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.709644" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:02:22.709630" 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-10-11T01:02:22.710009" elapsed="0.000032"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.710200" 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-10-11T01:02:22.710360" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:02:22.709605" elapsed="0.000816"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.709518" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.710594" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.710659" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:02:22.710771" 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-10-11T01:02:22.685761" elapsed="0.025036"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:22.711939" 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-10-11T01:02:22.711724" elapsed="0.000275">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-10-11T01:02:22.712098" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:22.711382" elapsed="0.000739"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.712471" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.712223" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.712974" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.712711" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.712547" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.712204" elapsed="0.000859"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.713577" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:02:22.713225" elapsed="0.000376"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:02:22.713645" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:22.713784" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:02:22.711085" elapsed="0.002723"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.715543" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:02:22.715294" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.715988" 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-10-11T01:02:22.715774" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.716471" 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-10-11T01:02:22.716239" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.716912" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:22.716698" elapsed="0.000253"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:02:22.717671" 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-10-11T01:02:22.717511" elapsed="0.000184"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:02:22.717986" 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-10-11T01:02:22.717844" elapsed="0.000165"/>
</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-10-11T01:02:22.718182" elapsed="0.000156"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.718764" 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-10-11T01:02:22.718543" elapsed="0.000261"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:02:22.718842" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:22.718968" 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-10-11T01:02:22.717144" elapsed="0.001847"/>
</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-10-11T01:02:22.728563" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.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-10-11T01:02:22.728621" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:02:22.728745" 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-10-11T01:02:22.719327" elapsed="0.009443"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.719074" elapsed="0.009738"/>
</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-10-11T01:02:22.728990" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.728836" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.719057" 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-10-11T01:02:22.730334" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:22.730011" elapsed="0.000362"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.729776" elapsed="0.000647"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.729759" elapsed="0.000688"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.730995" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:22.730732" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.730497" elapsed="0.000585"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.730482" elapsed="0.000622"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.731650" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:22.731278" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.731945" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.731737" elapsed="0.000260"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.732469" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.732192" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.732019" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.731721" elapsed="0.000825"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.733067" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:22.732717" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:22.733363" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.733156" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.733872" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:22.733613" elapsed="0.000283"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:22.733453" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.733139" elapsed="0.000808"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:22.734099" elapsed="0.000290"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:02:22.734783" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:22.734563" elapsed="0.000244"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:02:22.734959" elapsed="0.000231"/>
</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-10-11T01:02:22.729418" elapsed="0.005826"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:02:22.735390" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-10-11T01:02:22.735308" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.735291" elapsed="0.000192"/>
</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-10-11T01:02:22.735625" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:02:22.735684" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:02:22.735841" 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-10-11T01:02:22.714236" elapsed="0.021629"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:02:22.735925" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:02:22.736095" 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-10-11T01:02:22.635401" elapsed="0.100718"/>
</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-10-11T01:02:22.736425" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:22.736209" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:22.736193" elapsed="0.000317"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:02:22.736540" elapsed="0.000025"/>
</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-10-11T01:02:22.634760" elapsed="0.101877"/>
</kw>
<var name="${pathid}">3</var>
<status status="PASS" start="2026-10-11T01:02:22.633641" elapsed="0.103031"/>
</iter>
<var>${pathid}</var>
<value>@{PATH_ID_LIST}</value>
<status status="PASS" start="2026-10-11T01:02:22.419930" elapsed="0.316770"/>
</for>
<doc>Configure bgp application peer and fill it immediately with routes.</doc>
<status status="PASS" start="2026-10-11T01:02:22.317160" elapsed="0.419591"/>
</kw>
<kw name="Upload_Config_Files">
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T01:02:22.746299" 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-10-11T01:02:22.737313" elapsed="0.009041"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T01:02:22.754078" 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-10-11T01:02:22.746559" elapsed="0.007575"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-10-11T01:02:22.763611" 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-10-11T01:02:22.763716" 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-10-11T01:02:22.754285" elapsed="0.009456"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:22.764255" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-10-11T01:02:22.776665" 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-10-11T01:02:22.764127" elapsed="0.012597"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:22.777065" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-10-11T01:02:22.830221" 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-10-11T01:02:22.776923" elapsed="0.053424"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:22.831099" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-10-11T01:02:22.878739" 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-10-11T01:02:22.830819" elapsed="0.048043"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:22.879651" level="INFO">Executing command 'sed -i -e 's/ADDPATH/send\/receive/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-10-11T01:02:22.930742" 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-10-11T01:02:22.879328" elapsed="0.051537"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:22.931619" level="INFO">Executing command 'cat bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-10-11T01:02:22.978650" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:02:22.978850" level="INFO">${stdout} = neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0.1/3...</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-10-11T01:02:22.931323" elapsed="0.047581"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:22.980000" level="INFO">neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
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-10-11T01:02:22.979457" elapsed="0.000673"/>
</kw>
<var name="${cfgfile}">bgp-flowspec-redirect.cfg</var>
<status status="PASS" start="2026-10-11T01:02:22.763942" elapsed="0.216258"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:22.981133" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-10-11T01:02:23.026439" 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-10-11T01:02:22.980840" elapsed="0.045727"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:23.027441" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-10-11T01:02:23.074509" 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-10-11T01:02:23.027121" elapsed="0.047508"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:23.075348" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-10-11T01:02:23.122676" 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-10-11T01:02:23.075094" elapsed="0.047707"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:23.123592" level="INFO">Executing command 'sed -i -e 's/ADDPATH/send\/receive/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-10-11T01:02:23.170273" 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-10-11T01:02:23.123260" elapsed="0.047137"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:23.171206" level="INFO">Executing command 'cat bgp-flowspec.cfg'.</msg>
<msg time="2026-10-11T01:02:23.218281" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:02:23.218523" level="INFO">${stdout} = neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0.1/3...</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-10-11T01:02:23.170874" elapsed="0.047706"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:23.219734" level="INFO">neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
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-10-11T01:02:23.219132" elapsed="0.000711"/>
</kw>
<var name="${cfgfile}">bgp-flowspec.cfg</var>
<status status="PASS" start="2026-10-11T01:02:22.980457" elapsed="0.239461"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:23.220890" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-10-11T01:02:23.266483" 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-10-11T01:02:23.220613" elapsed="0.046010"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:23.267560" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-10-11T01:02:23.314355" 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-10-11T01:02:23.267191" elapsed="0.047373"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:23.315691" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-10-11T01:02:23.362598" 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-10-11T01:02:23.315136" elapsed="0.047661"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:23.363841" level="INFO">Executing command 'sed -i -e 's/ADDPATH/send\/receive/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-10-11T01:02:23.410507" 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-10-11T01:02:23.363442" elapsed="0.047250"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:23.411491" level="INFO">Executing command 'cat bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-10-11T01:02:23.458657" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:02:23.458897" level="INFO">${stdout} = neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
local-as 64496;
peer-as 64496;
  family {
    ipv4 mpls-vpn;
  }
  static {
    route 1.1.1.0/24 {
      next-hop 10.0.255.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-10-11T01:02:23.411183" elapsed="0.047776"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:23.460307" level="INFO">neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
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-10-11T01:02:23.459615" elapsed="0.000825"/>
</kw>
<var name="${cfgfile}">bgp-l3vpn-ipv4.cfg</var>
<status status="PASS" start="2026-10-11T01:02:23.220203" elapsed="0.240321"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:23.461576" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' exa-md5.cfg'.</msg>
<msg time="2026-10-11T01:02:23.516631" 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-10-11T01:02:23.461251" elapsed="0.055506"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:23.517581" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' exa-md5.cfg'.</msg>
<msg time="2026-10-11T01:02:23.566642" 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-10-11T01:02:23.517249" elapsed="0.049518"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:23.567546" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exa-md5.cfg'.</msg>
<msg time="2026-10-11T01:02:23.614614" 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-10-11T01:02:23.567254" elapsed="0.047482"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:23.615627" level="INFO">Executing command 'sed -i -e 's/ADDPATH/send\/receive/g' exa-md5.cfg'.</msg>
<msg time="2026-10-11T01:02:23.663135" 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-10-11T01:02:23.615305" elapsed="0.047956"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:23.664006" level="INFO">Executing command 'cat exa-md5.cfg'.</msg>
<msg time="2026-10-11T01:02:23.714896" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:02:23.715135" level="INFO">${stdout} = neighbor 10.30.170.173 {
  router-id 10.30.171.7;
  local-address 10.30.171.7;
  local-as 64496;
  peer-as 64496;
  md5-password topsecret;

  capability {
    route-refresh disable;
    add-path disa...</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-10-11T01:02:23.663738" elapsed="0.051457"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:23.716331" level="INFO">neighbor 10.30.170.173 {
  router-id 10.30.171.7;
  local-address 10.30.171.7;
  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-10-11T01:02:23.715748" elapsed="0.000718"/>
</kw>
<var name="${cfgfile}">exa-md5.cfg</var>
<status status="PASS" start="2026-10-11T01:02:23.460801" elapsed="0.255742"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:23.717546" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' exa.cfg'.</msg>
<msg time="2026-10-11T01:02:23.762559" 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-10-11T01:02:23.717221" elapsed="0.045458"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:23.763452" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' exa.cfg'.</msg>
<msg time="2026-10-11T01:02:23.814805" 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-10-11T01:02:23.763131" elapsed="0.051799"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:23.815678" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exa.cfg'.</msg>
<msg time="2026-10-11T01:02:23.866666" 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-10-11T01:02:23.815386" elapsed="0.051403"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:23.867595" level="INFO">Executing command 'sed -i -e 's/ADDPATH/send\/receive/g' exa.cfg'.</msg>
<msg time="2026-10-11T01:02:23.914771" 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-10-11T01:02:23.867263" elapsed="0.047642"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:23.915697" level="INFO">Executing command 'cat exa.cfg'.</msg>
<msg time="2026-10-11T01:02:23.966884" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:02:23.967134" level="INFO">${stdout} = neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
local-as 64496;
peer-as 64496;
  capability {
    route-refresh disable;
    add-path send/receive;
  }

  family {
    ipv4 ...</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-10-11T01:02:23.915390" elapsed="0.051837"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:23.968472" level="INFO">neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
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.171.7;
    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-10-11T01:02:23.967863" elapsed="0.000712"/>
</kw>
<var name="${cfgfile}">exa.cfg</var>
<status status="PASS" start="2026-10-11T01:02:23.716789" elapsed="0.251856"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:23.969598" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' gobgp.cfg'.</msg>
<msg time="2026-10-11T01:02:24.014627" 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-10-11T01:02:23.969283" elapsed="0.045469"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:24.015542" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' gobgp.cfg'.</msg>
<msg time="2026-10-11T01:02:24.062798" 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-10-11T01:02:24.015214" elapsed="0.047709"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:24.063682" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' gobgp.cfg'.</msg>
<msg time="2026-10-11T01:02:24.110839" 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-10-11T01:02:24.063388" elapsed="0.047587"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:24.111777" level="INFO">Executing command 'sed -i -e 's/ADDPATH/send\/receive/g' gobgp.cfg'.</msg>
<msg time="2026-10-11T01:02:24.158477" 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-10-11T01:02:24.111479" elapsed="0.047123"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:24.159396" level="INFO">Executing command 'cat gobgp.cfg'.</msg>
<msg time="2026-10-11T01:02:24.206564" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:02:24.206781" level="INFO">${stdout} = [global.config]
    as = 64496
    router-id = "10.30.171.7"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.173"
        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-10-11T01:02:24.159095" elapsed="0.047744"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:24.208285" level="INFO">[global.config]
    as = 64496
    router-id = "10.30.171.7"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.173"
        local-as = 64496
    [neighbors.transport.config]
        local-address = "10.30.171.7"
        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-10-11T01:02:24.207700" elapsed="0.000859"/>
</kw>
<var name="${cfgfile}">gobgp.cfg</var>
<status status="PASS" start="2026-10-11T01:02:23.968876" elapsed="0.239760"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-10-11T01:02:22.763793" elapsed="1.444908"/>
</for>
<arg>addpath=${exa_add_path_value}</arg>
<doc>Uploads exabgp config files</doc>
<status status="PASS" start="2026-10-11T01:02:22.736928" elapsed="1.471905"/>
</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-10-11T01:02:24.212976" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:24.212309" elapsed="0.000745"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:24.214008" 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-10-11T01:02:24.213511" elapsed="0.000630"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:02:24.244434" 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-10-11T01:02:24.215561" elapsed="0.028993"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:02:24.248857" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:24.249062" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:24.244935" elapsed="0.004183"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:24.250481" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:24.249924" elapsed="0.000655"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:24.249278" elapsed="0.001370"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:24.249232" elapsed="0.001470"/>
</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-10-11T01:02:24.214738" elapsed="0.036060"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:02:24.253946" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<msg time="2026-10-11T01:02:24.254082" 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-10-11T01:02:24.251220" elapsed="0.002896"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:24.254732" 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-10-11T01:02:24.254393" elapsed="0.000395"/>
</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-10-11T01:02:24.211233" elapsed="0.043624"/>
</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-10-11T01:02:24.257442" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:24.256987" elapsed="0.000491"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:24.258143" 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-10-11T01:02:24.257731" elapsed="0.000445"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:02:24.264195" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:24.264443" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:02:24.264568" 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-10-11T01:02:24.258393" elapsed="0.006208"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:24.265386" 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-10-11T01:02:24.264885" elapsed="0.000587"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:02:24.266258" 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-10-11T01:02:24.265709" elapsed="0.000649">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-10-11T01:02:24.256391" elapsed="0.010136">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:27.269568" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:27.268685" elapsed="0.000955"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:27.270959" 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-10-11T01:02:27.270238" elapsed="0.000776"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:02:27.278791" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:27.279124" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:02:27.279342" 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-10-11T01:02:27.271433" elapsed="0.007963"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:27.280749" 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-10-11T01:02:27.279901" elapsed="0.000952"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:02:27.282150" 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-10-11T01:02:27.281268" elapsed="0.001033">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-10-11T01:02:27.267394" elapsed="0.015176">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:30.288866" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:30.287951" elapsed="0.000987"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:30.290150" 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-10-11T01:02:30.289448" elapsed="0.000757"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:02:30.297667" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:30.297948" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:02:30.298214" 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-10-11T01:02:30.290589" elapsed="0.007690"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:30.299504" 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-10-11T01:02:30.298789" elapsed="0.000815"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:02:30.300844" 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-10-11T01:02:30.299982" elapsed="0.001007">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-10-11T01:02:30.286740" elapsed="0.014498">200.0 != 409.0</status>
</kw>
<msg time="2026-10-11T01:02:30.301450" 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-10-11T01:02:24.255742" elapsed="6.045902">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</status>
</kw>
<msg time="2026-10-11T01:02:30.301878" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T01:02:30.301964" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:24.255155" elapsed="6.046857"/>
</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-10-11T01:02:30.303754" level="INFO">[?2004l01:02:24 | 3360   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:02:24 | 3360   | [01;34mversion      [0m | [1m4.2.17  [0m
01:02:24 | 3360   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
01:02:24 | 3360   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
01:02:24 | 3360   | [01;34minstallation [0m | [1m        [0m
01:02:24 | 3360   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
01:02:24 | 3360   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
01:02:24 | 3360   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:02:24 | 3360   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:02:24 | 3360   | [01;31mcli control  [0m | [1m - /run/[0m
01:02:24 | 3360   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:02:24 | 3360   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:02:24 | 3360   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:02:24 | 3360   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:02:24 | 3360   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:02:24 | 3360   | [01;31mcli control  [0m | [1m - /run/[0m
01:02:24 | 3360   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:02:24 | 3360   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:02:24 | 3360   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:02:24 | 3360   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
01:02:24 | 3360   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
01:02:24 | 3360   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
01:02:24 | 3360   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
01:02:24 | 3360   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
01:02:24 | 3360   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
01:02:24 | 3360   | configuration[0m | . router-id        | '10.30.171.7'[0m
01:02:24 | 3360   | configuration[0m | . local-address    | '10.30.171.7'[0m
01:02:24 | 3360   | configuration[0m | . local-as         | '64496'[0m
01:02:24 | 3360   | configuration[0m | . peer-as          | '64496'[0m
01:02:24 | 3360   | configuration[0m | &gt; capability       | [0m
01:02:24 | 3360   | configuration[0m | . route-refresh    | 'disable'[0m
01:02:24 | 3360   | configuration[0m | . add-path         | 'send/receive'[0m
01:02:24 | 3360   | configuration[0m | &lt; capability       | [0m
01:02:24 | 3360   | configuration[0m | &gt; family           | [0m
01:02:24 | 3360   | configuration[0m | . ipv4             | 'unicast'[0m
01:02:24 | 3360   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
01:02:24 | 3360   | configuration[0m | &lt; family           | [0m
01:02:24 | 3360   | configuration[0m | &gt; process          | 'exarpcserver'[0m
01:02:24 | 3360   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
01:02:24 | 3360   | [01;31mconfiguration[0m | [1m        [0m
01:02:24 | 3360   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
01:02:24 | 3360   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
01:02:24 | 3360   | [01;31mconfiguration[0m | [1m        [0m
01:02:24 | 3360   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:30.304244" level="INFO">${output} = [?2004l01:02:24 | 3360   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:02:24 | 3360   | [01;34mversion      [0m | [1m4.2.17  [0m
01:02:24 | 3360   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-10-11T01:02:30.303504" elapsed="0.000813"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:30.305383" level="INFO">[?2004l01:02:24 | 3360   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:02:24 | 3360   | [01;34mversion      [0m | [1m4.2.17  [0m
01:02:24 | 3360   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
01:02:24 | 3360   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
01:02:24 | 3360   | [01;34minstallation [0m | [1m        [0m
01:02:24 | 3360   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
01:02:24 | 3360   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
01:02:24 | 3360   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:02:24 | 3360   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:02:24 | 3360   | [01;31mcli control  [0m | [1m - /run/[0m
01:02:24 | 3360   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:02:24 | 3360   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:02:24 | 3360   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:02:24 | 3360   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:02:24 | 3360   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:02:24 | 3360   | [01;31mcli control  [0m | [1m - /run/[0m
01:02:24 | 3360   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:02:24 | 3360   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:02:24 | 3360   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:02:24 | 3360   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
01:02:24 | 3360   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
01:02:24 | 3360   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
01:02:24 | 3360   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
01:02:24 | 3360   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
01:02:24 | 3360   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
01:02:24 | 3360   | configuration[0m | . router-id        | '10.30.171.7'[0m
01:02:24 | 3360   | configuration[0m | . local-address    | '10.30.171.7'[0m
01:02:24 | 3360   | configuration[0m | . local-as         | '64496'[0m
01:02:24 | 3360   | configuration[0m | . peer-as          | '64496'[0m
01:02:24 | 3360   | configuration[0m | &gt; capability       | [0m
01:02:24 | 3360   | configuration[0m | . route-refresh    | 'disable'[0m
01:02:24 | 3360   | configuration[0m | . add-path         | 'send/receive'[0m
01:02:24 | 3360   | configuration[0m | &lt; capability       | [0m
01:02:24 | 3360   | configuration[0m | &gt; family           | [0m
01:02:24 | 3360   | configuration[0m | . ipv4             | 'unicast'[0m
01:02:24 | 3360   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
01:02:24 | 3360   | configuration[0m | &lt; family           | [0m
01:02:24 | 3360   | configuration[0m | &gt; process          | 'exarpcserver'[0m
01:02:24 | 3360   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
01:02:24 | 3360   | [01;31mconfiguration[0m | [1m        [0m
01:02:24 | 3360   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
01:02:24 | 3360   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
01:02:24 | 3360   | [01;31mconfiguration[0m | [1m        [0m
01:02:24 | 3360   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:30.304827" elapsed="0.000831"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:30.307493" 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-10-11T01:02:30.306770" elapsed="0.000784"/>
</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-10-11T01:02:30.307888" elapsed="0.000453"/>
</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-10-11T01:02:30.306105" elapsed="0.002412"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:02:30.311980" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:30.312188" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:30.308875" elapsed="0.003373"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:30.313235" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:30.312712" elapsed="0.000624"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:02:30.316771" 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-10-11T01:02:30.314703" elapsed="0.002182"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:02:30.318714" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:30.318880" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-423-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-10-11T01:02:30.317300" elapsed="0.001633"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:30.320247" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-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-10-11T01:02:30.319687" elapsed="0.000686"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:30.319090" elapsed="0.001407"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:30.319050" elapsed="0.001523"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-10-11T01:02:30.313879" elapsed="0.006822"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-10-11T01:02:30.302832" elapsed="0.017993"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:30.302254" elapsed="0.018624"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:30.302203" elapsed="0.018721"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-10-11T01:02:30.321532" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:30.321290" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:30.321000" elapsed="0.000730"/>
</if>
<var name="${idx}">0</var>
<status status="PASS" start="2026-10-11T01:02:24.210853" elapsed="6.110932"/>
</iter>
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:30.323903" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:30.323242" elapsed="0.000718"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:30.325094" 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-10-11T01:02:30.324566" elapsed="0.000622"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:02:30.329545" 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-10-11T01:02:30.326550" elapsed="0.003111"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:02:30.334129" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:30.334315" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:30.330059" elapsed="0.004310"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:30.335713" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:30.335373" elapsed="0.000401"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:30.334540" elapsed="0.001277"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:30.334499" elapsed="0.001350"/>
</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-10-11T01:02:30.325707" elapsed="0.010202"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:02:30.338108" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<msg time="2026-10-11T01:02:30.338220" 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-10-11T01:02:30.336135" elapsed="0.002118"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:30.338860" 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-10-11T01:02:30.338544" elapsed="0.000386"/>
</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-10-11T01:02:30.322543" elapsed="0.016467"/>
</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-10-11T01:02:30.341552" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:30.341102" elapsed="0.000486"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:30.342241" 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-10-11T01:02:30.341830" elapsed="0.000445"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:02:30.346930" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:30.347100" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:02:30.347231" 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-10-11T01:02:30.342511" elapsed="0.004754"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:30.347959" 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-10-11T01:02:30.347574" elapsed="0.000445"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:02:30.348896" 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-10-11T01:02:30.348339" elapsed="0.000636">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-10-11T01:02:30.340520" elapsed="0.008616">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:33.352150" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:33.351245" elapsed="0.000975"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:33.353364" 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-10-11T01:02:33.352660" elapsed="0.000796"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:02:33.361388" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:33.361782" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:02:33.362018" 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-10-11T01:02:33.353941" elapsed="0.008190"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:33.363745" 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-10-11T01:02:33.362796" elapsed="0.001084"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:02:33.365533" 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-10-11T01:02:33.364458" elapsed="0.001252">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-10-11T01:02:33.349992" elapsed="0.015998">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:36.369005" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:36.368199" elapsed="0.000893"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:36.370216" 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-10-11T01:02:36.369529" elapsed="0.000742"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:02:36.377624" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:36.377889" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:02:36.378110" 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-10-11T01:02:36.370655" elapsed="0.007512"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:36.379336" 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-10-11T01:02:36.378657" elapsed="0.000813"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:02:36.380712" 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-10-11T01:02:36.379848" elapsed="0.001005">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-10-11T01:02:36.366966" elapsed="0.014138">200.0 != 409.0</status>
</kw>
<msg time="2026-10-11T01:02:36.381288" 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-10-11T01:02:30.339843" elapsed="6.042214">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</status>
</kw>
<msg time="2026-10-11T01:02:36.382305" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T01:02:36.382397" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:30.339267" elapsed="6.043213"/>
</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-10-11T01:02:36.384171" level="INFO">[?2004l01:02:30 | 3364   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:02:30 | 3364   | [01;34mversion      [0m | [1m4.2.17  [0m
01:02:30 | 3364   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
01:02:30 | 3364   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
01:02:30 | 3364   | [01;34minstallation [0m | [1m        [0m
01:02:30 | 3364   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
01:02:30 | 3364   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
01:02:30 | 3364   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:02:30 | 3364   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:02:30 | 3364   | [01;31mcli control  [0m | [1m - /run/[0m
01:02:30 | 3364   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:02:30 | 3364   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:02:30 | 3364   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:02:30 | 3364   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:02:30 | 3364   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:02:30 | 3364   | [01;31mcli control  [0m | [1m - /run/[0m
01:02:30 | 3364   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:02:30 | 3364   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:02:30 | 3364   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:02:30 | 3364   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
01:02:30 | 3364   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
01:02:30 | 3364   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
01:02:30 | 3364   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
01:02:30 | 3364   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
01:02:30 | 3364   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
01:02:30 | 3364   | configuration[0m | . router-id        | '10.30.171.7'[0m
01:02:30 | 3364   | configuration[0m | . local-address    | '10.30.171.7'[0m
01:02:30 | 3364   | configuration[0m | . local-as         | '64496'[0m
01:02:30 | 3364   | configuration[0m | . peer-as          | '64496'[0m
01:02:30 | 3364   | configuration[0m | &gt; capability       | [0m
01:02:30 | 3364   | configuration[0m | . route-refresh    | 'disable'[0m
01:02:30 | 3364   | configuration[0m | . add-path         | 'send/receive'[0m
01:02:30 | 3364   | configuration[0m | &lt; capability       | [0m
01:02:30 | 3364   | configuration[0m | &gt; family           | [0m
01:02:30 | 3364   | configuration[0m | . ipv4             | 'unicast'[0m
01:02:30 | 3364   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
01:02:30 | 3364   | configuration[0m | &lt; family           | [0m
01:02:30 | 3364   | configuration[0m | &gt; process          | 'exarpcserver'[0m
01:02:30 | 3364   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
01:02:30 | 3364   | [01;31mconfiguration[0m | [1m        [0m
01:02:30 | 3364   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
01:02:30 | 3364   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
01:02:30 | 3364   | [01;31mconfiguration[0m | [1m        [0m
01:02:30 | 3364   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:36.384623" level="INFO">${output} = [?2004l01:02:30 | 3364   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:02:30 | 3364   | [01;34mversion      [0m | [1m4.2.17  [0m
01:02:30 | 3364   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-10-11T01:02:36.383908" elapsed="0.000780"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:36.385687" level="INFO">[?2004l01:02:30 | 3364   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:02:30 | 3364   | [01;34mversion      [0m | [1m4.2.17  [0m
01:02:30 | 3364   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
01:02:30 | 3364   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
01:02:30 | 3364   | [01;34minstallation [0m | [1m        [0m
01:02:30 | 3364   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
01:02:30 | 3364   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
01:02:30 | 3364   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:02:30 | 3364   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:02:30 | 3364   | [01;31mcli control  [0m | [1m - /run/[0m
01:02:30 | 3364   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:02:30 | 3364   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:02:30 | 3364   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:02:30 | 3364   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:02:30 | 3364   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:02:30 | 3364   | [01;31mcli control  [0m | [1m - /run/[0m
01:02:30 | 3364   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:02:30 | 3364   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:02:30 | 3364   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:02:30 | 3364   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
01:02:30 | 3364   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
01:02:30 | 3364   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
01:02:30 | 3364   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
01:02:30 | 3364   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
01:02:30 | 3364   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
01:02:30 | 3364   | configuration[0m | . router-id        | '10.30.171.7'[0m
01:02:30 | 3364   | configuration[0m | . local-address    | '10.30.171.7'[0m
01:02:30 | 3364   | configuration[0m | . local-as         | '64496'[0m
01:02:30 | 3364   | configuration[0m | . peer-as          | '64496'[0m
01:02:30 | 3364   | configuration[0m | &gt; capability       | [0m
01:02:30 | 3364   | configuration[0m | . route-refresh    | 'disable'[0m
01:02:30 | 3364   | configuration[0m | . add-path         | 'send/receive'[0m
01:02:30 | 3364   | configuration[0m | &lt; capability       | [0m
01:02:30 | 3364   | configuration[0m | &gt; family           | [0m
01:02:30 | 3364   | configuration[0m | . ipv4             | 'unicast'[0m
01:02:30 | 3364   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
01:02:30 | 3364   | configuration[0m | &lt; family           | [0m
01:02:30 | 3364   | configuration[0m | &gt; process          | 'exarpcserver'[0m
01:02:30 | 3364   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
01:02:30 | 3364   | [01;31mconfiguration[0m | [1m        [0m
01:02:30 | 3364   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
01:02:30 | 3364   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
01:02:30 | 3364   | [01;31mconfiguration[0m | [1m        [0m
01:02:30 | 3364   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:36.385137" elapsed="0.000797"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:36.387769" 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-10-11T01:02:36.387066" elapsed="0.000764"/>
</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-10-11T01:02:36.388191" elapsed="0.000452"/>
</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-10-11T01:02:36.386382" elapsed="0.002401"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:02:36.392072" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:36.392259" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:36.389164" elapsed="0.003152"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:36.393285" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:36.392769" elapsed="0.000614"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:02:36.396778" 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-10-11T01:02:36.394721" elapsed="0.002168"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:02:36.398692" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:36.398860" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-423-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-10-11T01:02:36.397276" elapsed="0.001638"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:36.400180" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-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-10-11T01:02:36.399662" elapsed="0.000614"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:36.399069" elapsed="0.001274"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:36.399008" elapsed="0.001388"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-10-11T01:02:36.393912" elapsed="0.006619"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-10-11T01:02:36.383244" elapsed="0.017389"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:36.382677" elapsed="0.018010"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:36.382628" elapsed="0.018106"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-10-11T01:02:36.401068" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:36.400845" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:36.400811" elapsed="0.000449"/>
</if>
<var name="${idx}">1</var>
<status status="PASS" start="2026-10-11T01:02:30.322149" elapsed="6.079165"/>
</iter>
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:36.403461" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:36.402790" elapsed="0.000730"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:36.404478" 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-10-11T01:02:36.403949" elapsed="0.000623"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:02:36.408767" 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-10-11T01:02:36.405864" elapsed="0.003016"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:02:36.413277" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:36.413485" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:36.409275" elapsed="0.004268"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:36.414786" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:36.414256" elapsed="0.000627"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:36.413678" elapsed="0.001272"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:36.413640" elapsed="0.001361"/>
</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-10-11T01:02:36.405079" elapsed="0.010043"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:02:36.417808" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<msg time="2026-10-11T01:02:36.417919" 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-10-11T01:02:36.415492" elapsed="0.002460"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:36.418563" 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-10-11T01:02:36.418233" elapsed="0.000389"/>
</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-10-11T01:02:36.402080" elapsed="0.016612"/>
</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-10-11T01:02:36.421603" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:36.420945" elapsed="0.000694"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:36.422294" 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-10-11T01:02:36.421881" elapsed="0.000447"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:02:36.426942" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:36.427105" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:02:36.427236" 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-10-11T01:02:36.422569" elapsed="0.004701"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:36.427960" 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-10-11T01:02:36.427574" elapsed="0.000461"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:02:36.428784" 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-10-11T01:02:36.428271" elapsed="0.000593">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-10-11T01:02:36.420357" elapsed="0.008639">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:39.431856" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:39.431058" elapsed="0.000865"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:39.433059" 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-10-11T01:02:39.432344" elapsed="0.000772"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:02:39.440796" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:39.441102" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:02:39.441309" 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-10-11T01:02:39.433633" elapsed="0.007732"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:39.442604" 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-10-11T01:02:39.441876" elapsed="0.000831"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:02:39.443950" 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-10-11T01:02:39.443107" elapsed="0.001004">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-10-11T01:02:39.429876" elapsed="0.014462">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.447225" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:42.446438" elapsed="0.000853"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.448443" 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-10-11T01:02:42.447722" elapsed="0.000779"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:02:42.456052" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:42.456321" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:02:42.456553" 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-10-11T01:02:42.448857" elapsed="0.007754"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.457783" 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-10-11T01:02:42.457094" elapsed="0.000791"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.459156" 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-10-11T01:02:42.458290" elapsed="0.001008">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-10-11T01:02:42.445259" elapsed="0.014297">200.0 != 409.0</status>
</kw>
<msg time="2026-10-11T01:02:42.459741" 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-10-11T01:02:36.419716" elapsed="6.040209">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</status>
</kw>
<msg time="2026-10-11T01:02:42.460192" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T01:02:42.460283" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:36.418908" elapsed="6.041426"/>
</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-10-11T01:02:42.462065" level="INFO">[?2004l01:02:36 | 3368   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:02:36 | 3368   | [01;34mversion      [0m | [1m4.2.17  [0m
01:02:36 | 3368   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
01:02:36 | 3368   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
01:02:36 | 3368   | [01;34minstallation [0m | [1m        [0m
01:02:36 | 3368   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
01:02:36 | 3368   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
01:02:36 | 3368   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:02:36 | 3368   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:02:36 | 3368   | [01;31mcli control  [0m | [1m - /run/[0m
01:02:36 | 3368   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:02:36 | 3368   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:02:36 | 3368   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:02:36 | 3368   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:02:36 | 3368   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:02:36 | 3368   | [01;31mcli control  [0m | [1m - /run/[0m
01:02:36 | 3368   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:02:36 | 3368   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:02:36 | 3368   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:02:36 | 3368   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
01:02:36 | 3368   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
01:02:36 | 3368   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
01:02:36 | 3368   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
01:02:36 | 3368   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
01:02:36 | 3368   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
01:02:36 | 3368   | configuration[0m | . router-id        | '10.30.171.7'[0m
01:02:36 | 3368   | configuration[0m | . local-address    | '10.30.171.7'[0m
01:02:36 | 3368   | configuration[0m | . local-as         | '64496'[0m
01:02:36 | 3368   | configuration[0m | . peer-as          | '64496'[0m
01:02:36 | 3368   | configuration[0m | &gt; capability       | [0m
01:02:36 | 3368   | configuration[0m | . route-refresh    | 'disable'[0m
01:02:36 | 3368   | configuration[0m | . add-path         | 'send/receive'[0m
01:02:36 | 3368   | configuration[0m | &lt; capability       | [0m
01:02:36 | 3368   | configuration[0m | &gt; family           | [0m
01:02:36 | 3368   | configuration[0m | . ipv4             | 'unicast'[0m
01:02:36 | 3368   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
01:02:36 | 3368   | configuration[0m | &lt; family           | [0m
01:02:36 | 3368   | configuration[0m | &gt; process          | 'exarpcserver'[0m
01:02:36 | 3368   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
01:02:36 | 3368   | [01;31mconfiguration[0m | [1m        [0m
01:02:36 | 3368   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
01:02:36 | 3368   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
01:02:36 | 3368   | [01;31mconfiguration[0m | [1m        [0m
01:02:36 | 3368   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:42.462527" level="INFO">${output} = [?2004l01:02:36 | 3368   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:02:36 | 3368   | [01;34mversion      [0m | [1m4.2.17  [0m
01:02:36 | 3368   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-10-11T01:02:42.461804" elapsed="0.000787"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.463564" level="INFO">[?2004l01:02:36 | 3368   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:02:36 | 3368   | [01;34mversion      [0m | [1m4.2.17  [0m
01:02:36 | 3368   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
01:02:36 | 3368   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
01:02:36 | 3368   | [01;34minstallation [0m | [1m        [0m
01:02:36 | 3368   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
01:02:36 | 3368   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
01:02:36 | 3368   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:02:36 | 3368   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:02:36 | 3368   | [01;31mcli control  [0m | [1m - /run/[0m
01:02:36 | 3368   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:02:36 | 3368   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:02:36 | 3368   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:02:36 | 3368   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:02:36 | 3368   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:02:36 | 3368   | [01;31mcli control  [0m | [1m - /run/[0m
01:02:36 | 3368   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:02:36 | 3368   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:02:36 | 3368   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:02:36 | 3368   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
01:02:36 | 3368   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
01:02:36 | 3368   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
01:02:36 | 3368   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
01:02:36 | 3368   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
01:02:36 | 3368   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
01:02:36 | 3368   | configuration[0m | . router-id        | '10.30.171.7'[0m
01:02:36 | 3368   | configuration[0m | . local-address    | '10.30.171.7'[0m
01:02:36 | 3368   | configuration[0m | . local-as         | '64496'[0m
01:02:36 | 3368   | configuration[0m | . peer-as          | '64496'[0m
01:02:36 | 3368   | configuration[0m | &gt; capability       | [0m
01:02:36 | 3368   | configuration[0m | . route-refresh    | 'disable'[0m
01:02:36 | 3368   | configuration[0m | . add-path         | 'send/receive'[0m
01:02:36 | 3368   | configuration[0m | &lt; capability       | [0m
01:02:36 | 3368   | configuration[0m | &gt; family           | [0m
01:02:36 | 3368   | configuration[0m | . ipv4             | 'unicast'[0m
01:02:36 | 3368   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
01:02:36 | 3368   | configuration[0m | &lt; family           | [0m
01:02:36 | 3368   | configuration[0m | &gt; process          | 'exarpcserver'[0m
01:02:36 | 3368   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
01:02:36 | 3368   | [01;31mconfiguration[0m | [1m        [0m
01:02:36 | 3368   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
01:02:36 | 3368   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
01:02:36 | 3368   | [01;31mconfiguration[0m | [1m        [0m
01:02:36 | 3368   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:42.463034" elapsed="0.000769"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.466131" 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-10-11T01:02:42.465442" elapsed="0.000749"/>
</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-10-11T01:02:42.466567" elapsed="0.000417"/>
</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-10-11T01:02:42.464748" elapsed="0.002397"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:02:42.470366" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:42.470579" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:42.467536" elapsed="0.003101"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.471622" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:42.471086" elapsed="0.000638"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:02:42.474965" 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-10-11T01:02:42.473074" elapsed="0.002027"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:02:42.476887" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:42.477074" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-423-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-10-11T01:02:42.475499" elapsed="0.001630"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.478369" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-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-10-11T01:02:42.477853" elapsed="0.000643"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:42.477262" elapsed="0.001303"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.477224" elapsed="0.001394"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-10-11T01:02:42.472259" elapsed="0.006454"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-10-11T01:02:42.461131" elapsed="0.017686"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:42.460570" elapsed="0.018301"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.460520" elapsed="0.018399"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-10-11T01:02:42.479258" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:42.479052" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.478995" elapsed="0.000483"/>
</if>
<var name="${idx}">2</var>
<status status="PASS" start="2026-10-11T01:02:36.401696" elapsed="6.077841"/>
</iter>
<var>${idx}</var>
<value>${connection_retries}</value>
<status status="PASS" start="2026-10-11T01:02:24.210447" elapsed="18.269158"/>
</for>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.480605" level="FAIL">Unable to connect ExaBgp to ODL</msg>
<arg>Unable to connect ExaBgp to ODL</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-10-11T01:02:42.479957" elapsed="0.000773">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-10-11T01:02:24.209574" elapsed="18.271358">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-10-11T01:02:21.998946" elapsed="20.482213">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-10-11T01:02:42.483338" level="INFO">&amp;{mapping} = { IP=10.30.171.7 | 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-10-11T01:02:42.482435" elapsed="0.000961"/>
</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-10-11T01:02:42.508141" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:42.507703" elapsed="0.000475"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:42.509166" 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-10-11T01:02:42.508867" elapsed="0.000377">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-10-11T01:02:42.509360" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:42.508400" elapsed="0.000991"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.510102" 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-10-11T01:02:42.509652" elapsed="0.000485"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:02:42.510598" 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-10-11T01:02:42.510787" 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-10-11T01:02:42.510437" elapsed="0.000385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.511450" 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-10-11T01:02:42.511124" 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-10-11T01:02:42.513061" level="INFO">mapping: {'IP': '10.30.171.7', '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-10-11T01:02:42.512724" elapsed="0.000395"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.513725" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:02:42.513360" elapsed="0.000397"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.514623" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:42.514232" elapsed="0.000425"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:42.515702" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:42.515383" elapsed="0.000353"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:42.515798" elapsed="0.000044"/>
</return>
<msg time="2026-10-11T01:02:42.515978" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:42.514893" 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-10-11T01:02:42.516254" elapsed="0.000287"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T01:02:42.514046" elapsed="0.002548"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.517354" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:42.516963" elapsed="0.000424"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:42.518376" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:42.518127" elapsed="0.000302"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:42.518493" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T01:02:42.518667" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:42.517642" 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-10-11T01:02:42.518921" elapsed="0.000245"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:02:42.516783" elapsed="0.002435"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:02:42.513822" elapsed="0.005439"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:02:42.519314" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T01:02:42.519513" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:02:42.511949" elapsed="0.007598"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:42.511595" elapsed="0.007992"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:42.519821" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:42.519618" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.511570" elapsed="0.008347"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.521075" 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-10-11T01:02:42.520149" elapsed="0.000974"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:02:42.521200" 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/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-10-11T01:02:42.506922" elapsed="0.014452"/>
</kw>
<msg time="2026-10-11T01:02:42.521486" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:42.500333" elapsed="0.021270"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:42.526340" 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/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-10-11T01:02:42.530615" 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/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-10-11T01:02:42.535041" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:42.535224" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:42.535415" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:42.535789" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:42.535645" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:02:42.535631" 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-10-11T01:02:42.536047" 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-10-11T01:02:42.536229" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:42.536392" elapsed="0.000033"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:02:42.535606" elapsed="0.000850"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:02:42.535515" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:42.536632" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:02:42.536698" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:02:42.536810" 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-10-11T01:02:42.499356" elapsed="0.037479"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.537870" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:42.537647" elapsed="0.000266"/>
</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-10-11T01:02:42.546246" level="INFO">DELETE Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:42.546331" level="INFO">DELETE Response : url=http://10.30.170.173: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.171.7 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:42.546535" 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-10-11T01:02:42.538213" elapsed="0.008376"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:42.537973" elapsed="0.008696"/>
</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-10-11T01:02:42.546984" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:42.546722" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.537956" elapsed="0.009118"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.548294" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:42.548006" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:42.547769" elapsed="0.000596"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.547751" elapsed="0.000636"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.548957" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:42.548694" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:42.548452" elapsed="0.000592"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.548436" elapsed="0.000631"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.549619" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:42.549254" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:42.549917" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:42.549707" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.550488" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:42.550202" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:42.550034" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.549690" elapsed="0.000876"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.551098" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:42.550739" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:42.551391" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:42.551185" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.551902" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:42.551641" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:42.551481" elapsed="0.000477"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.551169" elapsed="0.000809"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:42.552134" elapsed="0.000306"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:02:42.552846" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:42.552619" elapsed="0.000251"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:02:42.553035" elapsed="0.000215"/>
</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-10-11T01:02:42.547399" elapsed="0.005907"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:02:42.553347" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:42.553581" 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-10-11T01:02:42.537087" elapsed="0.016519"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:02:42.553653" elapsed="0.000025"/>
</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-10-11T01:02:42.483882" elapsed="0.069867"/>
</kw>
<kw name="Deconfigure_App_Peer">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.554487" level="INFO">${app_rib} = 10.30.170.173</msg>
<var>${app_rib}</var>
<arg>${ODL_SYSTEM_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:42.554213" elapsed="0.000298"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.555081" level="INFO">&amp;{route_mapping} = { APP_RIB=10.30.170.173 | 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-10-11T01:02:42.554689" elapsed="0.000418"/>
</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-10-11T01:02:42.569079" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:42.568761" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:42.569821" 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-10-11T01:02:42.569604" elapsed="0.000284">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-10-11T01:02:42.569972" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:42.569269" elapsed="0.000725"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.570504" 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-10-11T01:02:42.570177" elapsed="0.000355"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:02:42.570813" 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-10-11T01:02:42.570955" 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-10-11T01:02:42.570702" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.571512" 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-10-11T01:02:42.571233" 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-10-11T01:02:42.572511" level="INFO">mapping: {'APP_RIB': '10.30.170.173', '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-10-11T01:02:42.572263" elapsed="0.000290"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.572977" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:02:42.572725" elapsed="0.000276"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.573623" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:42.573335" elapsed="0.000312"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:42.574577" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:42.574161" elapsed="0.000441"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:42.574649" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:02:42.574778" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:42.573816" 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-10-11T01:02:42.574979" elapsed="0.000186"/>
</kw>
<var name="${key}">APP_RIB</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:02:42.573204" elapsed="0.001998"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.575711" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:42.575444" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:42.576752" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:42.576373" elapsed="0.000404"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:42.576822" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:42.576946" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:42.575899" elapsed="0.001070"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:42.577142" elapsed="0.000166"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:02:42.575300" elapsed="0.002044"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:02:42.573060" elapsed="0.004316"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:02:42.577436" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:42.577565" level="INFO">${mapping_to_use} = {'APP_RIB': '10.30.170.173', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:02:42.571880" elapsed="0.005709"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:42.571629" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:42.577785" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:42.577640" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.571609" elapsed="0.006244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.578541" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:02:42.578008" elapsed="0.000559"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:02:42.578611" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:42.568222" elapsed="0.010487"/>
</kw>
<msg time="2026-10-11T01:02:42.578758" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:42.563739" elapsed="0.015075"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:42.583182" 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/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-10-11T01:02:42.587481" 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/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-10-11T01:02:42.591732" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:42.591909" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:42.592101" 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-10-11T01:02:42.592448" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:42.592292" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:02:42.592278" 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-10-11T01:02:42.592675" 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-10-11T01:02:42.592851" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:42.593030" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:02:42.592253" elapsed="0.000827"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:02:42.592167" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:42.593253" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:02:42.593319" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:02:42.593441" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:02:42.563071" elapsed="0.030396"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.594495" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:02:42.594257" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:02:42.601070" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:42.601114" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:02:42.601205" 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-10-11T01:02:42.594823" elapsed="0.006407"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:42.594599" elapsed="0.006668"/>
</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-10-11T01:02:42.601459" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:42.601291" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.594583" elapsed="0.006985"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.602787" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:42.602512" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:42.602260" elapsed="0.000600"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.602243" elapsed="0.000640"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.603510" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:42.603226" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:42.602933" elapsed="0.000650"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.602918" elapsed="0.000687"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.604157" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:42.603788" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:42.604470" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:42.604245" elapsed="0.000277"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.604971" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:42.604706" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:42.604545" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.604228" elapsed="0.000838"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.605595" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:42.605240" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:42.605889" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:42.605683" elapsed="0.000257"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.606566" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:42.606135" elapsed="0.000458"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:42.605962" elapsed="0.000664"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.605666" elapsed="0.000980"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:42.606789" elapsed="0.000314"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:02:42.607500" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:42.607262" elapsed="0.000263"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:02:42.607677" elapsed="0.000213"/>
</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-10-11T01:02:42.601889" elapsed="0.006056"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:02:42.607986" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T01:02:42.608173" 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-10-11T01:02:42.593700" elapsed="0.014497"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:02:42.608244" elapsed="0.000024"/>
</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-10-11T01:02:42.555305" elapsed="0.053034"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.608995" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | APP_PEER_NAME=example-bgp-peer-app | IP=10.30.170.173 | 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-10-11T01:02:42.608540" elapsed="0.000492"/>
</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-10-11T01:02:42.622609" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:42.622292" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:42.623302" 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-10-11T01:02:42.623115" elapsed="0.000246">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-10-11T01:02:42.623497" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:42.622791" elapsed="0.000729"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.623999" 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-10-11T01:02:42.623692" elapsed="0.000517"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:02:42.624499" 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-10-11T01:02:42.624616" 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-10-11T01:02:42.624374" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.625062" 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-10-11T01:02:42.624831" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.626036" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'APP_PEER_NAME': 'example-bgp-peer-app', 'IP': '10.30.170.173', '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-10-11T01:02:42.625791" elapsed="0.000289"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.626513" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:02:42.626252" elapsed="0.000286"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.627126" 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-10-11T01:02:42.626849" elapsed="0.000301"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:42.628031" 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-10-11T01:02:42.627660" elapsed="0.000396"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:42.628102" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:02:42.628228" 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-10-11T01:02:42.627316" elapsed="0.000935"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:42.628431" elapsed="0.000168"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T01:02:42.626720" elapsed="0.001915"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.629295" 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-10-11T01:02:42.629005" elapsed="0.000315"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:42.630212" 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-10-11T01:02:42.629844" elapsed="0.000393"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:42.630281" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:42.630424" 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-10-11T01:02:42.629514" elapsed="0.000935"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:42.630611" elapsed="0.000166"/>
</kw>
<var name="${key}">APP_PEER_NAME</var>
<var name="${value}">example-bgp-peer-app</var>
<status status="PASS" start="2026-10-11T01:02:42.628734" elapsed="0.002080"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.631322" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:42.631053" elapsed="0.000294"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:42.632253" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:42.631883" elapsed="0.000394"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:42.632320" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:02:42.632473" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:42.631550" 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-10-11T01:02:42.632657" elapsed="0.000164"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:02:42.630913" elapsed="0.001944"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.633436" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:42.633140" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:42.634331" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:42.633965" elapsed="0.000390"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:42.634398" elapsed="0.000049"/>
</return>
<msg time="2026-10-11T01:02:42.634545" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:42.633637" 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-10-11T01:02:42.634727" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:02:42.632992" elapsed="0.001936"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:02:42.626580" elapsed="0.008379"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:02:42.634996" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T01:02:42.635144" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'APP_PEER_NAME': 'example-bgp-peer-app', 'IP': '10.30.170.173', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:02:42.625427" elapsed="0.009741"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:42.625165" elapsed="0.010031"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:42.635366" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:42.635219" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.625147" elapsed="0.010313"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.636240" 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-10-11T01:02:42.635628" elapsed="0.000639"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:02:42.636310" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:42.621760" elapsed="0.014668"/>
</kw>
<msg time="2026-10-11T01:02:42.636478" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:42.617264" 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/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-10-11T01:02:42.640984" 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/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-10-11T01:02:42.645272" 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/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-10-11T01:02:42.649547" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:42.649731" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:42.649910" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:42.650292" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:42.650146" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:02:42.650133" 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-10-11T01:02:42.650537" 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-10-11T01:02:42.650716" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:42.650876" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:02:42.650108" elapsed="0.000815"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:02:42.650006" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:42.651108" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:02:42.651174" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:02:42.651284" 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-10-11T01:02:42.616619" elapsed="0.034690"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.652341" 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.173</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:42.652117" elapsed="0.000268"/>
</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-10-11T01:02:42.660467" level="INFO">DELETE Request : url=http://10.30.170.173: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.173 
 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.173 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:42.660517" level="INFO">DELETE Response : url=http://10.30.170.173: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.173 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:42.660596" 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-10-11T01:02:42.652689" elapsed="0.007931"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:42.652461" elapsed="0.008195"/>
</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-10-11T01:02:42.660827" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:42.660680" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.652444" elapsed="0.008457"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.662145" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:42.661861" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:42.661608" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.661591" elapsed="0.000647"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.662815" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:42.662535" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:42.662286" elapsed="0.000602"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.662272" elapsed="0.000637"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.663450" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:42.663093" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:42.663744" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:42.663538" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.664291" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:42.664026" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:42.663850" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.663522" elapsed="0.000845"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.664891" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:42.664556" elapsed="0.000360"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:42.665204" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:42.664978" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.665716" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:42.665450" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:42.665277" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.664962" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:42.665932" elapsed="0.000304"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:02:42.666628" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:42.666393" elapsed="0.000260"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:02:42.666803" elapsed="0.000219"/>
</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-10-11T01:02:42.661228" elapsed="0.005850"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:02:42.667119" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:02:42.667291" 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-10-11T01:02:42.651551" elapsed="0.015763"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:02:42.667361" elapsed="0.000024"/>
</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-10-11T01:02:42.609237" elapsed="0.058236"/>
</kw>
<doc>Revert the BGP configuration to the original state: without application peer</doc>
<status status="PASS" start="2026-10-11T01:02:42.553889" elapsed="0.113646"/>
</kw>
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-10-11T01:02:42.668203" level="INFO">${output} =  </msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-10-11T01:02:42.668045" elapsed="0.000182"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.669871" level="INFO"> </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:42.668429" elapsed="0.001485"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.670727" 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-10-11T01:02:42.670439" elapsed="0.000314"/>
</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-10-11T01:02:42.670903" 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-10-11T01:02:42.670117" elapsed="0.001067"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:02:42.672946" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:42.673038" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-423-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-10-11T01:02:42.671352" elapsed="0.001713"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.673489" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-423-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-10-11T01:02:42.673256" elapsed="0.000277"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:02:42.675632" 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-10-11T01:02:42.674128" elapsed="0.001554"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:02:42.852659" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:42.852859" level="INFO">${output} = [?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-423-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-10-11T01:02:42.675846" elapsed="0.177042"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.853763" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-423-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-10-11T01:02:42.853430" elapsed="0.000379"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:42.853033" elapsed="0.000872"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.852980" elapsed="0.000953"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-10-11T01:02:42.673752" elapsed="0.180235"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-10-11T01:02:42.667735" elapsed="0.186320"/>
</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-10-11T01:02:42.855227" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:42.854864" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.854847" elapsed="0.000459"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:42.855470" elapsed="0.000294"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.858142" 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-10-11T01:02:42.857742" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-10-11T01:02:42.858348" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:42.858235" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.858218" elapsed="0.000208"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.858892" 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-10-11T01:02:42.858589" elapsed="0.000329"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:42.859321" 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-10-11T01:02:42.859102" elapsed="0.000243"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-10-11T01:02:42.859665" 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-10-11T01:02:42.859519" elapsed="0.000171"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.860156" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:42.859845" elapsed="0.000336"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.860651" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:42.860336" elapsed="0.000343"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.861219" 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 of the current test case.</doc>
<status status="PASS" start="2026-10-11T01:02:42.860838" elapsed="0.000429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.861735" 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-10-11T01:02:42.861478" elapsed="0.000303"/>
</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-10-11T01:02:42.857425" elapsed="0.004407"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:42.854663" elapsed="0.007215"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-10-11T01:02:42.854256" elapsed="0.007660"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:42.481673" elapsed="0.380289"/>
</kw>
<doc>all-paths selected policy selected</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-10-11T01:02:21.998436" elapsed="20.863568">... 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-10-11T01:02:42.863703" elapsed="0.000403"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:02:42.863452" elapsed="0.000705"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:02:42.865234" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:42.865145" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.865127" elapsed="0.000171"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:02:42.867327" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:42.867245" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.867228" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.868307" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:02:42.867962" elapsed="0.000370"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.868760" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:02:42.868499" elapsed="0.000285"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:02:42.868824" elapsed="0.000034"/>
</return>
<msg time="2026-10-11T01:02:42.868957" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:02:42.867609" elapsed="0.001371"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:02:42.871582" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:42.871497" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.871479" elapsed="0.000168"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:02:42.872773" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:42.872688" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.872670" elapsed="0.000242"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:02:42.873457" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:02:42.873080" elapsed="0.000403"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:02:42.873900" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:02:42.873694" elapsed="0.000230"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:02:42.910627" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:02:42.875395" elapsed="0.035387"/>
</kw>
<msg time="2026-10-11T01:02:42.910916" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:02:42.910959" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:42.874125" elapsed="0.036870"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:02:42.952672" 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-10-11T01:02:42.912572" elapsed="0.040261"/>
</kw>
<msg time="2026-10-11T01:02:42.952958" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:02:42.952999" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:42.911246" elapsed="0.041806"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:42.953441" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:42.953171" elapsed="0.000431"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.953152" elapsed="0.000475"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.954350" 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-10-11T01:02:42.953812" elapsed="0.000663"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:42.954930" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:42.954564" elapsed="0.000610"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.954546" elapsed="0.000655"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:02:42.955234" 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-10-11T01:02:42.957839" elapsed="0.000120"/>
</kw>
<msg time="2026-10-11T01:02:42.957999" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:42.957329" elapsed="0.000749"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:42.958314" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:42.958584" 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-10-11T01:02:42.956468" elapsed="0.002282"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:02:42.955560" elapsed="0.003287"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:02:42.872427" elapsed="0.086495"/>
</kw>
<msg time="2026-10-11T01:02:42.959005" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:02:42.959059" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:42.871798" elapsed="0.087298"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:02:42.959249" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:02:42.959165" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.959147" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:42.959756" 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-10-11T01:02:42.960105" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:02:42.960170" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T01:02:42.871193" elapsed="0.089061"/>
</kw>
<msg time="2026-10-11T01:02:42.960338" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:02:42.960377" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:42.869334" elapsed="0.091094"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:42.960715" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:42.960496" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.960480" elapsed="0.000305"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:02:42.869192" elapsed="0.091615"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:02:42.869046" elapsed="0.091791"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:02:42.866940" elapsed="0.093945"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:02:42.864874" elapsed="0.096061"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:42.864309" elapsed="0.096667"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:02:42.863071" elapsed="0.097972"/>
</kw>
<kw name="Configure_Odl_Peer_With_Path_Selection_Mode">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.961859" 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-10-11T01:02:42.961519" elapsed="0.000364"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.962614" level="INFO">&amp;{mapping} = { IP=10.30.171.7 | 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-10-11T01:02:42.962080" elapsed="0.000560"/>
</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-10-11T01:02:42.973836" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:42.973509" elapsed="0.000357"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:42.974606" 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-10-11T01:02:42.974371" elapsed="0.000307">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-10-11T01:02:42.974764" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:42.974043" elapsed="0.000744"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.975287" 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-10-11T01:02:42.974961" elapsed="0.000352"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:02:42.975611" 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-10-11T01:02:42.975780" 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-10-11T01:02:42.975496" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.976242" 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-10-11T01:02:42.976001" 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-10-11T01:02:42.977246" level="INFO">mapping: {'IP': '10.30.171.7', '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-10-11T01:02:42.976992" elapsed="0.000297"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.977739" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:02:42.977480" elapsed="0.000283"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.978608" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:42.978106" elapsed="0.000526"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:42.979797" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:42.979322" elapsed="0.000513"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:42.979957" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T01:02:42.980173" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:42.978800" elapsed="0.001397"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:42.980363" elapsed="0.000340"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T01:02:42.977957" elapsed="0.002784"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.981473" 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-10-11T01:02:42.980972" elapsed="0.000534"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:42.982542" 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-10-11T01:02:42.982073" elapsed="0.000507"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:42.982697" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:02:42.982883" 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-10-11T01:02:42.981674" elapsed="0.001232"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:42.983083" elapsed="0.000301"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T01:02:42.980843" elapsed="0.002640"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.984353" 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-10-11T01:02:42.983719" elapsed="0.000658"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:42.985525" 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-10-11T01:02:42.984985" elapsed="0.000578"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:42.985679" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:02:42.985866" 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-10-11T01:02:42.984610" elapsed="0.001279"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:42.986065" elapsed="0.000296"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T01:02:42.983589" elapsed="0.002810"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.987124" 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-10-11T01:02:42.986656" elapsed="0.000493"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:42.988181" 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-10-11T01:02:42.987718" elapsed="0.000502"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:42.988339" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:02:42.988540" 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-10-11T01:02:42.987314" elapsed="0.001250"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:42.988727" elapsed="0.000311"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T01:02:42.986521" elapsed="0.002556"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.989786" 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-10-11T01:02:42.989306" elapsed="0.000504"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:42.990886" 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-10-11T01:02:42.990371" elapsed="0.000553"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:42.991061" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:02:42.991246" 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-10-11T01:02:42.989977" 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-10-11T01:02:42.991519" elapsed="0.000295"/>
</kw>
<var name="${key}">MULTIPATH</var>
<var name="${value}">2</var>
<status status="PASS" start="2026-10-11T01:02:42.989177" elapsed="0.002675"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.992565" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:42.992092" elapsed="0.000497"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:42.993647" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:42.993148" elapsed="0.000537"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:42.993801" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:02:42.993984" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:42.992755" elapsed="0.001252"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:42.994189" elapsed="0.000311"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:02:42.991951" elapsed="0.002587"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:02:42.977807" elapsed="0.016764"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:02:42.994668" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:02:42.994804" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', '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-10-11T01:02:42.976650" elapsed="0.018178"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:42.976352" elapsed="0.018504"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:42.995040" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:42.994879" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:42.976332" elapsed="0.018778"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:42.995712" 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-10-11T01:02:42.995268" elapsed="0.000470"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:02:42.995781" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:42.972922" elapsed="0.022957"/>
</kw>
<msg time="2026-10-11T01:02:42.995964" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:42.968232" elapsed="0.027792"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:43.000549" 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/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-10-11T01:02:43.004827" 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/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-10-11T01:02:43.009098" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.009280" 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-10-11T01:02:43.009475" 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-10-11T01:02:43.009822" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.009675" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:02:43.009660" 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-10-11T01:02:43.010066" 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-10-11T01:02:43.010246" 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-10-11T01:02:43.010422" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:02:43.009634" elapsed="0.000837"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:02:43.009543" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.010646" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:02:43.010713" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:02:43.010825" 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-10-11T01:02:42.967623" elapsed="0.043226"/>
</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-10-11T01:02:43.020173" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.019830" elapsed="0.000369"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:43.020867" 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-10-11T01:02:43.020692" elapsed="0.000272">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-10-11T01:02:43.021063" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:43.020356" elapsed="0.000730"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.021587" 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-10-11T01:02:43.021259" elapsed="0.000354"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:02:43.021889" 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-10-11T01:02:43.022029" 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-10-11T01:02:43.021779" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.022489" 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-10-11T01:02:43.022254" 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-10-11T01:02:43.022856" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.022609" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.023353" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', '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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.023090" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.022930" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.022592" elapsed="0.000855"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.024271" 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-10-11T01:02:43.023607" elapsed="0.000692"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:02:43.024344" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:43.019315" elapsed="0.005146"/>
</kw>
<msg time="2026-10-11T01:02:43.024515" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:43.014755" elapsed="0.009804"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:43.028930" 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/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-10-11T01:02:43.033202" 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/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-10-11T01:02:43.037535" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.037722" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.037900" 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-10-11T01:02:43.038421" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.038263" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:02:43.038250" 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-10-11T01:02:43.038651" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.038828" 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-10-11T01:02:43.038990" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:02:43.038223" elapsed="0.000835"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:02:43.037966" elapsed="0.001115"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.039230" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:02:43.039297" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:02:43.039433" 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-10-11T01:02:43.014036" elapsed="0.025426"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:43.040570" 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-10-11T01:02:43.040369" elapsed="0.000261">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-10-11T01:02:43.040713" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:43.040045" elapsed="0.000690"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.041031" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.040798" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.041565" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.041288" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.041106" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.040781" elapsed="0.000859"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.042148" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:02:43.041798" elapsed="0.000374"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:02:43.042216" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:02:43.042372" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:02:43.039733" elapsed="0.002662"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.043655" 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-10-11T01:02:43.043431" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.044114" 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-10-11T01:02:43.043886" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.044590" 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-10-11T01:02:43.044356" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.045048" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:43.044816" elapsed="0.000272"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:02:43.045801" 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-10-11T01:02:43.045638" elapsed="0.000187"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:02:43.046137" 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-10-11T01:02:43.045978" elapsed="0.000182"/>
</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-10-11T01:02:43.046320" elapsed="0.000171"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.046904" 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-10-11T01:02:43.046684" elapsed="0.000260"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:02:43.046981" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:43.047127" 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-10-11T01:02:43.045268" elapsed="0.001882"/>
</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-10-11T01:02:43.057941" level="INFO">PUT Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.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-10-11T01:02:43.058003" level="INFO">PUT Response : url=http://10.30.170.173: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-10-11T01:02:43.058114" 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-10-11T01:02:43.047457" elapsed="0.010681"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.047212" elapsed="0.010968"/>
</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-10-11T01:02:43.058390" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.058232" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.047196" elapsed="0.011296"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.059664" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:43.059366" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.059129" elapsed="0.000606"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.059112" elapsed="0.000645"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.060319" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:43.060051" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.059806" elapsed="0.000585"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.059791" elapsed="0.000637"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.060956" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:43.060609" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.061268" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.061058" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.061790" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.061520" elapsed="0.000294"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.061342" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.061041" elapsed="0.000825"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.062391" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:43.062053" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.062707" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.062495" elapsed="0.000263"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.063210" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.062938" elapsed="0.000296"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.062780" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.062478" elapsed="0.000807"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:43.063443" elapsed="0.000290"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:02:43.064135" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:43.063891" elapsed="0.000268"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.064334" elapsed="0.000233"/>
</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-10-11T01:02:43.058820" elapsed="0.005802"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:02:43.064764" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:02:43.064682" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.064665" elapsed="0.000175"/>
</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-10-11T01:02:43.064986" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:02:43.065060" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:02:43.065218" 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-10-11T01:02:43.042710" elapsed="0.022532"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:02:43.065297" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:02:43.065436" 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-10-11T01:02:42.963534" elapsed="0.101926"/>
</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-10-11T01:02:43.065783" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.065577" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.065532" elapsed="0.000334"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:02:43.065896" elapsed="0.000024"/>
</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-10-11T01:02:42.962918" elapsed="0.103076"/>
</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-10-11T01:02:43.076686" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.076370" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:43.077368" 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-10-11T01:02:43.077197" elapsed="0.000245">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-10-11T01:02:43.077526" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:43.076868" elapsed="0.000681"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.078040" 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-10-11T01:02:43.077720" elapsed="0.000346"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:02:43.078337" 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-10-11T01:02:43.078469" 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-10-11T01:02:43.078230" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.078902" 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-10-11T01:02:43.078686" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.079853" level="INFO">mapping: {'IP': '10.30.171.7', '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-10-11T01:02:43.079623" elapsed="0.000272"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.080328" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.080081" elapsed="0.000271"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.081159" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:43.080686" elapsed="0.000497"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:43.082301" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.081829" elapsed="0.000511"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:43.082476" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T01:02:43.082671" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:43.081347" 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-10-11T01:02:43.082858" elapsed="0.000312"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T01:02:43.080555" elapsed="0.002653"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.083914" 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-10-11T01:02:43.083456" elapsed="0.000482"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:43.084969" 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-10-11T01:02:43.084523" elapsed="0.000484"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:43.085138" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:02:43.085357" 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-10-11T01:02:43.084115" elapsed="0.001265"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.085565" elapsed="0.000296"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T01:02:43.083308" elapsed="0.002591"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.086804" 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-10-11T01:02:43.086141" elapsed="0.000689"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:43.087889" 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-10-11T01:02:43.087383" elapsed="0.000545"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:43.088058" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:02:43.088242" 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-10-11T01:02:43.086996" elapsed="0.001270"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.088455" elapsed="0.000296"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T01:02:43.086000" elapsed="0.002789"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.089502" 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-10-11T01:02:43.089027" elapsed="0.000500"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:43.090544" 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-10-11T01:02:43.090077" elapsed="0.000506"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:43.090701" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:02:43.090884" 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-10-11T01:02:43.089692" elapsed="0.001215"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.091083" elapsed="0.000297"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T01:02:43.088889" elapsed="0.002549"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.092177" 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-10-11T01:02:43.091672" elapsed="0.000529"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:43.093316" 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-10-11T01:02:43.092845" elapsed="0.000508"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:43.093558" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:02:43.093755" 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-10-11T01:02:43.092366" elapsed="0.001412"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.093940" elapsed="0.000304"/>
</kw>
<var name="${key}">MULTIPATH</var>
<var name="${value}">2</var>
<status status="PASS" start="2026-10-11T01:02:43.091539" elapsed="0.002743"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.094991" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:43.094536" elapsed="0.000490"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:43.096059" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.095593" elapsed="0.000513"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:43.096226" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:02:43.096468" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:43.095192" elapsed="0.001308"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.096691" elapsed="0.000301"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:02:43.094380" elapsed="0.002664"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:02:43.080394" elapsed="0.016682"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:02:43.097113" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:02:43.097243" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', '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-10-11T01:02:43.079264" elapsed="0.018003"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.079003" elapsed="0.018293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.097521" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.097318" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.078986" elapsed="0.018644"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.098368" 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-10-11T01:02:43.097789" elapsed="0.000605"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:02:43.098493" 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-10-11T01:02:43.075850" elapsed="0.022746"/>
</kw>
<msg time="2026-10-11T01:02:43.098643" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:43.071354" elapsed="0.027334"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:43.103132" 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/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-10-11T01:02:43.107359" 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/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-10-11T01:02:43.111591" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.111771" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.111950" 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-10-11T01:02:43.112299" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.112154" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:02:43.112141" 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-10-11T01:02:43.112538" 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-10-11T01:02:43.112716" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.112877" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:02:43.112116" elapsed="0.000807"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:02:43.112027" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.113111" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:02:43.113178" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:02:43.113287" 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-10-11T01:02:43.070749" elapsed="0.042591"/>
</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-10-11T01:02:43.122498" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.122182" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:43.123192" 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-10-11T01:02:43.123000" elapsed="0.000254">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-10-11T01:02:43.123337" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:43.122685" elapsed="0.000674"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.123857" 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-10-11T01:02:43.123550" elapsed="0.000332"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:02:43.124204" 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-10-11T01:02:43.124324" 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-10-11T01:02:43.124093" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.124775" 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-10-11T01:02:43.124558" elapsed="0.000272"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:02:43.125146" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.124891" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.125648" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', '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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.125363" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.125220" elapsed="0.000485"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.124874" elapsed="0.000850"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.126530" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflecto...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:43.125883" elapsed="0.000676"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:02:43.126603" 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/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-10-11T01:02:43.121667" elapsed="0.005037"/>
</kw>
<msg time="2026-10-11T01:02:43.126755" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:43.117174" elapsed="0.009654"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:43.131175" 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/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-10-11T01:02:43.135388" 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/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-10-11T01:02:43.139640" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.139819" 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-10-11T01:02:43.139998" elapsed="0.000030"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.140341" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.140200" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:02:43.140186" 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-10-11T01:02:43.140581" 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-10-11T01:02:43.140757" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.140919" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:02:43.140162" elapsed="0.000804"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:02:43.140075" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.141150" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:02:43.141216" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:02:43.141332" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;route-reflector&gt;
        &lt;config&gt;
            &lt;route-reflecto...</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-10-11T01:02:43.116470" elapsed="0.024889"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:43.142482" 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-10-11T01:02:43.142281" elapsed="0.000261">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-10-11T01:02:43.142625" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:43.141941" elapsed="0.000706"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.142966" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.142745" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.143497" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.143220" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.143051" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.142727" elapsed="0.000846"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.144090" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:02:43.143734" elapsed="0.000380"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:02:43.144159" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:43.144281" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:02:43.141643" elapsed="0.002661"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.145536" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:43.145298" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.145980" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T01:02:43.145767" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.146473" 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-10-11T01:02:43.146239" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.146915" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:43.146700" elapsed="0.000254"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:02:43.147672" 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-10-11T01:02:43.147514" elapsed="0.000182"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:02:43.147988" 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-10-11T01:02:43.147846" elapsed="0.000285"/>
</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-10-11T01:02:43.148295" elapsed="0.000183"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.148892" 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-10-11T01:02:43.148672" elapsed="0.000261"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:02:43.148971" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:43.149112" 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-10-11T01:02:43.147147" elapsed="0.001988"/>
</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-10-11T01:02:43.159258" level="INFO">PUT Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.node0', 'Content-Length': '869', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T01:02:43.159348" level="INFO">PUT Response : url=http://10.30.170.173: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.171.7 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:43.159460" 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-10-11T01:02:43.149438" elapsed="0.010048"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.149198" elapsed="0.010333"/>
</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-10-11T01:02:43.159707" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.159555" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.149182" elapsed="0.010604"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.160932" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:43.160659" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.160403" elapsed="0.000599"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.160386" elapsed="0.000656"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.161618" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:43.161326" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.161092" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.161077" elapsed="0.000635"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.162249" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:43.161886" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.162562" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.162338" elapsed="0.000276"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.163071" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.162795" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.162637" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.162321" elapsed="0.000827"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.163680" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:43.163320" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.163976" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.163769" elapsed="0.000271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.164498" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.164222" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.164062" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.163752" elapsed="0.000822"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:43.164715" elapsed="0.000294"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:02:43.165417" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:43.165181" elapsed="0.000262"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.165596" elapsed="0.000212"/>
</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-10-11T01:02:43.160116" elapsed="0.005746"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:02:43.166001" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-10-11T01:02:43.165920" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.165904" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.166239" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:02:43.166298" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:02:43.166470" 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-10-11T01:02:43.144611" elapsed="0.021883"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:02:43.166588" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:02:43.166713" 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-10-11T01:02:43.066828" elapsed="0.099907"/>
</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-10-11T01:02:43.167030" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.166821" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.166805" elapsed="0.000309"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:02:43.167143" elapsed="0.000024"/>
</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-10-11T01:02:43.066239" elapsed="0.101000"/>
</kw>
<arg>${odl_path_sel_mode}</arg>
<doc>Configures odl peer with path selection mode</doc>
<status status="PASS" start="2026-10-11T01:02:42.961169" elapsed="0.206123"/>
</kw>
<kw name="Configure_App_Peer_With_Routes">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.168024" level="INFO">${app_rib} = 10.30.170.173</msg>
<var>${app_rib}</var>
<arg>${ODL_SYSTEM_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.167751" elapsed="0.000299"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.168762" 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.173 | IP=10.30.170.173 | 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-10-11T01:02:43.168229" elapsed="0.000560"/>
</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-10-11T01:02:43.180362" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.180038" elapsed="0.000354"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:43.181119" 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-10-11T01:02:43.180897" elapsed="0.000290">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-10-11T01:02:43.181272" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:43.180570" elapsed="0.000725"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.181798" 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-10-11T01:02:43.181484" elapsed="0.000339"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:02:43.182116" 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-10-11T01:02:43.182257" 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-10-11T01:02:43.181990" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.182716" 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-10-11T01:02:43.182493" elapsed="0.000267"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.183708" 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.173', 'IP': '10.30.170.173', '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-10-11T01:02:43.183473" elapsed="0.000278"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.184197" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.183926" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.185071" 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-10-11T01:02:43.184568" elapsed="0.000528"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:43.186279" 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-10-11T01:02:43.185807" elapsed="0.000511"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:43.186457" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T01:02:43.186660" 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-10-11T01:02:43.185309" 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-10-11T01:02:43.186851" elapsed="0.000323"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T01:02:43.184434" elapsed="0.002779"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.187927" 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-10-11T01:02:43.187463" elapsed="0.000489"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:43.188987" 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-10-11T01:02:43.188546" elapsed="0.000497"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:43.189164" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:02:43.189349" 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-10-11T01:02:43.188131" elapsed="0.001241"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.189556" elapsed="0.000299"/>
</kw>
<var name="${key}">APP_PEER_NAME</var>
<var name="${value}">example-bgp-peer-app</var>
<status status="PASS" start="2026-10-11T01:02:43.187313" elapsed="0.002580"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.190831" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:43.190134" elapsed="0.000722"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:43.191928" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.191483" elapsed="0.000485"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:43.192101" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:02:43.192286" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:43.191038" elapsed="0.001271"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.192500" elapsed="0.000298"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:02:43.189991" elapsed="0.002846"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.193561" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:43.193075" elapsed="0.000511"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:43.194611" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.194141" elapsed="0.000508"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:43.194765" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:02:43.194951" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:43.193752" elapsed="0.001221"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.195162" elapsed="0.000315"/>
</kw>
<var name="${key}">APP_PEER_ID</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:02:43.192935" elapsed="0.002581"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.196223" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:43.195745" elapsed="0.000502"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:43.197353" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.196896" elapsed="0.000495"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:43.197523" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:02:43.197710" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:43.196515" elapsed="0.001218"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.197897" elapsed="0.000309"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:02:43.195616" elapsed="0.002628"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.198957" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:43.198501" elapsed="0.000480"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:43.200064" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.199606" elapsed="0.000497"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:43.200223" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:02:43.200430" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:43.199198" elapsed="0.001257"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.200619" elapsed="0.000298"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:02:43.198343" elapsed="0.002611"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:02:43.184268" elapsed="0.016718"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:02:43.201035" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:02:43.201167" 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.173', 'IP': '10.30.170.173', 'BGP_RIB_OPENCONFIG': 'exam...</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:02:43.183118" elapsed="0.018073"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.182827" elapsed="0.018393"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.201389" elapsed="0.000082"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.201242" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.182808" elapsed="0.018716"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.202301" 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-10-11T01:02:43.201684" elapsed="0.000644"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:02:43.202371" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:43.179464" elapsed="0.023076"/>
</kw>
<msg time="2026-10-11T01:02:43.202590" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:43.174768" elapsed="0.027868"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:43.207145" 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/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-10-11T01:02:43.211426" 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/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-10-11T01:02:43.215689" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.215872" 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-10-11T01:02:43.216076" 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-10-11T01:02:43.216468" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.216275" elapsed="0.000246"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:02:43.216261" 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-10-11T01:02:43.216699" 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-10-11T01:02:43.216877" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.217051" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:02:43.216236" elapsed="0.000864"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:02:43.216145" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.217273" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:02:43.217339" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:02:43.217467" 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-10-11T01:02:43.174157" elapsed="0.043335"/>
</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-10-11T01:02:43.226668" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.226352" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:43.227348" 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-10-11T01:02:43.227177" elapsed="0.000245">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-10-11T01:02:43.227507" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:43.226850" elapsed="0.000680"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.228005" 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-10-11T01:02:43.227701" elapsed="0.000341"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:02:43.228312" 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-10-11T01:02:43.228442" 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-10-11T01:02:43.228205" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.228879" 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-10-11T01:02:43.228662" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:02:43.229243" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.228983" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.229745" 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.173', 'IP': '10.30.170.173', '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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.229474" elapsed="0.000296"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.229317" elapsed="0.000485"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.228966" elapsed="0.000856"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.230569" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.173&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-10-11T01:02:43.229980" elapsed="0.000645"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:02:43.230671" 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-10-11T01:02:43.225843" elapsed="0.004932"/>
</kw>
<msg time="2026-10-11T01:02:43.230823" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:43.221346" elapsed="0.009519"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:43.235485" 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/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-10-11T01:02:43.239926" 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/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-10-11T01:02:43.244168" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.244349" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.244542" 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-10-11T01:02:43.244880" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.244737" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:02:43.244723" 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-10-11T01:02:43.245121" 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-10-11T01:02:43.245299" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.245476" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:02:43.244698" elapsed="0.000830"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:02:43.244610" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.245700" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:02:43.245765" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:02:43.245874" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.173&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-10-11T01:02:43.220639" elapsed="0.025261"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:43.247066" 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-10-11T01:02:43.246865" elapsed="0.000262">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-10-11T01:02:43.247210" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:43.246539" elapsed="0.000693"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.247528" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.247295" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.248060" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.247782" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.247603" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.247277" elapsed="0.000859"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.248660" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:02:43.248295" elapsed="0.000389"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:02:43.248728" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:43.248852" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:02:43.246221" elapsed="0.002654"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.250116" 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.173</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:43.249877" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.250576" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.173&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-10-11T01:02:43.250347" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.251036" 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-10-11T01:02:43.250806" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.251488" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:43.251261" elapsed="0.000268"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:02:43.252242" 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-10-11T01:02:43.252073" elapsed="0.000194"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:02:43.252581" 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-10-11T01:02:43.252432" elapsed="0.000173"/>
</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-10-11T01:02:43.252769" elapsed="0.000156"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.253351" 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-10-11T01:02:43.253123" elapsed="0.000272"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:02:43.253448" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:02:43.253582" 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-10-11T01:02:43.251708" elapsed="0.001905"/>
</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-10-11T01:02:43.263118" level="INFO">PUT Request : url=http://10.30.170.173: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.173 
 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.173 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.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.173&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-10-11T01:02:43.263179" level="INFO">PUT Response : url=http://10.30.170.173: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.173 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:43.263292" 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-10-11T01:02:43.253903" elapsed="0.009413"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.253677" elapsed="0.009680"/>
</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-10-11T01:02:43.263561" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.263381" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.253660" elapsed="0.009983"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.264967" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:43.264697" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.264454" elapsed="0.000603"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.264436" elapsed="0.000644"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.265652" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:43.265369" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.265130" elapsed="0.000594"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.265115" elapsed="0.000631"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.266287" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:43.265920" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.266605" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.266374" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.267112" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.266837" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.266678" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.266357" elapsed="0.000831"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.267719" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:43.267360" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.268025" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.267807" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.268541" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.268259" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.268100" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.267790" elapsed="0.000826"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:43.268757" elapsed="0.000309"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:02:43.269465" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:43.269225" elapsed="0.000264"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.269641" elapsed="0.000213"/>
</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-10-11T01:02:43.263962" elapsed="0.005946"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:02:43.270063" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:02:43.269966" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.269949" elapsed="0.000191"/>
</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-10-11T01:02:43.270281" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:02:43.270340" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:02:43.270512" 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-10-11T01:02:43.249181" elapsed="0.021356"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:02:43.270596" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:02:43.270724" 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-10-11T01:02:43.169623" elapsed="0.101125"/>
</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-10-11T01:02:43.271084" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.270867" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.270849" elapsed="0.000318"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:02:43.271198" elapsed="0.000024"/>
</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-10-11T01:02:43.169041" elapsed="0.102256"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.272129" level="INFO">&amp;{route_mapping} = { NEXTHOP=100.100.100.1 | LOCALPREF=100 | PATHID=1 | APP_RIB=10.30.170.173 }</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-10-11T01:02:43.271634" elapsed="0.000521"/>
</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-10-11T01:02:43.283001" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.282703" elapsed="0.000339"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:43.283733" 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-10-11T01:02:43.283525" elapsed="0.000267">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-10-11T01:02:43.283875" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:43.283196" elapsed="0.000702"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.284394" 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-10-11T01:02:43.284083" elapsed="0.000357"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:02:43.284712" 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-10-11T01:02:43.284832" 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-10-11T01:02:43.284603" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.285283" 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-10-11T01:02:43.285064" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.286451" level="INFO">mapping: {'NEXTHOP': '100.100.100.1', 'LOCALPREF': '100', 'PATHID': '1', 'APP_RIB': '10.30.170.173'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:43.285991" elapsed="0.000503"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.287079" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.286673" elapsed="0.000430"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.288065" 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-10-11T01:02:43.287461" elapsed="0.000644"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:43.289826" 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-10-11T01:02:43.289397" elapsed="0.000461"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:43.289928" elapsed="0.000071"/>
</return>
<msg time="2026-10-11T01:02:43.290237" 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-10-11T01:02:43.288558" elapsed="0.001717"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.290577" elapsed="0.000413"/>
</kw>
<var name="${key}">NEXTHOP</var>
<var name="${value}">100.100.100.1</var>
<status status="PASS" start="2026-10-11T01:02:43.287284" elapsed="0.003811"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.292055" 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-10-11T01:02:43.291392" elapsed="0.000703"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:43.293849" 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-10-11T01:02:43.293474" elapsed="0.000411"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:43.293979" elapsed="0.000111"/>
</return>
<msg time="2026-10-11T01:02:43.294371" 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-10-11T01:02:43.292597" 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-10-11T01:02:43.294680" elapsed="0.000437"/>
</kw>
<var name="${key}">LOCALPREF</var>
<var name="${value}">100</var>
<status status="PASS" start="2026-10-11T01:02:43.291231" elapsed="0.003981"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.296247" 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-10-11T01:02:43.295496" elapsed="0.000791"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:43.298160" 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-10-11T01:02:43.297766" elapsed="0.000427"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:43.298264" elapsed="0.000071"/>
</return>
<msg time="2026-10-11T01:02:43.298574" 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-10-11T01:02:43.296785" elapsed="0.001827"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.298847" elapsed="0.000534"/>
</kw>
<var name="${key}">PATHID</var>
<var name="${value}">1</var>
<status status="PASS" start="2026-10-11T01:02:43.295319" elapsed="0.004225"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.300429" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:43.299811" elapsed="0.000660"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:43.302211" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.301821" elapsed="0.000423"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:43.302315" elapsed="0.000072"/>
</return>
<msg time="2026-10-11T01:02:43.302624" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:43.300901" elapsed="0.001763"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.302899" elapsed="0.000438"/>
</kw>
<var name="${key}">APP_RIB</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:02:43.299650" elapsed="0.003869"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:02:43.287145" elapsed="0.016410"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:02:43.303594" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:43.303726" level="INFO">${mapping_to_use} = {'NEXTHOP': '100.100.100.1', 'LOCALPREF': '100', 'PATHID': '1', 'APP_RIB': '10.30.170.173'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:02:43.285649" elapsed="0.018101"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.285383" elapsed="0.018397"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.303955" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.303804" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.285366" elapsed="0.018675"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.304757" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:02:43.304199" elapsed="0.000585"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:02:43.304827" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:43.282188" elapsed="0.022737"/>
</kw>
<msg time="2026-10-11T01:02:43.304973" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:43.277729" elapsed="0.027304"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:43.309359" 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/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-10-11T01:02:43.313620" 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/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-10-11T01:02:43.317824" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.318002" 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-10-11T01:02:43.318193" 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-10-11T01:02:43.318541" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.318383" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:02:43.318370" 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-10-11T01:02:43.318770" 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-10-11T01:02:43.318953" 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-10-11T01:02:43.319136" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:02:43.318345" elapsed="0.000840"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:02:43.318258" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.319355" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:02:43.319438" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:02:43.319557" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:02:43.277125" elapsed="0.042457"/>
</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-10-11T01:02:43.328897" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.328598" elapsed="0.000326"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:43.329619" 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-10-11T01:02:43.329416" elapsed="0.000263">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-10-11T01:02:43.329852" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:43.329090" elapsed="0.000787"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.330402" 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-10-11T01:02:43.330059" elapsed="0.000389"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:02:43.330726" 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-10-11T01:02:43.330844" 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-10-11T01:02:43.330618" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.331344" 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-10-11T01:02:43.331123" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:02:43.331748" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.331474" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.332256" level="INFO">${mapping_to_use} = {'NEXTHOP': '100.100.100.1', 'LOCALPREF': '100', 'PATHID': '1', 'APP_RIB': '10.30.170.173'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.331971" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.331824" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.331456" elapsed="0.000877"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.333087" 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-10-11T01:02:43.332512" elapsed="0.000604"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:02:43.333161" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:43.328086" elapsed="0.005175"/>
</kw>
<msg time="2026-10-11T01:02:43.333310" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:43.323605" elapsed="0.009749"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:43.337601" 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/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-10-11T01:02:43.341838" 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/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-10-11T01:02:43.346199" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.346439" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.346627" 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-10-11T01:02:43.346962" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.346818" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:02:43.346805" 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-10-11T01:02:43.347202" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.347380" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.347558" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:02:43.346780" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:02:43.346692" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.347777" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:02:43.347842" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:02:43.347952" 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-10-11T01:02:43.322893" elapsed="0.025086"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:43.349100" 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-10-11T01:02:43.348901" elapsed="0.000259">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-10-11T01:02:43.349242" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:43.348580" elapsed="0.000685"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.349562" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.349327" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.350090" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.349813" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.349640" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.349310" elapsed="0.000856"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.350676" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:02:43.350325" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:02:43.350744" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:43.350867" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:02:43.348266" elapsed="0.002623"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.352226" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:02:43.351990" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.352683" 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-10-11T01:02:43.352469" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.353204" 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-10-11T01:02:43.352954" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.353668" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:43.353453" elapsed="0.000255"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:02:43.354430" 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-10-11T01:02:43.354255" elapsed="0.000200"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:02:43.354748" 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-10-11T01:02:43.354605" elapsed="0.000166"/>
</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-10-11T01:02:43.354929" elapsed="0.000167"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.355529" 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-10-11T01:02:43.355285" elapsed="0.000284"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:02:43.355607" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:43.355733" 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-10-11T01:02:43.353887" elapsed="0.001869"/>
</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-10-11T01:02:43.364303" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.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-10-11T01:02:43.364361" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:02:43.364461" 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-10-11T01:02:43.356085" elapsed="0.008400"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.355816" elapsed="0.008709"/>
</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-10-11T01:02:43.364709" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.364555" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.355800" elapsed="0.008987"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.366212" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:43.365926" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.365690" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.365673" elapsed="0.000633"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.366868" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:43.366605" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.366355" elapsed="0.000584"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.366339" elapsed="0.000623"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.367505" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:43.367151" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.367800" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.367592" elapsed="0.000260"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.368308" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.368046" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.367874" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.367576" elapsed="0.000851"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.368941" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:43.368607" elapsed="0.000359"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.369296" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.369089" elapsed="0.000258"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.369809" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.369548" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.369369" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.369070" elapsed="0.000815"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:43.370040" elapsed="0.000294"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:02:43.370728" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:43.370507" elapsed="0.000245"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.370901" elapsed="0.000229"/>
</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-10-11T01:02:43.365174" elapsed="0.006011"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:02:43.371330" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:02:43.371249" elapsed="0.000135"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.371232" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.371563" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:02:43.371623" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:02:43.371779" 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-10-11T01:02:43.351201" elapsed="0.020601"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:02:43.371861" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:02:43.371980" 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-10-11T01:02:43.273041" elapsed="0.098961"/>
</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-10-11T01:02:43.372381" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.372183" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.372167" elapsed="0.000320"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:02:43.372517" elapsed="0.000024"/>
</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-10-11T01:02:43.272391" elapsed="0.100223"/>
</kw>
<var name="${pathid}">1</var>
<status status="PASS" start="2026-10-11T01:02:43.271476" elapsed="0.101172"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.373378" level="INFO">&amp;{route_mapping} = { NEXTHOP=100.100.100.2 | LOCALPREF=200 | PATHID=2 | APP_RIB=10.30.170.173 }</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-10-11T01:02:43.372892" elapsed="0.000512"/>
</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-10-11T01:02:43.384263" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.383947" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:43.385006" 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-10-11T01:02:43.384811" elapsed="0.000269">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-10-11T01:02:43.385164" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:43.384493" elapsed="0.000693"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.385856" 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-10-11T01:02:43.385357" elapsed="0.000525"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:02:43.386184" 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-10-11T01:02:43.386327" 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-10-11T01:02:43.386067" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.386802" 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-10-11T01:02:43.386574" elapsed="0.000269"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.388032" level="INFO">mapping: {'NEXTHOP': '100.100.100.2', 'LOCALPREF': '200', 'PATHID': '2', 'APP_RIB': '10.30.170.173'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:43.387579" elapsed="0.000497"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.388676" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.388252" elapsed="0.000448"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.389677" 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-10-11T01:02:43.389067" elapsed="0.000647"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:43.391460" 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-10-11T01:02:43.391047" elapsed="0.000446"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:43.391564" elapsed="0.000077"/>
</return>
<msg time="2026-10-11T01:02:43.391864" 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-10-11T01:02:43.390170" elapsed="0.001730"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.392153" elapsed="0.000451"/>
</kw>
<var name="${key}">NEXTHOP</var>
<var name="${value}">100.100.100.2</var>
<status status="PASS" start="2026-10-11T01:02:43.388892" elapsed="0.003806"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.393635" 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-10-11T01:02:43.392956" elapsed="0.000717"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:43.395468" 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-10-11T01:02:43.395079" elapsed="0.000422"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:43.395570" elapsed="0.000071"/>
</return>
<msg time="2026-10-11T01:02:43.395862" 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-10-11T01:02:43.394120" elapsed="0.001781"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.396149" elapsed="0.000473"/>
</kw>
<var name="${key}">LOCALPREF</var>
<var name="${value}">200</var>
<status status="PASS" start="2026-10-11T01:02:43.392801" elapsed="0.003915"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.397571" 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-10-11T01:02:43.396973" elapsed="0.000636"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:43.399351" 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-10-11T01:02:43.398969" elapsed="0.000414"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:43.399469" elapsed="0.000071"/>
</return>
<msg time="2026-10-11T01:02:43.399758" 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-10-11T01:02:43.398054" 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-10-11T01:02:43.400036" elapsed="0.001749"/>
</kw>
<var name="${key}">PATHID</var>
<var name="${value}">2</var>
<status status="PASS" start="2026-10-11T01:02:43.396818" elapsed="0.005061"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.402817" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:43.402163" elapsed="0.000693"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:43.404571" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.404149" elapsed="0.000454"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:43.404672" elapsed="0.000070"/>
</return>
<msg time="2026-10-11T01:02:43.404960" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:43.403296" 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-10-11T01:02:43.405244" elapsed="0.000425"/>
</kw>
<var name="${key}">APP_RIB</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:02:43.401984" elapsed="0.003778"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:02:43.388745" elapsed="0.017050"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:02:43.405834" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:43.405965" level="INFO">${mapping_to_use} = {'NEXTHOP': '100.100.100.2', 'LOCALPREF': '200', 'PATHID': '2', 'APP_RIB': '10.30.170.173'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:02:43.387203" elapsed="0.018785"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.386909" elapsed="0.019121"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.406203" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.406054" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.386889" elapsed="0.019382"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.407080" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:02:43.406517" elapsed="0.000590"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:02:43.407151" 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/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-10-11T01:02:43.383447" elapsed="0.023804"/>
</kw>
<msg time="2026-10-11T01:02:43.407300" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:43.378840" elapsed="0.028509"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:43.411671" 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/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-10-11T01:02:43.415953" 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/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-10-11T01:02:43.420204" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.420385" 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-10-11T01:02:43.420615" 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-10-11T01:02:43.420955" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.420811" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:02:43.420797" 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-10-11T01:02:43.421194" 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-10-11T01:02:43.421372" 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-10-11T01:02:43.421556" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:02:43.420772" elapsed="0.000833"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:02:43.420683" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.421776" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:02:43.421843" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:02:43.421951" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:02:43.378239" elapsed="0.043737"/>
</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-10-11T01:02:43.431358" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.431053" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:43.432098" 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-10-11T01:02:43.431875" elapsed="0.000290">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-10-11T01:02:43.432251" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:43.431558" elapsed="0.000715"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.432773" 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-10-11T01:02:43.432463" elapsed="0.000335"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:02:43.433082" 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-10-11T01:02:43.433201" 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-10-11T01:02:43.432961" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.433668" 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-10-11T01:02:43.433439" 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-10-11T01:02:43.434043" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.433783" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.434585" level="INFO">${mapping_to_use} = {'NEXTHOP': '100.100.100.2', 'LOCALPREF': '200', 'PATHID': '2', 'APP_RIB': '10.30.170.173'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.434298" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.434151" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.433766" elapsed="0.000896"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.435468" 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-10-11T01:02:43.434822" elapsed="0.000681"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:02:43.435547" 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/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-10-11T01:02:43.430539" elapsed="0.005109"/>
</kw>
<msg time="2026-10-11T01:02:43.435699" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:43.425835" elapsed="0.009908"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:43.439964" 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/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-10-11T01:02:43.444252" 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/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-10-11T01:02:43.448506" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.448685" 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-10-11T01:02:43.448868" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.449217" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.449073" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:02:43.449059" 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-10-11T01:02:43.449453" 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-10-11T01:02:43.449634" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.449794" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:02:43.449033" elapsed="0.000809"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:02:43.448933" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.450025" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:02:43.450124" elapsed="0.000017"/>
</return>
<msg time="2026-10-11T01:02:43.450240" 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-10-11T01:02:43.425132" elapsed="0.025135"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:43.451384" 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-10-11T01:02:43.451198" elapsed="0.000260">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-10-11T01:02:43.451543" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:43.450856" elapsed="0.000716"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.451853" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.451636" elapsed="0.000269"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.452383" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.452116" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.451926" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.451618" elapsed="0.000857"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.452972" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:02:43.452635" elapsed="0.000360"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:02:43.453054" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:02:43.453178" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:02:43.450552" elapsed="0.002649"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.454703" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:02:43.454476" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.455169" 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-10-11T01:02:43.454937" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.455644" 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-10-11T01:02:43.455424" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.456104" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:43.455871" elapsed="0.000273"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:02:43.456860" 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-10-11T01:02:43.456696" elapsed="0.000188"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:02:43.457192" 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-10-11T01:02:43.457046" elapsed="0.000170"/>
</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-10-11T01:02:43.457376" elapsed="0.000172"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.457992" 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-10-11T01:02:43.457767" elapsed="0.000280"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:02:43.458086" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:43.458212" 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-10-11T01:02:43.456324" elapsed="0.001979"/>
</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-10-11T01:02:43.467314" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.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-10-11T01:02:43.467374" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:02:43.467493" 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-10-11T01:02:43.458620" elapsed="0.008897"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.458373" elapsed="0.009187"/>
</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-10-11T01:02:43.467762" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.467585" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.458356" elapsed="0.009489"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.469103" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:43.468814" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.468572" elapsed="0.000603"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.468554" elapsed="0.000644"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.469771" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:43.469499" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.469246" elapsed="0.000597"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.469232" elapsed="0.000633"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.470421" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:43.470059" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.470721" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.470511" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.471257" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.470970" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.470805" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.470495" elapsed="0.000843"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.471889" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:43.471533" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.472292" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.472023" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.472821" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.472555" elapsed="0.000292"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.472373" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.471987" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:43.473121" elapsed="0.000309"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:02:43.473820" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:43.473591" elapsed="0.000253"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.474049" elapsed="0.000220"/>
</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-10-11T01:02:43.468188" elapsed="0.006137"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:02:43.474489" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-11T01:02:43.474390" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.474373" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.474713" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:02:43.474773" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:02:43.474930" 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-10-11T01:02:43.453515" elapsed="0.021440"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:02:43.475028" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:02:43.475151" 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-10-11T01:02:43.374284" elapsed="0.100889"/>
</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-10-11T01:02:43.475479" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.475264" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.475248" elapsed="0.000320"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:02:43.475602" elapsed="0.000025"/>
</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-10-11T01:02:43.373653" elapsed="0.102046"/>
</kw>
<var name="${pathid}">2</var>
<status status="PASS" start="2026-10-11T01:02:43.372730" elapsed="0.103005"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.476497" level="INFO">&amp;{route_mapping} = { NEXTHOP=100.100.100.3 | LOCALPREF=300 | PATHID=3 | APP_RIB=10.30.170.173 }</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-10-11T01:02:43.475983" elapsed="0.000540"/>
</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-10-11T01:02:43.487644" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.487326" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:43.488366" 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-10-11T01:02:43.488154" elapsed="0.000297">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-10-11T01:02:43.488538" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:43.487826" elapsed="0.000734"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.489052" 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-10-11T01:02:43.488730" elapsed="0.000347"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:02:43.489351" 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-10-11T01:02:43.489506" 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-10-11T01:02:43.489242" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.489978" 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-10-11T01:02:43.489757" elapsed="0.000277"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.491306" level="INFO">mapping: {'NEXTHOP': '100.100.100.3', 'LOCALPREF': '300', 'PATHID': '3', 'APP_RIB': '10.30.170.173'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:43.490712" elapsed="0.000636"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.491943" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.491544" elapsed="0.000423"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.492922" 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-10-11T01:02:43.492329" elapsed="0.000631"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:43.494707" 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-10-11T01:02:43.494297" elapsed="0.000442"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:43.494808" elapsed="0.000071"/>
</return>
<msg time="2026-10-11T01:02:43.495116" 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-10-11T01:02:43.493440" elapsed="0.001714"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.495387" elapsed="0.000434"/>
</kw>
<var name="${key}">NEXTHOP</var>
<var name="${value}">100.100.100.3</var>
<status status="PASS" start="2026-10-11T01:02:43.492170" elapsed="0.003743"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.496926" 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-10-11T01:02:43.496188" elapsed="0.000776"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:43.498873" 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-10-11T01:02:43.498357" elapsed="0.000548"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:43.498974" elapsed="0.000084"/>
</return>
<msg time="2026-10-11T01:02:43.499278" 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-10-11T01:02:43.497515" elapsed="0.001801"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.499562" elapsed="0.000412"/>
</kw>
<var name="${key}">LOCALPREF</var>
<var name="${value}">300</var>
<status status="PASS" start="2026-10-11T01:02:43.496029" elapsed="0.004052"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.500975" 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-10-11T01:02:43.500343" elapsed="0.000683"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:43.502746" 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-10-11T01:02:43.502301" elapsed="0.000477"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:43.502847" elapsed="0.000069"/>
</return>
<msg time="2026-10-11T01:02:43.503148" 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-10-11T01:02:43.501468" elapsed="0.001717"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.503430" elapsed="0.000411"/>
</kw>
<var name="${key}">PATHID</var>
<var name="${value}">3</var>
<status status="PASS" start="2026-10-11T01:02:43.500185" elapsed="0.003748"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.504877" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:02:43.504204" elapsed="0.000712"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:02:43.506644" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.506196" elapsed="0.000479"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:02:43.506743" elapsed="0.000071"/>
</return>
<msg time="2026-10-11T01:02:43.507045" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:02:43.505351" 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-10-11T01:02:43.507314" elapsed="0.000424"/>
</kw>
<var name="${key}">APP_RIB</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:02:43.504047" elapsed="0.003783"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:02:43.492024" elapsed="0.015838"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:02:43.507900" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:43.508042" level="INFO">${mapping_to_use} = {'NEXTHOP': '100.100.100.3', 'LOCALPREF': '300', 'PATHID': '3', 'APP_RIB': '10.30.170.173'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:02:43.490346" elapsed="0.017751"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.490097" elapsed="0.018031"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.508299" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.508150" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.490079" elapsed="0.018290"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.509166" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:02:43.508619" elapsed="0.000574"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:02:43.509237" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:43.486813" elapsed="0.022524"/>
</kw>
<msg time="2026-10-11T01:02:43.509386" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:43.482321" elapsed="0.027125"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:43.513770" 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/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-10-11T01:02:43.518157" 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/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-10-11T01:02:43.522369" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.522561" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.522741" 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-10-11T01:02:43.523098" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.522931" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:02:43.522918" 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-10-11T01:02:43.523322" 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-10-11T01:02:43.523523" 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-10-11T01:02:43.523685" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:02:43.522893" elapsed="0.000840"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:02:43.522807" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.523905" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:02:43.524000" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:02:43.524130" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:02:43.481723" elapsed="0.042431"/>
</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-10-11T01:02:43.533302" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.532974" elapsed="0.000357"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:43.534031" 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-10-11T01:02:43.533822" elapsed="0.000270">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-10-11T01:02:43.534176" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:43.533505" elapsed="0.000693"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.534696" 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-10-11T01:02:43.534368" elapsed="0.000354"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:02:43.534997" 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-10-11T01:02:43.535134" 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-10-11T01:02:43.534890" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.535592" 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-10-11T01:02:43.535350" 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-10-11T01:02:43.535953" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.535707" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.536472" level="INFO">${mapping_to_use} = {'NEXTHOP': '100.100.100.3', 'LOCALPREF': '300', 'PATHID': '3', 'APP_RIB': '10.30.170.173'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.536190" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.536044" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.535689" elapsed="0.000860"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.537294" 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-10-11T01:02:43.536707" elapsed="0.000616"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:02:43.537367" 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/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-10-11T01:02:43.532468" elapsed="0.005028"/>
</kw>
<msg time="2026-10-11T01:02:43.537547" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:43.527990" elapsed="0.009631"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:02:43.542088" 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/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-10-11T01:02:43.546355" 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/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-10-11T01:02:43.550596" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.550776" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.550954" 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-10-11T01:02:43.551303" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.551160" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:02:43.551146" 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-10-11T01:02:43.551548" 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-10-11T01:02:43.551732" 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-10-11T01:02:43.551899" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:02:43.551121" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:02:43.551032" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.552130" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:02:43.552197" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:02:43.552308" 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-10-11T01:02:43.527296" elapsed="0.025039"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:02:43.553472" 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-10-11T01:02:43.553266" elapsed="0.000267">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-10-11T01:02:43.553616" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:02:43.552920" elapsed="0.000720"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.553960" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.553736" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.554548" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.554220" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.554052" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.553718" elapsed="0.000913"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.555146" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:02:43.554792" elapsed="0.000377"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:02:43.555214" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:02:43.555338" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:02:43.552622" elapsed="0.002738"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.556702" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:02:43.556477" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.557160" 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-10-11T01:02:43.556932" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.557624" 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-10-11T01:02:43.557394" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.558073" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:43.557848" elapsed="0.000265"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:02:43.558840" 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-10-11T01:02:43.558684" elapsed="0.000180"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:02:43.559167" 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-10-11T01:02:43.559024" elapsed="0.000167"/>
</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-10-11T01:02:43.559349" elapsed="0.000168"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.559937" 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-10-11T01:02:43.559717" elapsed="0.000259"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:02:43.560025" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:02:43.560154" 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-10-11T01:02:43.558291" elapsed="0.001886"/>
</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-10-11T01:02:43.571101" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.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-10-11T01:02:43.571160" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:02:43.571281" 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-10-11T01:02:43.560485" elapsed="0.010820"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.560239" elapsed="0.011107"/>
</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-10-11T01:02:43.571547" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.571370" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.560222" elapsed="0.011406"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.572842" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:43.572572" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.572316" elapsed="0.000597"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.572299" elapsed="0.000636"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.573509" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:02:43.573229" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.572984" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.572969" elapsed="0.000638"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.574127" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:43.573779" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.574435" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.574215" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.574935" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.574668" elapsed="0.000292"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.574510" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.574198" elapsed="0.000830"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.575550" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:43.575201" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:02:43.575842" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.575637" elapsed="0.000256"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.576385" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:02:43.576125" elapsed="0.000298"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:43.575914" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.575620" elapsed="0.000856"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:02:43.576622" elapsed="0.000288"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:02:43.577299" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:02:43.577080" elapsed="0.000243"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:02:43.577489" elapsed="0.000210"/>
</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-10-11T01:02:43.571946" elapsed="0.005807"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:02:43.577903" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:02:43.577816" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.577799" elapsed="0.000181"/>
</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-10-11T01:02:43.578131" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:02:43.578190" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:02:43.578347" 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-10-11T01:02:43.555670" elapsed="0.022701"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:02:43.578446" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:02:43.578606" 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-10-11T01:02:43.477596" elapsed="0.101033"/>
</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-10-11T01:02:43.578916" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:02:43.578719" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:43.578703" elapsed="0.000296"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:02:43.579046" elapsed="0.000025"/>
</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-10-11T01:02:43.476770" elapsed="0.102374"/>
</kw>
<var name="${pathid}">3</var>
<status status="PASS" start="2026-10-11T01:02:43.475817" elapsed="0.103362"/>
</iter>
<var>${pathid}</var>
<value>@{PATH_ID_LIST}</value>
<status status="PASS" start="2026-10-11T01:02:43.271345" elapsed="0.307860"/>
</for>
<doc>Configure bgp application peer and fill it immediately with routes.</doc>
<status status="PASS" start="2026-10-11T01:02:43.167466" elapsed="0.411787"/>
</kw>
<kw name="Upload_Config_Files">
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T01:02:43.587784" 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-10-11T01:02:43.579811" elapsed="0.008026"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T01:02:43.595369" 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-10-11T01:02:43.588030" elapsed="0.007429"/>
</kw>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-10-11T01:02:43.606396" 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-10-11T01:02:43.606529" 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-10-11T01:02:43.595641" elapsed="0.010913"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:43.607065" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-10-11T01:02:43.630091" 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-10-11T01:02:43.606924" elapsed="0.023220"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:43.630471" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-10-11T01:02:43.681949" 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-10-11T01:02:43.630331" elapsed="0.051756"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:43.682801" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-10-11T01:02:43.734321" 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-10-11T01:02:43.682552" elapsed="0.051922"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:43.735213" level="INFO">Executing command 'sed -i -e 's/ADDPATH/send\/receive/g' bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-10-11T01:02:43.782504" 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-10-11T01:02:43.734908" elapsed="0.047715"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:43.783459" level="INFO">Executing command 'cat bgp-flowspec-redirect.cfg'.</msg>
<msg time="2026-10-11T01:02:43.834844" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:02:43.835104" level="INFO">${stdout} = neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0.1/3...</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-10-11T01:02:43.783169" elapsed="0.051992"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:43.836392" level="INFO">neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
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-10-11T01:02:43.835763" elapsed="0.000770"/>
</kw>
<var name="${cfgfile}">bgp-flowspec-redirect.cfg</var>
<status status="PASS" start="2026-10-11T01:02:43.606750" elapsed="0.229856"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:43.837600" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-10-11T01:02:43.882683" 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-10-11T01:02:43.837271" elapsed="0.045532"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:43.883677" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-10-11T01:02:43.938641" 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-10-11T01:02:43.883347" elapsed="0.055410"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:43.940162" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-10-11T01:02:43.990672" 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-10-11T01:02:43.939880" elapsed="0.050912"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:43.991568" level="INFO">Executing command 'sed -i -e 's/ADDPATH/send\/receive/g' bgp-flowspec.cfg'.</msg>
<msg time="2026-10-11T01:02:44.042720" 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-10-11T01:02:43.991242" elapsed="0.051621"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:44.043682" level="INFO">Executing command 'cat bgp-flowspec.cfg'.</msg>
<msg time="2026-10-11T01:02:44.094931" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:02:44.095171" level="INFO">${stdout} = neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
local-as 64496;
peer-as 64496;
family {
  ipv4 flow;
}
flow {
    route flow1 {
        match {
            source 10.0.0.1/3...</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-10-11T01:02:44.043356" elapsed="0.051873"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:44.096493" level="INFO">neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
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-10-11T01:02:44.095786" elapsed="0.000820"/>
</kw>
<var name="${cfgfile}">bgp-flowspec.cfg</var>
<status status="PASS" start="2026-10-11T01:02:43.836852" elapsed="0.259824"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:44.097622" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-10-11T01:02:44.142649" 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-10-11T01:02:44.097314" elapsed="0.045471"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:44.143634" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-10-11T01:02:44.194738" 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-10-11T01:02:44.143284" elapsed="0.051585"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:44.195654" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-10-11T01:02:44.246970" 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-10-11T01:02:44.195341" elapsed="0.051815"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:44.248032" level="INFO">Executing command 'sed -i -e 's/ADDPATH/send\/receive/g' bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-10-11T01:02:44.298951" 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-10-11T01:02:44.247679" elapsed="0.051431"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:44.299856" level="INFO">Executing command 'cat bgp-l3vpn-ipv4.cfg'.</msg>
<msg time="2026-10-11T01:02:44.350952" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:02:44.351196" level="INFO">${stdout} = neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
local-as 64496;
peer-as 64496;
  family {
    ipv4 mpls-vpn;
  }
  static {
    route 1.1.1.0/24 {
      next-hop 10.0.255.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-10-11T01:02:44.299590" elapsed="0.051664"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:44.352464" level="INFO">neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
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-10-11T01:02:44.351835" elapsed="0.000731"/>
</kw>
<var name="${cfgfile}">bgp-l3vpn-ipv4.cfg</var>
<status status="PASS" start="2026-10-11T01:02:44.096914" elapsed="0.255724"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:44.353590" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' exa-md5.cfg'.</msg>
<msg time="2026-10-11T01:02:44.398920" 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-10-11T01:02:44.353282" elapsed="0.045797"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:44.399861" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' exa-md5.cfg'.</msg>
<msg time="2026-10-11T01:02:44.450950" 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-10-11T01:02:44.399562" elapsed="0.051566"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:44.451906" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exa-md5.cfg'.</msg>
<msg time="2026-10-11T01:02:44.502940" 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-10-11T01:02:44.451625" elapsed="0.051475"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:44.504007" level="INFO">Executing command 'sed -i -e 's/ADDPATH/send\/receive/g' exa-md5.cfg'.</msg>
<msg time="2026-10-11T01:02:44.555031" 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-10-11T01:02:44.503677" elapsed="0.051490"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:44.555920" level="INFO">Executing command 'cat exa-md5.cfg'.</msg>
<msg time="2026-10-11T01:02:44.606955" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:02:44.607200" level="INFO">${stdout} = neighbor 10.30.170.173 {
  router-id 10.30.171.7;
  local-address 10.30.171.7;
  local-as 64496;
  peer-as 64496;
  md5-password topsecret;

  capability {
    route-refresh disable;
    add-path disa...</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-10-11T01:02:44.555654" elapsed="0.051605"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:44.608477" level="INFO">neighbor 10.30.170.173 {
  router-id 10.30.171.7;
  local-address 10.30.171.7;
  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-10-11T01:02:44.607826" elapsed="0.000754"/>
</kw>
<var name="${cfgfile}">exa-md5.cfg</var>
<status status="PASS" start="2026-10-11T01:02:44.352879" elapsed="0.255771"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:44.609624" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' exa.cfg'.</msg>
<msg time="2026-10-11T01:02:44.654992" 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-10-11T01:02:44.609314" elapsed="0.045890"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:44.656142" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' exa.cfg'.</msg>
<msg time="2026-10-11T01:02:44.706664" 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-10-11T01:02:44.655766" elapsed="0.051030"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:44.707572" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exa.cfg'.</msg>
<msg time="2026-10-11T01:02:44.754598" 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-10-11T01:02:44.707264" elapsed="0.047462"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:44.755548" level="INFO">Executing command 'sed -i -e 's/ADDPATH/send\/receive/g' exa.cfg'.</msg>
<msg time="2026-10-11T01:02:44.806844" 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-10-11T01:02:44.755214" elapsed="0.051762"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:44.807757" level="INFO">Executing command 'cat exa.cfg'.</msg>
<msg time="2026-10-11T01:02:44.858662" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:02:44.858945" level="INFO">${stdout} = neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
local-as 64496;
peer-as 64496;
  capability {
    route-refresh disable;
    add-path send/receive;
  }

  family {
    ipv4 ...</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-10-11T01:02:44.807489" elapsed="0.051514"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:44.860327" level="INFO">neighbor 10.30.170.173 {
router-id 10.30.171.7;
local-address 10.30.171.7;
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.171.7;
    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-10-11T01:02:44.859685" elapsed="0.000773"/>
</kw>
<var name="${cfgfile}">exa.cfg</var>
<status status="PASS" start="2026-10-11T01:02:44.608906" elapsed="0.251624"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:44.861524" level="INFO">Executing command 'sed -i -e 's/EXABGPIP/10.30.171.7/g' gobgp.cfg'.</msg>
<msg time="2026-10-11T01:02:44.906619" 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-10-11T01:02:44.861192" elapsed="0.045549"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:44.907518" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' gobgp.cfg'.</msg>
<msg time="2026-10-11T01:02:44.954661" 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-10-11T01:02:44.907195" elapsed="0.047588"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:44.955542" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' gobgp.cfg'.</msg>
<msg time="2026-10-11T01:02:45.002697" 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-10-11T01:02:44.955250" elapsed="0.047570"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:45.003602" level="INFO">Executing command 'sed -i -e 's/ADDPATH/send\/receive/g' gobgp.cfg'.</msg>
<msg time="2026-10-11T01:02:45.050480" 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-10-11T01:02:45.003275" elapsed="0.047346"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:02:45.051360" level="INFO">Executing command 'cat gobgp.cfg'.</msg>
<msg time="2026-10-11T01:02:45.098571" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:02:45.098774" level="INFO">${stdout} = [global.config]
    as = 64496
    router-id = "10.30.171.7"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.173"
        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-10-11T01:02:45.051096" elapsed="0.047731"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:45.100036" level="INFO">[global.config]
    as = 64496
    router-id = "10.30.171.7"
    port = 17900
[[neighbors]]
    [neighbors.config]
        peer-as = 64496
        neighbor-address = "10.30.170.173"
        local-as = 64496
    [neighbors.transport.config]
        local-address = "10.30.171.7"
        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-10-11T01:02:45.099455" elapsed="0.000785"/>
</kw>
<var name="${cfgfile}">gobgp.cfg</var>
<status status="PASS" start="2026-10-11T01:02:44.860775" elapsed="0.239537"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-10-11T01:02:43.606609" elapsed="1.493771"/>
</for>
<arg>addpath=${exa_add_path_value}</arg>
<doc>Uploads exabgp config files</doc>
<status status="PASS" start="2026-10-11T01:02:43.579441" elapsed="1.521102"/>
</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-10-11T01:02:45.104686" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:45.103995" elapsed="0.000747"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:45.105711" 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-10-11T01:02:45.105189" elapsed="0.000614"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:02:45.136523" 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-10-11T01:02:45.107125" elapsed="0.029518"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:02:45.140488" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:45.140674" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:45.137044" elapsed="0.003684"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:45.142073" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:45.141545" elapsed="0.000627"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:45.140884" elapsed="0.001356"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:45.140840" elapsed="0.001453"/>
</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-10-11T01:02:45.106314" elapsed="0.036074"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:02:45.145331" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<msg time="2026-10-11T01:02:45.145425" 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-10-11T01:02:45.142759" elapsed="0.002691"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:45.145872" 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-10-11T01:02:45.145652" elapsed="0.000261"/>
</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-10-11T01:02:45.102880" elapsed="0.043082"/>
</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-10-11T01:02:45.147782" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:45.147478" elapsed="0.000330"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:45.148274" 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-10-11T01:02:45.147977" elapsed="0.000321"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:02:45.153580" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:45.153769" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:02:45.153909" 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-10-11T01:02:45.148469" elapsed="0.005473"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:45.154657" 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-10-11T01:02:45.154243" elapsed="0.000473"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:02:45.155490" 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-10-11T01:02:45.154947" elapsed="0.000639">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-10-11T01:02:45.147056" elapsed="0.008671">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:48.158882" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:48.158026" elapsed="0.000935"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:48.160211" 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-10-11T01:02:48.159521" elapsed="0.000745"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:02:48.168277" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:48.168596" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:02:48.168788" 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-10-11T01:02:48.160650" elapsed="0.008192"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:48.170092" 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-10-11T01:02:48.169332" elapsed="0.000867"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:02:48.171534" 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-10-11T01:02:48.170610" elapsed="0.001066">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-10-11T01:02:48.156722" elapsed="0.015208">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:51.175404" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:51.174616" elapsed="0.000886"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:51.176622" 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-10-11T01:02:51.175907" elapsed="0.000770"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:02:51.184182" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:51.184500" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:02:51.184722" 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-10-11T01:02:51.177051" elapsed="0.007726"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:51.185955" 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-10-11T01:02:51.185262" elapsed="0.000821"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:02:51.187316" 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-10-11T01:02:51.186493" elapsed="0.000994">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-10-11T01:02:51.173484" elapsed="0.014224">200.0 != 409.0</status>
</kw>
<msg time="2026-10-11T01:02:51.187888" 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-10-11T01:02:45.146569" elapsed="6.041527">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</status>
</kw>
<msg time="2026-10-11T01:02:51.188326" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T01:02:51.188442" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:45.146140" elapsed="6.042354"/>
</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-10-11T01:02:51.190188" level="INFO">[?2004l01:02:45 | 3410   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:02:45 | 3410   | [01;34mversion      [0m | [1m4.2.17  [0m
01:02:45 | 3410   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
01:02:45 | 3410   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
01:02:45 | 3410   | [01;34minstallation [0m | [1m        [0m
01:02:45 | 3410   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
01:02:45 | 3410   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
01:02:45 | 3410   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:02:45 | 3410   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:02:45 | 3410   | [01;31mcli control  [0m | [1m - /run/[0m
01:02:45 | 3410   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:02:45 | 3410   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:02:45 | 3410   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:02:45 | 3410   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:02:45 | 3410   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:02:45 | 3410   | [01;31mcli control  [0m | [1m - /run/[0m
01:02:45 | 3410   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:02:45 | 3410   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:02:45 | 3410   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:02:45 | 3410   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
01:02:45 | 3410   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
01:02:45 | 3410   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
01:02:45 | 3410   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
01:02:45 | 3410   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
01:02:45 | 3410   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
01:02:45 | 3410   | configuration[0m | . router-id        | '10.30.171.7'[0m
01:02:45 | 3410   | configuration[0m | . local-address    | '10.30.171.7'[0m
01:02:45 | 3410   | configuration[0m | . local-as         | '64496'[0m
01:02:45 | 3410   | configuration[0m | . peer-as          | '64496'[0m
01:02:45 | 3410   | configuration[0m | &gt; capability       | [0m
01:02:45 | 3410   | configuration[0m | . route-refresh    | 'disable'[0m
01:02:45 | 3410   | configuration[0m | . add-path         | 'send/receive'[0m
01:02:45 | 3410   | configuration[0m | &lt; capability       | [0m
01:02:45 | 3410   | configuration[0m | &gt; family           | [0m
01:02:45 | 3410   | configuration[0m | . ipv4             | 'unicast'[0m
01:02:45 | 3410   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
01:02:45 | 3410   | configuration[0m | &lt; family           | [0m
01:02:45 | 3410   | configuration[0m | &gt; process          | 'exarpcserver'[0m
01:02:45 | 3410   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
01:02:45 | 3410   | [01;31mconfiguration[0m | [1m        [0m
01:02:45 | 3410   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
01:02:45 | 3410   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
01:02:45 | 3410   | [01;31mconfiguration[0m | [1m        [0m
01:02:45 | 3410   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:51.190657" level="INFO">${output} = [?2004l01:02:45 | 3410   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:02:45 | 3410   | [01;34mversion      [0m | [1m4.2.17  [0m
01:02:45 | 3410   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-10-11T01:02:51.189922" elapsed="0.000801"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:51.191775" level="INFO">[?2004l01:02:45 | 3410   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:02:45 | 3410   | [01;34mversion      [0m | [1m4.2.17  [0m
01:02:45 | 3410   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
01:02:45 | 3410   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
01:02:45 | 3410   | [01;34minstallation [0m | [1m        [0m
01:02:45 | 3410   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
01:02:45 | 3410   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
01:02:45 | 3410   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:02:45 | 3410   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:02:45 | 3410   | [01;31mcli control  [0m | [1m - /run/[0m
01:02:45 | 3410   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:02:45 | 3410   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:02:45 | 3410   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:02:45 | 3410   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:02:45 | 3410   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:02:45 | 3410   | [01;31mcli control  [0m | [1m - /run/[0m
01:02:45 | 3410   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:02:45 | 3410   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:02:45 | 3410   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:02:45 | 3410   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
01:02:45 | 3410   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
01:02:45 | 3410   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
01:02:45 | 3410   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
01:02:45 | 3410   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
01:02:45 | 3410   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
01:02:45 | 3410   | configuration[0m | . router-id        | '10.30.171.7'[0m
01:02:45 | 3410   | configuration[0m | . local-address    | '10.30.171.7'[0m
01:02:45 | 3410   | configuration[0m | . local-as         | '64496'[0m
01:02:45 | 3410   | configuration[0m | . peer-as          | '64496'[0m
01:02:45 | 3410   | configuration[0m | &gt; capability       | [0m
01:02:45 | 3410   | configuration[0m | . route-refresh    | 'disable'[0m
01:02:45 | 3410   | configuration[0m | . add-path         | 'send/receive'[0m
01:02:45 | 3410   | configuration[0m | &lt; capability       | [0m
01:02:45 | 3410   | configuration[0m | &gt; family           | [0m
01:02:45 | 3410   | configuration[0m | . ipv4             | 'unicast'[0m
01:02:45 | 3410   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
01:02:45 | 3410   | configuration[0m | &lt; family           | [0m
01:02:45 | 3410   | configuration[0m | &gt; process          | 'exarpcserver'[0m
01:02:45 | 3410   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
01:02:45 | 3410   | [01;31mconfiguration[0m | [1m        [0m
01:02:45 | 3410   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
01:02:45 | 3410   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
01:02:45 | 3410   | [01;31mconfiguration[0m | [1m        [0m
01:02:45 | 3410   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:51.191176" elapsed="0.000857"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:51.193840" 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-10-11T01:02:51.193135" elapsed="0.000762"/>
</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-10-11T01:02:51.194262" elapsed="0.000448"/>
</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-10-11T01:02:51.192483" elapsed="0.002363"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:02:51.198566" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:51.198757" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:51.195224" elapsed="0.003590"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:51.199828" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:51.199299" elapsed="0.000629"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:02:51.203468" 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-10-11T01:02:51.201246" elapsed="0.002344"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:02:51.205356" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:51.205575" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-423-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-10-11T01:02:51.203961" elapsed="0.001670"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:51.206898" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-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-10-11T01:02:51.206369" elapsed="0.000624"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:51.205778" elapsed="0.001306"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:51.205727" elapsed="0.001410"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-10-11T01:02:51.200470" elapsed="0.006759"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-10-11T01:02:51.189261" elapsed="0.018066"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:51.188679" elapsed="0.018699"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:51.188635" elapsed="0.018819"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-10-11T01:02:51.207765" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:51.207565" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:51.207532" elapsed="0.000422"/>
</if>
<var name="${idx}">0</var>
<status status="PASS" start="2026-10-11T01:02:45.102493" elapsed="6.105536"/>
</iter>
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:51.210122" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:51.209481" elapsed="0.000696"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:51.211144" 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-10-11T01:02:51.210642" elapsed="0.000594"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:02:51.215646" 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-10-11T01:02:51.212573" elapsed="0.003192"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:02:51.219861" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:51.220469" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:51.216164" elapsed="0.004374"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:51.221813" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:51.221268" elapsed="0.000641"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:51.220682" elapsed="0.001295"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:51.220642" elapsed="0.001409"/>
</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-10-11T01:02:51.211759" elapsed="0.010388"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:02:51.225402" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<msg time="2026-10-11T01:02:51.225546" 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-10-11T01:02:51.222516" elapsed="0.003064"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:51.226183" 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-10-11T01:02:51.225854" elapsed="0.000387"/>
</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-10-11T01:02:51.208760" elapsed="0.017549"/>
</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-10-11T01:02:51.228764" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:51.228312" elapsed="0.000487"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:51.229489" 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-10-11T01:02:51.229076" elapsed="0.000452"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:02:51.234073" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:51.234222" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:02:51.234351" 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-10-11T01:02:51.229746" elapsed="0.004639"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:51.235130" 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-10-11T01:02:51.234726" elapsed="0.000464"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:02:51.235927" 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-10-11T01:02:51.235445" elapsed="0.000616">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-10-11T01:02:51.227741" elapsed="0.008455">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:54.239071" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:54.238252" elapsed="0.000887"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:54.240274" 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-10-11T01:02:54.239585" elapsed="0.000744"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:02:54.247335" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:54.247678" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:02:54.247946" 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-10-11T01:02:54.240820" elapsed="0.007214"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:54.249290" 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-10-11T01:02:54.248555" elapsed="0.000840"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:02:54.250705" 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-10-11T01:02:54.249840" elapsed="0.001003">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-10-11T01:02:54.237083" elapsed="0.013998">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:57.254053" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:57.253233" elapsed="0.000887"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:57.255287" 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-10-11T01:02:57.254550" elapsed="0.000791"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:02:57.263272" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:57.263582" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:02:57.263777" 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-10-11T01:02:57.255724" elapsed="0.008108"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:57.265014" 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-10-11T01:02:57.264316" elapsed="0.000801"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:02:57.268494" 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-10-11T01:02:57.265523" elapsed="0.003119">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-10-11T01:02:57.252024" elapsed="0.016838">200.0 != 409.0</status>
</kw>
<msg time="2026-10-11T01:02:57.269066" 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-10-11T01:02:51.227100" elapsed="6.042151">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</status>
</kw>
<msg time="2026-10-11T01:02:57.269514" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T01:02:57.269604" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:51.226554" elapsed="6.043100"/>
</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-10-11T01:02:57.271355" level="INFO">[?2004l01:02:51 | 3414   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:02:51 | 3414   | [01;34mversion      [0m | [1m4.2.17  [0m
01:02:51 | 3414   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
01:02:51 | 3414   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
01:02:51 | 3414   | [01;34minstallation [0m | [1m        [0m
01:02:51 | 3414   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
01:02:51 | 3414   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
01:02:51 | 3414   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:02:51 | 3414   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:02:51 | 3414   | [01;31mcli control  [0m | [1m - /run/[0m
01:02:51 | 3414   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:02:51 | 3414   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:02:51 | 3414   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:02:51 | 3414   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:02:51 | 3414   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:02:51 | 3414   | [01;31mcli control  [0m | [1m - /run/[0m
01:02:51 | 3414   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:02:51 | 3414   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:02:51 | 3414   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:02:51 | 3414   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
01:02:51 | 3414   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
01:02:51 | 3414   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
01:02:51 | 3414   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
01:02:51 | 3414   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
01:02:51 | 3414   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
01:02:51 | 3414   | configuration[0m | . router-id        | '10.30.171.7'[0m
01:02:51 | 3414   | configuration[0m | . local-address    | '10.30.171.7'[0m
01:02:51 | 3414   | configuration[0m | . local-as         | '64496'[0m
01:02:51 | 3414   | configuration[0m | . peer-as          | '64496'[0m
01:02:51 | 3414   | configuration[0m | &gt; capability       | [0m
01:02:51 | 3414   | configuration[0m | . route-refresh    | 'disable'[0m
01:02:51 | 3414   | configuration[0m | . add-path         | 'send/receive'[0m
01:02:51 | 3414   | configuration[0m | &lt; capability       | [0m
01:02:51 | 3414   | configuration[0m | &gt; family           | [0m
01:02:51 | 3414   | configuration[0m | . ipv4             | 'unicast'[0m
01:02:51 | 3414   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
01:02:51 | 3414   | configuration[0m | &lt; family           | [0m
01:02:51 | 3414   | configuration[0m | &gt; process          | 'exarpcserver'[0m
01:02:51 | 3414   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
01:02:51 | 3414   | [01;31mconfiguration[0m | [1m        [0m
01:02:51 | 3414   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
01:02:51 | 3414   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
01:02:51 | 3414   | [01;31mconfiguration[0m | [1m        [0m
01:02:51 | 3414   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:57.271798" level="INFO">${output} = [?2004l01:02:51 | 3414   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:02:51 | 3414   | [01;34mversion      [0m | [1m4.2.17  [0m
01:02:51 | 3414   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-10-11T01:02:57.271122" elapsed="0.000739"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:57.272850" level="INFO">[?2004l01:02:51 | 3414   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:02:51 | 3414   | [01;34mversion      [0m | [1m4.2.17  [0m
01:02:51 | 3414   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
01:02:51 | 3414   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
01:02:51 | 3414   | [01;34minstallation [0m | [1m        [0m
01:02:51 | 3414   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
01:02:51 | 3414   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
01:02:51 | 3414   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:02:51 | 3414   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:02:51 | 3414   | [01;31mcli control  [0m | [1m - /run/[0m
01:02:51 | 3414   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:02:51 | 3414   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:02:51 | 3414   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:02:51 | 3414   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:02:51 | 3414   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:02:51 | 3414   | [01;31mcli control  [0m | [1m - /run/[0m
01:02:51 | 3414   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:02:51 | 3414   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:02:51 | 3414   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:02:51 | 3414   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
01:02:51 | 3414   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
01:02:51 | 3414   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
01:02:51 | 3414   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
01:02:51 | 3414   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
01:02:51 | 3414   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
01:02:51 | 3414   | configuration[0m | . router-id        | '10.30.171.7'[0m
01:02:51 | 3414   | configuration[0m | . local-address    | '10.30.171.7'[0m
01:02:51 | 3414   | configuration[0m | . local-as         | '64496'[0m
01:02:51 | 3414   | configuration[0m | . peer-as          | '64496'[0m
01:02:51 | 3414   | configuration[0m | &gt; capability       | [0m
01:02:51 | 3414   | configuration[0m | . route-refresh    | 'disable'[0m
01:02:51 | 3414   | configuration[0m | . add-path         | 'send/receive'[0m
01:02:51 | 3414   | configuration[0m | &lt; capability       | [0m
01:02:51 | 3414   | configuration[0m | &gt; family           | [0m
01:02:51 | 3414   | configuration[0m | . ipv4             | 'unicast'[0m
01:02:51 | 3414   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
01:02:51 | 3414   | configuration[0m | &lt; family           | [0m
01:02:51 | 3414   | configuration[0m | &gt; process          | 'exarpcserver'[0m
01:02:51 | 3414   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
01:02:51 | 3414   | [01;31mconfiguration[0m | [1m        [0m
01:02:51 | 3414   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
01:02:51 | 3414   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
01:02:51 | 3414   | [01;31mconfiguration[0m | [1m        [0m
01:02:51 | 3414   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:57.272312" elapsed="0.000800"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:02:57.274910" 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-10-11T01:02:57.274210" elapsed="0.000759"/>
</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-10-11T01:02:57.275335" elapsed="0.000450"/>
</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-10-11T01:02:57.273556" elapsed="0.002365"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:02:57.279610" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:57.279805" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:57.276295" elapsed="0.003568"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:57.280846" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:57.280316" elapsed="0.000628"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:02:57.284825" 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-10-11T01:02:57.282344" elapsed="0.002593"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:02:57.286723" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:57.286887" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-423-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-10-11T01:02:57.285327" elapsed="0.001613"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:57.288199" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-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-10-11T01:02:57.287681" elapsed="0.000612"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:57.287093" elapsed="0.001267"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:57.287053" elapsed="0.001388"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-10-11T01:02:57.281560" elapsed="0.006975"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-10-11T01:02:57.270475" elapsed="0.018161"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:57.269843" elapsed="0.018845"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:57.269797" elapsed="0.018936"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-10-11T01:02:57.289059" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:02:57.288839" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:57.288806" elapsed="0.000445"/>
</if>
<var name="${idx}">1</var>
<status status="PASS" start="2026-10-11T01:02:51.208374" elapsed="6.080931"/>
</iter>
<iter>
<kw name="Start_ExaBgp" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:02:57.291388" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:57.290748" elapsed="0.000726"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:57.292461" 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-10-11T01:02:57.291898" elapsed="0.000655"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:02:57.296934" 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-10-11T01:02:57.293835" elapsed="0.003234"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:02:57.301252" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:02:57.301457" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:57.297468" elapsed="0.004045"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:57.302768" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:02:57.302229" elapsed="0.000635"/>
</kw>
<status status="PASS" start="2026-10-11T01:02:57.301649" elapsed="0.001283"/>
</branch>
<status status="PASS" start="2026-10-11T01:02:57.301610" elapsed="0.001371"/>
</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-10-11T01:02:57.293057" elapsed="0.010048"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:02:57.305906" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exa.cfg</msg>
<msg time="2026-10-11T01:02:57.306029" 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-10-11T01:02:57.303469" elapsed="0.002595"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:57.306663" 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-10-11T01:02:57.306332" elapsed="0.000389"/>
</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-10-11T01:02:57.290049" elapsed="0.016740"/>
</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-10-11T01:02:57.309481" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:02:57.308816" elapsed="0.000701"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:02:57.310164" 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-10-11T01:02:57.309753" elapsed="0.000444"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:02:57.315329" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:02:57.315516" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:02:57.315635" 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-10-11T01:02:57.310432" elapsed="0.005236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:02:57.316355" 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-10-11T01:02:57.315947" elapsed="0.000489"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:02:57.317185" 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-10-11T01:02:57.316675" elapsed="0.000591">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-10-11T01:02:57.308234" elapsed="0.009165">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:00.320275" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:00.319403" elapsed="0.000939"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:00.321523" 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-10-11T01:03:00.320791" elapsed="0.000788"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:00.328952" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:00.329252" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:03:00.329479" 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-10-11T01:03:00.322085" elapsed="0.007451"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:00.330696" 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-10-11T01:03:00.330010" elapsed="0.000786"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:03:00.332060" 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-10-11T01:03:00.331199" elapsed="0.001003">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-10-11T01:03:00.318235" elapsed="0.014219">200.0 != 409.0</status>
</kw>
<kw name="Verify_ExaBgps_Connection" owner="ExaBgpLib">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.335447" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:03.334602" elapsed="0.000914"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.336650" 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-10-11T01:03:03.335920" elapsed="0.000785"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:03.344843" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 path_url=/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:03.345136" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp:%2F%2F10.30.171.7?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-10-11T01:03:03.345331" 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-10-11T01:03:03.337099" elapsed="0.008288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.346584" 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-10-11T01:03:03.345880" elapsed="0.000806"/>
</kw>
<kw name="Should Be Equal As Numbers" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.347947" 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-10-11T01:03:03.347116" elapsed="0.000999">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-10-11T01:03:03.333345" elapsed="0.014994">200.0 != 409.0</status>
</kw>
<msg time="2026-10-11T01:03:03.348558" 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-10-11T01:02:57.307586" elapsed="6.041159">Keyword 'Verify_ExaBgps_Connection' failed after retrying 3 times. The last error was: 200.0 != 409.0</status>
</kw>
<msg time="2026-10-11T01:03:03.348976" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T01:03:03.349091" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:02:57.307023" elapsed="6.042119"/>
</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-10-11T01:03:03.350834" level="INFO">[?2004l01:02:57 | 3418   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:02:57 | 3418   | [01;34mversion      [0m | [1m4.2.17  [0m
01:02:57 | 3418   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
01:02:57 | 3418   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
01:02:57 | 3418   | [01;34minstallation [0m | [1m        [0m
01:02:57 | 3418   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
01:02:57 | 3418   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
01:02:57 | 3418   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:02:57 | 3418   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:02:57 | 3418   | [01;31mcli control  [0m | [1m - /run/[0m
01:02:57 | 3418   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:02:57 | 3418   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:02:57 | 3418   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:02:57 | 3418   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:02:57 | 3418   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:02:57 | 3418   | [01;31mcli control  [0m | [1m - /run/[0m
01:02:57 | 3418   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:02:57 | 3418   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:02:57 | 3418   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:02:57 | 3418   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
01:02:57 | 3418   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
01:02:57 | 3418   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
01:02:57 | 3418   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
01:02:57 | 3418   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
01:02:57 | 3418   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
01:02:57 | 3418   | configuration[0m | . router-id        | '10.30.171.7'[0m
01:02:57 | 3418   | configuration[0m | . local-address    | '10.30.171.7'[0m
01:02:57 | 3418   | configuration[0m | . local-as         | '64496'[0m
01:02:57 | 3418   | configuration[0m | . peer-as          | '64496'[0m
01:02:57 | 3418   | configuration[0m | &gt; capability       | [0m
01:02:57 | 3418   | configuration[0m | . route-refresh    | 'disable'[0m
01:02:57 | 3418   | configuration[0m | . add-path         | 'send/receive'[0m
01:02:57 | 3418   | configuration[0m | &lt; capability       | [0m
01:02:57 | 3418   | configuration[0m | &gt; family           | [0m
01:02:57 | 3418   | configuration[0m | . ipv4             | 'unicast'[0m
01:02:57 | 3418   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
01:02:57 | 3418   | configuration[0m | &lt; family           | [0m
01:02:57 | 3418   | configuration[0m | &gt; process          | 'exarpcserver'[0m
01:02:57 | 3418   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
01:02:57 | 3418   | [01;31mconfiguration[0m | [1m        [0m
01:02:57 | 3418   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
01:02:57 | 3418   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
01:02:57 | 3418   | [01;31mconfiguration[0m | [1m        [0m
01:02:57 | 3418   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:03:03.351282" level="INFO">${output} = [?2004l01:02:57 | 3418   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:02:57 | 3418   | [01;34mversion      [0m | [1m4.2.17  [0m
01:02:57 | 3418   | [01;34minterpreter  ...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-10-11T01:03:03.350581" elapsed="0.000764"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.352834" level="INFO">[?2004l01:02:57 | 3418   | [01;34mwelcome      [0m | [1mThank you for using ExaBGP[0m
01:02:57 | 3418   | [01;34mversion      [0m | [1m4.2.17  [0m
01:02:57 | 3418   | [01;34minterpreter  [0m | [1m3.10.12 (main, Jun 22 2026, 18:55:27) [GCC 11.4.0][0m
01:02:57 | 3418   | [01;34mos           [0m | [1mLinux releng-26932-423-1-mininet-ovs-217-0 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64[0m
01:02:57 | 3418   | [01;34minstallation [0m | [1m        [0m
01:02:57 | 3418   | [01;31mcli          [0m | [1mcould not find the named pipes (exabgp.in and exabgp.out) required for the cli[0m
01:02:57 | 3418   | [01;31mcli          [0m | [1mwe scanned the following folders (the number is your PID):[0m
01:02:57 | 3418   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:02:57 | 3418   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:02:57 | 3418   | [01;31mcli control  [0m | [1m - /run/[0m
01:02:57 | 3418   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:02:57 | 3418   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:02:57 | 3418   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:02:57 | 3418   | [01;31mcli control  [0m | [1m - /run/exabgp/[0m
01:02:57 | 3418   | [01;31mcli control  [0m | [1m - /run/1001/[0m
01:02:57 | 3418   | [01;31mcli control  [0m | [1m - /run/[0m
01:02:57 | 3418   | [01;31mcli control  [0m | [1m - /var/run/exabgp/[0m
01:02:57 | 3418   | [01;31mcli control  [0m | [1m - /var/run/1001/[0m
01:02:57 | 3418   | [01;31mcli control  [0m | [1m - /var/run/[0m
01:02:57 | 3418   | [01;31mcli control  [0m | [1mplease make them in one of the folder with the following commands:[0m
01:02:57 | 3418   | [01;31mcli control  [0m | [1m&gt; mkfifo /home/jenkins/run/exabgp.{in,out}[0m
01:02:57 | 3418   | [01;31mcli control  [0m | [1m&gt; chmod 600 /home/jenkins/run/exabgp.{in,out}[0m
01:02:57 | 3418   | [01;31mcli control  [0m | [1m&gt; chown 1001:1001 /home/jenkins/run/exabgp.{in,out}[0m
01:02:57 | 3418   | [01;34mconfiguration[0m | [1mperforming reload of exabgp 4.2.17[0m
01:02:57 | 3418   | configuration[0m | &gt; neighbor         | '10.30.170.173'[0m
01:02:57 | 3418   | configuration[0m | . router-id        | '10.30.171.7'[0m
01:02:57 | 3418   | configuration[0m | . local-address    | '10.30.171.7'[0m
01:02:57 | 3418   | configuration[0m | . local-as         | '64496'[0m
01:02:57 | 3418   | configuration[0m | . peer-as          | '64496'[0m
01:02:57 | 3418   | configuration[0m | &gt; capability       | [0m
01:02:57 | 3418   | configuration[0m | . route-refresh    | 'disable'[0m
01:02:57 | 3418   | configuration[0m | . add-path         | 'send/receive'[0m
01:02:57 | 3418   | configuration[0m | &lt; capability       | [0m
01:02:57 | 3418   | configuration[0m | &gt; family           | [0m
01:02:57 | 3418   | configuration[0m | . ipv4             | 'unicast'[0m
01:02:57 | 3418   | configuration[0m | . ipv4             | 'mpls-vpn'[0m
01:02:57 | 3418   | configuration[0m | &lt; family           | [0m
01:02:57 | 3418   | configuration[0m | &gt; process          | 'exarpcserver'[0m
01:02:57 | 3418   | [01;31mconfiguration[0m | [1mnot reloaded, no change found in the configuration[0m
01:02:57 | 3418   | [01;31mconfiguration[0m | [1m        [0m
01:02:57 | 3418   | [01;31mconfiguration[0m | [1msyntax error in section neighbor[0m
01:02:57 | 3418   | [01;31mconfiguration[0m | [1mline 14: process exarpcserver {[0m
01:02:57 | 3418   | [01;31mconfiguration[0m | [1m        [0m
01:02:57 | 3418   | [01;31mconfiguration[0m | [1msection process is invalid in neighbor, neighbor[0m
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:03:03.351813" elapsed="0.001303"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.355221" 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-10-11T01:03:03.354251" elapsed="0.001030"/>
</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-10-11T01:03:03.355695" elapsed="0.000453"/>
</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-10-11T01:03:03.353587" elapsed="0.002690"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:03:03.359340" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:03:03.359550" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:03:03.356667" elapsed="0.002941"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.360754" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:03:03.360111" elapsed="0.000761"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:03:03.364638" 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-10-11T01:03:03.362539" elapsed="0.002233"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:03:03.367139" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:03:03.367344" level="INFO">${output} = [?2004l[?2004h[jenkins@releng-26932-423-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-10-11T01:03:03.365272" elapsed="0.002166"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.369031" level="INFO">[?2004l[?2004h[jenkins@releng-26932-423-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-10-11T01:03:03.368359" elapsed="0.000794"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:03.367604" elapsed="0.001630"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.367557" elapsed="0.001742"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-10-11T01:03:03.361544" elapsed="0.007927"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-10-11T01:03:03.349897" elapsed="0.019706"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:03.349333" elapsed="0.020335"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.349287" elapsed="0.020439"/>
</if>
<if>
<branch type="IF" condition="&quot;${status}&quot; == &quot;PASS&quot;">
<return>
<status status="NOT RUN" start="2026-10-11T01:03:03.370133" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:03.369860" elapsed="0.000378"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.369819" elapsed="0.000543"/>
</if>
<var name="${idx}">2</var>
<status status="PASS" start="2026-10-11T01:02:57.289672" elapsed="6.080789"/>
</iter>
<var>${idx}</var>
<value>${connection_retries}</value>
<status status="PASS" start="2026-10-11T01:02:45.102064" elapsed="18.268482"/>
</for>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.371760" level="FAIL">Unable to connect ExaBgp to ODL</msg>
<arg>Unable to connect ExaBgp to ODL</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-10-11T01:03:03.371016" elapsed="0.000893">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-10-11T01:02:45.101246" elapsed="18.270940">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-10-11T01:02:42.862696" elapsed="20.509763">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-10-11T01:03:03.375129" level="INFO">&amp;{mapping} = { IP=10.30.171.7 | 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-10-11T01:03:03.374009" elapsed="0.001191"/>
</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-10-11T01:03:03.399939" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:03.399506" elapsed="0.000471"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:03.400967" 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-10-11T01:03:03.400686" elapsed="0.000376">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-10-11T01:03:03.401178" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:03.400217" elapsed="0.000993"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.401909" 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-10-11T01:03:03.401477" elapsed="0.000467"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:03.402360" 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-10-11T01:03:03.402568" 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-10-11T01:03:03.402195" elapsed="0.000408"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.403252" 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-10-11T01:03:03.402888" elapsed="0.000422"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.404700" level="INFO">mapping: {'IP': '10.30.171.7', '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-10-11T01:03:03.404312" elapsed="0.000447"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.405370" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:03.405023" elapsed="0.000380"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.406263" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:03.405870" elapsed="0.000427"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:03.407314" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:03.407055" elapsed="0.000293"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:03.407434" elapsed="0.000044"/>
</return>
<msg time="2026-10-11T01:03:03.407617" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:03.406552" 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-10-11T01:03:03.407882" elapsed="0.000261"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T01:03:03.405687" elapsed="0.002508"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.408968" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:03.408590" elapsed="0.000426"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:03.410022" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:03.409756" elapsed="0.000302"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:03.410120" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T01:03:03.410269" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:03.409251" 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-10-11T01:03:03.410472" elapsed="0.000167"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:03.408334" elapsed="0.002343"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:03.405488" elapsed="0.005222"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:03.410749" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:03:03.410876" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:03.403769" elapsed="0.007131"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:03.403395" elapsed="0.007533"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:03.411111" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:03.410951" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.403370" elapsed="0.007810"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.411875" 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-10-11T01:03:03.411340" elapsed="0.000562"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:03.411945" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:03:03.398725" elapsed="0.013333"/>
</kw>
<msg time="2026-10-11T01:03:03.412106" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:03.392142" elapsed="0.020018"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:03:03.416696" 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/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-10-11T01:03:03.420942" 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/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-10-11T01:03:03.425382" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:03.425577" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:03.425760" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:03.426152" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:03.426000" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:03.425972" 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-10-11T01:03:03.426386" elapsed="0.000032"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:03.426586" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:03.426748" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:03.425946" elapsed="0.000849"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:03.425856" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:03.426968" elapsed="0.000029"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:03.427047" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:03.427157" 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-10-11T01:03:03.391223" elapsed="0.035959"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.428246" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:03.428021" elapsed="0.000273"/>
</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-10-11T01:03:03.436020" level="INFO">DELETE Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:03.436066" level="INFO">DELETE Response : url=http://10.30.170.173: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.171.7 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:03.436155" 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-10-11T01:03:03.428600" elapsed="0.007580"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:03.428354" elapsed="0.007884"/>
</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-10-11T01:03:03.436505" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:03.436271" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.428337" elapsed="0.008280"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.438342" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:03.437944" elapsed="0.000453"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:03.437614" elapsed="0.000850"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.437590" elapsed="0.000906"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.439275" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:03.438890" elapsed="0.000441"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:03.438564" elapsed="0.000810"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.438543" elapsed="0.000862"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.440175" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:03.439683" elapsed="0.000527"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:03.440615" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:03.440296" elapsed="0.000393"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.441375" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:03.441005" elapsed="0.000424"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:03.440761" elapsed="0.000715"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.440274" elapsed="0.001230"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.442229" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:03.441747" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:03.442663" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:03.442351" elapsed="0.000385"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.443370" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:03.443004" elapsed="0.000399"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:03.442766" elapsed="0.000703"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.442328" elapsed="0.001169"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:03.443694" elapsed="0.000430"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:03.444677" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:03.444346" elapsed="0.000365"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:03.444923" elapsed="0.000317"/>
</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-10-11T01:03:03.437082" elapsed="0.008236"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:03:03.445374" elapsed="0.000058"/>
</return>
<msg time="2026-10-11T01:03:03.445639" 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-10-11T01:03:03.427437" elapsed="0.018236"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:03.445739" elapsed="0.000034"/>
</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-10-11T01:03:03.375795" elapsed="0.070077"/>
</kw>
<kw name="Deconfigure_App_Peer">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.446897" level="INFO">${app_rib} = 10.30.170.173</msg>
<var>${app_rib}</var>
<arg>${ODL_SYSTEM_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:03.446537" elapsed="0.000394"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.447745" level="INFO">&amp;{route_mapping} = { APP_RIB=10.30.170.173 | 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-10-11T01:03:03.447200" 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-10-11T01:03:03.463480" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:03.463165" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:03.464265" 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-10-11T01:03:03.464025" elapsed="0.000302">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-10-11T01:03:03.464429" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:03.463663" elapsed="0.000797"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.464962" 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-10-11T01:03:03.464635" elapsed="0.000368"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:03.465280" 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-10-11T01:03:03.465402" 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-10-11T01:03:03.465171" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.465885" 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-10-11T01:03:03.465665" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.466915" level="INFO">mapping: {'APP_RIB': '10.30.170.173', '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-10-11T01:03:03.466684" elapsed="0.000272"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.467384" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:03.467140" elapsed="0.000281"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.468008" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:03.467730" elapsed="0.000303"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:03.468926" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:03.468542" elapsed="0.000409"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:03.469007" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:03:03.469138" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:03.468198" 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-10-11T01:03:03.469322" elapsed="0.000185"/>
</kw>
<var name="${key}">APP_RIB</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:03:03.467603" elapsed="0.001941"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.470048" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:03.469769" elapsed="0.000303"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:03.471085" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:03.470717" elapsed="0.000392"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:03.471153" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:03:03.471282" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:03.470236" 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-10-11T01:03:03.471483" elapsed="0.000220"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:03.469642" elapsed="0.002097"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:03.467465" elapsed="0.004306"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:03.471808" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:03:03.471934" level="INFO">${mapping_to_use} = {'APP_RIB': '10.30.170.173', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:03.466254" elapsed="0.005703"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:03.466000" elapsed="0.005996"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:03.472168" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:03.472020" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.465970" elapsed="0.006266"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.472902" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:03.472397" elapsed="0.000532"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:03.472972" 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/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-10-11T01:03:03.462631" elapsed="0.010455"/>
</kw>
<msg time="2026-10-11T01:03:03.473132" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:03.458123" elapsed="0.015063"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:03:03.477477" 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/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-10-11T01:03:03.481724" 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/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-10-11T01:03:03.485933" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:03.486123" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:03.486304" 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-10-11T01:03:03.486661" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:03.486517" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:03.486504" 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-10-11T01:03:03.486885" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:03.487075" 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-10-11T01:03:03.487237" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:03.486477" elapsed="0.000806"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:03.486375" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:03.487468" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:03.487536" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:03.487643" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:03.457474" elapsed="0.030194"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.488704" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:03.488480" elapsed="0.000267"/>
</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-10-11T01:03:03.495038" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:03.495081" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:03.495167" 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-10-11T01:03:03.489042" elapsed="0.006149"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:03.488808" elapsed="0.006420"/>
</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-10-11T01:03:03.495399" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:03.495251" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.488791" elapsed="0.006743"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.496749" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:03.496475" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:03.496221" elapsed="0.000599"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.496203" elapsed="0.000639"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.497429" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:03.497143" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:03.496890" elapsed="0.000613"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.496876" elapsed="0.000648"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.498046" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:03.497696" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:03.498348" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:03.498133" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.498882" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:03.498622" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:03.498456" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.498117" elapsed="0.000841"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.499488" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:03.499141" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:03.499779" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:03.499575" elapsed="0.000255"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.500439" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:03.500020" elapsed="0.000445"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:03.499851" elapsed="0.000647"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.499558" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:03.500658" elapsed="0.000291"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:03.501379" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:03.501162" elapsed="0.000256"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:03.501569" elapsed="0.000209"/>
</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-10-11T01:03:03.495849" elapsed="0.005984"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:03:03.501873" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:03.502058" 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-10-11T01:03:03.487894" elapsed="0.014188"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:03.502130" elapsed="0.000024"/>
</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-10-11T01:03:03.448071" elapsed="0.054153"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.502866" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | APP_PEER_NAME=example-bgp-peer-app | IP=10.30.170.173 | 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-10-11T01:03:03.502401" 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-10-11T01:03:03.516522" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:03.516209" elapsed="0.000340"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:03.517219" 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-10-11T01:03:03.517027" elapsed="0.000251">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-10-11T01:03:03.517427" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:03.516703" elapsed="0.000749"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.517933" 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-10-11T01:03:03.517628" elapsed="0.000330"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:03.518239" 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-10-11T01:03:03.518362" 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-10-11T01:03:03.518132" elapsed="0.000254"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.518812" 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-10-11T01:03:03.518595" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.519790" level="INFO">mapping: {'DEVICE_NAME': 'controller-config', 'APP_PEER_NAME': 'example-bgp-peer-app', 'IP': '10.30.170.173', '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-10-11T01:03:03.519558" elapsed="0.000273"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.520290" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:03.520016" elapsed="0.000298"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.520901" 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-10-11T01:03:03.520639" elapsed="0.000286"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:03.521814" 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-10-11T01:03:03.521454" elapsed="0.000385"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:03.521883" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:03:03.522019" 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-10-11T01:03:03.521102" 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-10-11T01:03:03.522209" elapsed="0.000167"/>
</kw>
<var name="${key}">DEVICE_NAME</var>
<var name="${value}">controller-config</var>
<status status="PASS" start="2026-10-11T01:03:03.520510" elapsed="0.001921"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.523097" 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-10-11T01:03:03.522799" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:03.524108" 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-10-11T01:03:03.523735" elapsed="0.000397"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:03.524178" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:03.524301" 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-10-11T01:03:03.523291" 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-10-11T01:03:03.524504" elapsed="0.000167"/>
</kw>
<var name="${key}">APP_PEER_NAME</var>
<var name="${value}">example-bgp-peer-app</var>
<status status="PASS" start="2026-10-11T01:03:03.522532" elapsed="0.002176"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.525213" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:03.524932" elapsed="0.000305"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:03.526137" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:03.525774" elapsed="0.000388"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:03.526205" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:03.526327" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:03.525430" elapsed="0.000925"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:03.526540" elapsed="0.000169"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:03:03.524806" elapsed="0.001940"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.527290" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:03.527024" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:03.528196" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:03.527835" elapsed="0.000385"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:03.528264" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:03:03.528388" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:03.527508" elapsed="0.000922"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:03.528597" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:03.526884" elapsed="0.001912"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:03.520356" elapsed="0.008471"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:03.528864" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:03:03.529002" level="INFO">${mapping_to_use} = {'DEVICE_NAME': 'controller-config', 'APP_PEER_NAME': 'example-bgp-peer-app', 'IP': '10.30.170.173', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:03.519173" elapsed="0.009854"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:03.518915" elapsed="0.010141"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:03.529224" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:03.529079" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.518897" elapsed="0.010395"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.530018" 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-10-11T01:03:03.529472" elapsed="0.000573"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:03.530088" 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-10-11T01:03:03.515676" elapsed="0.014512"/>
</kw>
<msg time="2026-10-11T01:03:03.530234" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:03.511150" elapsed="0.019144"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:03:03.534723" 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/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-10-11T01:03:03.539028" 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/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-10-11T01:03:03.543266" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:03.543471" 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-10-11T01:03:03.543651" 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-10-11T01:03:03.544031" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:03.543875" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:03.543862" 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-10-11T01:03:03.544256" 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-10-11T01:03:03.544447" 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-10-11T01:03:03.544611" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:03.543837" elapsed="0.000821"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:03.543747" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:03.544831" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:03.544896" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:03.545023" 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-10-11T01:03:03.510508" elapsed="0.034541"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.546083" 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.173</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:03.545846" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:03.552870" level="INFO">DELETE Request : url=http://10.30.170.173: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.173 
 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.173 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:03.552952" level="INFO">DELETE Response : url=http://10.30.170.173: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.173 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:03.553123" 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-10-11T01:03:03.546434" elapsed="0.006732"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:03.546190" elapsed="0.007035"/>
</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-10-11T01:03:03.553393" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:03.553248" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.546170" elapsed="0.007318"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.554716" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:03.554442" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:03.554183" elapsed="0.000604"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.554166" elapsed="0.000643"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.555398" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:03.555134" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:03.554857" elapsed="0.000630"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.554842" elapsed="0.000667"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.556037" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:03.555681" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:03.556331" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:03.556125" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.556879" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:03.556618" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:03.556453" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.556108" elapsed="0.000847"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.557491" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:03.557142" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:03.557784" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:03.557578" elapsed="0.000257"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.558293" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:03.558030" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:03.557857" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.557561" elapsed="0.000808"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:03.558525" elapsed="0.000297"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:03.559211" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:03.558979" elapsed="0.000256"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:03.559384" elapsed="0.000224"/>
</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-10-11T01:03:03.553815" elapsed="0.005848"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:03:03.559704" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:03.559874" 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-10-11T01:03:03.545287" elapsed="0.014611"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:03.559944" elapsed="0.000024"/>
</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-10-11T01:03:03.503109" elapsed="0.056943"/>
</kw>
<doc>Revert the BGP configuration to the original state: without application peer</doc>
<status status="PASS" start="2026-10-11T01:03:03.446077" elapsed="0.114029"/>
</kw>
<kw name="Stop_ExaBgp" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-10-11T01:03:03.560763" level="INFO">${output} =  </msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-10-11T01:03:03.560617" elapsed="0.000170"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.561358" level="INFO"> </msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:03.560979" elapsed="0.000420"/>
</kw>
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.562371" 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-10-11T01:03:03.562058" 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-10-11T01:03:03.562560" elapsed="0.000186"/>
</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-10-11T01:03:03.561745" elapsed="0.001055"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:03:03.564528" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:03:03.564610" level="INFO">${output} = ^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-423-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-10-11T01:03:03.562969" elapsed="0.001666"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.565057" level="INFO">^C[?2004l[?2004h[?2004l
[?2004h[jenkins@releng-26932-423-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-10-11T01:03:03.564825" elapsed="0.000275"/>
</kw>
<kw name="Virtual_Env_Deactivate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:03:03.567107" 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-10-11T01:03:03.565693" elapsed="0.001463"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:03:03.764958" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-423-1-mininet-ovs-217-0 ~]&gt;</msg>
<msg time="2026-10-11T01:03:03.765060" level="INFO">${output} = [?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-423-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-10-11T01:03:03.567320" elapsed="0.197766"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.765663" level="INFO">[?2004ldeactivate: command not found
[?2004h[jenkins@releng-26932-423-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-10-11T01:03:03.765432" elapsed="0.000274"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:03.765157" elapsed="0.000617"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.765133" elapsed="0.000665"/>
</if>
<arg>log_output=${True}</arg>
<doc>Deactivates virtual environment.</doc>
<status status="PASS" start="2026-10-11T01:03:03.565319" elapsed="0.200522"/>
</kw>
<doc>Stops the ExaBgp by sending ctrl+c</doc>
<status status="PASS" start="2026-10-11T01:03:03.560305" elapsed="0.205581"/>
</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-10-11T01:03:03.766995" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:03.766643" elapsed="0.000408"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.766626" elapsed="0.000447"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:03.767212" elapsed="0.000297"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.769949" 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-10-11T01:03:03.769567" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-10-11T01:03:03.770185" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:03.770077" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.770059" elapsed="0.000182"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.770689" 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-10-11T01:03:03.770398" elapsed="0.000315"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:03.771100" 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-10-11T01:03:03.770876" elapsed="0.000248"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-10-11T01:03:03.771438" 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-10-11T01:03:03.771281" elapsed="0.000182"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.771894" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:03.771613" elapsed="0.000306"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.772370" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:03.772092" elapsed="0.000305"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.772920" 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 of the current test case.</doc>
<status status="PASS" start="2026-10-11T01:03:03.772568" elapsed="0.000398"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.773456" 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-10-11T01:03:03.773199" elapsed="0.000301"/>
</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-10-11T01:03:03.769137" elapsed="0.004444"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:03.766432" elapsed="0.007194"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-10-11T01:03:03.766076" elapsed="0.007587"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:03.373069" elapsed="0.400635"/>
</kw>
<doc>n-paths policy selected on odl</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-10-11T01:02:42.862270" elapsed="20.911473">... 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-10-11T01:03:03.775527" elapsed="0.000377"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:03:03.775251" elapsed="0.000705"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:03.777424" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:03.777319" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.777300" 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-10-11T01:03:03.779520" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:03.779436" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.779418" elapsed="0.000164"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.780496" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:03.780158" elapsed="0.000363"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.780933" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:03:03.780673" elapsed="0.000289"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:03:03.781018" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:03:03.781148" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:03:03.779788" elapsed="0.001383"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:03.783731" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:03.783646" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.783629" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:03.784848" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:03.784765" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.784748" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:03.785236" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:03:03.785068" elapsed="0.000192"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:03:03.785586" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:03.785437" elapsed="0.000172"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:03:03.821066" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:03:03.786109" elapsed="0.035052"/>
</kw>
<msg time="2026-10-11T01:03:03.821311" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:03:03.821353" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:03.785763" elapsed="0.035625"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:03:03.861196" 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-10-11T01:03:03.821914" elapsed="0.039383"/>
</kw>
<msg time="2026-10-11T01:03:03.861464" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:03:03.861505" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:03.821574" elapsed="0.039966"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:03.861811" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:03.861608" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.861590" elapsed="0.000292"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.863802" 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-10-11T01:03:03.862099" elapsed="0.001799"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:03.864272" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:03.863996" elapsed="0.000382"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.863958" elapsed="0.000472"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:03:03.864469" 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-10-11T01:03:03.867029" elapsed="0.000118"/>
</kw>
<msg time="2026-10-11T01:03:03.867205" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:03.865885" elapsed="0.001454"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:03.867666" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:03.868018" 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-10-11T01:03:03.865288" 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-10-11T01:03:03.864779" elapsed="0.003651"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:03:03.784514" elapsed="0.083992"/>
</kw>
<msg time="2026-10-11T01:03:03.868588" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:03.868627" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:03.783949" elapsed="0.084713"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:03:03.868816" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:03:03.868731" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.868713" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:03.869227" 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-10-11T01:03:03.869547" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:03:03.869611" 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-10-11T01:03:03.783346" elapsed="0.086350"/>
</kw>
<msg time="2026-10-11T01:03:03.869779" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:03.869817" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:03.781510" elapsed="0.088342"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:03.870150" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:03.869918" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.869902" elapsed="0.000318"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:03:03.781355" elapsed="0.088887"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:03:03.781217" elapsed="0.089052"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:03:03.779126" elapsed="0.091190"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:03:03.776958" elapsed="0.093407"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:03.776124" elapsed="0.094379"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:03:03.774886" elapsed="0.095669"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.871210" level="INFO">&amp;{mapping} = { DEVICE_NAME=controller-config | BGP_NAME=example-bgp-peer | IP=10.30.171.7 | 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-10-11T01:03:03.870734" elapsed="0.000506"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-10-11T01:03:03.774266" elapsed="0.097074"/>
</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-10-11T01:03:03.921239" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:03.920884" elapsed="0.000456"/>
</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-10-11T01:03:03.922732" level="INFO">Executing command 'cd '.' &amp;&amp; rm -rf /tmp/defaultvenv'.</msg>
<msg time="2026-10-11T01:03:03.976063" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:03:03.976167" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T01:03:03.976206" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T01:03:03.976242" 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-10-11T01:03:03.922567" elapsed="0.053696"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.977046" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T01:03:03.976781" elapsed="0.000307"/>
</kw>
<msg time="2026-10-11T01:03:03.977172" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T01:03:03.977210" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:03.976455" elapsed="0.000776"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.977966" 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-10-11T01:03:03.977405" elapsed="0.000597"/>
</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-10-11T01:03:03.978948" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:03.978726" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.979400" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:03.979188" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.979848" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:03.979639" elapsed="0.000248"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T01:03:03.978373" elapsed="0.001563"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:03.978084" elapsed="0.001884"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.978061" elapsed="0.001990"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T01:03:03.980180" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:03.980102" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.980087" elapsed="0.000159"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T01:03:03.980359" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-10-11T01:03:03.980291" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.980278" elapsed="0.000179"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:03.980606" elapsed="0.000020"/>
</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-10-11T01:03:03.922066" elapsed="0.058635"/>
</kw>
<msg time="2026-10-11T01:03:03.980746" 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-10-11T01:03:03.921532" elapsed="0.059270"/>
</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-10-11T01:03:03.920239" elapsed="0.060631"/>
</kw>
<msg time="2026-10-11T01:03:03.980913" 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-10-11T01:03:03.872765" elapsed="0.108197"/>
</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-10-11T01:03:03.872253" elapsed="0.108789"/>
</kw>
<doc>Deletes a directory with virtual env.</doc>
<status status="PASS" start="2026-10-11T01:03:03.872053" elapsed="0.109035"/>
</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-10-11T01:03:03.982643" 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-10-11T01:03:03.982419" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.983101" 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-10-11T01:03:03.982876" elapsed="0.000437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.983871" 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-10-11T01:03:03.983516" elapsed="0.000397"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.984356" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:03.984137" elapsed="0.000259"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:03.985063" 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-10-11T01:03:03.984887" elapsed="0.000200"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:03:03.985387" 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-10-11T01:03:03.985238" elapsed="0.000187"/>
</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-10-11T01:03:03.985589" elapsed="0.000156"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:03.986165" 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-10-11T01:03:03.985934" elapsed="0.000271"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:03:03.986242" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:03.986368" 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-10-11T01:03:03.984588" elapsed="0.001803"/>
</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-10-11T01:03:04.005388" level="INFO">PUT Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node016uxh7fq2iclat2ero2768d021.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-10-11T01:03:04.005696" level="INFO">PUT Response : url=http://10.30.170.173: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-10-11T01:03:04.005825" 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-10-11T01:03:03.986695" elapsed="0.019164"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:03.986468" elapsed="0.019447"/>
</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-10-11T01:03:04.006182" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:04.005948" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:03.986452" elapsed="0.019846"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:04.007823" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:04.007443" elapsed="0.000434"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:04.007095" elapsed="0.000824"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:04.007072" elapsed="0.000879"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:04.008784" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:04.008398" elapsed="0.000443"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:04.008035" elapsed="0.000849"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:04.008014" elapsed="0.000901"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:04.009692" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:04.009186" elapsed="0.000542"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:04.010123" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:04.009813" elapsed="0.000383"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:04.010841" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:04.010475" elapsed="0.000400"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:04.010227" elapsed="0.000693"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:04.009791" elapsed="0.001156"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:04.011694" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:04.011208" elapsed="0.000521"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:04.012116" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:04.011815" elapsed="0.000373"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:04.012821" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:04.012458" elapsed="0.000397"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:04.012218" elapsed="0.000681"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:04.011792" elapsed="0.001134"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:04.013141" elapsed="0.000429"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:04.014116" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:04.013790" 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-10-11T01:03:04.014361" elapsed="0.000313"/>
</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-10-11T01:03:04.006755" elapsed="0.007995"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:03:04.014945" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-10-11T01:03:04.014831" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:04.014809" elapsed="0.000262"/>
</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-10-11T01:03:04.015270" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:03:04.015354" elapsed="0.000019"/>
</return>
<msg time="2026-10-11T01:03:04.015590" 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-10-11T01:03:03.981799" elapsed="0.033825"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:04.015698" elapsed="0.000035"/>
</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-10-11T01:03:03.981270" elapsed="0.034606"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-10-11T01:03:04.016138" elapsed="0.000481"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:04.016918" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects </doc>
<status status="PASS" start="2026-10-11T01:03:04.016822" elapsed="0.000269"/>
</kw>
<doc>Suite teardown keyword with old rib restoration</doc>
<status status="PASS" start="2026-10-11T01:03:03.871807" elapsed="0.145352"/>
</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-10-11T01:02:14.713318" elapsed="49.303881"/>
</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-10-11T01:03:04.050186" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:03:04.048304" elapsed="0.001928"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-10-11T01:03:04.048046" elapsed="0.002243"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T01:03:04.052557" 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-10-11T01:03:04.051256" elapsed="0.001327"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-10-11T01:03:04.052733" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:04.052654" elapsed="0.000118"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:04.052636" elapsed="0.000155"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:04.053301" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:03:04.052969" elapsed="0.000371"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T01:03:04.053796" 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-10-11T01:03:04.053518" elapsed="0.000302"/>
</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-10-11T01:03:04.054326" elapsed="0.000266"/>
</kw>
<msg time="2026-10-11T01:03:04.054677" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:04.054718" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:04.053993" elapsed="0.000746"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:04.055237" 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-10-11T01:03:04.054914" elapsed="0.000348"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:03:04.056131" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:03:04.055870" elapsed="0.000286"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:03:04.056555" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:03:04.056300" elapsed="0.000280"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:04.057037" 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-10-11T01:03:04.056757" elapsed="0.000306"/>
</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-10-11T01:03:04.057930" elapsed="0.000169"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:04.058546" level="INFO">${member_ip} = 10.30.170.173</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:04.058256" elapsed="0.000315"/>
</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-10-11T01:03:04.058734" elapsed="0.000165"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:04.059779" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:04.059516" elapsed="0.000288"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-11T01:03:04.059844" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:03:04.059971" 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-10-11T01:03:04.059088" elapsed="0.000918"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:04.060510" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x743445447a10&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-10-11T01:03:04.060180" elapsed="0.000491"/>
</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-10-11T01:03:04.060833" elapsed="0.000163"/>
</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-10-11T01:03:04.057487" elapsed="0.003564"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:03:04.057299" elapsed="0.003790"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-10-11T01:03:04.057114" elapsed="0.004004"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:04.061674" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:03:04.061304" elapsed="0.000410"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:04.062261" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.173'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:03:04.061900" elapsed="0.000400"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:04.062837" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:03:04.062501" elapsed="0.000374"/>
</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-10-11T01:03:04.055498" elapsed="0.007428"/>
</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-10-11T01:03:04.050938" elapsed="0.012038"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:04.063136" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:04.063048" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:04.063031" elapsed="0.000165"/>
</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-10-11T01:03:04.064389" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:04.064070" elapsed="0.000360"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:03:04.064841" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:03:04.064582" elapsed="0.000282"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:03:04.064904" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:04.065042" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:03:04.063757" elapsed="0.001307"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:04.066066" level="INFO">${member_ip} = 10.30.170.173</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-10-11T01:03:04.065836" elapsed="0.000255"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:03:04.066802" 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-10-11T01:03:04.066890" 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-10-11T01:03:04.066665" elapsed="0.000249"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:04.069889" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:04.069198" elapsed="0.000770"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:04.069179" elapsed="0.000840"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:03:04.070705" 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-10-11T01:03:04.070924" 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-10-11T01:03:04.070266" elapsed="0.000707"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:04.071863" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.173" 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-10-11T01:03:04.071285" elapsed="0.000745"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:03:04.073168" 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-10-11T01:03:04.072324" elapsed="0.000896"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:03:04.074940" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T01:03:04.075125" 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-10-11T01:03:04.074619" elapsed="0.000547"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:04.075540" elapsed="0.000412"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T01:03:04.077048" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T01:03:04.685233" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 01:03:04 UTC 2026

  System load:  0.1                Processes:             121
  Usage of /:   14.2% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.173
  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.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 01:02:15 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T01:03:04.076790" elapsed="0.608574"/>
</kw>
<msg time="2026-10-11T01:03:04.685477" 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-10-11T01:03:04.076308" elapsed="0.609336"/>
</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-10-11T01:03:04.073771" elapsed="0.612043"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:03:04.686923" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-10-11T01:03:04.699857" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-10-11T01:03:04.700090" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T01:03:04.700222" 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-10-11T01:03:04.686316" elapsed="0.013974"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:03:04.700735" elapsed="0.000709"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:04.703095" 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-10-11T01:03:04.702331" elapsed="0.000931"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T01:03:04.703834" elapsed="0.000092"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:04.703525" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:04.703491" elapsed="0.000616"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T01:03:04.704512" elapsed="0.000108"/>
</return>
<status status="PASS" start="2026-10-11T01:03:04.704213" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:04.704191" elapsed="0.000599"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T01:03:04.704867" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:04.706609" elapsed="0.000598"/>
</kw>
<kw name="Open 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-10-11T01:03:04.707785" elapsed="0.000389"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:03:04.708566" elapsed="0.000299"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:03:04.705563" elapsed="0.003389"/>
</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-10-11T01:03:04.068537" elapsed="0.640596"/>
</kw>
<msg time="2026-10-11T01:03:04.709201" 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-10-11T01:03:04.067940" elapsed="0.641325"/>
</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-10-11T01:03:04.067560" elapsed="0.641907"/>
</kw>
<msg time="2026-10-11T01:03:04.709521" 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-10-11T01:03:04.067083" elapsed="0.642496"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:04.710459" elapsed="0.000387"/>
</kw>
<kw name="Open 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-10-11T01:03:04.711121" elapsed="0.000486"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:03:04.711819" elapsed="0.000142"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:03:04.709959" elapsed="0.002143"/>
</kw>
<msg time="2026-10-11T01:03:04.712268" 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-10-11T01:03:04.066292" elapsed="0.646012"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:04.713005" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:04.712645" elapsed="0.000419"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-11T01:03:04.713120" elapsed="0.000039"/>
</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-10-11T01:03:04.065369" elapsed="0.647894"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:03:04.065209" elapsed="0.648101"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:03:04.065110" elapsed="0.648242"/>
</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-10-11T01:03:04.063397" elapsed="0.650043"/>
</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-10-11T01:03:04.713657" elapsed="0.000285"/>
</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-10-11T01:03:04.721474" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:04.721333" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:04.721308" elapsed="0.000255"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:03:04.722020" 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-10-11T01:03:04.722151" 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-10-11T01:03:04.721840" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:04.722791" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:04.722472" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:04.723456" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:04.723130" elapsed="0.000386"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:04.724549" 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-10-11T01:03:04.724287" elapsed="0.000390">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-10-11T01:03:04.724810" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T01:03:04.724869" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:04.723737" elapsed="0.001162"/>
</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-10-11T01:03:04.725314" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:04.725009" elapsed="0.000416"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:04.724970" elapsed="0.000488"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:04.726368" level="INFO">${ip_address} = 10.30.170.173</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-10-11T01:03:04.726077" elapsed="0.000325"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-10-11T01:03:04.726484" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T01:03:04.726658" level="INFO">${odl_ip} = 10.30.170.173</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-10-11T01:03:04.725717" elapsed="0.000973"/>
</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-10-11T01:03:04.726939" elapsed="0.000529"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:03:04.727901" level="INFO">index=4
host=10.30.170.173
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-10-11T01:03:04.728043" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.173
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-10-11T01:03:04.727767" elapsed="0.000311"/>
</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-10-11T01:03:04.728307" elapsed="0.000340"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-10-11T01:03:04.729374" level="INFO">Logging into '10.30.170.173:8101' as 'karaf'.</msg>
<msg time="2026-10-11T01:03:04.914552" 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-10-11T01:03:04.728938" elapsed="0.185723"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:04.916063" elapsed="0.000274"/>
</kw>
<kw name="Open 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-10-11T01:03:04.916539" elapsed="0.000145"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:03:04.916829" elapsed="0.000090"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:03:04.915679" elapsed="0.001288"/>
</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-10-11T01:03:04.915051" elapsed="0.001973"/>
</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-10-11T01:03:04.721011" elapsed="0.196061"/>
</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-10-11T01:03:04.714926" elapsed="0.202187"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:04.714382" elapsed="0.202784"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:03:04.714183" elapsed="0.203031"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-10-11T01:03:04.714026" elapsed="0.203226"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-10-11T01:03:04.050563" elapsed="0.866759"/>
</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-10-11T01:03:04.918194" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:04.918101" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:04.918080" elapsed="0.000181"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:04.920213" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:04.920130" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:04.920113" elapsed="0.000168"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:04.921159" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:04.920815" elapsed="0.000370"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:03:04.921619" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:03:04.921340" elapsed="0.000303"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:03:04.921683" elapsed="0.000032"/>
</return>
<msg time="2026-10-11T01:03:04.921814" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:03:04.920507" elapsed="0.001330"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:04.924511" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:04.924425" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:04.924394" elapsed="0.000181"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:04.925629" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:04.925544" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:04.925527" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:04.926126" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:03:04.925841" elapsed="0.000310"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:03:04.926525" 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-10-11T01:03:04.926319" elapsed="0.000240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:03:04.964864" 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-10-11T01:03:04.927239" elapsed="0.037764"/>
</kw>
<msg time="2026-10-11T01:03:04.965132" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:03:04.965173" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:04.926720" elapsed="0.038488"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:03:05.045732" 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-10-11T01:03:04.966037" elapsed="0.079843"/>
</kw>
<msg time="2026-10-11T01:03:05.046021" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:03:05.046070" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:04.965377" elapsed="0.080728"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:05.046386" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:05.046174" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:05.046156" elapsed="0.000411"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.047123" 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-10-11T01:03:05.046752" elapsed="0.000454"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:05.047590" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:05.047267" elapsed="0.000465"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:05.047250" elapsed="0.000506"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:03:05.047786" 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">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:05.049735" elapsed="0.000428"/>
</kw>
<kw name="Open 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-10-11T01:03:05.050544" elapsed="0.000272"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:03:05.051168" elapsed="0.000218"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:03:05.048911" elapsed="0.002630"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:03:05.048094" elapsed="0.003574"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:03:04.925320" elapsed="0.126426"/>
</kw>
<msg time="2026-10-11T01:03:05.051828" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:05.051868" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:04.924729" elapsed="0.127175"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:03:05.052133" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:03:05.052044" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:05.052023" elapsed="0.000187"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:05.052548" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:05.052846" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:03:05.052910" 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-10-11T01:03:04.924177" elapsed="0.128832"/>
</kw>
<msg time="2026-10-11T01:03:05.053094" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:05.053134" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:04.922264" elapsed="0.130905"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:05.053543" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:05.053237" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:05.053221" elapsed="0.000395"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:03:04.922118" elapsed="0.131519"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:03:04.921935" elapsed="0.131730"/>
</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-10-11T01:03:04.919888" elapsed="0.133824"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-10-11T01:03:04.917906" elapsed="0.135855"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:04.917498" elapsed="0.136300"/>
</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-10-11T01:03:04.047768" elapsed="1.006076"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:03:05.054365" 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-10-11T01:03:05.054071" elapsed="0.000318"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.054885" level="INFO">${mininet_conn_id} = 7</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:03:05.054600" elapsed="0.000324"/>
</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-10-11T01:03:05.056676" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T01:03:05.056747" 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-10-11T01:03:05.056184" elapsed="0.000586"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:05.056925" elapsed="0.000299"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T01:03:05.058012" level="INFO">Logging into '10.30.171.7:22' as 'jenkins'.</msg>
<msg time="2026-10-11T01:03:05.673167" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Sun Oct 11 01:03:05 UTC 2026

  System load:  0.14               Processes:             105
  Usage of /:   19.9% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.7
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 01:02:15 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T01:03:05.057776" elapsed="0.615588"/>
</kw>
<msg time="2026-10-11T01:03:05.673542" 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-10-11T01:03:05.057391" elapsed="0.616279"/>
</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-10-11T01:03:05.055802" elapsed="0.618057"/>
</kw>
<msg time="2026-10-11T01:03:05.674085" 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-10-11T01:03:05.055446" elapsed="0.618740"/>
</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-10-11T01:03:05.055118" elapsed="0.619222"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:05.675493" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7434497baf50&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-10-11T01:03:05.674856" elapsed="0.000969"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T01:03:05.686975" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-10-11T01:03:05.703963" 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-10-11T01:03:05.676297" elapsed="0.027819"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:03:05.706964" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-10-11T01:03:05.740201" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:03:05.740552" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T01:03:05.740643" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T01:03:05.740726" 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-10-11T01:03:05.706612" elapsed="0.034162"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.742766" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T01:03:05.742166" elapsed="0.000696"/>
</kw>
<msg time="2026-10-11T01:03:05.743081" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T01:03:05.743171" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:05.741267" elapsed="0.001950"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.744602" 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-10-11T01:03:05.743690" elapsed="0.000967"/>
</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-10-11T01:03:05.745581" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:05.744834" elapsed="0.000885"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:05.744785" elapsed="0.000988"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-10-11T01:03:05.746091" elapsed="0.000069"/>
</return>
<status status="PASS" start="2026-10-11T01:03:05.745887" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:05.745856" elapsed="0.000419"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-10-11T01:03:05.746484" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:05.746384" elapsed="0.000181"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:05.746353" elapsed="0.000256"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:05.746944" elapsed="0.000060"/>
</kw>
<msg time="2026-10-11T01:03:05.747238" 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-10-11T01:03:05.705699" elapsed="0.041591"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-10-11T01:03:05.747620" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-10-11T01:03:05.747457" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:05.747392" elapsed="0.000385"/>
</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-10-11T01:03:05.748176" elapsed="0.000043"/>
</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-10-11T01:03:05.704723" elapsed="0.043619"/>
</kw>
<doc>Initialize SetupUtils. Suite setup keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:04.047510" elapsed="1.700968"/>
</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-10-11T01:03:05.752122" elapsed="0.000521"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:03:05.751516" elapsed="0.001242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:05.754854" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:05.754656" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:05.754617" elapsed="0.000405"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:05.759602" elapsed="0.000120"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:05.759385" elapsed="0.000407"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:05.759348" elapsed="0.000491"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.761971" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:05.761211" elapsed="0.000845"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.763057" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:03:05.762404" elapsed="0.000709"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:03:05.763202" elapsed="0.000064"/>
</return>
<msg time="2026-10-11T01:03:05.763524" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:03:05.760330" elapsed="0.003246"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:05.771606" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:05.771382" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:05.771342" elapsed="0.000407"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:05.773557" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:05.773435" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:05.773384" elapsed="0.000261"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:05.774112" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:03:05.773855" elapsed="0.000291"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:03:05.774643" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:05.774441" elapsed="0.000236"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:03:05.809796" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:03:05.775385" elapsed="0.034565"/>
</kw>
<msg time="2026-10-11T01:03:05.810194" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:03:05.810252" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:05.774899" elapsed="0.035404"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:03:05.840129" 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-10-11T01:03:05.811150" elapsed="0.029087"/>
</kw>
<msg time="2026-10-11T01:03:05.840393" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:03:05.840456" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:05.810626" elapsed="0.029866"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:05.840818" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:05.840577" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:05.840551" elapsed="0.000343"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.841362" 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-10-11T01:03:05.841116" elapsed="0.000330"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:05.841712" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:05.841509" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:05.841492" elapsed="0.000290"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:03:05.841817" 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-10-11T01:03:05.844583" elapsed="0.000121"/>
</kw>
<msg time="2026-10-11T01:03:05.844763" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:05.843366" elapsed="0.001535"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:05.845285" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:05.845651" 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-10-11T01:03:05.842692" elapsed="0.003330"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:03:05.842179" elapsed="0.003906"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:03:05.773047" elapsed="0.073115"/>
</kw>
<msg time="2026-10-11T01:03:05.846249" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:05.846289" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:05.772120" elapsed="0.074205"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:03:05.846519" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T01:03:05.846396" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:05.846377" 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-10-11T01:03:05.846935" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:05.847264" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:03:05.847329" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T01:03:05.770711" elapsed="0.076723"/>
</kw>
<msg time="2026-10-11T01:03:05.847523" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:05.847564" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:05.764484" elapsed="0.083115"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:05.847891" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:05.847667" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:05.847651" elapsed="0.000311"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:03:05.764079" elapsed="0.083921"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:03:05.763685" elapsed="0.084348"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:03:05.758703" elapsed="0.089381"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:03:05.754057" elapsed="0.094080"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:05.753121" elapsed="0.095058"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:03:05.750349" elapsed="0.097880"/>
</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-10-11T01:03:05.859256" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:05.858924" elapsed="0.000366"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:05.860054" 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-10-11T01:03:05.859814" elapsed="0.000315">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-10-11T01:03:05.860214" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:05.859490" elapsed="0.000747"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.860736" 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-10-11T01:03:05.860428" elapsed="0.000365"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:05.861098" 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-10-11T01:03:05.861250" 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-10-11T01:03:05.860966" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.861717" 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-10-11T01:03:05.861491" elapsed="0.000269"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.862731" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:03:05.862467" elapsed="0.000307"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.863226" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:05.862954" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.863861" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:05.863587" elapsed="0.000298"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:05.864595" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:05.864386" elapsed="0.000233"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:05.864664" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:05.864789" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:05.864071" elapsed="0.000741"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:05.864993" elapsed="0.000183"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:03:05.863453" elapsed="0.001760"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.865725" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:05.865455" elapsed="0.000294"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:05.866427" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:05.866236" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:05.866497" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:05.866620" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:05.865918" elapsed="0.000725"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:05.866806" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:05.865311" elapsed="0.001714"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:05.863297" elapsed="0.003761"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:05.867096" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:05.867223" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:05.862094" elapsed="0.005152"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:05.861822" elapsed="0.005454"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:05.867465" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:05.867298" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:05.861805" elapsed="0.005737"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.868482" 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-10-11T01:03:05.867732" elapsed="0.000777"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:05.868553" 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/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-10-11T01:03:05.858415" elapsed="0.010241"/>
</kw>
<msg time="2026-10-11T01:03:05.868738" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:05.854058" elapsed="0.014726"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:05.872932" 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/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-10-11T01:03:05.877030" 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/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-10-11T01:03:05.881158" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:05.881343" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:05.881542" 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-10-11T01:03:05.881882" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:05.881737" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:05.881722" 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-10-11T01:03:05.882123" 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-10-11T01:03:05.882304" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:05.882483" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:05.881697" elapsed="0.000835"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:05.881610" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:05.882709" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:05.882775" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:03:05.882884" 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-10-11T01:03:05.853453" elapsed="0.029456"/>
</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-10-11T01:03:05.892101" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:05.891781" elapsed="0.000346"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:05.892791" 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-10-11T01:03:05.892619" elapsed="0.000289">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-10-11T01:03:05.893022" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:05.892285" elapsed="0.000761"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.893548" 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-10-11T01:03:05.893219" elapsed="0.000355"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:05.893853" 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-10-11T01:03:05.893975" 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-10-11T01:03:05.893739" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.894450" 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-10-11T01:03:05.894216" elapsed="0.000279"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:05.894807" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:05.894556" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.895307" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', '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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:05.895044" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:05.894883" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:05.894539" elapsed="0.000844"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.896062" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.173&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-10-11T01:03:05.895559" elapsed="0.000531"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:05.896134" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:05.891259" elapsed="0.004976"/>
</kw>
<msg time="2026-10-11T01:03:05.896287" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:05.886892" elapsed="0.009438"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:05.900669" 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/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-10-11T01:03:05.904855" 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/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-10-11T01:03:05.909219" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:05.909480" 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-10-11T01:03:05.909666" 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-10-11T01:03:05.910016" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:05.909858" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:05.909845" 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-10-11T01:03:05.910246" 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-10-11T01:03:05.910441" 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-10-11T01:03:05.910607" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:05.909820" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:05.909732" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:05.910830" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:05.910895" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:05.911018" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.173&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-10-11T01:03:05.886120" elapsed="0.024926"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:05.912174" 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-10-11T01:03:05.911964" elapsed="0.000270">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-10-11T01:03:05.912317" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:05.911640" elapsed="0.000700"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:05.912637" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:05.912401" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.913164" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:05.912884" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:05.912710" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:05.912385" elapsed="0.000854"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.913761" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:05.913421" elapsed="0.000364"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:05.913829" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:05.913953" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:05.911324" elapsed="0.002652"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.915216" 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.173</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:05.914997" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.915683" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.173&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-10-11T01:03:05.915468" elapsed="0.000259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.916145" 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-10-11T01:03:05.915914" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.916642" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:05.916422" elapsed="0.000260"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:05.917400" 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-10-11T01:03:05.917238" elapsed="0.000202"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:03:05.917784" 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-10-11T01:03:05.917619" elapsed="0.000189"/>
</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-10-11T01:03:05.917971" elapsed="0.000171"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.918579" 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-10-11T01:03:05.918339" elapsed="0.000281"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:03:05.918658" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:05.918785" 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-10-11T01:03:05.916865" elapsed="0.001943"/>
</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-10-11T01:03:05.932298" level="INFO">PUT Request : url=http://10.30.170.173: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.173 
 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.173 
 headers={'User-Agent': 'python-requests/2.34.2', '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.173&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-10-11T01:03:05.932353" level="INFO">PUT Response : url=http://10.30.170.173: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.173 
 status=201, reason=Created 
 headers={'Set-Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Sat, 10-Oct-2026 01:03:05 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:05.932543" 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-10-11T01:03:05.919112" elapsed="0.013457"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:05.918871" elapsed="0.013739"/>
</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-10-11T01:03:05.932789" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:05.932635" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:05.918854" elapsed="0.014016"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.934098" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:05.933816" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:05.933576" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:05.933559" elapsed="0.000632"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.934769" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:05.934490" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:05.934240" elapsed="0.000605"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:05.934225" elapsed="0.000644"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.935404" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:05.935059" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:05.935724" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:05.935513" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.936226" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:05.935957" elapsed="0.000293"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:05.935797" elapsed="0.000485"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:05.935497" elapsed="0.000804"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.936823" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:05.936490" elapsed="0.000358"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:05.937162" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:05.936909" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.937678" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:05.937401" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:05.937237" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:05.936893" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:05.937898" elapsed="0.000304"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:05.938604" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:05.938362" elapsed="0.000266"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:05.938781" elapsed="0.000227"/>
</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-10-11T01:03:05.933254" elapsed="0.005809"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:03:05.939203" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:03:05.939122" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:05.939106" elapsed="0.000175"/>
</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-10-11T01:03:05.939438" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:03:05.939499" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:03:05.939658" 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-10-11T01:03:05.914292" elapsed="0.025390"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:05.939738" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:03:05.939860" 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-10-11T01:03:05.849164" elapsed="0.090719"/>
</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-10-11T01:03:05.940185" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:05.939968" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:05.939951" elapsed="0.000318"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:05.940299" elapsed="0.000023"/>
</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-10-11T01:03:05.848550" elapsed="0.091844"/>
</kw>
<doc>Configures bgp application peer.</doc>
<status status="PASS" start="2026-10-11T01:03:05.748615" elapsed="0.191900"/>
</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-10-11T01:03:05.942333" elapsed="0.000496"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:03:05.942068" elapsed="0.000814"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:05.943795" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:05.943709" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:05.943691" elapsed="0.000167"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:05.946017" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:05.945922" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:05.945905" elapsed="0.000174"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.946994" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:05.946660" elapsed="0.000360"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:03:05.947447" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:03:05.947173" elapsed="0.000299"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:03:05.947544" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:03:05.947673" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:03:05.946285" elapsed="0.001410"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:05.950227" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:05.950143" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:05.950126" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:05.951350" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:05.951267" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:05.951250" elapsed="0.000181"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:05.951747" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:03:05.951579" elapsed="0.000192"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:03:05.952084" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:05.951934" elapsed="0.000173"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:03:05.985689" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:03:05.952616" elapsed="0.033167"/>
</kw>
<msg time="2026-10-11T01:03:05.985935" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:03:05.985976" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:05.952265" elapsed="0.033760"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:03:06.024748" 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-10-11T01:03:05.986548" elapsed="0.038305"/>
</kw>
<msg time="2026-10-11T01:03:06.025016" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:03:06.025057" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:05.986192" elapsed="0.038900"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:06.025364" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:06.025160" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:06.025142" elapsed="0.000333"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:06.025886" 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-10-11T01:03:06.025663" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:06.026229" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:06.026029" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:06.026012" elapsed="0.000287"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:03:06.026328" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:06.028835" elapsed="0.000247"/>
</kw>
<msg time="2026-10-11T01:03:06.029140" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:06.027725" elapsed="0.001569"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:06.029717" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:06.030074" 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-10-11T01:03:06.027129" elapsed="0.003153"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:03:06.026619" 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-10-11T01:03:05.951013" elapsed="0.079459"/>
</kw>
<msg time="2026-10-11T01:03:06.030554" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:06.030593" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:05.950457" elapsed="0.080171"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:03:06.030907" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:03:06.030817" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:06.030797" elapsed="0.000199"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:06.031319" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:06.031639" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:03:06.031704" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T01:03:05.949810" elapsed="0.081979"/>
</kw>
<msg time="2026-10-11T01:03:06.031872" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:06.031911" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:05.948040" elapsed="0.083906"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:06.032251" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:06.032029" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:06.032013" elapsed="0.000310"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:03:05.947882" elapsed="0.084463"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:03:05.947741" elapsed="0.084630"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:03:05.945629" elapsed="0.086888"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:03:05.943456" elapsed="0.089113"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:05.943047" 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-10-11T01:03:05.941516" elapsed="0.091140"/>
</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-10-11T01:03:06.043077" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:06.042762" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:06.043787" 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-10-11T01:03:06.043594" elapsed="0.000255">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-10-11T01:03:06.043932" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:06.043262" elapsed="0.000693"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:06.044476" 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-10-11T01:03:06.044146" elapsed="0.000355"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:06.044777" 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-10-11T01:03:06.044937" 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-10-11T01:03:06.044668" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:06.045450" 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-10-11T01:03:06.045209" 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-10-11T01:03:06.046438" level="INFO">mapping: {'IP': '10.30.171.7', '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-10-11T01:03:06.046189" elapsed="0.000292"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:06.047140" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:06.046659" elapsed="0.000506"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:06.047770" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:06.047500" elapsed="0.000294"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:06.048485" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:06.048287" elapsed="0.000223"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:06.048555" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:06.048679" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:06.047963" elapsed="0.000740"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:06.048866" elapsed="0.000187"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T01:03:06.047353" elapsed="0.001738"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:06.049604" 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-10-11T01:03:06.049320" elapsed="0.000309"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:06.050296" 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-10-11T01:03:06.050120" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:06.050364" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:06.050502" 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-10-11T01:03:06.049797" elapsed="0.000728"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:06.050686" elapsed="0.000164"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T01:03:06.049190" elapsed="0.001696"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:06.051401" 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-10-11T01:03:06.051130" elapsed="0.000310"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:06.052106" 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-10-11T01:03:06.051916" elapsed="0.000215"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:06.052175" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:06.052298" 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-10-11T01:03:06.051608" elapsed="0.000713"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:06.052501" elapsed="0.000167"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T01:03:06.051000" elapsed="0.001705"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:06.053262" 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-10-11T01:03:06.052933" elapsed="0.000354"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:06.053963" 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-10-11T01:03:06.053786" elapsed="0.000216"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:06.054046" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:03:06.054171" 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-10-11T01:03:06.053475" elapsed="0.000719"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:06.054364" elapsed="0.000183"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T01:03:06.052804" elapsed="0.001779"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:06.055141" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:06.054850" elapsed="0.000315"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:06.055875" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:06.055698" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:06.055943" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:06.056084" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:06.055371" elapsed="0.000736"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:06.056270" elapsed="0.000180"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:06.054694" elapsed="0.001793"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:06.057155" 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-10-11T01:03:06.056715" elapsed="0.000465"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:06.058026" 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-10-11T01:03:06.057831" elapsed="0.000220"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:06.058096" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:06.058220" 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-10-11T01:03:06.057353" elapsed="0.000910"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:06.058444" elapsed="0.000169"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T01:03:06.056586" elapsed="0.002065"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:06.047210" elapsed="0.011471"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:06.058719" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:03:06.058847" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', '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-10-11T01:03:06.045806" elapsed="0.013065"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:06.045554" elapsed="0.013345"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:06.059088" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:06.058922" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:06.045536" elapsed="0.013622"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:06.059896" 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-10-11T01:03:06.059316" elapsed="0.000607"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:06.059967" 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/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-10-11T01:03:06.042250" elapsed="0.017872"/>
</kw>
<msg time="2026-10-11T01:03:06.060170" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:06.037882" elapsed="0.022332"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:06.064322" 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/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-10-11T01:03:06.068457" 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/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-10-11T01:03:06.072642" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:06.072827" 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-10-11T01:03:06.073042" 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-10-11T01:03:06.073378" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:06.073233" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:06.073220" 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-10-11T01:03:06.073621" 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-10-11T01:03:06.073800" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:06.073963" elapsed="0.000032"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:06.073196" elapsed="0.000829"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:06.073109" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:06.074199" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:06.074265" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:06.074374" 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-10-11T01:03:06.037278" elapsed="0.037122"/>
</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-10-11T01:03:06.083400" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:06.083096" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:06.084105" 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-10-11T01:03:06.083918" elapsed="0.000245">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-10-11T01:03:06.084246" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:06.083600" elapsed="0.000668"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:06.084761" 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-10-11T01:03:06.084454" elapsed="0.000333"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:06.085074" 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-10-11T01:03:06.085194" 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-10-11T01:03:06.084952" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:06.085650" 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-10-11T01:03:06.085431" 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-10-11T01:03:06.086210" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:06.085787" elapsed="0.000478"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:06.086726" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', '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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:06.086457" elapsed="0.000295"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:06.086291" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:06.085769" elapsed="0.001035"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:06.087555" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:06.086966" elapsed="0.000617"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:06.087629" 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/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-10-11T01:03:06.082543" elapsed="0.005188"/>
</kw>
<msg time="2026-10-11T01:03:06.087779" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:06.078180" elapsed="0.009643"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:06.092028" 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/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-10-11T01:03:06.096162" 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/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-10-11T01:03:06.100269" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:06.100464" 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-10-11T01:03:06.100647" 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-10-11T01:03:06.100996" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:06.100836" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:06.100823" 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-10-11T01:03:06.101225" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:06.101415" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:06.101583" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:06.100798" elapsed="0.000831"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:06.100712" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:06.101837" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:06.101905" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:03:06.102028" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-...</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-10-11T01:03:06.077467" elapsed="0.024589"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:06.103183" 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-10-11T01:03:06.102976" elapsed="0.000265">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-10-11T01:03:06.103323" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:06.102649" elapsed="0.000697"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:06.103643" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:06.103423" elapsed="0.000271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:06.104157" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:06.103879" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:06.103716" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:06.103391" elapsed="0.000842"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:06.104742" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:06.104393" elapsed="0.000373"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:06.104810" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:06.104934" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:06.102330" elapsed="0.002627"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:06.106194" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:06.105958" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:06.106655" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T01:03:06.106440" elapsed="0.000261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:06.107175" 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-10-11T01:03:06.106889" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:06.107651" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:06.107433" elapsed="0.000259"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:06.108403" 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-10-11T01:03:06.108247" elapsed="0.000196"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:03:06.108886" 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-10-11T01:03:06.108596" elapsed="0.000315"/>
</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-10-11T01:03:06.109089" elapsed="0.000156"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:06.109678" 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-10-11T01:03:06.109453" elapsed="0.000267"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:03:06.109757" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:06.109884" 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-10-11T01:03:06.107875" elapsed="0.002061"/>
</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-10-11T01:03:06.119304" level="INFO">PUT Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Content-Length': '293', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T01:03:06.119358" level="INFO">PUT Response : url=http://10.30.170.173: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.171.7 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:06.119456" 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-10-11T01:03:06.110245" elapsed="0.009236"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:06.110015" elapsed="0.009507"/>
</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-10-11T01:03:06.119697" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:06.119546" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:06.109998" elapsed="0.009778"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:06.120926" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:06.120658" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:06.120402" elapsed="0.000614"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:06.120385" elapsed="0.000654"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:06.121605" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:06.121322" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:06.121088" elapsed="0.000589"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:06.121073" elapsed="0.000626"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:06.122230" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:06.121874" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:06.122542" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:06.122317" elapsed="0.000277"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:06.123053" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:06.122776" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:06.122616" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:06.122301" elapsed="0.000828"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:06.123665" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:06.123305" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:06.123958" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:06.123752" elapsed="0.000269"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:06.124479" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:06.124205" elapsed="0.000299"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:06.124043" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:06.123736" elapsed="0.000819"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:06.124698" elapsed="0.000301"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:06.125379" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:06.125160" elapsed="0.000243"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:06.125572" elapsed="0.000209"/>
</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-10-11T01:03:06.120114" elapsed="0.005725"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:03:06.126035" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:03:06.125939" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:06.125921" elapsed="0.000192"/>
</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-10-11T01:03:06.126255" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:03:06.126330" elapsed="0.000019"/>
</return>
<msg time="2026-10-11T01:03:06.126532" 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-10-11T01:03:06.105265" elapsed="0.021292"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:06.126613" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:03:06.126735" 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-10-11T01:03:06.033489" elapsed="0.093268"/>
</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-10-11T01:03:06.127144" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:06.126841" elapsed="0.000364"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:06.126826" elapsed="0.000401"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:06.127257" elapsed="0.000023"/>
</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-10-11T01:03:06.032885" elapsed="0.094468"/>
</kw>
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="PASS" start="2026-10-11T01:03:05.940926" elapsed="0.186538"/>
</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-10-11T01:03:06.129643" elapsed="0.000203"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:03:06.129195" elapsed="0.000701"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:06.130960" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:06.130874" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:06.130856" elapsed="0.000181"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:06.133058" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:06.132948" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:06.132927" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:06.134039" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:06.133703" elapsed="0.000361"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:03:06.134524" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:03:06.134216" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:03:06.134592" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:06.134720" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:03:06.133327" elapsed="0.001416"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:06.137228" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:06.137144" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:06.137126" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:06.138342" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:06.138259" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:06.138243" elapsed="0.000181"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:06.138743" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:03:06.138575" elapsed="0.000193"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:03:06.139128" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:06.138941" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:03:06.175324" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:03:06.139698" elapsed="0.035736"/>
</kw>
<msg time="2026-10-11T01:03:06.175585" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:03:06.175627" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:06.139346" elapsed="0.036316"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:03:06.205010" 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-10-11T01:03:06.176178" elapsed="0.028929"/>
</kw>
<msg time="2026-10-11T01:03:06.205252" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:03:06.205294" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:06.175829" elapsed="0.029500"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:06.205622" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:06.205396" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:06.205379" elapsed="0.000314"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:06.206113" 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-10-11T01:03:06.205875" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:06.206454" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:06.206235" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:06.206219" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:03:06.206555" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:06.210289" elapsed="0.000139"/>
</kw>
<msg time="2026-10-11T01:03:06.210486" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:06.209168" 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-10-11T01:03:06.210921" elapsed="0.000115"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:06.211299" elapsed="0.000225"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:03:06.207304" 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-10-11T01:03:06.206829" elapsed="0.004891"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:03:06.138002" elapsed="0.073792"/>
</kw>
<msg time="2026-10-11T01:03:06.211875" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:06.211914" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:06.137457" elapsed="0.074492"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:03:06.212123" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-11T01:03:06.212037" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:06.212018" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:06.212556" 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-10-11T01:03:06.212896" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:03:06.212962" 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-10-11T01:03:06.136841" elapsed="0.076219"/>
</kw>
<msg time="2026-10-11T01:03:06.213176" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:06.213215" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:06.135081" elapsed="0.078168"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:06.213557" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:06.213315" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:06.213299" elapsed="0.000328"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:03:06.134926" elapsed="0.078723"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:03:06.134789" elapsed="0.078886"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:03:06.132635" elapsed="0.081087"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:03:06.130468" elapsed="0.083302"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:06.130057" elapsed="0.083753"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:03:06.128761" elapsed="0.085095"/>
</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-10-11T01:03:06.215498" level="INFO">${command} = python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:06.215161" elapsed="0.000364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:06.215936" level="INFO">python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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-10-11T01:03:06.215722" elapsed="0.000270"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:03:06.219383" level="INFO">python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --peerport=1790 --debug --mvpn --wfr 1 &amp;&gt; play.py.out</msg>
<msg time="2026-10-11T01:03:06.219475" level="INFO">${output} =  python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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-10-11T01:03:06.216147" elapsed="0.003353"/>
</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-10-11T01:03:06.214787" elapsed="0.004766"/>
</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-10-11T01:03:12.221338" 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-10-11T01:03:06.221087" elapsed="6.000832">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-10-11T01:03:12.222206" elapsed="0.000029"/>
</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-10-11T01:03:06.220799" elapsed="6.001546">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-10-11T01:03:06.220442" elapsed="6.002031"/>
</kw>
<msg time="2026-10-11T01:03:12.222565" 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-10-11T01:03:06.220064" elapsed="6.002524"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-10-11T01:03:12.222734" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-10-11T01:03:12.222668" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:12.222644" elapsed="0.000169"/>
</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-10-11T01:03:12.223040" elapsed="0.000025"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:12.223217" 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-10-11T01:03:06.219784" elapsed="6.003507"/>
</kw>
<doc>Starts bgp peer and verifies that the peer runs.</doc>
<status status="PASS" start="2026-10-11T01:03:06.214480" elapsed="6.008857"/>
</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-10-11T01:03:06.214051" elapsed="6.009326"/>
</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-10-11T01:03:06.127797" elapsed="6.095748"/>
</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-10-11T01:03:12.226063" elapsed="0.000234"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:03:12.225053" elapsed="0.001296"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:12.227300" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:12.227205" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:12.227188" elapsed="0.000173"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:12.229384" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:12.229302" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:12.229285" elapsed="0.000176"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:12.230373" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:12.230041" elapsed="0.000357"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:03:12.230836" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:03:12.230575" elapsed="0.000285"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:03:12.230900" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:12.231042" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:03:12.229671" elapsed="0.001394"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:12.233657" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:12.233572" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:12.233552" elapsed="0.000168"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:12.234782" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:12.234699" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:12.234682" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:12.235211" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:03:12.235038" elapsed="0.000198"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:03:12.235559" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:12.235400" elapsed="0.000182"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:03:12.270249" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:03:12.236083" elapsed="0.034259"/>
</kw>
<msg time="2026-10-11T01:03:12.270509" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:03:12.270550" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:12.235739" elapsed="0.034846"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:03:12.306719" 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-10-11T01:03:12.271106" elapsed="0.035715"/>
</kw>
<msg time="2026-10-11T01:03:12.306981" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:03:12.307025" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:12.270752" elapsed="0.036307"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:12.307333" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:12.307127" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:12.307109" elapsed="0.000316"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:12.307835" 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-10-11T01:03:12.307609" elapsed="0.000327"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:12.308328" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:12.308011" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:12.307994" elapsed="0.000406"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:03:12.308446" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:12.310907" elapsed="0.000131"/>
</kw>
<msg time="2026-10-11T01:03:12.311096" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:12.309804" 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-10-11T01:03:12.311555" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:12.312027" 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-10-11T01:03:12.309209" elapsed="0.003012"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:03:12.308736" 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-10-11T01:03:12.234443" elapsed="0.077910"/>
</kw>
<msg time="2026-10-11T01:03:12.312457" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:12.312498" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:12.233871" elapsed="0.078662"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:03:12.312687" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:03:12.312602" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:12.312584" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:12.313104" 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-10-11T01:03:12.313425" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:03:12.313491" 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-10-11T01:03:12.233261" elapsed="0.080316"/>
</kw>
<msg time="2026-10-11T01:03:12.313659" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:12.313698" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:12.231399" elapsed="0.082333"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:12.314035" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:12.313798" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:12.313782" elapsed="0.000324"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:03:12.231256" elapsed="0.082872"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:03:12.231114" elapsed="0.083043"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:03:12.229010" elapsed="0.085196"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:03:12.226930" elapsed="0.087324"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:12.226516" elapsed="0.087778"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:03:12.224474" elapsed="0.089867"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:12.315210" 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-10-11T01:03:12.315390" 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-10-11T01:03:12.315058" elapsed="0.000372"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:03:12.315781" 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-10-11T01:03:12.315597" elapsed="0.000209"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:12.316135" 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-10-11T01:03:12.316251" 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-10-11T01:03:12.315997" elapsed="0.000279"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:03:12.316619" 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-10-11T01:03:12.316450" elapsed="0.000193"/>
</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-10-11T01:03:12.316893" elapsed="0.003021"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:12.316707" elapsed="0.003242"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:12.316690" elapsed="0.003297"/>
</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-10-11T01:03:12.330780" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:12.330473" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:12.331511" 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-10-11T01:03:12.331304" elapsed="0.000272">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-10-11T01:03:12.331662" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:12.330978" elapsed="0.000708"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:12.332190" 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-10-11T01:03:12.331862" elapsed="0.000355"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:12.332509" 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-10-11T01:03:12.332635" 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-10-11T01:03:12.332385" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:12.333093" 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-10-11T01:03:12.332857" elapsed="0.000280"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:12.334067" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:03:12.333817" elapsed="0.000293"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:12.334560" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:12.334288" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:12.335184" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:12.334902" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:12.336075" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:12.335705" elapsed="0.000395"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:12.336145" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:03:12.336273" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:12.335378" 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-10-11T01:03:12.336542" elapsed="0.000185"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:03:12.334768" elapsed="0.001996"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:12.337278" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:12.337008" elapsed="0.000294"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:12.338165" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:12.337797" elapsed="0.000393"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:12.338235" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:12.338360" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:12.337487" elapsed="0.000897"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:12.338568" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:12.336865" elapsed="0.001905"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:12.334629" elapsed="0.004174"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:12.338841" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:03:12.339013" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:12.333471" elapsed="0.005567"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:12.333200" elapsed="0.005868"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:12.339240" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:12.339090" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:12.333182" elapsed="0.006126"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:12.340166" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:12.339497" elapsed="0.000696"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:12.340237" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:12.329937" elapsed="0.010401"/>
</kw>
<msg time="2026-10-11T01:03:12.340386" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:12.325574" elapsed="0.014876"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:12.344574" 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/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-10-11T01:03:12.348683" 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/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-10-11T01:03:12.352774" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:12.353002" 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-10-11T01:03:12.353187" 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-10-11T01:03:12.353541" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:12.353379" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:12.353366" 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-10-11T01:03:12.353771" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:12.353949" 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-10-11T01:03:12.354126" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:12.353341" elapsed="0.000833"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:12.353254" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:12.354350" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:12.354430" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:03:12.354540" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:12.324951" elapsed="0.029614"/>
</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-10-11T01:03:12.363555" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:12.363234" elapsed="0.000349"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:12.364245" 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-10-11T01:03:12.364072" elapsed="0.000233">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-10-11T01:03:12.364388" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:12.363743" elapsed="0.000683"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:12.364908" 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-10-11T01:03:12.364603" elapsed="0.000330"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:12.365225" 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-10-11T01:03:12.365347" 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-10-11T01:03:12.365116" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:12.365806" 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-10-11T01:03:12.365588" elapsed="0.000271"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:12.366219" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:12.365951" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:12.366722" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', '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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:12.366458" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:12.366296" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:12.365933" elapsed="0.000866"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:12.367364" 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-10-11T01:03:12.366962" elapsed="0.000430"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:12.367452" 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-10-11T01:03:12.362716" elapsed="0.004841"/>
</kw>
<msg time="2026-10-11T01:03:12.367609" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:12.358347" elapsed="0.009305"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:12.371930" 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/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-10-11T01:03:12.376077" 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/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-10-11T01:03:12.380199" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:12.380382" 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-10-11T01:03:12.380583" 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-10-11T01:03:12.380921" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:12.380776" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:12.380763" 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-10-11T01:03:12.381167" 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-10-11T01:03:12.381347" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:12.381527" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:12.380738" elapsed="0.000838"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:12.380649" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:12.381784" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:12.381852" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:12.381981" 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-10-11T01:03:12.357652" elapsed="0.024358"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:12.383142" 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-10-11T01:03:12.382935" elapsed="0.000266">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-10-11T01:03:12.383285" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:12.382609" elapsed="0.000698"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:12.383609" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:12.383370" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:12.384130" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:12.383851" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:12.383682" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:12.383353" elapsed="0.000853"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:12.384720" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:12.384368" elapsed="0.000376"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:12.384789" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:12.384913" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:12.382292" elapsed="0.002644"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:12.386273" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:12.386052" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:12.386734" 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-10-11T01:03:12.386521" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:12.387202" 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-10-11T01:03:12.386985" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:12.387658" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:12.387443" elapsed="0.000255"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:12.388432" 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-10-11T01:03:12.388252" elapsed="0.000206"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:03:12.388760" 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-10-11T01:03:12.388616" elapsed="0.000167"/>
</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-10-11T01:03:12.388945" elapsed="0.000172"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:12.389551" 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-10-11T01:03:12.389313" elapsed="0.000314"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:03:12.389667" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:12.389795" 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-10-11T01:03:12.387879" elapsed="0.001939"/>
</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-10-11T01:03:12.403116" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.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-10-11T01:03:12.403177" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:12.403270" 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-10-11T01:03:12.390125" elapsed="0.013169"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:12.389880" elapsed="0.013455"/>
</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-10-11T01:03:12.403531" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:12.403359" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:12.389864" elapsed="0.013753"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:12.404841" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:12.404562" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:12.404305" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:12.404288" elapsed="0.000647"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:12.405522" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:12.405238" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:12.405000" elapsed="0.000594"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:12.404983" elapsed="0.000633"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:12.406149" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:12.405795" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:12.406465" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:12.406237" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:12.406960" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:12.406700" elapsed="0.000297"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:12.406539" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:12.406221" elapsed="0.000829"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:12.407577" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:12.407223" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:12.407872" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:12.407664" elapsed="0.000259"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:12.408380" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:12.408120" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:12.407945" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:12.407647" elapsed="0.000826"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:12.408617" elapsed="0.000288"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:12.409342" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:12.409115" elapsed="0.000252"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:12.409538" elapsed="0.000214"/>
</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-10-11T01:03:12.403938" elapsed="0.005870"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:03:12.409954" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-10-11T01:03:12.409873" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:12.409856" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:12.410190" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:03:12.410251" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:03:12.410425" 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-10-11T01:03:12.385251" elapsed="0.025199"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:12.410511" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:12.410635" 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-10-11T01:03:12.320900" elapsed="0.089757"/>
</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-10-11T01:03:12.410948" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:12.410747" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:12.410731" elapsed="0.000314"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:12.411075" elapsed="0.000024"/>
</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-10-11T01:03:12.320233" elapsed="0.090939"/>
</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-10-11T01:03:12.414554" level="INFO">${update} = </msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:03:12.412070" elapsed="0.002516"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:03:12.415097" level="FAIL"> == </msg>
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="FAIL" start="2026-10-11T01:03:12.414743" elapsed="0.000411"> == </status>
</kw>
<return>
<value>${update}</value>
<status status="NOT RUN" start="2026-10-11T01:03:12.415203" elapsed="0.000016"/>
</return>
<doc>Returns hex update message.</doc>
<status status="FAIL" start="2026-10-11T01:03:12.411802" elapsed="0.003500"> == </status>
</kw>
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:14.420387" level="INFO">${update} = ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0a</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:03:14.416608" elapsed="0.003884"/>
</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-10-11T01:03:14.420900" elapsed="0.000759"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:03:14.421762" elapsed="0.000069"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:03:14.415902" elapsed="0.006118"/>
</kw>
<msg time="2026-10-11T01:03:14.422173" 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-10-11T01:03:12.411355" elapsed="2.010871"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.424554" level="INFO">Length is 140.</msg>
<msg time="2026-10-11T01:03:14.424712" 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-10-11T01:03:14.423512" elapsed="0.001250"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.425697" level="INFO">Length is 140.</msg>
<msg time="2026-10-11T01:03:14.425848" 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-10-11T01:03:14.425143" elapsed="0.000752"/>
</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-10-11T01:03:14.426437" elapsed="0.000669"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:14.427815" 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-10-11T01:03:14.427469" elapsed="0.000399"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:14.428575" 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-10-11T01:03:14.428209" elapsed="0.000417"/>
</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-10-11T01:03:14.429052" elapsed="0.000625"/>
</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-10-11T01:03:14.422709" elapsed="0.007090"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:03:14.430130" elapsed="0.002746"/>
</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-10-11T01:03:14.464646" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:14.463914" elapsed="0.000792"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:14.466248" 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-10-11T01:03:14.465825" elapsed="0.000562">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-10-11T01:03:14.466608" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:14.465084" elapsed="0.001575"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.467787" 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-10-11T01:03:14.467067" elapsed="0.000776"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:14.468514" 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-10-11T01:03:14.468777" 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-10-11T01:03:14.468238" elapsed="0.000593"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.469817" 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-10-11T01:03:14.469293" elapsed="0.000617"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.471552" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:03:14.471211" elapsed="0.000399"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.472228" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:14.471856" elapsed="0.000405"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.473552" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:14.472735" elapsed="0.000852"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:14.475061" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:14.474404" elapsed="0.000766"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:14.475350" elapsed="0.000044"/>
</return>
<msg time="2026-10-11T01:03:14.475615" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:14.473827" elapsed="0.001821"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:14.475881" elapsed="0.000442"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:03:14.472548" elapsed="0.003831"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.477308" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:14.476737" elapsed="0.000605"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:14.478925" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:14.478232" elapsed="0.000817"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:14.479226" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T01:03:14.479504" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:14.477655" elapsed="0.001882"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:14.479768" elapsed="0.000441"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:14.476554" elapsed="0.003708"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:14.472326" elapsed="0.007981"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:14.480361" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T01:03:14.480569" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:14.470698" elapsed="0.009904"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:14.470075" elapsed="0.010566"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:14.480881" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:14.480673" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:14.470033" elapsed="0.010958"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.481949" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:14.481214" elapsed="0.000786"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:14.482062" 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/app.vanadium/${file_name} exists. 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-10-11T01:03:14.462735" elapsed="0.019465"/>
</kw>
<msg time="2026-10-11T01:03:14.482267" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:14.452911" elapsed="0.029418"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:14.488115" 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/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-10-11T01:03:14.493838" 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_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-10-11T01:03:14.498577" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:14.498762" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:14.498941" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:14.499324" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:14.499175" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:14.499162" 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-10-11T01:03:14.499570" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:14.499748" 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-10-11T01:03:14.499911" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:14.499135" elapsed="0.000823"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:14.499016" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:14.500148" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:14.500215" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:14.500323" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:14.451479" elapsed="0.048868"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.501359" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:14.501135" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:14.509513" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:14.509565" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:14.509650" 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-10-11T01:03:14.501708" elapsed="0.007965"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:14.501477" elapsed="0.008232"/>
</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-10-11T01:03:14.509881" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:14.509733" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:14.501460" elapsed="0.008495"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.511351" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:14.510880" elapsed="0.000511"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:14.510634" elapsed="0.000806"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:14.510617" elapsed="0.000847"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.512040" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:14.511760" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:14.511515" elapsed="0.000597"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:14.511499" elapsed="0.000636"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.512685" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:14.512321" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:14.513002" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:14.512775" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.513529" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:14.513243" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:14.513078" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:14.512758" elapsed="0.000877"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.514164" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:14.513814" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:14.514476" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:14.514252" elapsed="0.000276"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.514993" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:14.514718" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:14.514550" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:14.514235" elapsed="0.000835"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:14.515214" elapsed="0.000305"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:14.515900" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:14.515680" elapsed="0.000245"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:14.516091" elapsed="0.000210"/>
</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-10-11T01:03:14.510289" elapsed="0.006068"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:03:14.516398" elapsed="0.000047"/>
</return>
<msg time="2026-10-11T01:03:14.516592" 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-10-11T01:03:14.500601" elapsed="0.016015"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:14.516662" elapsed="0.000025"/>
</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-10-11T01:03:14.435060" elapsed="0.081698"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:14.434123" elapsed="0.082683"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:03:14.433302" elapsed="0.083555"/>
</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-10-11T01:03:14.520020" level="INFO">${update} = ffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:03:14.517748" elapsed="0.002300"/>
</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-10-11T01:03:14.520203" elapsed="0.000328"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:03:14.520584" elapsed="0.000032"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:03:14.517492" elapsed="0.003240"/>
</kw>
<msg time="2026-10-11T01:03:14.520839" 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-10-11T01:03:14.517048" elapsed="0.003823"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.521992" level="INFO">Length is 128.</msg>
<msg time="2026-10-11T01:03:14.522090" 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-10-11T01:03:14.521645" elapsed="0.000476"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.522694" level="INFO">Length is 128.</msg>
<msg time="2026-10-11T01:03:14.522789" 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-10-11T01:03:14.522340" elapsed="0.000480"/>
</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-10-11T01:03:14.523091" elapsed="0.000393"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:14.523904" 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-10-11T01:03:14.523699" elapsed="0.000238"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:14.524395" 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-10-11T01:03:14.524192" elapsed="0.000255"/>
</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-10-11T01:03:14.524701" elapsed="0.000385"/>
</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-10-11T01:03:14.521153" elapsed="0.004009"/>
</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-10-11T01:03:14.541795" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:14.541490" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:14.542514" 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-10-11T01:03:14.542313" elapsed="0.000260">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-10-11T01:03:14.542656" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:14.541993" elapsed="0.000686"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.543170" 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-10-11T01:03:14.542851" elapsed="0.000344"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:14.543483" 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-10-11T01:03:14.543599" 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-10-11T01:03:14.543360" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.544047" 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-10-11T01:03:14.543815" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.545025" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:03:14.544782" elapsed="0.000284"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.545505" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:14.545243" elapsed="0.000286"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.546323" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:14.545841" elapsed="0.000506"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:14.547389" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:14.546946" elapsed="0.000499"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:14.547557" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:03:14.547737" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:14.546537" elapsed="0.001223"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:14.547924" elapsed="0.000284"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:03:14.545710" elapsed="0.002536"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.548951" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:14.548496" elapsed="0.000495"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:14.550042" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:14.549594" elapsed="0.000488"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:14.550193" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:03:14.550372" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:14.549162" 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-10-11T01:03:14.550581" elapsed="0.000270"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:14.548344" elapsed="0.002545"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:14.545573" elapsed="0.005347"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:14.550959" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T01:03:14.551141" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:14.544400" elapsed="0.006765"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:14.544150" elapsed="0.007044"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:14.551366" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:14.551216" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:14.544132" elapsed="0.007374"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.552382" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:14.551695" elapsed="0.000778"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:14.552520" 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/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-10-11T01:03:14.540931" elapsed="0.011695"/>
</kw>
<msg time="2026-10-11T01:03:14.552677" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:14.536554" elapsed="0.016178"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:14.556904" 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/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-10-11T01:03:14.561049" 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/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-10-11T01:03:14.565178" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:14.565358" 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-10-11T01:03:14.565554" 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-10-11T01:03:14.565896" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:14.565750" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:14.565737" 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-10-11T01:03:14.566139" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:14.566318" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:14.566495" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:14.565711" elapsed="0.000832"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:14.565620" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:14.566715" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:14.566812" elapsed="0.000017"/>
</return>
<msg time="2026-10-11T01:03:14.566923" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:14.535885" elapsed="0.031062"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.567993" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:14.567757" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:14.573102" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:14.573398" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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+xml', 'Content-Length': '635'} 
 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-path xmlns:a="urn:opendaylight:params:xml:ns:yang:bgp-rib" xmlns:b="urn:opendaylight:params:xml:ns:yang:bgp-types" xmlns:c="urn:opendaylight:params:xml:ns:yang:bgp:mvpn" xmlns:d="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;/a:application-rib[a:id='10.30.170.173']/a:tables[a:afi='b:ipv4-address-family'][a:safi='c:mcast-vpn-subsequent-address-family']/d:mvpn-routes-ipv4&lt;/error-path&gt;&lt;error-message&gt;Data does not exist&lt;/error-message&gt;&lt;error-tag&gt;data-missing&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-10-11T01:03:14.573557" level="INFO">${response} = None</msg>
<msg time="2026-10-11T01:03:14.573597" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:14.568323" elapsed="0.005663">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:14.568098" elapsed="0.005966">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:14.574245" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:14.574095" elapsed="0.000206"/>
</branch>
<status status="FAIL" start="2026-10-11T01:03:14.568081" elapsed="0.006241">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:14.575573" 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-10-11T01:03:14.575285" elapsed="0.000321">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:03:14.575040" elapsed="0.000623">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:03:14.575023" elapsed="0.000669">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-10-11T01:03:14.576281" 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-10-11T01:03:14.576015" elapsed="0.000296">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:03:14.575755" elapsed="0.000611">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:03:14.575739" elapsed="0.000657">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.578044" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:14.576603" elapsed="0.001468"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:14.578385" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:14.578167" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.578911" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:14.578642" elapsed="0.000294"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:14.578476" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:14.578149" elapsed="0.000856"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.579538" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:14.579180" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:14.579838" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:14.579628" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.580355" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:14.580087" elapsed="0.000293"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:14.579913" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:14.579611" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:14.580593" elapsed="0.000299"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:14.581290" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:14.581066" elapsed="0.000250"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-10-11T01:03:14.581649" 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-10-11T01:03:14.581484" elapsed="0.000197">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-10-11T01:03:14.574672" elapsed="0.007131">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-10-11T01:03:14.581858" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:14.582123" level="INFO">${response_text} = None</msg>
<msg time="2026-10-11T01:03:14.582151" 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-10-11T01:03:14.567193" elapsed="0.014985">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-10-11T01:03:14.582235" elapsed="0.000024"/>
</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-10-11T01:03:14.526573" elapsed="0.055800">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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:14.526014" elapsed="0.056429"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:03:14.525508" elapsed="0.056990"/>
</kw>
<arg>intra_as_ipmsi_ad</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-10-11T01:03:12.314697" elapsed="2.267846"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:12.223945" elapsed="2.358696"/>
</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-10-11T01:03:14.584151" elapsed="0.000199"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:03:14.583888" elapsed="0.000513"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:14.585741" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:14.585654" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:14.585635" elapsed="0.000171"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:14.588104" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:14.588016" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:14.587948" elapsed="0.000252"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.589134" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:14.588792" elapsed="0.000367"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.589596" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:03:14.589314" elapsed="0.000306"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:03:14.589661" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:14.589788" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:03:14.588427" elapsed="0.001385"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:14.592338" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:14.592252" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:14.592235" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:14.593479" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:14.593375" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:14.593358" elapsed="0.000184"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:14.593861" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:03:14.593690" elapsed="0.000196"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:03:14.594206" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:14.594064" elapsed="0.000166"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:03:14.631783" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:03:14.594737" elapsed="0.037140"/>
</kw>
<msg time="2026-10-11T01:03:14.632042" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:03:14.632084" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:14.594388" elapsed="0.037732"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:03:14.671629" 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-10-11T01:03:14.632648" elapsed="0.039080"/>
</kw>
<msg time="2026-10-11T01:03:14.671874" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:03:14.671915" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:14.632290" elapsed="0.039660"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:14.672241" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:14.672033" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:14.672015" elapsed="0.000297"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.672744" 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-10-11T01:03:14.672515" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:14.673084" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:14.672870" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:14.672854" elapsed="0.000301"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:03:14.673185" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:14.675792" elapsed="0.000117"/>
</kw>
<msg time="2026-10-11T01:03:14.675980" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:14.674558" elapsed="0.001558"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:14.676478" elapsed="0.000079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:14.676820" 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-10-11T01:03:14.673945" 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-10-11T01:03:14.673481" elapsed="0.003673"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:03:14.593116" elapsed="0.084225"/>
</kw>
<msg time="2026-10-11T01:03:14.677455" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:14.677497" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:14.592570" elapsed="0.084962"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:03:14.677687" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:03:14.677602" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:14.677584" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:14.678104" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:14.678423" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:03:14.678489" 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-10-11T01:03:14.591951" elapsed="0.086624"/>
</kw>
<msg time="2026-10-11T01:03:14.678659" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:14.678699" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:14.590155" elapsed="0.088579"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:14.679036" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:14.678800" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:14.678784" elapsed="0.000324"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:03:14.590012" elapsed="0.089118"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:03:14.589859" elapsed="0.089298"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:03:14.587663" elapsed="0.091542"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:03:14.585240" elapsed="0.094015"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:14.584565" elapsed="0.094732"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:03:14.583525" elapsed="0.095818"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.680460" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:14.680039" elapsed="0.000448"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.681067" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:14.680670" elapsed="0.000422"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.681622" 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-10-11T01:03:14.681272" elapsed="0.000376"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:14.681958" 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-10-11T01:03:14.682104" 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-10-11T01:03:14.681814" elapsed="0.000314"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:14.682480" 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-10-11T01:03:14.682593" 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-10-11T01:03:14.682325" elapsed="0.000292"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:03:14.682758" elapsed="0.002459"/>
</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-10-11T01:03:14.685365" elapsed="0.002274"/>
</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-10-11T01:03:14.703325" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:14.703020" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:14.704051" 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-10-11T01:03:14.703847" elapsed="0.000273">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-10-11T01:03:14.704205" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:14.703527" elapsed="0.000701"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.704732" 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-10-11T01:03:14.704402" elapsed="0.000355"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:14.705044" 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-10-11T01:03:14.705165" 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-10-11T01:03:14.704924" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.705623" 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-10-11T01:03:14.705387" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.706581" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:14.706333" elapsed="0.000290"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.707055" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:14.706799" elapsed="0.000280"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.707844" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:14.707391" elapsed="0.000478"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:14.709009" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:14.708495" elapsed="0.000602"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:14.709177" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:03:14.709387" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:14.708053" 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-10-11T01:03:14.709598" elapsed="0.000309"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:03:14.707260" elapsed="0.002686"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.710650" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:14.710193" elapsed="0.000482"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:14.711846" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:14.711284" elapsed="0.000648"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:14.712023" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:03:14.712231" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:14.710845" 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-10-11T01:03:14.712438" elapsed="0.000303"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:14.710058" elapsed="0.002721"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:14.707122" elapsed="0.005688"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:14.712848" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:14.712988" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:14.705990" elapsed="0.007022"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:14.705726" elapsed="0.007316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:14.713214" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:14.713064" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:14.705708" elapsed="0.007576"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.714189" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-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-10-11T01:03:14.713513" elapsed="0.000703"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:14.714261" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:14.702502" elapsed="0.011860"/>
</kw>
<msg time="2026-10-11T01:03:14.714478" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:14.698174" elapsed="0.016352"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:14.718651" 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/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-10-11T01:03:14.722743" 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/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-10-11T01:03:14.726824" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:14.727016" 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-10-11T01:03:14.727199" 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-10-11T01:03:14.727551" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:14.727390" elapsed="0.000243"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:14.727376" 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-10-11T01:03:14.727815" 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-10-11T01:03:14.728009" 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-10-11T01:03:14.728176" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:14.727352" elapsed="0.000871"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:14.727264" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:14.728400" elapsed="0.000033"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:14.728483" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:14.728594" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-i...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:03:14.697566" elapsed="0.031053"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:14.729736" 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-10-11T01:03:14.729541" elapsed="0.000255">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-10-11T01:03:14.729880" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:14.729200" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:14.730200" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:14.729977" elapsed="0.000275"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.730720" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:14.730456" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:14.730274" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:14.729947" elapsed="0.000849"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.731312" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:14.730957" elapsed="0.000379"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:14.731380" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T01:03:14.731521" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:14.728887" elapsed="0.002657"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:14.732633" 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-10-11T01:03:14.732443" elapsed="0.000249">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-10-11T01:03:14.732775" 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-10-11T01:03:14.732109" elapsed="0.000689"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:03:14.732957" elapsed="0.000066"/>
</return>
<status status="PASS" start="2026-10-11T01:03:14.732859" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:14.732843" elapsed="0.000233"/>
</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-10-11T01:03:14.733231" elapsed="0.000020"/>
</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-10-11T01:03:14.733419" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:03:14.733479" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:03:14.733642" 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-10-11T01:03:14.731797" elapsed="0.001868"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.734925" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:14.734704" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:14.735575" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:14.735171" elapsed="0.000445"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:14.741763" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:14.741901" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:14.742007" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:14.735914" elapsed="0.006438">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:14.735680" elapsed="0.006769">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:14.742638" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:14.742483" elapsed="0.000213"/>
</branch>
<status status="FAIL" start="2026-10-11T01:03:14.735661" elapsed="0.007056">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:14.743073" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:14.743192" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:14.743159" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:14.743143" elapsed="0.000105"/>
</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-10-11T01:03:14.743389" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:03:14.743467" 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-10-11T01:03:14.733950" elapsed="0.009613">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:14.743627" elapsed="0.000014"/>
</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-10-11T01:03:14.690182" elapsed="0.053529">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:14.743954" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:14.743791" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:14.743776" elapsed="0.000308"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:14.744114" 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-10-11T01:03:14.689556" elapsed="0.054646">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:16.779357" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:16.778636" elapsed="0.000825"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:16.781244" 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-10-11T01:03:16.780803" elapsed="0.000583">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-10-11T01:03:16.781613" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:16.779882" elapsed="0.001782"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.782803" 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-10-11T01:03:16.782073" elapsed="0.000787"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:16.783535" 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-10-11T01:03:16.783803" 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-10-11T01:03:16.783256" elapsed="0.000601"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.784839" 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-10-11T01:03:16.784312" elapsed="0.000621"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.787049" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:16.786516" elapsed="0.000628"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.788150" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:16.787568" elapsed="0.000635"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.790070" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:16.788945" elapsed="0.001181"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:16.792874" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:16.791636" elapsed="0.001460"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:16.793278" elapsed="0.000071"/>
</return>
<msg time="2026-10-11T01:03:16.793835" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:16.790573" elapsed="0.003316"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:16.794298" elapsed="0.000705"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:03:16.788649" elapsed="0.006408"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.796055" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:16.795379" elapsed="0.000711"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:16.797831" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:16.797077" elapsed="0.000947"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:16.798141" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T01:03:16.798476" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:16.796334" elapsed="0.002184"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:16.798752" elapsed="0.000451"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:16.795196" elapsed="0.004062"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:16.788303" elapsed="0.010998"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:16.799354" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T01:03:16.799588" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:16.785701" elapsed="0.013920"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:16.785096" elapsed="0.014566"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:16.799903" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:16.799693" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:16.785052" elapsed="0.014966"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.801020" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-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-10-11T01:03:16.800241" elapsed="0.000818"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:16.801122" 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/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-10-11T01:03:16.777441" elapsed="0.023823"/>
</kw>
<msg time="2026-10-11T01:03:16.801333" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:16.767161" elapsed="0.034235"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:16.807602" 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/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-10-11T01:03:16.813339" 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_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-10-11T01:03:16.819047" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:16.819300" 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-10-11T01:03:16.819573" 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-10-11T01:03:16.820071" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:16.819839" elapsed="0.000344"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:16.819821" elapsed="0.000396"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:16.820459" 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-10-11T01:03:16.820742" elapsed="0.000031"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:16.821028" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:16.819786" elapsed="0.001294"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:16.819665" elapsed="0.001438"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:16.821254" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:16.821320" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:16.821445" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-i...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:03:16.765599" elapsed="0.055872"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:16.822645" 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-10-11T01:03:16.822425" elapsed="0.000280">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-10-11T01:03:16.822790" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:16.822078" elapsed="0.000735"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:16.823118" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:16.822877" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.823664" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:16.823370" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:16.823195" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:16.822860" elapsed="0.000883"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.824257" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:16.823904" elapsed="0.000377"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:16.824326" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:16.824466" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:16.821743" elapsed="0.002746"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:16.825577" 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-10-11T01:03:16.825377" elapsed="0.000258">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-10-11T01:03:16.825720" 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-10-11T01:03:16.825058" elapsed="0.000685"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:03:16.825902" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:03:16.825804" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:16.825788" elapsed="0.000204"/>
</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-10-11T01:03:16.826146" elapsed="0.000020"/>
</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-10-11T01:03:16.826320" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:03:16.826377" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:03:16.826518" 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-10-11T01:03:16.824744" elapsed="0.001828"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.827813" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:16.827585" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.828277" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:16.828061" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:16.834275" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:16.834403" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:16.834525" 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-10-11T01:03:16.828620" elapsed="0.005930"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:16.828377" elapsed="0.006213"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:16.834768" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:16.834614" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:16.828360" elapsed="0.006487"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.836131" 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-10-11T01:03:16.835784" elapsed="0.000392"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:16.835538" elapsed="0.000670"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:16.835521" elapsed="0.000710"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.836816" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:16.836538" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:16.836283" elapsed="0.000606"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:16.836267" elapsed="0.000645"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.837467" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:16.837104" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:16.837773" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:16.837557" elapsed="0.000269"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.838291" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:16.838026" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:16.837848" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:16.837540" elapsed="0.000829"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.838895" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:16.838560" elapsed="0.000360"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:16.839208" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:16.838997" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.839728" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:16.839459" elapsed="0.000294"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:16.839282" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:16.838979" elapsed="0.000826"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:16.839950" elapsed="0.000304"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:16.840691" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:16.840464" elapsed="0.000252"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:16.840871" elapsed="0.000228"/>
</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-10-11T01:03:16.835184" elapsed="0.005972"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:16.841301" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:16.841219" elapsed="0.000122"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:16.841202" elapsed="0.000159"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:16.842128" 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-10-11T01:03:16.841520" elapsed="0.000636"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:16.842202" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:16.842331" 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-10-11T01:03:16.826859" elapsed="0.015497"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:16.842426" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:16.842551" 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-10-11T01:03:16.749166" elapsed="0.093409"/>
</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-10-11T01:03:16.853237" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:16.852924" elapsed="0.000340"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:16.853987" 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-10-11T01:03:16.853753" elapsed="0.000352">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-10-11T01:03:16.854266" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:16.853437" elapsed="0.000852"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.854808" 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-10-11T01:03:16.854495" elapsed="0.000339"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:16.855130" 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-10-11T01:03:16.855258" 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-10-11T01:03:16.855020" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.855745" 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-10-11T01:03:16.855505" 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-10-11T01:03:16.856201" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:16.855886" elapsed="0.000369"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.856916" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:16.856458" elapsed="0.000484"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:16.856278" elapsed="0.000710"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:16.855868" elapsed="0.001140"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.857602" 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-10-11T01:03:16.857174" elapsed="0.000456"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:16.857675" 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-10-11T01:03:16.852388" elapsed="0.005390"/>
</kw>
<msg time="2026-10-11T01:03:16.857828" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:16.847973" elapsed="0.009901"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:16.862234" 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/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-10-11T01:03:16.866360" 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/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-10-11T01:03:16.870668" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:16.870857" 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-10-11T01:03:16.871055" 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-10-11T01:03:16.871400" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:16.871253" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:16.871240" 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-10-11T01:03:16.871648" 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-10-11T01:03:16.871875" 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-10-11T01:03:16.872062" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:16.871215" elapsed="0.000897"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:16.871126" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:16.872321" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:16.872388" elapsed="0.000033"/>
</return>
<msg time="2026-10-11T01:03:16.872541" 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-10-11T01:03:16.847247" elapsed="0.025319"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:16.872734" elapsed="0.000329"/>
</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-10-11T01:03:16.874091" 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-10-11T01:03:16.873720" elapsed="0.000399"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:16.874647" 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-10-11T01:03:16.874269" elapsed="0.000404"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:03:16.874861" elapsed="0.000292"/>
</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-10-11T01:03:16.873334" elapsed="0.001873"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:16.873133" elapsed="0.002103"/>
</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-10-11T01:03:16.875571" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:16.875259" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:16.873116" elapsed="0.002537"/>
</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-10-11T01:03:16.843541" elapsed="0.032157"/>
</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-10-11T01:03:16.842856" elapsed="0.032906"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:16.842649" elapsed="0.033151"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:16.842633" elapsed="0.033188"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:16.875851" elapsed="0.000026"/>
</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-10-11T01:03:16.747663" elapsed="0.128288"/>
</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-10-11T01:03:14.687827" elapsed="2.188211"/>
</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-10-11T01:03:16.891714" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:16.891396" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:16.892418" 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-10-11T01:03:16.892234" elapsed="0.000246">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-10-11T01:03:16.892619" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:16.891899" elapsed="0.000745"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.893190" 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-10-11T01:03:16.892818" elapsed="0.000397"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:16.893509" 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-10-11T01:03:16.893623" 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-10-11T01:03:16.893382" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.894079" 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-10-11T01:03:16.893841" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.895036" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:16.894789" elapsed="0.000289"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.895521" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:16.895255" elapsed="0.000291"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.896346" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:16.895860" elapsed="0.000511"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:16.897573" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:16.897034" elapsed="0.000630"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:16.897745" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:03:16.897957" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:16.896578" 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-10-11T01:03:16.898165" elapsed="0.000338"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/effective-rib-in</var>
<status status="PASS" start="2026-10-11T01:03:16.895727" elapsed="0.002815"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.899239" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:16.898775" elapsed="0.000488"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:16.900446" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:16.899901" elapsed="0.000644"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:16.900628" elapsed="0.000033"/>
</return>
<msg time="2026-10-11T01:03:16.900848" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:16.899472" 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-10-11T01:03:16.901055" elapsed="0.000306"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:16.898643" elapsed="0.002757"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:16.895589" elapsed="0.005969"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:16.901599" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:16.901732" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:16.894449" elapsed="0.007307"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:16.894182" elapsed="0.007603"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:16.901973" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:16.901809" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:16.894165" elapsed="0.007880"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.902734" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-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-10-11T01:03:16.902207" elapsed="0.000553"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:16.902805" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:16.890880" elapsed="0.012058"/>
</kw>
<msg time="2026-10-11T01:03:16.903007" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:16.886425" elapsed="0.016629"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:16.908398" 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_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-10-11T01:03:16.912528" 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/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-10-11T01:03:16.916610" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:16.916793" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:16.916986" 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-10-11T01:03:16.917322" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:16.917177" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:16.917164" 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-10-11T01:03:16.917565" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:16.917744" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:16.917907" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:16.917139" elapsed="0.000815"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:16.917052" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:16.918143" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:16.918208" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:16.918318" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-ro...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:03:16.885798" elapsed="0.032546"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:16.919494" 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-10-11T01:03:16.919294" elapsed="0.000259">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-10-11T01:03:16.919636" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:16.918952" elapsed="0.000707"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:16.919943" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:16.919723" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.920480" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:16.920202" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:16.920033" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:16.919705" elapsed="0.000851"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.921086" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:16.920718" elapsed="0.000392"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:16.921155" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:16.921279" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:16.918650" elapsed="0.002652"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:16.922385" 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-10-11T01:03:16.922202" elapsed="0.000257">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-10-11T01:03:16.922543" 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-10-11T01:03:16.921867" elapsed="0.000699"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:03:16.922726" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:03:16.922628" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:16.922611" elapsed="0.000192"/>
</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-10-11T01:03:16.923010" 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-10-11T01:03:16.923189" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:03:16.923247" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:03:16.923370" 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-10-11T01:03:16.921565" elapsed="0.001828"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.924625" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:16.924388" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.925121" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:16.924859" 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-10-11T01:03:16.930301" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:16.930438" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:16.930545" 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-10-11T01:03:16.925462" elapsed="0.005135"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:16.925221" elapsed="0.005416"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:16.930816" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:16.930661" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:16.925204" elapsed="0.005689"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.932170" 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-10-11T01:03:16.931822" elapsed="0.000392"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:16.931580" elapsed="0.000665"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:16.931563" elapsed="0.000705"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.932849" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:16.932575" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:16.932318" elapsed="0.000603"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:16.932303" elapsed="0.000641"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.933494" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:16.933138" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:16.933795" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:16.933583" elapsed="0.000264"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.934313" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:16.934049" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:16.933868" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:16.933567" elapsed="0.000823"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.934917" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:16.934581" elapsed="0.000361"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:16.935232" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:16.935021" elapsed="0.000261"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.935743" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:16.935481" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:16.935304" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:16.935004" elapsed="0.000815"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:16.935976" elapsed="0.000291"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:16.936665" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:16.936444" elapsed="0.000245"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:16.936842" elapsed="0.000221"/>
</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-10-11T01:03:16.931226" elapsed="0.005893"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:16.937261" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:16.937180" elapsed="0.000121"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:16.937163" elapsed="0.000157"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:16.938058" 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-10-11T01:03:16.937481" elapsed="0.000605"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:16.938132" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:16.938258" 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-10-11T01:03:16.923682" elapsed="0.014600"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:16.938370" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:03:16.938535" 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-10-11T01:03:16.878520" elapsed="0.060040"/>
</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-10-11T01:03:16.949239" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:16.948922" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:16.949991" 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-10-11T01:03:16.949758" elapsed="0.000352">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-10-11T01:03:16.950272" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:16.949439" elapsed="0.000857"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.950819" 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-10-11T01:03:16.950505" elapsed="0.000339"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:16.951138" 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-10-11T01:03:16.951256" 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-10-11T01:03:16.951027" elapsed="0.000254"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.951725" 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-10-11T01:03:16.951504" elapsed="0.000265"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:16.952136" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:16.951830" elapsed="0.000361"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.952841" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:16.952360" elapsed="0.000506"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:16.952213" elapsed="0.000686"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:16.951813" elapsed="0.001106"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.953526" 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-10-11T01:03:16.953100" elapsed="0.000453"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:16.953597" 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/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-10-11T01:03:16.948391" elapsed="0.005314"/>
</kw>
<msg time="2026-10-11T01:03:16.953755" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:16.943951" elapsed="0.009849"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:16.958066" 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/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-10-11T01:03:16.962233" 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/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-10-11T01:03:16.966475" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:16.966658" 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-10-11T01:03:16.966842" 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-10-11T01:03:16.967196" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:16.967051" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:16.967037" 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-10-11T01:03:16.967437" 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-10-11T01:03:16.967620" 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-10-11T01:03:16.967785" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:16.967011" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:16.966908" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:16.968021" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:16.968088" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:16.968208" 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-10-11T01:03:16.943228" elapsed="0.025005"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:16.968401" elapsed="0.000334"/>
</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-10-11T01:03:16.969759" 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-10-11T01:03:16.969382" elapsed="0.000406"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:16.970337" 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-10-11T01:03:16.969983" elapsed="0.000380"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:03:16.970562" elapsed="0.000278"/>
</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-10-11T01:03:16.969019" elapsed="0.001877"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:16.968805" elapsed="0.002120"/>
</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-10-11T01:03:16.971140" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:16.970948" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:16.968788" elapsed="0.002421"/>
</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-10-11T01:03:16.939518" elapsed="0.031736"/>
</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-10-11T01:03:16.938839" elapsed="0.032481"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:16.938634" elapsed="0.032726"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:16.938617" elapsed="0.032764"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:16.971432" 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-10-11T01:03:16.877885" elapsed="0.093661"/>
</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-10-11T01:03:16.876230" elapsed="0.095367"/>
</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-10-11T01:03:16.987484" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:16.987161" elapsed="0.000350"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:16.988196" 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-10-11T01:03:16.988003" elapsed="0.000254">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-10-11T01:03:16.988342" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:16.987670" elapsed="0.000695"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.988885" 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-10-11T01:03:16.988564" elapsed="0.000345"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:16.989203" 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-10-11T01:03:16.989363" 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-10-11T01:03:16.989094" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.989839" 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-10-11T01:03:16.989616" elapsed="0.000264"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.990800" 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-10-11T01:03:16.990568" elapsed="0.000273"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.991303" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:16.991048" elapsed="0.000278"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.992142" 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-10-11T01:03:16.991692" elapsed="0.000475"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:16.993330" 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-10-11T01:03:16.992806" elapsed="0.000635"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:16.993532" elapsed="0.000032"/>
</return>
<msg time="2026-10-11T01:03:16.993748" 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-10-11T01:03:16.992338" elapsed="0.001435"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:16.993942" elapsed="0.000320"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:03:16.991560" elapsed="0.002740"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.995023" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:16.994564" elapsed="0.000484"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:16.996229" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:16.995701" elapsed="0.000619"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:16.996402" elapsed="0.000057"/>
</return>
<msg time="2026-10-11T01:03:16.996652" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:16.995225" elapsed="0.001451"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:16.996845" elapsed="0.000325"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:16.994400" elapsed="0.002811"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:16.991402" elapsed="0.005842"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:16.997282" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:16.997536" 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-10-11T01:03:16.990207" elapsed="0.007360"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:16.989942" elapsed="0.007656"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:16.997778" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:16.997620" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:16.989924" elapsed="0.007924"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:16.998593" 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-10-11T01:03:16.998062" elapsed="0.000559"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:16.998666" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:16.986640" elapsed="0.012128"/>
</kw>
<msg time="2026-10-11T01:03:16.998816" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:16.982105" elapsed="0.016756"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:17.003173" 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/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-10-11T01:03:17.007341" 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/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-10-11T01:03:17.011481" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:17.011666" 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-10-11T01:03:17.011849" 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-10-11T01:03:17.012203" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:17.012056" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:17.012042" 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-10-11T01:03:17.012445" 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-10-11T01:03:17.012630" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:17.012794" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:17.012016" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:17.011914" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:17.013032" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:17.013099" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:17.013208" 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-10-11T01:03:16.981493" elapsed="0.031739"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:17.014343" 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-10-11T01:03:17.014158" elapsed="0.000244">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-10-11T01:03:17.014502" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:17.013816" elapsed="0.000709"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:17.014810" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:17.014589" elapsed="0.000272"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.015326" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:17.015063" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:17.014884" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:17.014571" elapsed="0.000846"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.015920" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:17.015584" elapsed="0.000360"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:17.016003" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:17.016128" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:17.013513" elapsed="0.002638"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:17.017241" 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-10-11T01:03:17.017055" elapsed="0.000280">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-10-11T01:03:17.017437" 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-10-11T01:03:17.016718" elapsed="0.000743"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:03:17.017625" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:03:17.017525" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:17.017508" elapsed="0.000194"/>
</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-10-11T01:03:17.017858" elapsed="0.000019"/>
</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-10-11T01:03:17.018046" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:03:17.018106" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:03:17.018231" 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-10-11T01:03:17.016399" elapsed="0.001856"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.019488" 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-10-11T01:03:17.019251" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.019938" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:17.019722" elapsed="0.000268"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:17.024789" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:17.024903" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:03:17.025008" 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-10-11T01:03:17.020278" elapsed="0.004755"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:17.020051" elapsed="0.005023"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:17.025254" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:17.025098" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:17.020034" elapsed="0.005296"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.026651" 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-10-11T01:03:17.026283" elapsed="0.000415"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:17.026039" elapsed="0.000691"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:17.026022" elapsed="0.000731"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.027369" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:17.027083" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:17.026803" elapsed="0.000667"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:17.026787" elapsed="0.000707"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.028037" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:17.027673" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:17.028339" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:17.028126" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.028859" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:17.028597" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:17.028431" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:17.028109" elapsed="0.000877"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.029523" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:17.029166" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:17.029845" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:17.029612" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.030375" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:17.030107" elapsed="0.000293"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:17.029922" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:17.029595" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:17.030627" elapsed="0.000293"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:17.031322" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:17.031100" elapsed="0.000247"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:17.031516" elapsed="0.000211"/>
</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-10-11T01:03:17.025682" elapsed="0.006100"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:17.031926" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:17.031844" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:17.031827" elapsed="0.000175"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:17.032727" 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-10-11T01:03:17.032144" elapsed="0.000610"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:17.032799" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:17.032925" 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-10-11T01:03:17.018543" elapsed="0.014407"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:17.033020" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:03:17.033141" 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-10-11T01:03:16.974168" elapsed="0.058997"/>
</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-10-11T01:03:17.043821" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:17.043519" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:17.044591" 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-10-11T01:03:17.044335" elapsed="0.000374">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-10-11T01:03:17.044873" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:17.044019" elapsed="0.000879"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.045420" 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-10-11T01:03:17.045093" elapsed="0.000363"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:17.045772" 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-10-11T01:03:17.045890" 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-10-11T01:03:17.045661" elapsed="0.000254"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.046346" 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-10-11T01:03:17.046126" elapsed="0.000265"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:17.046787" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:17.046487" elapsed="0.000357"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.047504" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:17.047029" elapsed="0.000500"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:17.046866" elapsed="0.000697"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:17.046467" elapsed="0.001116"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.048147" 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-10-11T01:03:17.047748" elapsed="0.000426"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:17.048218" 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/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-10-11T01:03:17.043000" elapsed="0.005318"/>
</kw>
<msg time="2026-10-11T01:03:17.048368" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:17.038560" elapsed="0.009874"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:17.052595" 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/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-10-11T01:03:17.056710" 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/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-10-11T01:03:17.061145" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:17.061330" 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-10-11T01:03:17.061571" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:17.061913" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:17.061768" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:17.061755" 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-10-11T01:03:17.062155" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:17.062334" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:17.062513" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:17.061729" elapsed="0.000833"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:17.061642" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:17.062736" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:17.062802" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:17.062921" 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-10-11T01:03:17.037831" elapsed="0.025115"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:17.063126" elapsed="0.000331"/>
</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-10-11T01:03:17.064477" 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-10-11T01:03:17.064101" elapsed="0.000404"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:17.065020" 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-10-11T01:03:17.064654" elapsed="0.000393"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:03:17.065233" elapsed="0.000306"/>
</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-10-11T01:03:17.063726" elapsed="0.001868"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:17.063527" elapsed="0.002097"/>
</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-10-11T01:03:17.065824" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:17.065646" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:17.063510" 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-10-11T01:03:17.034120" elapsed="0.031815"/>
</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-10-11T01:03:17.033457" elapsed="0.032559"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:17.033237" elapsed="0.032819"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:17.033222" elapsed="0.032855"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:17.066107" elapsed="0.000026"/>
</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-10-11T01:03:16.973545" elapsed="0.092661"/>
</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-10-11T01:03:16.971786" elapsed="0.094470"/>
</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-10-11T01:03:17.066457" elapsed="0.003088"/>
</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-10-11T01:03:17.085497" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:17.085176" elapsed="0.000348"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:17.086195" 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-10-11T01:03:17.086010" elapsed="0.000245">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-10-11T01:03:17.086339" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:17.085681" elapsed="0.000680"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.086856" 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-10-11T01:03:17.086549" elapsed="0.000332"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:17.087167" 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-10-11T01:03:17.087289" 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-10-11T01:03:17.087058" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.087762" 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-10-11T01:03:17.087541" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.088717" 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-10-11T01:03:17.088485" elapsed="0.000274"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.089198" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:17.088934" elapsed="0.000288"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.090019" 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-10-11T01:03:17.089565" elapsed="0.000480"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:17.091199" 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-10-11T01:03:17.090685" elapsed="0.000600"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:17.091370" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:03:17.091614" 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-10-11T01:03:17.090217" 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-10-11T01:03:17.091804" elapsed="0.000318"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:03:17.089426" elapsed="0.002733"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.092859" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:17.092389" elapsed="0.000495"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:17.094072" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:17.093548" elapsed="0.000613"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:17.094244" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:03:17.094518" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:17.093071" elapsed="0.001480"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:17.094722" elapsed="0.000320"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:17.092258" elapsed="0.002823"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:17.089266" elapsed="0.005847"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:17.095182" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:17.095317" 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-10-11T01:03:17.088130" elapsed="0.007212"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:17.087866" elapsed="0.007506"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:17.095681" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:17.095394" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:17.087848" elapsed="0.007907"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.096445" 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-10-11T01:03:17.095915" elapsed="0.000561"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:17.096520" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:17.084661" elapsed="0.011961"/>
</kw>
<msg time="2026-10-11T01:03:17.096671" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:17.080041" elapsed="0.016674"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:17.101011" 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/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-10-11T01:03:17.105102" 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/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-10-11T01:03:17.109186" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:17.109370" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:17.109568" 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-10-11T01:03:17.109905" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:17.109759" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:17.109746" 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-10-11T01:03:17.110148" 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-10-11T01:03:17.110327" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:17.110505" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:17.109721" elapsed="0.000833"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:17.109633" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:17.110727" elapsed="0.000017"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:17.110828" elapsed="0.000017"/>
</return>
<msg time="2026-10-11T01:03:17.110938" 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-10-11T01:03:17.079432" elapsed="0.031542"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:17.112084" 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-10-11T01:03:17.111879" elapsed="0.000265">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-10-11T01:03:17.112227" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:17.111558" elapsed="0.000691"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:17.112549" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:17.112313" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.113065" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:17.112789" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:17.112623" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:17.112296" elapsed="0.000845"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.113649" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:17.113301" elapsed="0.000372"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:17.113718" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:17.113840" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:17.111241" elapsed="0.002621"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:17.114900" 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-10-11T01:03:17.114758" elapsed="0.000191"/>
</kw>
<msg time="2026-10-11T01:03:17.115039" 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-10-11T01:03:17.114438" elapsed="0.000623"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:03:17.115221" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:17.115125" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:17.115108" elapsed="0.000172"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:17.115571" 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-10-11T01:03:17.115689" 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-10-11T01:03:17.115446" elapsed="0.000265"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:03:17.116068" 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-10-11T01:03:17.115872" elapsed="0.000220"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:03:17.116133" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:17.116256" 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-10-11T01:03:17.114124" elapsed="0.002153"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.117503" 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-10-11T01:03:17.117268" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.117998" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:17.117736" 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-10-11T01:03:17.122917" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:17.123041" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:03:17.123129" 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-10-11T01:03:17.118324" elapsed="0.004829"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:17.118098" elapsed="0.005094"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:17.123369" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:17.123216" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:17.118081" elapsed="0.005396"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.124737" 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-10-11T01:03:17.124387" elapsed="0.000396"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:17.124146" elapsed="0.000669"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:17.124128" elapsed="0.000709"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.125405" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:17.125140" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:17.124887" elapsed="0.000607"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:17.124872" elapsed="0.000644"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.126044" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:17.125691" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:17.126343" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:17.126132" elapsed="0.000263"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.126864" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:17.126599" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:17.126432" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:17.126116" elapsed="0.000825"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.127483" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:17.127130" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:17.127783" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:17.127571" elapsed="0.000264"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.128292" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:17.128032" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:17.127857" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:17.127554" elapsed="0.000813"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:17.128526" elapsed="0.000292"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:17.129209" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:17.128988" elapsed="0.000245"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:17.129385" elapsed="0.000226"/>
</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-10-11T01:03:17.123794" elapsed="0.005905"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:17.129844" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:17.129762" elapsed="0.000122"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:17.129745" elapsed="0.000159"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:17.130701" 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-10-11T01:03:17.130058" elapsed="0.000670"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:17.130776" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:17.130901" 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-10-11T01:03:17.116568" elapsed="0.014357"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:17.131003" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:03:17.131123" 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-10-11T01:03:17.072103" elapsed="0.059045"/>
</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-10-11T01:03:17.142622" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:17.142300" elapsed="0.000349"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:17.143358" 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-10-11T01:03:17.143138" elapsed="0.000375">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-10-11T01:03:17.143681" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:17.142806" elapsed="0.000898"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.144211" 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-10-11T01:03:17.143881" elapsed="0.000356"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:17.144547" 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-10-11T01:03:17.144668" 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-10-11T01:03:17.144425" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.145122" 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-10-11T01:03:17.144886" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:17.145555" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:17.145225" elapsed="0.000388"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.146250" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:17.145783" elapsed="0.000492"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:17.145635" elapsed="0.000673"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:17.145208" elapsed="0.001119"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.146909" 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-10-11T01:03:17.146524" elapsed="0.000454"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:17.147025" 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/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-10-11T01:03:17.141778" elapsed="0.005350"/>
</kw>
<msg time="2026-10-11T01:03:17.147175" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:17.137314" elapsed="0.009906"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:17.151417" 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/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-10-11T01:03:17.155522" 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/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-10-11T01:03:17.159791" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:17.159987" 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-10-11T01:03:17.160172" 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-10-11T01:03:17.160525" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:17.160365" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:17.160352" 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-10-11T01:03:17.160752" 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-10-11T01:03:17.160932" 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-10-11T01:03:17.161111" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:17.160327" elapsed="0.000832"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:17.160238" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:17.161333" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:17.161399" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:03:17.161521" 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-10-11T01:03:17.136597" elapsed="0.024949"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:17.161745" elapsed="0.000328"/>
</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-10-11T01:03:17.162972" 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-10-11T01:03:17.162724" elapsed="0.000275"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:17.163699" 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-10-11T01:03:17.163150" elapsed="0.000577"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:03:17.164198" 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-10-11T01:03:17.164364" 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-10-11T01:03:17.163913" elapsed="0.000541">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-10-11T01:03:17.162344" elapsed="0.002245">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-10-11T01:03:17.162142" elapsed="0.002516">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-10-11T01:03:17.164868" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:17.164690" elapsed="0.000229"/>
</branch>
<status status="FAIL" start="2026-10-11T01:03:17.162126" elapsed="0.002814">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-10-11T01:03:17.132102" elapsed="0.032960">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-10-11T01:03:17.131440" elapsed="0.033778">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-10-11T01:03:17.131220" elapsed="0.034075">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-10-11T01:03:17.131205" elapsed="0.034122">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-10-11T01:03:17.165370" elapsed="0.000015"/>
</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-10-11T01:03:17.071468" elapsed="0.094043">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-10-11T01:03:19.200815" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:19.200084" elapsed="0.000793"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:19.202531" 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-10-11T01:03:19.202040" elapsed="0.000639">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-10-11T01:03:19.202871" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:19.201265" elapsed="0.001656"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.204096" 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-10-11T01:03:19.203341" elapsed="0.000812"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:19.204809" 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-10-11T01:03:19.205197" 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-10-11T01:03:19.204557" elapsed="0.000764"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.206356" 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-10-11T01:03:19.205825" elapsed="0.000659"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.208587" 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-10-11T01:03:19.208036" elapsed="0.000645"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.209690" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:19.209100" elapsed="0.000643"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.211589" 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-10-11T01:03:19.210493" elapsed="0.001154"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:19.214365" 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-10-11T01:03:19.213187" elapsed="0.001444"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:19.214821" elapsed="0.000072"/>
</return>
<msg time="2026-10-11T01:03:19.215332" 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-10-11T01:03:19.212133" elapsed="0.003253"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:19.215836" elapsed="0.000781"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:03:19.210169" elapsed="0.006542"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.217863" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:19.217126" elapsed="0.000772"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:19.219579" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:19.218822" elapsed="0.000884"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:19.219821" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T01:03:19.220140" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:19.218155" elapsed="0.002020"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:19.220437" elapsed="0.000437"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:19.216926" elapsed="0.004002"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:19.209841" elapsed="0.011145"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:19.221039" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T01:03:19.221218" 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-10-11T01:03:19.207222" elapsed="0.014029"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:19.206628" elapsed="0.014664"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:19.221581" elapsed="0.000241"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:19.221324" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:19.206587" elapsed="0.015309"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.222972" 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-10-11T01:03:19.222145" elapsed="0.000870"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:19.223077" 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-10-11T01:03:19.198834" elapsed="0.024386"/>
</kw>
<msg time="2026-10-11T01:03:19.223287" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:19.188714" elapsed="0.034637"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:19.229215" 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/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-10-11T01:03:19.235050" 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-10-11T01:03:19.240783" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:19.241055" 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-10-11T01:03:19.241311" 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-10-11T01:03:19.241803" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:19.241598" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:19.241579" elapsed="0.000325"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:19.242143" 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-10-11T01:03:19.242399" elapsed="0.000045"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:19.242651" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:19.241544" elapsed="0.001181"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:19.241401" elapsed="0.001365"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:19.243050" elapsed="0.000024"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:19.243130" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:19.243238" 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-10-11T01:03:19.187239" elapsed="0.056023"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:19.244384" 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-10-11T01:03:19.244197" elapsed="0.000263">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-10-11T01:03:19.244544" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:19.243848" elapsed="0.000719"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:19.244859" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:19.244631" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.245387" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:19.245123" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:19.244932" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:19.244613" elapsed="0.000897"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.246028" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:19.245676" elapsed="0.000376"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:19.246097" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:19.246221" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:19.243544" elapsed="0.002700"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:19.247292" 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-10-11T01:03:19.247146" elapsed="0.000194"/>
</kw>
<msg time="2026-10-11T01:03:19.247431" 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-10-11T01:03:19.246811" elapsed="0.000644"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:03:19.247620" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:19.247520" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:19.247503" elapsed="0.000177"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:19.247977" 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-10-11T01:03:19.248094" 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-10-11T01:03:19.247839" elapsed="0.000279"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:03:19.248483" 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-10-11T01:03:19.248281" elapsed="0.000227"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:03:19.248550" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:19.248675" 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-10-11T01:03:19.246509" elapsed="0.002188"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.249920" 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-10-11T01:03:19.249699" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.250558" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:19.250169" elapsed="0.000430"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:19.255920" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:19.256114" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:03:19.256251" 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-10-11T01:03:19.250893" elapsed="0.005393"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:19.250660" elapsed="0.005680"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:19.256631" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:19.256374" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:19.250642" elapsed="0.006101"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.258540" 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-10-11T01:03:19.258058" elapsed="0.000543"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:19.257704" elapsed="0.000941"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:19.257680" elapsed="0.000997"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.259748" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:19.259275" elapsed="0.000532"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:19.258766" elapsed="0.001085"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:19.258736" elapsed="0.001149"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.260676" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:19.260155" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:19.261116" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:19.260801" elapsed="0.000388"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.261864" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:19.261487" elapsed="0.000411"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:19.261220" elapsed="0.000753"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:19.260777" elapsed="0.001226"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.262744" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:19.262252" elapsed="0.000526"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:19.263176" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:19.262866" elapsed="0.000382"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.263917" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:19.263547" elapsed="0.000404"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:19.263278" elapsed="0.000734"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:19.262842" elapsed="0.001197"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:19.264240" elapsed="0.000426"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:19.265214" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:19.264890" 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-10-11T01:03:19.265482" elapsed="0.000292"/>
</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-10-11T01:03:19.257208" elapsed="0.008645"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:19.266068" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:19.265939" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:19.265916" elapsed="0.000234"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:19.267011" 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-10-11T01:03:19.266347" elapsed="0.000703"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:19.267114" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T01:03:19.267290" 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-10-11T01:03:19.248987" elapsed="0.018336"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:19.267400" elapsed="0.000054"/>
</return>
<msg time="2026-10-11T01:03:19.267590" 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-10-11T01:03:19.170472" elapsed="0.097151"/>
</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-10-11T01:03:19.280846" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:19.280544" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:19.281674" 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-10-11T01:03:19.281447" elapsed="0.000350">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-10-11T01:03:19.281971" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:19.281095" elapsed="0.000900"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.282514" 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-10-11T01:03:19.282171" elapsed="0.000369"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:19.282821" 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-10-11T01:03:19.282941" 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-10-11T01:03:19.282710" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.283395" 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-10-11T01:03:19.283176" 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-10-11T01:03:19.283822" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:19.283526" elapsed="0.000350"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.284536" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:19.284059" elapsed="0.000504"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:19.283898" elapsed="0.000698"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:19.283508" elapsed="0.001108"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.285177" 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-10-11T01:03:19.284781" elapsed="0.000422"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:19.285248" 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/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-10-11T01:03:19.280022" elapsed="0.005326"/>
</kw>
<msg time="2026-10-11T01:03:19.285395" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:19.275239" elapsed="0.010240"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:19.289597" 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/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-10-11T01:03:19.293708" 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/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-10-11T01:03:19.298004" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:19.298189" 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-10-11T01:03:19.298372" 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-10-11T01:03:19.298728" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:19.298581" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:19.298568" 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-10-11T01:03:19.299032" 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-10-11T01:03:19.299224" 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-10-11T01:03:19.299391" elapsed="0.000040"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:19.298543" elapsed="0.000925"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:19.298453" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:19.299649" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:19.299715" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:19.299821" 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-10-11T01:03:19.274212" elapsed="0.025634"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:19.300030" elapsed="0.000314"/>
</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-10-11T01:03:19.301243" 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-10-11T01:03:19.301005" elapsed="0.000265"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:19.301671" 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-10-11T01:03:19.301434" elapsed="0.000263"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:03:19.301881" elapsed="0.000291"/>
</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-10-11T01:03:19.300633" elapsed="0.001593"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:19.300430" elapsed="0.001826"/>
</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-10-11T01:03:19.302471" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:19.302278" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:19.300397" elapsed="0.002145"/>
</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-10-11T01:03:19.268953" elapsed="0.033633"/>
</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-10-11T01:03:19.268027" elapsed="0.034624"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:19.267725" elapsed="0.034997"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:19.267703" elapsed="0.035041"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:19.302775" 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-10-11T01:03:19.168953" elapsed="0.133924"/>
</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-10-11T01:03:17.069741" elapsed="2.233188"/>
</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-10-11T01:03:19.303151" elapsed="0.002890"/>
</kw>
<arg>intra_as_ipmsi_ad</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-10-11T01:03:14.679657" elapsed="4.626440"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:14.583043" elapsed="4.723165"/>
</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-10-11T01:03:19.307750" elapsed="0.000218"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:03:19.307361" elapsed="0.000659"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:19.309236" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:19.308883" elapsed="0.000399"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:19.308864" elapsed="0.000440"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:19.311463" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:19.311364" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:19.311347" elapsed="0.000179"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.312446" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:19.312106" elapsed="0.000367"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.312895" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:03:19.312630" elapsed="0.000289"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:03:19.312971" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:19.313100" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:03:19.311735" elapsed="0.001389"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:19.315651" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:19.315566" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:19.315549" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:19.316808" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:19.316718" elapsed="0.000133"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:19.316701" elapsed="0.000170"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:19.317209" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:03:19.317036" elapsed="0.000198"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:03:19.317574" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:19.317402" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:03:19.369509" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:03:19.318102" elapsed="0.051514"/>
</kw>
<msg time="2026-10-11T01:03:19.369773" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:03:19.369816" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:19.317756" elapsed="0.052098"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:03:19.416006" 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-10-11T01:03:19.370400" elapsed="0.045710"/>
</kw>
<msg time="2026-10-11T01:03:19.416294" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:03:19.416336" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:19.370055" elapsed="0.046318"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:19.416690" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:19.416473" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:19.416451" elapsed="0.000312"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.417193" 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-10-11T01:03:19.416946" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:19.417548" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:19.417322" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:19.417305" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:03:19.417652" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:19.420318" elapsed="0.000143"/>
</kw>
<msg time="2026-10-11T01:03:19.420522" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:19.419059" elapsed="0.001597"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:19.420983" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:19.421471" 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-10-11T01:03:19.418438" elapsed="0.003237"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:03:19.417934" 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-10-11T01:03:19.316450" elapsed="0.105361"/>
</kw>
<msg time="2026-10-11T01:03:19.421893" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:19.421933" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:19.315866" elapsed="0.106117"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:03:19.422140" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:03:19.422052" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:19.422035" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:19.422624" 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-10-11T01:03:19.422927" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:03:19.423006" 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-10-11T01:03:19.315267" elapsed="0.107826"/>
</kw>
<msg time="2026-10-11T01:03:19.423176" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:19.423216" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:19.313468" elapsed="0.109783"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:19.423635" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:19.423317" elapsed="0.000371"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:19.423301" elapsed="0.000409"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:03:19.313308" elapsed="0.110423"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:03:19.313170" elapsed="0.110587"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:03:19.311067" elapsed="0.112738"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:03:19.308626" elapsed="0.115262"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:19.308173" elapsed="0.115759"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:03:19.307012" elapsed="0.116982"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:19.424780" 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-10-11T01:03:19.424912" 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-10-11T01:03:19.424633" elapsed="0.000304"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:03:19.425293" 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-10-11T01:03:19.425117" elapsed="0.000201"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:19.425632" 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-10-11T01:03:19.425749" 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-10-11T01:03:19.425497" elapsed="0.000276"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:03:19.426110" 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-10-11T01:03:19.425930" elapsed="0.000204"/>
</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-10-11T01:03:19.426381" elapsed="0.002511"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:19.426197" elapsed="0.002728"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:19.426180" 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-10-11T01:03:19.439782" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:19.439479" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:19.440509" 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-10-11T01:03:19.440303" elapsed="0.000272">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-10-11T01:03:19.440659" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:19.439980" elapsed="0.000702"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.441183" 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-10-11T01:03:19.440857" elapsed="0.000352"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:19.441515" 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-10-11T01:03:19.441636" 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-10-11T01:03:19.441378" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.442097" 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-10-11T01:03:19.441858" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.443076" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:03:19.442830" elapsed="0.000288"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.443568" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:19.443296" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.444227" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:19.443946" elapsed="0.000305"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:19.445129" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:19.444748" elapsed="0.000406"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:19.445199" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:19.445324" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:19.444437" elapsed="0.000910"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:19.445548" elapsed="0.000180"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:03:19.443812" elapsed="0.001954"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.446286" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:19.446013" elapsed="0.000297"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:19.447197" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:19.446824" elapsed="0.000398"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:19.447267" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:19.447390" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:19.446507" 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-10-11T01:03:19.447615" elapsed="0.000167"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:19.445865" elapsed="0.001955"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:19.443669" elapsed="0.004183"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:19.447889" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:19.448031" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:19.442484" elapsed="0.005570"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:19.442200" elapsed="0.005884"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:19.448258" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:19.448107" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:19.442183" elapsed="0.006146"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.449046" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:19.448525" elapsed="0.000547"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:19.449115" 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/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-10-11T01:03:19.438944" elapsed="0.010272"/>
</kw>
<msg time="2026-10-11T01:03:19.449265" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:19.434445" elapsed="0.014865"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:19.453632" 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/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-10-11T01:03:19.457711" 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/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-10-11T01:03:19.462081" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:19.462267" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:19.462465" 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-10-11T01:03:19.462806" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:19.462659" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:19.462645" 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-10-11T01:03:19.463045" 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-10-11T01:03:19.463227" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:19.463392" elapsed="0.000032"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:19.462620" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:19.462532" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:19.463630" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:19.463709" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:03:19.463818" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:19.433812" elapsed="0.030031"/>
</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-10-11T01:03:19.472781" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:19.472482" elapsed="0.000326"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:19.473482" 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-10-11T01:03:19.473295" elapsed="0.000247">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-10-11T01:03:19.473627" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:19.472978" elapsed="0.000671"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.474139" 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-10-11T01:03:19.473823" elapsed="0.000340"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:19.474454" 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-10-11T01:03:19.474577" 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-10-11T01:03:19.474331" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.475029" 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-10-11T01:03:19.474800" 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-10-11T01:03:19.475440" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:19.475175" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.475924" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', '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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:19.475664" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:19.475516" elapsed="0.000477"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:19.475157" elapsed="0.000856"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.476569" 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-10-11T01:03:19.476175" elapsed="0.000422"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:19.476641" 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/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-10-11T01:03:19.471966" elapsed="0.004775"/>
</kw>
<msg time="2026-10-11T01:03:19.476790" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:19.467668" elapsed="0.009165"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:19.481038" 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/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-10-11T01:03:19.485109" 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/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-10-11T01:03:19.489164" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:19.489345" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:19.489541" 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-10-11T01:03:19.489877" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:19.489731" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:19.489718" 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-10-11T01:03:19.490123" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:19.490302" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:19.490483" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:19.489693" elapsed="0.000839"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:19.489606" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:19.490742" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:19.490808" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:03:19.490922" 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-10-11T01:03:19.466966" elapsed="0.023982"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:19.492075" 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-10-11T01:03:19.491872" elapsed="0.000263">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-10-11T01:03:19.492217" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:19.491548" elapsed="0.000692"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:19.492538" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:19.492301" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.493052" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:19.492779" elapsed="0.000299"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:19.492611" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:19.492284" elapsed="0.000845"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.493644" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:19.493292" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:19.493712" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:19.493835" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:19.491233" elapsed="0.002625"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.495190" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:19.494970" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.495652" 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-10-11T01:03:19.495439" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.496122" 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-10-11T01:03:19.495892" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.496584" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:19.496350" elapsed="0.000274"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:19.497336" 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-10-11T01:03:19.497174" elapsed="0.000187"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:03:19.497698" 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-10-11T01:03:19.497548" elapsed="0.000173"/>
</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-10-11T01:03:19.497888" elapsed="0.000169"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.498534" 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-10-11T01:03:19.498289" elapsed="0.000285"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:03:19.498612" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:19.498742" 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-10-11T01:03:19.496806" elapsed="0.001959"/>
</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-10-11T01:03:19.523617" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.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-10-11T01:03:19.523676" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:19.523767" 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-10-11T01:03:19.499072" elapsed="0.024719"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:19.498827" elapsed="0.025005"/>
</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-10-11T01:03:19.524026" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:19.523856" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:19.498811" elapsed="0.025295"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.525318" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:19.525044" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:19.524791" elapsed="0.000599"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:19.524774" elapsed="0.000655"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.525998" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:19.525717" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:19.525481" elapsed="0.000590"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:19.525465" elapsed="0.000628"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.526627" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:19.526270" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:19.526927" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:19.526715" elapsed="0.000276"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.527460" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:19.527182" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:19.527014" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:19.526698" elapsed="0.000839"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.528059" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:19.527711" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:19.528357" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:19.528146" elapsed="0.000276"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.528872" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:19.528609" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:19.528445" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:19.528130" elapsed="0.000818"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:19.529104" elapsed="0.000337"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:19.529823" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:19.529601" elapsed="0.000246"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:19.530010" elapsed="0.000212"/>
</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-10-11T01:03:19.524435" elapsed="0.005841"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:03:19.530447" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-10-11T01:03:19.530341" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:19.530324" 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-10-11T01:03:19.530679" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:03:19.530739" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:03:19.530900" 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-10-11T01:03:19.494164" elapsed="0.036761"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:19.530999" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:19.531141" 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-10-11T01:03:19.429884" elapsed="0.101280"/>
</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-10-11T01:03:19.531487" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:19.531254" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:19.531238" elapsed="0.000333"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:19.531601" elapsed="0.000024"/>
</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-10-11T01:03:19.429185" elapsed="0.102513"/>
</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-10-11T01:03:19.535076" level="INFO">${update} = </msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:03:19.532606" elapsed="0.002496"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:03:19.535628" level="FAIL"> == </msg>
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="FAIL" start="2026-10-11T01:03:19.535261" elapsed="0.000424"> == </status>
</kw>
<return>
<value>${update}</value>
<status status="NOT RUN" start="2026-10-11T01:03:19.535737" elapsed="0.000016"/>
</return>
<doc>Returns hex update message.</doc>
<status status="FAIL" start="2026-10-11T01:03:19.532333" elapsed="0.003508"> == </status>
</kw>
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:21.540642" level="INFO">${update} = ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800e17000105047f01010100020c00010102030401020000fbf0</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:03:21.537257" elapsed="0.003454"/>
</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-10-11T01:03:21.541146" elapsed="0.000750"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:03:21.542028" elapsed="0.000075"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:03:21.536551" elapsed="0.005723"/>
</kw>
<msg time="2026-10-11T01:03:21.542466" 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-10-11T01:03:19.531887" elapsed="2.010636"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.544882" level="INFO">Length is 140.</msg>
<msg time="2026-10-11T01:03:21.545065" 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-10-11T01:03:21.543772" elapsed="0.001344"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.546057" level="INFO">Length is 140.</msg>
<msg time="2026-10-11T01:03:21.546209" 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-10-11T01:03:21.545508" elapsed="0.000831"/>
</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-10-11T01:03:21.546792" elapsed="0.000672"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:21.548176" 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-10-11T01:03:21.547810" elapsed="0.000418"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:21.548917" 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-10-11T01:03:21.548585" elapsed="0.000502"/>
</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-10-11T01:03:21.549525" elapsed="0.000618"/>
</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-10-11T01:03:21.542982" elapsed="0.007283"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:03:21.550605" elapsed="0.002770"/>
</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-10-11T01:03:21.585057" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:21.584321" elapsed="0.000796"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:21.586683" 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-10-11T01:03:21.586239" elapsed="0.000583">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-10-11T01:03:21.587037" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:21.585503" elapsed="0.001587"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.588147" 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-10-11T01:03:21.587512" elapsed="0.000670"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:21.588592" 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-10-11T01:03:21.588764" 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-10-11T01:03:21.588435" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.589391" 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-10-11T01:03:21.589086" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.590759" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:03:21.590436" elapsed="0.000382"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.591452" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:21.591079" elapsed="0.000408"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.592805" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:21.591942" elapsed="0.000898"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:21.594338" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:21.593696" elapsed="0.000780"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:21.594656" elapsed="0.000044"/>
</return>
<msg time="2026-10-11T01:03:21.594892" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:21.593102" elapsed="0.001823"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:21.595176" elapsed="0.000447"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:03:21.591755" elapsed="0.003922"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.596661" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:21.596022" elapsed="0.000674"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:21.598225" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:21.597598" elapsed="0.000734"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:21.598572" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T01:03:21.598805" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:21.596936" elapsed="0.001902"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:21.599084" elapsed="0.000442"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:21.595818" elapsed="0.003761"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:21.591553" elapsed="0.008070"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:21.599676" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T01:03:21.599855" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:21.589924" elapsed="0.009964"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:21.589564" elapsed="0.010364"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:21.600190" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:21.599979" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:21.589536" elapsed="0.010751"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.601266" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:21.600543" elapsed="0.000760"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:21.601364" 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/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-10-11T01:03:21.583147" elapsed="0.018385"/>
</kw>
<msg time="2026-10-11T01:03:21.601600" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:21.573310" elapsed="0.028353"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:21.607532" 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-10-11T01:03:21.613382" elapsed="0.000055"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-10-11T01:03:21.619130" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:21.619383" elapsed="0.000045"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:21.619658" 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-10-11T01:03:21.620206" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:21.619999" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:21.619979" 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-10-11T01:03:21.620553" 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-10-11T01:03:21.620804" 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-10-11T01:03:21.621050" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:21.619928" elapsed="0.001190"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:21.619801" elapsed="0.001349"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:21.621364" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:21.621476" elapsed="0.000022"/>
</return>
<msg time="2026-10-11T01:03:21.621627" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:21.571869" elapsed="0.049793"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.623093" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:21.622764" elapsed="0.000389"/>
</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-10-11T01:03:21.638200" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:21.638264" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:21.638377" 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-10-11T01:03:21.623575" elapsed="0.014860"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:21.623235" elapsed="0.015252"/>
</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-10-11T01:03:21.638735" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:21.638521" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:21.623212" elapsed="0.015628"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.640789" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:21.640382" elapsed="0.000463"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:21.640039" elapsed="0.000850"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:21.639765" elapsed="0.001156"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.641741" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:21.641341" elapsed="0.000458"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:21.641007" elapsed="0.000841"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:21.640985" elapsed="0.000894"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.642660" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:21.642153" elapsed="0.000543"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:21.643100" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:21.642784" elapsed="0.000391"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.643829" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:21.643459" elapsed="0.000404"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:21.643206" elapsed="0.000762"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:21.642761" elapsed="0.001239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.644742" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:21.644249" elapsed="0.000528"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:21.645169" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:21.644865" elapsed="0.000376"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.645883" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:21.645517" elapsed="0.000400"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:21.645272" elapsed="0.000705"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:21.644842" elapsed="0.001163"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:21.646208" elapsed="0.000434"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:21.647192" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:21.646866" elapsed="0.000361"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:21.647460" elapsed="0.000296"/>
</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-10-11T01:03:21.639304" elapsed="0.008530"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:03:21.647891" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T01:03:21.648151" 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-10-11T01:03:21.622012" elapsed="0.026173"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:21.648250" elapsed="0.000034"/>
</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-10-11T01:03:21.555597" elapsed="0.092785"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:21.554645" elapsed="0.093826"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:03:21.553783" elapsed="0.094761"/>
</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-10-11T01:03:21.652237" level="INFO">${update} = ffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105020c00010102030401020000fbf0</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:03:21.649782" elapsed="0.002495"/>
</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-10-11T01:03:21.652546" elapsed="0.000419"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:03:21.653026" elapsed="0.000038"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:03:21.649402" elapsed="0.003764"/>
</kw>
<msg time="2026-10-11T01:03:21.653257" 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-10-11T01:03:21.648793" elapsed="0.004497"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.654437" level="INFO">Length is 128.</msg>
<msg time="2026-10-11T01:03:21.654536" 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-10-11T01:03:21.654084" elapsed="0.000483"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.655120" level="INFO">Length is 128.</msg>
<msg time="2026-10-11T01:03:21.655214" 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-10-11T01:03:21.654784" elapsed="0.000461"/>
</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-10-11T01:03:21.655523" elapsed="0.000367"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:21.656312" 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-10-11T01:03:21.656106" elapsed="0.000239"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:21.656766" 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-10-11T01:03:21.656564" 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-10-11T01:03:21.657062" elapsed="0.000393"/>
</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-10-11T01:03:21.653577" elapsed="0.003956"/>
</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-10-11T01:03:21.675840" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:21.675537" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:21.676563" 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-10-11T01:03:21.676359" elapsed="0.000263">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-10-11T01:03:21.676705" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:21.676040" elapsed="0.000687"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.677220" 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-10-11T01:03:21.676900" elapsed="0.000345"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:21.677535" 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-10-11T01:03:21.677652" 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-10-11T01:03:21.677425" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.678104" 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-10-11T01:03:21.677870" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.679080" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:03:21.678839" elapsed="0.000283"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.679560" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:21.679296" elapsed="0.000288"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.680360" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:21.679898" elapsed="0.000487"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:21.681432" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:21.680990" elapsed="0.000483"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:21.681588" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:03:21.681766" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:21.680574" elapsed="0.001216"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:21.681966" elapsed="0.000267"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:03:21.679764" elapsed="0.002507"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.682976" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:21.682518" elapsed="0.000483"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:21.684037" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:21.683603" elapsed="0.000474"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:21.684184" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:03:21.684358" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:21.683169" elapsed="0.001212"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:21.684566" elapsed="0.000268"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:21.682368" elapsed="0.002503"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:21.679628" elapsed="0.005274"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:21.684940" elapsed="0.000044"/>
</return>
<msg time="2026-10-11T01:03:21.685119" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:21.678473" elapsed="0.006671"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:21.678207" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:21.685345" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:21.685195" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:21.678189" elapsed="0.007283"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.686304" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:21.685633" elapsed="0.000701"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:21.686378" elapsed="0.000090"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:21.674981" elapsed="0.011565"/>
</kw>
<msg time="2026-10-11T01:03:21.686594" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:21.670301" elapsed="0.016348"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:21.690806" 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/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-10-11T01:03:21.694936" 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/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-10-11T01:03:21.699078" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:21.699259" 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-10-11T01:03:21.699454" 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-10-11T01:03:21.699792" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:21.699647" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:21.699634" 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-10-11T01:03:21.700048" 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-10-11T01:03:21.700229" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:21.700392" elapsed="0.000031"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:21.699609" elapsed="0.000845"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:21.699521" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:21.700627" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:21.700725" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:03:21.700835" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:21.669376" elapsed="0.031483"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.701897" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:21.701669" elapsed="0.000271"/>
</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-10-11T01:03:21.709683" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:21.710037" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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+xml', 'Content-Length': '635'} 
 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-path xmlns:a="urn:opendaylight:params:xml:ns:yang:bgp-rib" xmlns:b="urn:opendaylight:params:xml:ns:yang:bgp-types" xmlns:c="urn:opendaylight:params:xml:ns:yang:bgp:mvpn" xmlns:d="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;/a:application-rib[a:id='10.30.170.173']/a:tables[a:afi='b:ipv4-address-family'][a:safi='c:mcast-vpn-subsequent-address-family']/d:mvpn-routes-ipv4&lt;/error-path&gt;&lt;error-message&gt;Data does not exist&lt;/error-message&gt;&lt;error-tag&gt;data-missing&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-10-11T01:03:21.710171" level="INFO">${response} = None</msg>
<msg time="2026-10-11T01:03:21.710211" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:21.702271" elapsed="0.008307">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:21.702044" elapsed="0.008612">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:21.710846" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:21.710687" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-10-11T01:03:21.702027" elapsed="0.008897">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:21.712205" 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-10-11T01:03:21.711912" elapsed="0.000324">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:03:21.711661" elapsed="0.000632">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:03:21.711644" elapsed="0.000678">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-10-11T01:03:21.712913" 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-10-11T01:03:21.712650" elapsed="0.000292">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:03:21.712383" elapsed="0.000635">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:03:21.712368" elapsed="0.000679">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.713768" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:21.713241" elapsed="0.000553"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:21.714133" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:21.713897" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.714663" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:21.714374" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:21.714209" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:21.713879" elapsed="0.000861"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.715271" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:21.714916" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:21.715587" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:21.715360" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.716107" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:21.715825" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:21.715662" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:21.715343" elapsed="0.000841"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:21.716328" elapsed="0.000311"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:21.717037" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:21.716800" elapsed="0.000262"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-10-11T01:03:21.717377" 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-10-11T01:03:21.717216" elapsed="0.000205">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-10-11T01:03:21.711277" elapsed="0.006270">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-10-11T01:03:21.717601" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:21.717855" level="INFO">${response_text} = None</msg>
<msg time="2026-10-11T01:03:21.717881" 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-10-11T01:03:21.701105" elapsed="0.016803">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-10-11T01:03:21.717977" 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-10-11T01:03:21.658931" elapsed="0.059185">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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:21.658366" elapsed="0.059806"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:03:21.657859" elapsed="0.060366"/>
</kw>
<arg>inter_as_ipmsi_ad</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-10-11T01:03:19.424252" elapsed="2.294021"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:19.306602" elapsed="2.411778"/>
</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-10-11T01:03:21.719938" elapsed="0.000213"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:03:21.719668" 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-10-11T01:03:21.721524" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:21.721434" elapsed="0.000133"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:21.721401" elapsed="0.000186"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:21.723697" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:21.723614" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:21.723597" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.724727" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:21.724382" elapsed="0.000370"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.725183" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:03:21.724906" elapsed="0.000301"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:03:21.725248" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:21.725377" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:03:21.724020" elapsed="0.001381"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:21.727902" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:21.727819" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:21.727802" elapsed="0.000178"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:21.729033" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:21.728937" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:21.728921" elapsed="0.000174"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:21.729430" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:03:21.729243" elapsed="0.000213"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:03:21.729762" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:21.729622" elapsed="0.000164"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:03:21.767294" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:03:21.730333" elapsed="0.037055"/>
</kw>
<msg time="2026-10-11T01:03:21.767560" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:03:21.767622" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:21.729942" elapsed="0.037717"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:03:21.808148" 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-10-11T01:03:21.768179" elapsed="0.040072"/>
</kw>
<msg time="2026-10-11T01:03:21.808399" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:03:21.808460" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:21.767826" elapsed="0.040670"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:21.808773" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:21.808564" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:21.808546" elapsed="0.000300"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.809266" 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-10-11T01:03:21.809040" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:21.809627" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:21.809391" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:21.809375" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:03:21.809727" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:21.812337" elapsed="0.000132"/>
</kw>
<msg time="2026-10-11T01:03:21.812528" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:21.811118" 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-10-11T01:03:21.813011" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:21.813347" 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-10-11T01:03:21.810503" elapsed="0.003049"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:03:21.810018" elapsed="0.003733"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:03:21.728683" elapsed="0.085162"/>
</kw>
<msg time="2026-10-11T01:03:21.813926" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:21.813980" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:21.728132" elapsed="0.085884"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:03:21.814169" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:03:21.814085" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:21.814067" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:21.814620" 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-10-11T01:03:21.814940" elapsed="0.000039"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:03:21.815022" 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-10-11T01:03:21.727535" elapsed="0.087573"/>
</kw>
<msg time="2026-10-11T01:03:21.815190" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:21.815230" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:21.725761" elapsed="0.089504"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:21.815609" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:21.815331" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:21.815315" elapsed="0.000365"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:03:21.725618" elapsed="0.090083"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:03:21.725465" elapsed="0.090264"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:03:21.723305" elapsed="0.092473"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:03:21.721157" elapsed="0.094673"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:21.720350" elapsed="0.095526"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:03:21.719306" elapsed="0.096617"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.817023" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:21.816603" elapsed="0.000447"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.817638" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:21.817238" elapsed="0.000426"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.818192" 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-10-11T01:03:21.817845" elapsed="0.000372"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:21.818544" 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-10-11T01:03:21.818677" 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-10-11T01:03:21.818384" elapsed="0.000317"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:21.819060" 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-10-11T01:03:21.819213" 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-10-11T01:03:21.818908" elapsed="0.000329"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:03:21.819378" 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-10-11T01:03:21.821858" elapsed="0.002078"/>
</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-10-11T01:03:21.839616" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:21.839298" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:21.840319" 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-10-11T01:03:21.840129" elapsed="0.000253">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-10-11T01:03:21.840483" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:21.839800" elapsed="0.000705"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.841004" 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-10-11T01:03:21.840678" elapsed="0.000351"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:21.841303" 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-10-11T01:03:21.841438" 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-10-11T01:03:21.841195" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.841875" 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-10-11T01:03:21.841658" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.842830" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:21.842600" elapsed="0.000271"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.843305" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:21.843060" elapsed="0.000269"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.844106" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:21.843656" elapsed="0.000475"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:21.845261" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:21.844749" elapsed="0.000600"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:21.845445" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:03:21.845664" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:21.844303" 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-10-11T01:03:21.845852" elapsed="0.000316"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:03:21.843525" elapsed="0.002682"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.846887" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:21.846455" elapsed="0.000456"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:21.848094" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:21.847549" elapsed="0.000630"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:21.848263" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:03:21.848492" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:21.847096" 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-10-11T01:03:21.848680" elapsed="0.000307"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:21.846306" elapsed="0.002719"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:21.843371" elapsed="0.005685"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:21.849093" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:21.849220" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:21.842244" elapsed="0.007000"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:21.841992" elapsed="0.007280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:21.849553" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:21.849294" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:21.841973" elapsed="0.007651"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.850462" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-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-10-11T01:03:21.849783" elapsed="0.000706"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:21.850533" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:21.838786" elapsed="0.011846"/>
</kw>
<msg time="2026-10-11T01:03:21.850680" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:21.834502" elapsed="0.016222"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:21.854820" 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/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-10-11T01:03:21.858884" 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/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-10-11T01:03:21.862948" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:21.863138" 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-10-11T01:03:21.863319" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:21.863667" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:21.863522" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:21.863509" 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-10-11T01:03:21.863928" 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-10-11T01:03:21.864121" 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-10-11T01:03:21.864285" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:21.863484" elapsed="0.000847"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:21.863383" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:21.864520" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:21.864586" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:03:21.864695" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-i...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:03:21.833877" elapsed="0.030842"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:21.865839" 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-10-11T01:03:21.865643" elapsed="0.000255">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-10-11T01:03:21.865992" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:21.865301" elapsed="0.000715"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:21.866319" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:21.866078" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.866844" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:21.866583" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:21.866394" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:21.866061" elapsed="0.000859"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.867447" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:21.867098" elapsed="0.000373"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:21.867516" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:21.867638" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:21.865000" elapsed="0.002661"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:21.868749" 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-10-11T01:03:21.868559" elapsed="0.000249">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-10-11T01:03:21.868892" 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-10-11T01:03:21.868220" elapsed="0.000694"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:03:21.869087" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:03:21.868988" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:21.868970" elapsed="0.000194"/>
</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-10-11T01:03:21.869318" elapsed="0.000019"/>
</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-10-11T01:03:21.869508" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:03:21.869567" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:03:21.869724" 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-10-11T01:03:21.867910" elapsed="0.001837"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.870981" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:21.870750" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:21.871609" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:21.871215" elapsed="0.000435"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:21.877053" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:21.877178" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:21.877265" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:21.871939" elapsed="0.005680">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:21.871710" elapsed="0.005985">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:21.877879" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:21.877725" elapsed="0.000212"/>
</branch>
<status status="FAIL" start="2026-10-11T01:03:21.871693" elapsed="0.006280">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:21.878310" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:21.878447" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:21.878396" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:21.878380" 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-10-11T01:03:21.878646" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:03:21.878707" elapsed="0.000013"/>
</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-10-11T01:03:21.870040" elapsed="0.008760">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:21.878865" elapsed="0.000014"/>
</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-10-11T01:03:21.826497" elapsed="0.052462">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:21.879204" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:21.879042" elapsed="0.000255"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:21.879027" elapsed="0.000292"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:21.879350" elapsed="0.000013"/>
</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-10-11T01:03:21.825857" elapsed="0.053595">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:23.916294" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:23.915535" elapsed="0.000823"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:23.918052" 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-10-11T01:03:23.917629" elapsed="0.000562">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-10-11T01:03:23.918381" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:23.916838" elapsed="0.001627"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:23.919613" 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-10-11T01:03:23.918861" elapsed="0.000810"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:23.920316" 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-10-11T01:03:23.920615" 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-10-11T01:03:23.920068" elapsed="0.000601"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:23.921695" 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-10-11T01:03:23.921173" elapsed="0.000617"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:23.923869" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:23.923327" elapsed="0.000658"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:23.924981" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:23.924378" elapsed="0.000659"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:23.926813" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:23.925771" elapsed="0.001097"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:23.929602" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:23.928275" elapsed="0.001524"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:23.930002" elapsed="0.000071"/>
</return>
<msg time="2026-10-11T01:03:23.930525" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:23.927272" elapsed="0.003308"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:23.930971" elapsed="0.000754"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:03:23.925475" elapsed="0.006334"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:23.933377" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:23.932347" elapsed="0.001208"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:23.936178" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:23.934999" elapsed="0.001500"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:23.936683" elapsed="0.000067"/>
</return>
<msg time="2026-10-11T01:03:23.937187" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:23.933964" elapsed="0.003277"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:23.937649" elapsed="0.000596"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:23.932053" elapsed="0.006246"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:23.925133" elapsed="0.013210"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:23.938397" elapsed="0.000078"/>
</return>
<msg time="2026-10-11T01:03:23.938634" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:23.922549" elapsed="0.016118"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:23.921929" elapsed="0.016779"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:23.938964" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:23.938739" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:23.921887" elapsed="0.017175"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:23.940036" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-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-10-11T01:03:23.939284" elapsed="0.000790"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:23.940135" 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/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-10-11T01:03:23.914317" elapsed="0.025957"/>
</kw>
<msg time="2026-10-11T01:03:23.940340" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:23.902009" elapsed="0.038393"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:23.946486" 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-10-11T01:03:23.952278" 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/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-10-11T01:03:23.957992" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:23.958247" 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-10-11T01:03:23.958521" 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-10-11T01:03:23.959004" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:23.958787" elapsed="0.000329"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:23.958768" elapsed="0.000382"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:23.959373" 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-10-11T01:03:23.959650" 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-10-11T01:03:23.959879" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:23.958734" elapsed="0.001223"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:23.958613" elapsed="0.001378"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:23.960208" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:23.960300" elapsed="0.000020"/>
</return>
<msg time="2026-10-11T01:03:23.960473" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-i...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:03:23.900605" elapsed="0.059904"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:23.962064" 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-10-11T01:03:23.961790" elapsed="0.000357">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-10-11T01:03:23.962263" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:23.961311" elapsed="0.000984"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:23.962712" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:23.962382" elapsed="0.000402"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:23.963458" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:23.963072" elapsed="0.000422"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:23.962815" elapsed="0.000724"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:23.962358" elapsed="0.001208"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:23.964314" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:23.963790" elapsed="0.000547"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:23.964381" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T01:03:23.964520" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:23.960876" elapsed="0.003666"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:23.965621" 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-10-11T01:03:23.965436" elapsed="0.000243">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-10-11T01:03:23.965762" 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-10-11T01:03:23.965100" elapsed="0.000685"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:03:23.965954" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T01:03:23.965847" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:23.965830" elapsed="0.000202"/>
</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-10-11T01:03:23.966187" elapsed="0.000019"/>
</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-10-11T01:03:23.966361" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:03:23.966434" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:03:23.966559" 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-10-11T01:03:23.964789" elapsed="0.001825"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:23.967838" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:23.967615" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:23.968300" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:23.968083" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:23.974331" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:23.974479" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:23.974576" 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-10-11T01:03:23.968641" elapsed="0.005959"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:23.968399" elapsed="0.006240"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:23.974819" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:23.974663" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:23.968383" elapsed="0.006513"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:23.976186" 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-10-11T01:03:23.975836" elapsed="0.000396"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:23.975581" elapsed="0.000682"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:23.975564" elapsed="0.000722"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:23.976862" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:23.976595" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:23.976336" elapsed="0.000599"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:23.976321" elapsed="0.000653"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:23.977513" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:23.977155" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:23.977818" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:23.977604" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:23.978333" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:23.978071" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:23.977892" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:23.977586" elapsed="0.000839"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:23.978934" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:23.978602" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:23.979243" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:23.979035" elapsed="0.000259"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:23.979753" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:23.979493" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:23.979316" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:23.979019" elapsed="0.000810"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:23.979981" elapsed="0.000290"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:23.980707" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:23.980480" elapsed="0.000251"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:23.980885" elapsed="0.000226"/>
</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-10-11T01:03:23.975228" elapsed="0.005938"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:23.981308" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:23.981227" elapsed="0.000121"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:23.981211" elapsed="0.000156"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:23.982136" 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-10-11T01:03:23.981525" elapsed="0.000638"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:23.982210" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:23.982334" 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-10-11T01:03:23.966894" elapsed="0.015464"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:23.982430" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:03:23.982558" 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-10-11T01:03:23.884307" elapsed="0.098275"/>
</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-10-11T01:03:23.993168" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:23.992846" elapsed="0.000348"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:23.993914" 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-10-11T01:03:23.993696" elapsed="0.000349">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-10-11T01:03:23.994205" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:23.993354" elapsed="0.000874"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:23.994733" 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-10-11T01:03:23.994422" elapsed="0.000336"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:23.995078" 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-10-11T01:03:23.995200" 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-10-11T01:03:23.994926" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:23.995653" 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-10-11T01:03:23.995434" 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-10-11T01:03:23.996104" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:23.995789" elapsed="0.000370"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:23.996799" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:23.996331" elapsed="0.000494"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:23.996182" elapsed="0.000675"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:23.995772" elapsed="0.001105"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:23.997466" 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-10-11T01:03:23.997056" elapsed="0.000437"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:23.997537" 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/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-10-11T01:03:23.992323" elapsed="0.005315"/>
</kw>
<msg time="2026-10-11T01:03:23.997687" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:23.987957" elapsed="0.009775"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:24.001847" 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/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-10-11T01:03:24.005935" 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/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-10-11T01:03:24.010163" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.010348" 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-10-11T01:03:24.010547" 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-10-11T01:03:24.010894" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:24.010744" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:24.010730" 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-10-11T01:03:24.011138" 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-10-11T01:03:24.011320" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.011499" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:24.010705" elapsed="0.000842"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:24.010615" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.011757" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:24.011824" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:03:24.011959" 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-10-11T01:03:23.987233" elapsed="0.024752"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:24.012154" elapsed="0.000332"/>
</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-10-11T01:03:24.013508" 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-10-11T01:03:24.013133" elapsed="0.000402"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:24.014049" 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-10-11T01:03:24.013684" elapsed="0.000392"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:03:24.014259" elapsed="0.000295"/>
</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-10-11T01:03:24.012757" elapsed="0.001852"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:24.012556" 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-10-11T01:03:24.014836" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:24.014661" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.012539" elapsed="0.002371"/>
</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-10-11T01:03:23.983533" elapsed="0.031434"/>
</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-10-11T01:03:23.982856" elapsed="0.032177"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:23.982654" elapsed="0.032418"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:23.982639" elapsed="0.032454"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:24.015122" 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="PASS" start="2026-10-11T01:03:23.882820" elapsed="0.132402"/>
</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-10-11T01:03:21.824135" elapsed="2.191137"/>
</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-10-11T01:03:24.031012" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:24.030696" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:24.031707" 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-10-11T01:03:24.031530" elapsed="0.000237">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-10-11T01:03:24.031889" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:24.031197" elapsed="0.000716"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.032427" 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-10-11T01:03:24.032102" elapsed="0.000352"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:24.032731" 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-10-11T01:03:24.032855" 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-10-11T01:03:24.032623" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.033309" 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-10-11T01:03:24.033091" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.034268" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:24.034039" elapsed="0.000271"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.034752" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:24.034502" elapsed="0.000274"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.035549" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:24.035099" elapsed="0.000475"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:24.036697" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:24.036185" elapsed="0.000600"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:24.036863" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:03:24.037092" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:24.035745" 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-10-11T01:03:24.037281" elapsed="0.000324"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/effective-rib-in</var>
<status status="PASS" start="2026-10-11T01:03:24.034966" elapsed="0.002677"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.038358" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:24.037874" elapsed="0.000508"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:24.039539" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:24.039017" elapsed="0.000609"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:24.039705" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:03:24.039913" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:24.038579" 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-10-11T01:03:24.040114" elapsed="0.000371"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:24.037742" elapsed="0.002781"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:24.034817" elapsed="0.005736"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:24.040591" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:24.040721" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:24.033684" elapsed="0.007060"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:24.033431" elapsed="0.007341"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.040964" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:24.040794" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.033395" elapsed="0.007640"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.041763" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-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-10-11T01:03:24.041196" elapsed="0.000594"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:24.041833" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:24.030177" elapsed="0.011800"/>
</kw>
<msg time="2026-10-11T01:03:24.042026" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:24.025747" elapsed="0.016323"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:24.046389" 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/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-10-11T01:03:24.050523" 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/rib.vanadium/${file_name} exists. 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-10-11T01:03:24.054631" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.054814" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.055008" 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-10-11T01:03:24.055347" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:24.055200" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:24.055186" 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-10-11T01:03:24.055592" 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-10-11T01:03:24.055772" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.055940" elapsed="0.000031"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:24.055161" elapsed="0.000840"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:24.055073" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.056177" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:24.056242" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:24.056351" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-ro...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:03:24.025140" elapsed="0.031236"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:24.057531" 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-10-11T01:03:24.057328" elapsed="0.000262">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-10-11T01:03:24.057673" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:24.057000" elapsed="0.000695"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.057993" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:24.057758" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.058513" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:24.058235" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:24.058069" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.057740" elapsed="0.000849"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.059100" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:24.058753" elapsed="0.000370"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:24.059168" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:24.059292" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:24.056684" elapsed="0.002630"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:24.060390" 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-10-11T01:03:24.060208" elapsed="0.000256">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-10-11T01:03:24.060556" 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-10-11T01:03:24.059875" elapsed="0.000703"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:03:24.060738" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:03:24.060641" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.060624" elapsed="0.000189"/>
</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-10-11T01:03:24.060982" elapsed="0.000020"/>
</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-10-11T01:03:24.061157" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:03:24.061215" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:03:24.061338" 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-10-11T01:03:24.059576" elapsed="0.001785"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.062605" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:24.062365" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.063075" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:24.062838" elapsed="0.000277"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:24.067841" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:24.067965" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:24.068054" 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-10-11T01:03:24.063400" elapsed="0.004706"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:24.063174" elapsed="0.004972"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.068326" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:24.068170" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.063157" elapsed="0.005263"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.069691" 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-10-11T01:03:24.069340" elapsed="0.000396"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:24.069100" elapsed="0.000668"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.069083" elapsed="0.000708"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.070368" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:24.070097" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:24.069841" elapsed="0.000615"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.069826" elapsed="0.000653"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.071017" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:24.070658" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.071316" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:24.071106" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.071834" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:24.071570" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:24.071391" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.071089" elapsed="0.000822"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.072460" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:24.072106" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.072760" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:24.072549" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.073269" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:24.073008" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:24.072833" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.072532" elapsed="0.000813"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:24.073505" elapsed="0.000291"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:24.074191" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:24.073970" elapsed="0.000245"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:24.074368" elapsed="0.000225"/>
</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-10-11T01:03:24.068748" elapsed="0.005901"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:24.074793" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:24.074711" elapsed="0.000122"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.074694" elapsed="0.000159"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:24.075601" 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-10-11T01:03:24.075015" elapsed="0.000613"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:24.075673" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:24.075797" 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-10-11T01:03:24.061654" elapsed="0.014167"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:24.075907" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:24.076044" 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-10-11T01:03:24.017840" elapsed="0.058228"/>
</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-10-11T01:03:24.086653" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:24.086336" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:24.087392" 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-10-11T01:03:24.087177" elapsed="0.000352">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-10-11T01:03:24.087689" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:24.086840" elapsed="0.000872"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.088206" 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-10-11T01:03:24.087888" elapsed="0.000343"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:24.088530" 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-10-11T01:03:24.088645" 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-10-11T01:03:24.088396" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.089127" 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-10-11T01:03:24.088862" 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-10-11T01:03:24.089541" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:24.089231" elapsed="0.000365"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.090224" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:24.089766" elapsed="0.000484"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:24.089618" elapsed="0.000664"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.089213" elapsed="0.001088"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.090870" 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-10-11T01:03:24.090481" elapsed="0.000415"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:24.090939" 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/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-10-11T01:03:24.085824" elapsed="0.005230"/>
</kw>
<msg time="2026-10-11T01:03:24.091103" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:24.081460" elapsed="0.009686"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:24.095306" 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/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-10-11T01:03:24.099378" 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/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-10-11T01:03:24.103600" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.103784" 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-10-11T01:03:24.103976" 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-10-11T01:03:24.104313" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:24.104168" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:24.104155" 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-10-11T01:03:24.104554" 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-10-11T01:03:24.104734" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.104897" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:24.104130" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:24.104043" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.105129" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:24.105194" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:24.105312" 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-10-11T01:03:24.080729" elapsed="0.024608"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:24.105520" elapsed="0.000313"/>
</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-10-11T01:03:24.106852" 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-10-11T01:03:24.106490" elapsed="0.000389"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:24.107445" 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-10-11T01:03:24.107076" elapsed="0.000396"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:03:24.107656" elapsed="0.000274"/>
</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-10-11T01:03:24.106114" elapsed="0.001885"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:24.105903" elapsed="0.002126"/>
</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-10-11T01:03:24.108228" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:24.108052" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.105886" elapsed="0.002411"/>
</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-10-11T01:03:24.077035" elapsed="0.031304"/>
</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-10-11T01:03:24.076344" elapsed="0.032072"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:24.076142" elapsed="0.032317"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.076125" elapsed="0.032355"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:24.108511" elapsed="0.000027"/>
</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-10-11T01:03:24.017140" elapsed="0.091471"/>
</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-10-11T01:03:24.015476" elapsed="0.093186"/>
</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-10-11T01:03:24.124165" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:24.123851" elapsed="0.000340"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:24.124857" 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-10-11T01:03:24.124681" elapsed="0.000246">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-10-11T01:03:24.125024" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:24.124348" elapsed="0.000698"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.125543" 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-10-11T01:03:24.125220" elapsed="0.000348"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:24.125842" 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-10-11T01:03:24.125975" 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-10-11T01:03:24.125734" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.126426" 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-10-11T01:03:24.126196" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.127370" 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-10-11T01:03:24.127142" elapsed="0.000285"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.127850" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:24.127604" elapsed="0.000270"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.128701" 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-10-11T01:03:24.128242" elapsed="0.000483"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:24.129849" 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-10-11T01:03:24.129332" elapsed="0.000605"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:24.130033" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:03:24.130246" 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-10-11T01:03:24.128896" 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-10-11T01:03:24.130455" elapsed="0.000302"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:03:24.128111" elapsed="0.002684"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.131492" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:24.131035" elapsed="0.000482"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:24.132648" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:24.132129" elapsed="0.000607"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:24.132815" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:03:24.133040" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:24.131686" 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-10-11T01:03:24.133316" elapsed="0.000350"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:24.130894" elapsed="0.002811"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:24.127969" elapsed="0.005767"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:24.133774" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:03:24.133901" 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-10-11T01:03:24.126790" elapsed="0.007135"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:24.126540" elapsed="0.007425"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.134138" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:24.133988" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.126522" elapsed="0.007685"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.134900" 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-10-11T01:03:24.134366" elapsed="0.000561"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:24.134982" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:24.123335" elapsed="0.011748"/>
</kw>
<msg time="2026-10-11T01:03:24.135131" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:24.118907" elapsed="0.016268"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:24.139490" 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/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-10-11T01:03:24.143630" 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/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-10-11T01:03:24.147721" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.147903" 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-10-11T01:03:24.148099" 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-10-11T01:03:24.148450" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:24.148290" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:24.148276" 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-10-11T01:03:24.148680" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.148858" elapsed="0.000017"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.149030" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:24.148251" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:24.148164" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.149251" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:24.149316" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:03:24.149436" 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-10-11T01:03:24.118302" elapsed="0.031160"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:24.150560" 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-10-11T01:03:24.150359" elapsed="0.000259">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-10-11T01:03:24.150701" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:24.150037" elapsed="0.000686"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.151017" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:24.150786" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.151529" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:24.151254" elapsed="0.000299"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:24.151091" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.150769" elapsed="0.000836"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.152111" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:24.151765" elapsed="0.000369"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:24.152178" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:24.152300" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:24.149723" elapsed="0.002599"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:24.153396" 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-10-11T01:03:24.153213" elapsed="0.000288">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-10-11T01:03:24.153586" 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-10-11T01:03:24.152880" elapsed="0.000728"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:03:24.153768" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:03:24.153671" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.153654" elapsed="0.000189"/>
</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-10-11T01:03:24.154013" elapsed="0.000020"/>
</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-10-11T01:03:24.154209" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:03:24.154268" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:03:24.154391" 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-10-11T01:03:24.152583" elapsed="0.001846"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.155652" 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-10-11T01:03:24.155428" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.156140" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:24.155885" 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-10-11T01:03:24.161673" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:24.161780" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:03:24.161877" 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-10-11T01:03:24.156479" elapsed="0.005423"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:24.156239" elapsed="0.005702"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.162134" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:24.161981" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.156222" elapsed="0.005989"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.163498" 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-10-11T01:03:24.163150" elapsed="0.000393"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:24.162895" elapsed="0.000680"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.162877" elapsed="0.000721"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.164177" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:24.163893" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:24.163648" elapsed="0.000600"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.163633" elapsed="0.000637"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.164805" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:24.164462" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.165116" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:24.164892" elapsed="0.000277"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.165634" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:24.165354" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:24.165191" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.164875" elapsed="0.000867"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.166272" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:24.165924" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.166586" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:24.166359" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.167094" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:24.166821" elapsed="0.000297"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:24.166659" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.166343" elapsed="0.000827"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:24.167314" elapsed="0.000309"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:24.168013" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:24.167782" elapsed="0.000255"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:24.168191" elapsed="0.000208"/>
</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-10-11T01:03:24.162558" elapsed="0.005918"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:24.168627" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:24.168545" elapsed="0.000122"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.168521" elapsed="0.000165"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:24.169401" 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-10-11T01:03:24.168827" elapsed="0.000617"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:24.169490" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:24.169618" 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-10-11T01:03:24.154709" elapsed="0.014933"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:24.169695" elapsed="0.000023"/>
</return>
<msg time="2026-10-11T01:03:24.169812" 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-10-11T01:03:24.111128" elapsed="0.058708"/>
</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-10-11T01:03:24.180444" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:24.180125" elapsed="0.000346"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:24.181180" 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-10-11T01:03:24.180961" elapsed="0.000335">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-10-11T01:03:24.181475" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:24.180629" elapsed="0.000870"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.181999" 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-10-11T01:03:24.181677" elapsed="0.000347"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:24.182334" 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-10-11T01:03:24.182465" 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-10-11T01:03:24.182223" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.182904" 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-10-11T01:03:24.182685" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:24.183323" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:24.183030" elapsed="0.000348"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.184021" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:24.183568" elapsed="0.000477"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:24.183400" elapsed="0.000677"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.183012" elapsed="0.001085"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.184677" 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-10-11T01:03:24.184260" elapsed="0.000444"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:24.184748" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:24.179607" elapsed="0.005240"/>
</kw>
<msg time="2026-10-11T01:03:24.184902" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:24.175213" elapsed="0.009744"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:24.189089" 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/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-10-11T01:03:24.193214" 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/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-10-11T01:03:24.197505" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.197690" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.197873" 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-10-11T01:03:24.198266" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:24.198119" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:24.198105" 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-10-11T01:03:24.198512" 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-10-11T01:03:24.198698" 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-10-11T01:03:24.198864" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:24.198080" elapsed="0.000832"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:24.197988" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.199102" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:24.199169" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:24.199288" 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-10-11T01:03:24.174497" elapsed="0.024816"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:24.199495" elapsed="0.000314"/>
</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-10-11T01:03:24.200837" 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-10-11T01:03:24.200472" elapsed="0.000391"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:24.201382" 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-10-11T01:03:24.201034" elapsed="0.000392"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:03:24.201613" elapsed="0.000275"/>
</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-10-11T01:03:24.200094" elapsed="0.001848"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:24.199878" elapsed="0.002107"/>
</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-10-11T01:03:24.202183" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:24.202008" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.199862" elapsed="0.002390"/>
</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-10-11T01:03:24.170785" elapsed="0.031509"/>
</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-10-11T01:03:24.170123" elapsed="0.032235"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:24.169907" elapsed="0.032491"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.169891" elapsed="0.032544"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:24.202465" elapsed="0.000026"/>
</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-10-11T01:03:24.110514" elapsed="0.092051"/>
</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-10-11T01:03:24.108849" elapsed="0.093766"/>
</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-10-11T01:03:24.202802" elapsed="0.002721"/>
</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-10-11T01:03:24.221148" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:24.220824" elapsed="0.000351"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:24.221841" 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-10-11T01:03:24.221669" elapsed="0.000232">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-10-11T01:03:24.222004" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:24.221333" elapsed="0.000694"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.222524" 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-10-11T01:03:24.222201" elapsed="0.000349"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:24.222824" 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-10-11T01:03:24.222953" 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-10-11T01:03:24.222715" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.223389" 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-10-11T01:03:24.223173" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.224337" 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-10-11T01:03:24.224108" elapsed="0.000270"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.224815" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:24.224568" elapsed="0.000271"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.225612" 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-10-11T01:03:24.225162" elapsed="0.000475"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:24.226761" 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-10-11T01:03:24.226246" elapsed="0.000600"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:24.226927" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T01:03:24.227151" 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-10-11T01:03:24.225807" elapsed="0.001368"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:24.227340" elapsed="0.000325"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:03:24.225031" elapsed="0.002673"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.228374" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:24.227933" elapsed="0.000465"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:24.229549" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:24.229037" elapsed="0.000599"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:24.229714" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:03:24.229923" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:24.228597" 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-10-11T01:03:24.230124" elapsed="0.000399"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:24.227803" elapsed="0.002759"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:24.224881" elapsed="0.005713"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:24.230667" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:24.230799" 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-10-11T01:03:24.223758" elapsed="0.007064"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:24.223509" elapsed="0.007343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.231033" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:24.230873" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.223492" elapsed="0.007612"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.231770" 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-10-11T01:03:24.231261" elapsed="0.000535"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:24.231839" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:24.220305" elapsed="0.011634"/>
</kw>
<msg time="2026-10-11T01:03:24.232002" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:24.215858" elapsed="0.016188"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:24.236336" 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/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-10-11T01:03:24.240505" 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/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-10-11T01:03:24.244586" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.244767" 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-10-11T01:03:24.244964" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.245305" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:24.245160" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:24.245147" 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-10-11T01:03:24.245551" 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-10-11T01:03:24.245733" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.245898" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:24.245121" elapsed="0.000836"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:24.245032" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.246132" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:24.246236" elapsed="0.000017"/>
</return>
<msg time="2026-10-11T01:03:24.246346" 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-10-11T01:03:24.215254" elapsed="0.031117"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:24.247506" 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-10-11T01:03:24.247299" elapsed="0.000267">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-10-11T01:03:24.247649" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:24.246973" elapsed="0.000699"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.247967" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:24.247735" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.248485" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:24.248207" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:24.248042" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.247718" elapsed="0.000853"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.249081" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:24.248733" elapsed="0.000372"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:24.249150" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:24.249273" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:24.246660" elapsed="0.002635"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:24.250337" 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-10-11T01:03:24.250190" elapsed="0.000196"/>
</kw>
<msg time="2026-10-11T01:03:24.250477" 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-10-11T01:03:24.249857" elapsed="0.000648"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:03:24.250667" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:24.250570" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.250553" elapsed="0.000174"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:24.251014" 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-10-11T01:03:24.251136" 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-10-11T01:03:24.250878" elapsed="0.000281"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:03:24.251529" 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-10-11T01:03:24.251319" elapsed="0.000234"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:03:24.251595" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:24.251719" 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-10-11T01:03:24.249558" elapsed="0.002183"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.252965" 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-10-11T01:03:24.252734" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.253474" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:24.253202" elapsed="0.000322"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:24.258449" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:24.258561" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:03:24.258650" 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-10-11T01:03:24.253813" elapsed="0.004861"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:24.253585" elapsed="0.005128"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.258889" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:24.258736" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.253568" elapsed="0.005423"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.260246" 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-10-11T01:03:24.259896" elapsed="0.000396"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:24.259655" elapsed="0.000668"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.259638" elapsed="0.000708"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.260929" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:24.260660" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:24.260395" elapsed="0.000621"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.260380" elapsed="0.000658"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.261578" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:24.261212" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.261875" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:24.261665" elapsed="0.000261"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.262383" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:24.262122" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:24.261959" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.261649" elapsed="0.000828"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.262996" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:24.262652" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.263291" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:24.263083" elapsed="0.000259"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.263801" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:24.263541" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:24.263363" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.263066" elapsed="0.000812"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:24.264032" elapsed="0.000287"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:24.264713" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:24.264494" elapsed="0.000243"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:24.264889" elapsed="0.000219"/>
</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-10-11T01:03:24.259303" elapsed="0.005893"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:24.265341" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:24.265259" elapsed="0.000122"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.265242" elapsed="0.000158"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:24.266186" 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-10-11T01:03:24.265560" elapsed="0.000653"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:24.266259" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:24.266385" 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-10-11T01:03:24.252031" elapsed="0.014392"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:24.266481" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:03:24.266601" 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-10-11T01:03:24.208035" elapsed="0.058590"/>
</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-10-11T01:03:24.277222" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:24.276908" elapsed="0.000340"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:24.277963" 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-10-11T01:03:24.277734" elapsed="0.000348">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-10-11T01:03:24.278243" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:24.277419" elapsed="0.000846"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.278777" 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-10-11T01:03:24.278469" elapsed="0.000333"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:24.279088" 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-10-11T01:03:24.279202" 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-10-11T01:03:24.278979" elapsed="0.000247"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.279654" 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-10-11T01:03:24.279437" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:24.280065" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:24.279754" elapsed="0.000366"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.280754" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:24.280288" elapsed="0.000491"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:24.280142" elapsed="0.000669"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:24.279737" elapsed="0.001094"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.281384" 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-10-11T01:03:24.281003" elapsed="0.000462"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:24.281521" 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-10-11T01:03:24.276394" elapsed="0.005231"/>
</kw>
<msg time="2026-10-11T01:03:24.281672" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:24.272002" elapsed="0.009714"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:24.285855" 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/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-10-11T01:03:24.289974" 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/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-10-11T01:03:24.294190" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.294372" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.294569" 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-10-11T01:03:24.294909" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:24.294764" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:24.294750" 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-10-11T01:03:24.295147" 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-10-11T01:03:24.295326" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.295504" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:24.294725" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:24.294635" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:24.295726" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:24.295792" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:03:24.295896" 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-10-11T01:03:24.271274" elapsed="0.024647"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:24.296131" elapsed="0.000333"/>
</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-10-11T01:03:24.297390" 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-10-11T01:03:24.297153" elapsed="0.000279"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:24.298098" 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-10-11T01:03:24.297581" elapsed="0.000544"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:03:24.298597" 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-10-11T01:03:24.298764" 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-10-11T01:03:24.298308" elapsed="0.000518">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-10-11T01:03:24.296736" elapsed="0.002237">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-10-11T01:03:24.296535" elapsed="0.002508">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-10-11T01:03:24.299253" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:24.299075" elapsed="0.000228"/>
</branch>
<status status="FAIL" start="2026-10-11T01:03:24.296518" elapsed="0.002806">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-10-11T01:03:24.267578" elapsed="0.031870">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-10-11T01:03:24.266899" elapsed="0.032714">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-10-11T01:03:24.266697" elapsed="0.032995">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-10-11T01:03:24.266682" elapsed="0.033041">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-10-11T01:03:24.299766" 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-10-11T01:03:24.207390" elapsed="0.092483">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-10-11T01:03:26.335222" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:26.334498" elapsed="0.000789"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:26.336887" 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-10-11T01:03:26.336462" elapsed="0.000592">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-10-11T01:03:26.337246" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:26.335687" elapsed="0.001610"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.338480" 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-10-11T01:03:26.337721" elapsed="0.000818"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:26.339183" 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-10-11T01:03:26.339497" 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-10-11T01:03:26.338914" elapsed="0.000639"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.340534" 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-10-11T01:03:26.340010" elapsed="0.000618"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.342731" 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-10-11T01:03:26.342180" elapsed="0.000646"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.344016" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:26.343376" elapsed="0.000696"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.345599" 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-10-11T01:03:26.344813" elapsed="0.000821"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:26.347251" 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-10-11T01:03:26.346514" elapsed="0.000861"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:26.347522" elapsed="0.000047"/>
</return>
<msg time="2026-10-11T01:03:26.347828" 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-10-11T01:03:26.345874" elapsed="0.001987"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:26.348112" elapsed="0.000473"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:03:26.344515" elapsed="0.004124"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.349626" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:26.348980" elapsed="0.000681"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:26.351313" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:26.350597" elapsed="0.000891"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:26.351600" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T01:03:26.351889" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:26.349899" elapsed="0.002023"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:26.352178" elapsed="0.000449"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:26.348781" elapsed="0.003900"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:26.344173" elapsed="0.008553"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:26.352780" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T01:03:26.353175" 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-10-11T01:03:26.341362" elapsed="0.011846"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:26.340772" elapsed="0.012476"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:26.353529" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:26.353280" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:26.340730" elapsed="0.012898"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.354601" 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-10-11T01:03:26.353849" elapsed="0.000789"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:26.354700" 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-10-11T01:03:26.333217" elapsed="0.021621"/>
</kw>
<msg time="2026-10-11T01:03:26.354906" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:26.323305" elapsed="0.031680"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:26.360756" 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/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-10-11T01:03:26.366581" 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/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-10-11T01:03:26.372400" elapsed="0.000049"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:26.372671" 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-10-11T01:03:26.372922" 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-10-11T01:03:26.373434" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:26.373211" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:26.373192" elapsed="0.000344"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:26.373756" 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-10-11T01:03:26.374021" 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-10-11T01:03:26.374250" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:26.373156" elapsed="0.001161"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:26.373034" elapsed="0.001315"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:26.374578" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:26.374670" elapsed="0.000021"/>
</return>
<msg time="2026-10-11T01:03:26.374819" 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-10-11T01:03:26.321879" elapsed="0.052973"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:26.376461" 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-10-11T01:03:26.376179" elapsed="0.000366">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-10-11T01:03:26.376660" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:26.375704" 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-10-11T01:03:26.377106" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:26.376779" elapsed="0.000400"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.377847" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:26.377478" elapsed="0.000403"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:26.377210" elapsed="0.000716"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:26.376755" elapsed="0.001268"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.378745" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:26.378253" elapsed="0.000525"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:26.378841" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T01:03:26.379032" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:26.375239" elapsed="0.003825"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:26.380528" 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-10-11T01:03:26.380310" elapsed="0.000329"/>
</kw>
<msg time="2026-10-11T01:03:26.380746" 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-10-11T01:03:26.379847" elapsed="0.000929"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:03:26.381020" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:26.380864" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:26.380840" elapsed="0.000265"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:26.381517" 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-10-11T01:03:26.381678" 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-10-11T01:03:26.381316" elapsed="0.000395"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:03:26.382233" 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-10-11T01:03:26.381971" elapsed="0.000295"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:03:26.382325" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T01:03:26.382519" 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-10-11T01:03:26.379430" elapsed="0.003121"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.384329" 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-10-11T01:03:26.384017" elapsed="0.000372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.385204" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:26.384674" elapsed="0.000587"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:26.391516" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:26.391709" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:03:26.391829" 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-10-11T01:03:26.385687" elapsed="0.006176"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:26.385347" elapsed="0.006570"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:26.392180" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:26.391966" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:26.385323" elapsed="0.006964"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.394131" 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-10-11T01:03:26.393658" elapsed="0.000534"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:26.393295" elapsed="0.000940"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:26.393262" elapsed="0.001004"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.395079" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:26.394689" elapsed="0.000448"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:26.394335" elapsed="0.000846"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:26.394315" elapsed="0.000896"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.395971" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:26.395476" elapsed="0.000532"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:26.396390" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:26.396095" elapsed="0.000388"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.397119" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:26.396739" elapsed="0.000413"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:26.396513" elapsed="0.000684"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:26.396071" elapsed="0.001193"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.398017" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:26.397531" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:26.398455" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:26.398138" elapsed="0.000391"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.399186" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:26.398798" elapsed="0.000422"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:26.398566" elapsed="0.000701"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:26.398116" elapsed="0.001179"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:26.399517" elapsed="0.000408"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:26.400509" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:26.400173" elapsed="0.000371"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:26.400758" elapsed="0.000313"/>
</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-10-11T01:03:26.392757" elapsed="0.008394"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:26.401350" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:26.401237" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:26.401214" elapsed="0.000242"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:26.402295" 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-10-11T01:03:26.401653" elapsed="0.000681"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:26.402397" elapsed="0.000059"/>
</return>
<msg time="2026-10-11T01:03:26.402599" 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-10-11T01:03:26.382964" elapsed="0.019670"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:26.402710" elapsed="0.000033"/>
</return>
<msg time="2026-10-11T01:03:26.402879" 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-10-11T01:03:26.305163" elapsed="0.097749"/>
</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-10-11T01:03:26.415508" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:26.415190" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:26.416248" 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-10-11T01:03:26.416025" elapsed="0.000344">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-10-11T01:03:26.416555" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:26.415694" elapsed="0.000884"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.417079" 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-10-11T01:03:26.416754" elapsed="0.000350"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:26.417429" 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-10-11T01:03:26.417549" 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-10-11T01:03:26.417304" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.418000" 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-10-11T01:03:26.417768" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:26.418397" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:26.418104" elapsed="0.000367"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.419108" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:26.418642" elapsed="0.000491"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:26.418493" elapsed="0.000672"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:26.418086" elapsed="0.001099"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.419749" 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-10-11T01:03:26.419346" elapsed="0.000429"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:26.419819" 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/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-10-11T01:03:26.414671" elapsed="0.005248"/>
</kw>
<msg time="2026-10-11T01:03:26.419985" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:26.410230" elapsed="0.009804"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:26.424113" 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/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-10-11T01:03:26.428211" 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/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-10-11T01:03:26.433483" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:26.433699" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:26.433897" 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-10-11T01:03:26.434259" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:26.434114" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:26.434101" 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-10-11T01:03:26.434537" 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-10-11T01:03:26.434719" 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-10-11T01:03:26.434886" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:26.434074" elapsed="0.000860"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:26.433978" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:26.435124" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:26.435190" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:26.435295" 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-10-11T01:03:26.409508" elapsed="0.025813"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:26.435501" elapsed="0.000316"/>
</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-10-11T01:03:26.436723" 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-10-11T01:03:26.436482" elapsed="0.000268"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:26.437143" 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-10-11T01:03:26.436901" elapsed="0.000268"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:03:26.437350" elapsed="0.000293"/>
</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-10-11T01:03:26.436099" elapsed="0.001599"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:26.435886" elapsed="0.001842"/>
</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-10-11T01:03:26.437926" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:26.437750" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:26.435870" elapsed="0.002140"/>
</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-10-11T01:03:26.404274" elapsed="0.033784"/>
</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-10-11T01:03:26.403322" elapsed="0.034801"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:26.403035" elapsed="0.035129"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:26.403013" elapsed="0.035172"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:26.438215" elapsed="0.000026"/>
</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-10-11T01:03:26.303556" elapsed="0.134757"/>
</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-10-11T01:03:24.205714" elapsed="2.232650"/>
</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-10-11T01:03:26.438574" elapsed="0.002775"/>
</kw>
<arg>inter_as_ipmsi_ad</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-10-11T01:03:21.816165" elapsed="4.625237"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:21.718816" elapsed="4.722713"/>
</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-10-11T01:03:26.443364" elapsed="0.000328"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:03:26.442935" elapsed="0.000941"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:26.444832" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:26.444744" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:26.444726" elapsed="0.000170"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:26.447022" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:26.446922" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:26.446905" elapsed="0.000181"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.448011" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:26.447671" elapsed="0.000365"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.448568" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:03:26.448189" elapsed="0.000404"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:03:26.448633" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:03:26.448762" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:03:26.447295" 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-10-11T01:03:26.451281" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:26.451196" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:26.451178" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:26.452392" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:26.452310" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:26.452293" elapsed="0.000182"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:26.452795" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:03:26.452626" elapsed="0.000193"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:03:26.453137" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:26.452995" elapsed="0.000165"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:03:26.494432" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:03:26.453672" elapsed="0.040854"/>
</kw>
<msg time="2026-10-11T01:03:26.494677" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:03:26.494719" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:26.453316" elapsed="0.041439"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:03:26.529618" 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-10-11T01:03:26.495294" elapsed="0.034421"/>
</kw>
<msg time="2026-10-11T01:03:26.529861" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:03:26.529902" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:26.494954" elapsed="0.034982"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:26.530234" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:26.530019" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:26.530001" elapsed="0.000304"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.530732" 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-10-11T01:03:26.530506" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:26.531068" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:26.530856" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:26.530839" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:03:26.531201" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:26.533830" elapsed="0.000250"/>
</kw>
<msg time="2026-10-11T01:03:26.534140" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:26.532633" elapsed="0.001640"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:26.534619" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:26.535139" 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-10-11T01:03:26.532033" elapsed="0.003298"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:03:26.531505" elapsed="0.003890"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:03:26.452055" elapsed="0.083463"/>
</kw>
<msg time="2026-10-11T01:03:26.535612" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:26.535654" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:26.451512" elapsed="0.084178"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:03:26.535845" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:03:26.535759" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:26.535741" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:26.536259" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:26.536580" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:03:26.536644" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T01:03:26.450897" elapsed="0.085831"/>
</kw>
<msg time="2026-10-11T01:03:26.536809" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:26.536849" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:26.449129" elapsed="0.087755"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:26.537181" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:26.536963" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:26.536933" elapsed="0.000318"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:03:26.448986" elapsed="0.088286"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:03:26.448832" elapsed="0.088466"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:03:26.446628" elapsed="0.090716"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:03:26.444488" elapsed="0.092905"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:26.444061" elapsed="0.093450"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:03:26.442571" elapsed="0.094987"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:26.538318" 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-10-11T01:03:26.538496" 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-10-11T01:03:26.538171" elapsed="0.000350"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:03:26.538887" 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-10-11T01:03:26.538682" elapsed="0.000229"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:26.539227" 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-10-11T01:03:26.539343" 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-10-11T01:03:26.539091" elapsed="0.000276"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:03:26.539708" 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-10-11T01:03:26.539540" elapsed="0.000192"/>
</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-10-11T01:03:26.539993" elapsed="0.002295"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:26.539795" elapsed="0.002526"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:26.539779" elapsed="0.002566"/>
</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-10-11T01:03:26.553084" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:26.552762" elapsed="0.000349"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:26.553801" 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-10-11T01:03:26.553607" elapsed="0.000260">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-10-11T01:03:26.553965" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:26.553272" elapsed="0.000717"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.554488" 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-10-11T01:03:26.554165" elapsed="0.000349"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:26.554789" 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-10-11T01:03:26.554909" 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-10-11T01:03:26.554681" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.555366" 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-10-11T01:03:26.555147" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.556321" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:03:26.556089" elapsed="0.000273"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.556810" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:26.556554" elapsed="0.000281"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.557445" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:26.557162" elapsed="0.000308"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:26.558319" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:26.557960" elapsed="0.000384"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:26.558387" elapsed="0.000049"/>
</return>
<msg time="2026-10-11T01:03:26.558535" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:26.557640" 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-10-11T01:03:26.558723" elapsed="0.000173"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:03:26.557030" elapsed="0.001903"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.559499" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:26.559212" elapsed="0.000312"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:26.560379" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:26.560020" elapsed="0.000402"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:26.560469" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:26.560594" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:26.559691" elapsed="0.000926"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:26.560782" elapsed="0.000179"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:26.559081" elapsed="0.001918"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:26.556877" elapsed="0.004155"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:26.561069" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:03:26.561196" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:26.555735" elapsed="0.005484"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:26.555485" elapsed="0.005763"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:26.561443" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:26.561269" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:26.555467" elapsed="0.006054"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.562186" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:26.561680" elapsed="0.000533"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:26.562256" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:26.552240" elapsed="0.010114"/>
</kw>
<msg time="2026-10-11T01:03:26.562421" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:26.547720" elapsed="0.014747"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:26.566770" 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/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-10-11T01:03:26.570911" 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/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-10-11T01:03:26.575113" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:26.575295" 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-10-11T01:03:26.575493" 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-10-11T01:03:26.575868" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:26.575721" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:26.575707" 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-10-11T01:03:26.576115" 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-10-11T01:03:26.576296" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:26.576476" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:26.575681" elapsed="0.000844"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:26.575590" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:26.576699" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:26.576765" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:26.576872" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:26.547117" elapsed="0.029780"/>
</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-10-11T01:03:26.585923" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:26.585623" elapsed="0.000341"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:26.586626" 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-10-11T01:03:26.586455" elapsed="0.000230">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-10-11T01:03:26.586767" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:26.586123" elapsed="0.000666"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.587314" 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-10-11T01:03:26.587006" elapsed="0.000333"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:26.587636" 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-10-11T01:03:26.587757" 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-10-11T01:03:26.587522" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.588210" 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-10-11T01:03:26.587993" elapsed="0.000269"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:26.588587" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:26.588323" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.589092" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', '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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:26.588811" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:26.588663" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:26.588305" elapsed="0.000894"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.589761" 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-10-11T01:03:26.589363" elapsed="0.000425"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:26.589831" 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/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-10-11T01:03:26.585104" elapsed="0.004828"/>
</kw>
<msg time="2026-10-11T01:03:26.590000" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:26.580703" elapsed="0.009341"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:26.594309" 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/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-10-11T01:03:26.598480" 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/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-10-11T01:03:26.602613" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:26.602795" 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-10-11T01:03:26.602989" 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-10-11T01:03:26.603328" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:26.603181" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:26.603168" 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-10-11T01:03:26.603576" 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-10-11T01:03:26.603755" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:26.603919" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:26.603143" elapsed="0.000838"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:26.603054" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:26.604157" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:26.604222" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:03:26.604338" 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-10-11T01:03:26.580002" elapsed="0.024391"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:26.605546" 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-10-11T01:03:26.605338" elapsed="0.000268">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-10-11T01:03:26.605689" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:26.605012" elapsed="0.000700"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:26.606007" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:26.605775" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.606527" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:26.606248" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:26.606080" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:26.605758" elapsed="0.000845"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.607113" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:26.606764" elapsed="0.000373"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:26.607181" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:26.607304" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:26.604688" elapsed="0.002639"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.608658" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:26.608435" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.609119" 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-10-11T01:03:26.608892" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.609591" 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-10-11T01:03:26.609358" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.610047" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:26.609820" elapsed="0.000267"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:26.610800" 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-10-11T01:03:26.610640" elapsed="0.000184"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:03:26.611142" 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-10-11T01:03:26.610993" elapsed="0.000172"/>
</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-10-11T01:03:26.611326" elapsed="0.000168"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.611911" 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-10-11T01:03:26.611690" elapsed="0.000273"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:03:26.612001" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:26.612128" 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-10-11T01:03:26.610267" elapsed="0.001884"/>
</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-10-11T01:03:26.629790" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.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-10-11T01:03:26.629851" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:26.629961" 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-10-11T01:03:26.612493" elapsed="0.017493"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:26.612214" elapsed="0.017813"/>
</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-10-11T01:03:26.630206" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:26.630051" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:26.612198" elapsed="0.018087"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.631533" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:26.631244" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:26.631000" elapsed="0.000605"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:26.630982" elapsed="0.000645"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.632191" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:26.631912" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:26.631676" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:26.631661" elapsed="0.000624"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.632820" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:26.632475" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:26.633133" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:26.632907" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.633650" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:26.633371" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:26.633207" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:26.632891" elapsed="0.000836"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.634288" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:26.633936" elapsed="0.000377"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:26.634604" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:26.634377" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.635177" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:26.634899" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:26.634677" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:26.634360" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:26.635397" elapsed="0.000310"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:26.636101" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:26.635867" elapsed="0.000258"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:26.636278" elapsed="0.000227"/>
</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-10-11T01:03:26.630629" elapsed="0.005963"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:03:26.636740" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:03:26.636657" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:26.636641" elapsed="0.000175"/>
</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-10-11T01:03:26.636977" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:03:26.637039" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:03:26.637197" 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-10-11T01:03:26.607636" elapsed="0.029585"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:26.637282" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:03:26.637402" 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-10-11T01:03:26.543262" elapsed="0.094179"/>
</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-10-11T01:03:26.637732" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:26.637530" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:26.637515" elapsed="0.000299"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:26.637843" elapsed="0.000024"/>
</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-10-11T01:03:26.542609" elapsed="0.095344"/>
</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-10-11T01:03:26.641241" level="INFO">${update} = </msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:03:26.638842" elapsed="0.002426"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:03:26.641822" level="FAIL"> == </msg>
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="FAIL" start="2026-10-11T01:03:26.641444" elapsed="0.000435"> == </status>
</kw>
<return>
<value>${update}</value>
<status status="NOT RUN" start="2026-10-11T01:03:26.641929" elapsed="0.000030"/>
</return>
<doc>Returns hex update message.</doc>
<status status="FAIL" start="2026-10-11T01:03:26.638585" elapsed="0.003463"> == </status>
</kw>
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:28.647028" level="INFO">${update} = ffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f0101010003160001010203040102200a00000a200c00000c01000001</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:03:28.643773" elapsed="0.003330"/>
</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-10-11T01:03:28.647560" elapsed="0.000752"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:03:28.648460" elapsed="0.000085"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:03:28.642932" elapsed="0.005791"/>
</kw>
<msg time="2026-10-11T01:03:28.648877" 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-10-11T01:03:26.638140" elapsed="2.010790"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.651587" level="INFO">Length is 160.</msg>
<msg time="2026-10-11T01:03:28.651751" 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-10-11T01:03:28.650931" elapsed="0.000870"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.652736" level="INFO">Length is 160.</msg>
<msg time="2026-10-11T01:03:28.652887" 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-10-11T01:03:28.652181" elapsed="0.000776"/>
</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-10-11T01:03:28.653370" elapsed="0.000652"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:28.654748" 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-10-11T01:03:28.654357" elapsed="0.000444"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:28.655615" 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-10-11T01:03:28.655237" elapsed="0.000432"/>
</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-10-11T01:03:28.656095" elapsed="0.000630"/>
</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-10-11T01:03:28.649442" elapsed="0.007406"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:03:28.657181" elapsed="0.002957"/>
</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-10-11T01:03:28.690100" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:28.689660" elapsed="0.000478"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:28.691126" 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-10-11T01:03:28.690832" elapsed="0.000391">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-10-11T01:03:28.691340" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:28.690359" elapsed="0.001012"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.692079" 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-10-11T01:03:28.691633" elapsed="0.000481"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:28.692522" 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-10-11T01:03:28.692704" 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-10-11T01:03:28.692348" elapsed="0.000390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.693334" 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-10-11T01:03:28.693027" 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-10-11T01:03:28.694708" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:03:28.694362" elapsed="0.000405"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.695593" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:28.695031" elapsed="0.000596"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.696729" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:28.696098" elapsed="0.000666"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:28.698254" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:28.697617" elapsed="0.000750"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:28.698579" elapsed="0.000047"/>
</return>
<msg time="2026-10-11T01:03:28.698821" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:28.697026" elapsed="0.001827"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:28.699103" elapsed="0.000463"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:03:28.695891" elapsed="0.003729"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.700550" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:28.699961" elapsed="0.000623"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:28.702115" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:28.701403" elapsed="0.000820"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:28.702401" elapsed="0.000101"/>
</return>
<msg time="2026-10-11T01:03:28.702695" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:28.700824" elapsed="0.001952"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:28.703027" elapsed="0.000447"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:28.699762" elapsed="0.003767"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:28.695692" elapsed="0.007881"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:28.703626" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T01:03:28.703809" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:28.693867" elapsed="0.009974"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:28.693505" elapsed="0.010377"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:28.704141" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:28.703914" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:28.693477" elapsed="0.010763"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.705224" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:28.704491" elapsed="0.000770"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:28.705322" 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/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-10-11T01:03:28.688901" elapsed="0.016589"/>
</kw>
<msg time="2026-10-11T01:03:28.705559" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:28.680144" elapsed="0.025477"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:28.711434" 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/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-10-11T01:03:28.715663" 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/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-10-11T01:03:28.719746" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:28.719926" 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-10-11T01:03:28.720122" 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-10-11T01:03:28.720476" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:28.720314" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:28.720299" 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-10-11T01:03:28.720707" 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-10-11T01:03:28.720887" 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-10-11T01:03:28.721109" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:28.720274" elapsed="0.000884"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:28.720188" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:28.721336" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:28.721416" elapsed="0.000017"/>
</return>
<msg time="2026-10-11T01:03:28.721528" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:28.678687" elapsed="0.042866"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.722579" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:28.722324" 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-10-11T01:03:28.731652" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:28.731712" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:28.731813" 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-10-11T01:03:28.722912" elapsed="0.008927"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:28.722683" elapsed="0.009198"/>
</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-10-11T01:03:28.732147" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:28.731908" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:28.722666" elapsed="0.009587"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.734344" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:28.733924" elapsed="0.000477"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:28.733577" elapsed="0.000890"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:28.733552" elapsed="0.000948"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.735293" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:28.734901" elapsed="0.000452"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:28.734570" elapsed="0.000827"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:28.734549" elapsed="0.000900"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.736220" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:28.735712" elapsed="0.000544"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:28.736666" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:28.736344" elapsed="0.000395"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.737386" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:28.737016" elapsed="0.000427"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:28.736770" elapsed="0.000721"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:28.736321" elapsed="0.001198"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.738250" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:28.737765" elapsed="0.000521"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:28.738692" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:28.738373" elapsed="0.000444"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.739497" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:28.739103" elapsed="0.000429"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:28.738852" elapsed="0.000726"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:28.738349" elapsed="0.001257"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:28.739809" elapsed="0.000429"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:28.740814" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:28.740483" elapsed="0.000365"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:28.741079" elapsed="0.000294"/>
</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-10-11T01:03:28.733068" elapsed="0.008406"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:03:28.741534" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T01:03:28.741780" 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-10-11T01:03:28.721789" elapsed="0.020025"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:28.741879" elapsed="0.000034"/>
</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-10-11T01:03:28.662449" elapsed="0.079581"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:28.661384" elapsed="0.080715"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:03:28.660604" elapsed="0.081569"/>
</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-10-11T01:03:28.746205" level="INFO">${update} = ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b00010503160001010203040102200a00000a200c00000c01000001</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:03:28.743444" elapsed="0.002800"/>
</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-10-11T01:03:28.746492" elapsed="0.000437"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:03:28.747009" elapsed="0.000038"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:03:28.743064" elapsed="0.004085"/>
</kw>
<msg time="2026-10-11T01:03:28.747243" 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-10-11T01:03:28.742444" elapsed="0.004833"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.748389" level="INFO">Length is 148.</msg>
<msg time="2026-10-11T01:03:28.748518" 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-10-11T01:03:28.748055" elapsed="0.000494"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.749103" level="INFO">Length is 148.</msg>
<msg time="2026-10-11T01:03:28.749198" 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-10-11T01:03:28.748767" 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-10-11T01:03:28.749508" elapsed="0.000374"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:28.750318" 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-10-11T01:03:28.750103" elapsed="0.000248"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:28.750783" 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-10-11T01:03:28.750573" 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-10-11T01:03:28.751084" elapsed="0.000390"/>
</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-10-11T01:03:28.747573" elapsed="0.003979"/>
</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-10-11T01:03:28.768859" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:28.768554" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:28.769642" 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-10-11T01:03:28.769426" elapsed="0.000284">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-10-11T01:03:28.769793" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:28.769090" elapsed="0.000725"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.770305" 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-10-11T01:03:28.769999" elapsed="0.000331"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:28.770620" 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-10-11T01:03:28.770750" 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-10-11T01:03:28.770510" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.771195" 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-10-11T01:03:28.770977" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.772175" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:03:28.771930" elapsed="0.000286"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.772658" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:28.772390" elapsed="0.000291"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.773503" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:28.773013" elapsed="0.000514"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:28.774572" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:28.774112" elapsed="0.000500"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:28.774723" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:03:28.774901" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:28.773697" elapsed="0.001228"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:28.775106" elapsed="0.000274"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:03:28.772868" elapsed="0.002570"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.776144" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:28.775672" elapsed="0.000497"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:28.777239" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:28.776780" elapsed="0.000498"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:28.777386" elapsed="0.000053"/>
</return>
<msg time="2026-10-11T01:03:28.777587" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:28.776338" elapsed="0.001273"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:28.777775" elapsed="0.000284"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:28.775541" elapsed="0.002557"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:28.772726" elapsed="0.005403"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:28.778167" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:28.778297" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:28.771566" elapsed="0.006754"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:28.771298" elapsed="0.007052"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:28.778591" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:28.778372" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:28.771281" elapsed="0.007381"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.779586" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:28.778822" elapsed="0.000791"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:28.779657" 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/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-10-11T01:03:28.768006" elapsed="0.011752"/>
</kw>
<msg time="2026-10-11T01:03:28.779806" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:28.763632" elapsed="0.016229"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:28.784030" 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/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-10-11T01:03:28.788229" 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/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-10-11T01:03:28.792397" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:28.792592" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:28.792772" 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-10-11T01:03:28.793122" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:28.792976" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:28.792962" 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-10-11T01:03:28.793347" 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-10-11T01:03:28.793545" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:28.793709" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:28.792924" elapsed="0.000831"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:28.792837" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:28.793929" elapsed="0.000033"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:28.794009" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:28.794116" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:28.762973" elapsed="0.031168"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.795213" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:28.794988" elapsed="0.000267"/>
</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-10-11T01:03:28.800290" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:28.800599" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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+xml', 'Content-Length': '635'} 
 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-path xmlns:a="urn:opendaylight:params:xml:ns:yang:bgp-rib" xmlns:b="urn:opendaylight:params:xml:ns:yang:bgp-types" xmlns:c="urn:opendaylight:params:xml:ns:yang:bgp:mvpn" xmlns:d="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;/a:application-rib[a:id='10.30.170.173']/a:tables[a:afi='b:ipv4-address-family'][a:safi='c:mcast-vpn-subsequent-address-family']/d:mvpn-routes-ipv4&lt;/error-path&gt;&lt;error-message&gt;Data does not exist&lt;/error-message&gt;&lt;error-tag&gt;data-missing&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-10-11T01:03:28.800727" level="INFO">${response} = None</msg>
<msg time="2026-10-11T01:03:28.800766" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:28.795557" elapsed="0.005569">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:28.795315" elapsed="0.005885">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:28.801383" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:28.801230" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-10-11T01:03:28.795298" elapsed="0.006179">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:28.802713" 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-10-11T01:03:28.802440" elapsed="0.000304">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:03:28.802181" elapsed="0.000619">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:03:28.802164" elapsed="0.000664">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-10-11T01:03:28.803404" 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-10-11T01:03:28.803142" elapsed="0.000308">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:03:28.802890" elapsed="0.000617">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:03:28.802875" elapsed="0.000660">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.805262" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:28.803726" elapsed="0.001563"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:28.805587" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:28.805354" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.806118" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:28.805831" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:28.805664" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:28.805337" elapsed="0.000859"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.806727" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:28.806371" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:28.807077" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:28.806846" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.807598" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:28.807316" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:28.807151" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:28.806828" elapsed="0.000848"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:28.807822" elapsed="0.000308"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:28.808529" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:28.808291" elapsed="0.000263"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-10-11T01:03:28.808871" 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-10-11T01:03:28.808708" elapsed="0.000193">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-10-11T01:03:28.801806" elapsed="0.007231">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-10-11T01:03:28.809092" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:28.809344" level="INFO">${response_text} = None</msg>
<msg time="2026-10-11T01:03:28.809371" 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-10-11T01:03:28.794425" elapsed="0.014973">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-10-11T01:03:28.809471" elapsed="0.000024"/>
</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-10-11T01:03:28.752905" elapsed="0.056702">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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:28.752342" elapsed="0.057320"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:03:28.751834" elapsed="0.057881"/>
</kw>
<arg>spmsi_ad</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-10-11T01:03:26.537811" elapsed="2.271948"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:26.442020" elapsed="2.367835"/>
</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-10-11T01:03:28.811391" elapsed="0.000404"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:03:28.811140" elapsed="0.000723"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:28.812837" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:28.812751" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:28.812733" elapsed="0.000167"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:28.815024" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:28.814924" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:28.814908" elapsed="0.000179"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.816015" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:28.815672" elapsed="0.000368"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.816474" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:03:28.816194" elapsed="0.000304"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:03:28.816538" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:28.816666" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:03:28.815296" elapsed="0.001394"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:28.819241" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:28.819156" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:28.819138" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:28.820362" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:28.820278" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:28.820261" elapsed="0.000186"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:28.820764" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:03:28.820596" elapsed="0.000193"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:03:28.821109" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:28.820969" elapsed="0.000164"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:03:28.852988" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:03:28.821650" elapsed="0.031431"/>
</kw>
<msg time="2026-10-11T01:03:28.853248" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:03:28.853291" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:28.821291" elapsed="0.032036"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:03:28.883192" 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-10-11T01:03:28.853853" elapsed="0.029435"/>
</kw>
<msg time="2026-10-11T01:03:28.883452" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:03:28.883494" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:28.853514" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:28.883802" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:28.883597" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:28.883580" elapsed="0.000295"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.884298" 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-10-11T01:03:28.884073" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:28.884638" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:28.884437" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:28.884419" elapsed="0.000289"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:03:28.884738" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:28.887322" elapsed="0.000133"/>
</kw>
<msg time="2026-10-11T01:03:28.887522" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:28.886105" 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-10-11T01:03:28.887975" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:28.888309" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:03:28.885512" 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-10-11T01:03:28.885025" 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-10-11T01:03:28.820020" elapsed="0.068627"/>
</kw>
<msg time="2026-10-11T01:03:28.888729" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:28.888768" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:28.819470" elapsed="0.069334"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:03:28.889006" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:03:28.888906" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:28.888888" elapsed="0.000194"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:28.889463" 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-10-11T01:03:28.889773" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:03:28.889836" 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-10-11T01:03:28.818858" elapsed="0.071063"/>
</kw>
<msg time="2026-10-11T01:03:28.890018" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:28.890059" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:28.817069" elapsed="0.073025"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:28.890382" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:28.890161" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:28.890145" elapsed="0.000386"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:03:28.816911" elapsed="0.073642"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:03:28.816769" elapsed="0.073811"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:03:28.814631" elapsed="0.075998"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:03:28.812499" elapsed="0.078180"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:28.812076" elapsed="0.078643"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:03:28.810761" elapsed="0.080006"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.891809" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:28.891378" elapsed="0.000457"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.892435" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:28.892038" elapsed="0.000423"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.892992" 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-10-11T01:03:28.892642" elapsed="0.000376"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:28.893325" 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-10-11T01:03:28.893467" 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-10-11T01:03:28.893184" elapsed="0.000308"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:28.893789" 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-10-11T01:03:28.893899" 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-10-11T01:03:28.893654" elapsed="0.000269"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:03:28.894080" elapsed="0.002577"/>
</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-10-11T01:03:28.896804" elapsed="0.002173"/>
</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-10-11T01:03:28.914731" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:28.914427" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:28.915462" 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-10-11T01:03:28.915255" elapsed="0.000273">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-10-11T01:03:28.915611" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:28.914917" elapsed="0.000717"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.916129" 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-10-11T01:03:28.915807" elapsed="0.000347"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:28.916443" 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-10-11T01:03:28.916563" 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-10-11T01:03:28.916321" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.917009" 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-10-11T01:03:28.916781" elapsed="0.000270"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.917959" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:28.917719" elapsed="0.000282"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.918440" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:28.918180" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.919227" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:28.918780" elapsed="0.000471"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:28.920381" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:28.919870" elapsed="0.000614"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:28.920573" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:03:28.920784" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:28.919443" 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-10-11T01:03:28.920987" elapsed="0.000315"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:03:28.918649" elapsed="0.002691"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.922036" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:28.921594" elapsed="0.000467"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:28.923190" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:28.922687" elapsed="0.000588"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:28.923352" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:03:28.923574" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:28.922230" 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-10-11T01:03:28.923761" elapsed="0.000313"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:28.921462" elapsed="0.002650"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:28.918508" elapsed="0.005636"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:28.924181" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:28.924311" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:28.917364" elapsed="0.006971"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:28.917112" elapsed="0.007281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:28.924591" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:28.924437" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:28.917094" elapsed="0.007566"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.925622" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-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-10-11T01:03:28.924819" elapsed="0.000830"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:28.925694" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:28.913895" elapsed="0.011900"/>
</kw>
<msg time="2026-10-11T01:03:28.925844" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:28.909572" elapsed="0.016316"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:28.930001" 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/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-10-11T01:03:28.934078" 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/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-10-11T01:03:28.938400" elapsed="0.000056"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:28.938644" 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-10-11T01:03:28.938830" 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-10-11T01:03:28.939255" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:28.939102" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:28.939088" 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-10-11T01:03:28.939504" 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-10-11T01:03:28.939687" 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-10-11T01:03:28.939854" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:28.939057" elapsed="0.000846"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:28.938899" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:28.940093" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:28.940162" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:03:28.940331" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-i...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:03:28.908911" elapsed="0.031447"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:28.941601" 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-10-11T01:03:28.941359" elapsed="0.000308">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-10-11T01:03:28.941752" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:28.941002" 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-10-11T01:03:28.942088" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:28.941839" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.942640" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:28.942344" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:28.942164" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:28.941822" elapsed="0.000895"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.943235" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:28.942881" elapsed="0.000378"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:28.943303" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:03:28.943446" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:28.940672" elapsed="0.002798"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:28.944568" 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-10-11T01:03:28.944363" elapsed="0.000264">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-10-11T01:03:28.944711" 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-10-11T01:03:28.944039" elapsed="0.000695"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:03:28.944896" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:03:28.944798" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:28.944781" elapsed="0.000207"/>
</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-10-11T01:03:28.945144" elapsed="0.000020"/>
</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-10-11T01:03:28.945322" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:03:28.945380" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:03:28.945523" 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-10-11T01:03:28.943721" elapsed="0.001825"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.946780" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:28.946553" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:28.947448" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:28.947027" elapsed="0.000463"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:28.952312" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:28.952502" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:28.952601" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:28.947783" elapsed="0.005186">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:28.947552" elapsed="0.005492">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:28.953231" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:28.953076" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-10-11T01:03:28.947534" elapsed="0.005779">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:28.953669" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:28.953790" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:28.953756" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:28.953740" elapsed="0.000107"/>
</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-10-11T01:03:28.954002" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:03:28.954070" 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-10-11T01:03:28.945826" elapsed="0.008339">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:28.954231" elapsed="0.000014"/>
</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-10-11T01:03:28.901509" elapsed="0.052808">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:28.954580" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:28.954400" elapsed="0.000245"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:28.954384" elapsed="0.000283"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:28.954697" 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-10-11T01:03:28.900867" elapsed="0.053920">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:30.990246" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:30.989516" elapsed="0.000796"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:30.992157" 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-10-11T01:03:30.991655" elapsed="0.000652">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-10-11T01:03:30.992539" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:30.990821" elapsed="0.001772"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:30.993729" 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-10-11T01:03:30.993003" elapsed="0.000783"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:30.994460" 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-10-11T01:03:30.994768" 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-10-11T01:03:30.994178" elapsed="0.000644"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:30.995797" 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-10-11T01:03:30.995274" elapsed="0.000618"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:30.998012" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:30.997479" elapsed="0.000626"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:30.999143" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:30.998551" elapsed="0.000645"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.000877" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:31.000167" elapsed="0.000745"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:31.002570" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:31.001805" elapsed="0.000891"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:31.002812" elapsed="0.000048"/>
</return>
<msg time="2026-10-11T01:03:31.003132" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:31.001170" elapsed="0.001995"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:31.003398" elapsed="0.000474"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:03:30.999707" elapsed="0.004218"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.004899" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:31.004262" elapsed="0.000685"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:31.006642" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:31.005858" elapsed="0.000905"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:31.006872" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T01:03:31.007178" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:31.005184" elapsed="0.002026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:31.007472" elapsed="0.000415"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:31.004081" elapsed="0.003872"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:30.999294" elapsed="0.008709"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:31.008055" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T01:03:31.008232" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:30.996666" elapsed="0.011598"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:30.996059" elapsed="0.012244"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.008577" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.008334" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:30.996015" elapsed="0.012663"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.009677" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-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-10-11T01:03:31.008900" elapsed="0.000855"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:31.009818" 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-10-11T01:03:30.988280" elapsed="0.021691"/>
</kw>
<msg time="2026-10-11T01:03:31.010040" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:30.977808" elapsed="0.032295"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:31.016086" 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/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-10-11T01:03:31.021840" 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-10-11T01:03:31.027582" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.027839" 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-10-11T01:03:31.028107" 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-10-11T01:03:31.028613" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.028386" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:31.028367" 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-10-11T01:03:31.028944" 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-10-11T01:03:31.029195" 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-10-11T01:03:31.029440" elapsed="0.000027"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:31.028329" elapsed="0.001185"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:31.028204" elapsed="0.001346"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.029761" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:31.029852" elapsed="0.000021"/>
</return>
<msg time="2026-10-11T01:03:31.030024" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-i...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:03:30.976373" elapsed="0.053686"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:31.031719" 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-10-11T01:03:31.031434" elapsed="0.000376">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-10-11T01:03:31.031927" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:31.030943" 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-10-11T01:03:31.032375" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.032062" elapsed="0.000406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.033134" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:31.032750" elapsed="0.000417"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.032499" elapsed="0.000713"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.032038" elapsed="0.001202"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.033969" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:31.033483" elapsed="0.000520"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:31.034064" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T01:03:31.034239" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:31.030503" elapsed="0.003767"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:31.035806" 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-10-11T01:03:31.035549" elapsed="0.000337">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-10-11T01:03:31.036021" 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-10-11T01:03:31.035085" elapsed="0.000967"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:03:31.036274" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-10-11T01:03:31.036139" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.036116" 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-10-11T01:03:31.036615" 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-10-11T01:03:31.036859" elapsed="0.000026"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:03:31.036957" elapsed="0.000020"/>
</return>
<msg time="2026-10-11T01:03:31.037130" 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-10-11T01:03:31.034650" elapsed="0.002511"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.038821" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:31.038599" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.039281" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:31.039067" elapsed="0.000253"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:31.045348" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:31.045509" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:31.045629" 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-10-11T01:03:31.039623" elapsed="0.006031"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.039378" elapsed="0.006315"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.045872" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.045717" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.039362" elapsed="0.006656"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.047825" 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-10-11T01:03:31.047340" elapsed="0.000548"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.047000" elapsed="0.000967"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.046975" elapsed="0.001028"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.048799" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:31.048426" elapsed="0.000430"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.048074" elapsed="0.000826"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.048052" elapsed="0.000891"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.049699" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:31.049194" elapsed="0.000540"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.050139" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.049822" elapsed="0.000390"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.050867" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:31.050495" elapsed="0.000407"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.050243" elapsed="0.000721"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.049798" elapsed="0.001194"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.051738" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:31.051237" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.052167" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.051860" elapsed="0.000379"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.052878" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:31.052515" elapsed="0.000396"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.052268" elapsed="0.000700"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.051837" elapsed="0.001158"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:31.053196" elapsed="0.000422"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:31.054180" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:31.053844" 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-10-11T01:03:31.054446" elapsed="0.000297"/>
</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-10-11T01:03:31.046508" elapsed="0.008312"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:31.055034" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:31.054905" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.054881" elapsed="0.000249"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:31.056055" 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-10-11T01:03:31.055373" elapsed="0.000709"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:31.056127" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:31.056252" 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-10-11T01:03:31.037573" elapsed="0.018702"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:31.056366" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:03:31.056505" 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-10-11T01:03:30.960041" elapsed="0.096488"/>
</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-10-11T01:03:31.067195" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:31.066844" elapsed="0.000377"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:31.067952" 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-10-11T01:03:31.067720" elapsed="0.000351">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-10-11T01:03:31.068233" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:31.067380" elapsed="0.000876"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.068757" 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-10-11T01:03:31.068449" elapsed="0.000333"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:31.069069" 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-10-11T01:03:31.069210" 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-10-11T01:03:31.068959" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.069660" 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-10-11T01:03:31.069444" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:31.070079" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.069764" elapsed="0.000369"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.070767" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:31.070303" elapsed="0.000489"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.070156" elapsed="0.000668"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.069747" elapsed="0.001097"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.071429" 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-10-11T01:03:31.071016" elapsed="0.000441"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:31.071501" 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/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-10-11T01:03:31.066325" elapsed="0.005276"/>
</kw>
<msg time="2026-10-11T01:03:31.071678" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:31.061906" elapsed="0.009820"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:31.075878" 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/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-10-11T01:03:31.080009" 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/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-10-11T01:03:31.084233" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.084430" 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-10-11T01:03:31.084618" 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-10-11T01:03:31.084968" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.084811" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:31.084798" 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-10-11T01:03:31.085197" 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-10-11T01:03:31.085378" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.085559" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:31.084773" elapsed="0.000833"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:31.084684" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.085780" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:31.085845" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:31.085967" 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-10-11T01:03:31.061184" elapsed="0.024808"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:31.086159" elapsed="0.000331"/>
</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-10-11T01:03:31.087522" 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-10-11T01:03:31.087133" elapsed="0.000416"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:31.088109" 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-10-11T01:03:31.087731" elapsed="0.000404"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:03:31.088326" elapsed="0.000295"/>
</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-10-11T01:03:31.086761" elapsed="0.001914"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.086560" elapsed="0.002145"/>
</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-10-11T01:03:31.088903" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.088728" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.086543" elapsed="0.002442"/>
</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-10-11T01:03:31.057493" elapsed="0.031535"/>
</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-10-11T01:03:31.056811" elapsed="0.032283"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.056603" elapsed="0.032530"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.056587" elapsed="0.032568"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:31.089184" elapsed="0.000026"/>
</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-10-11T01:03:30.958457" elapsed="0.130827"/>
</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-10-11T01:03:28.899167" elapsed="2.190171"/>
</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-10-11T01:03:31.104950" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:31.104634" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:31.105787" 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-10-11T01:03:31.105616" elapsed="0.000229">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-10-11T01:03:31.105940" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:31.105259" elapsed="0.000705"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.106461" 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-10-11T01:03:31.106137" elapsed="0.000349"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:31.106760" 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-10-11T01:03:31.106873" 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-10-11T01:03:31.106652" elapsed="0.000245"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.107327" 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-10-11T01:03:31.107105" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.108282" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:31.108052" elapsed="0.000271"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.108770" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:31.108515" elapsed="0.000279"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.109623" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:31.109174" elapsed="0.000474"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:31.110786" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:31.110263" elapsed="0.000614"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:31.110972" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:03:31.111186" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:31.109819" 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-10-11T01:03:31.111377" elapsed="0.000322"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/effective-rib-in</var>
<status status="PASS" start="2026-10-11T01:03:31.109039" elapsed="0.002697"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.112433" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:31.111979" elapsed="0.000479"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:31.113584" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:31.113068" elapsed="0.000604"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:31.113751" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:03:31.113971" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:31.112628" elapsed="0.001368"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:31.114161" elapsed="0.000370"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:31.111835" elapsed="0.002735"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:31.108882" elapsed="0.005719"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:31.114637" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:31.114765" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:31.107694" elapsed="0.007094"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.107444" elapsed="0.007373"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.115001" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.114838" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.107426" elapsed="0.007645"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.115800" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-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-10-11T01:03:31.115236" elapsed="0.000591"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:31.115870" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:31.104106" elapsed="0.011875"/>
</kw>
<msg time="2026-10-11T01:03:31.116029" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:31.099653" elapsed="0.016421"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:31.121420" 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/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-10-11T01:03:31.125512" 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/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-10-11T01:03:31.129628" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.129809" 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-10-11T01:03:31.130003" 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-10-11T01:03:31.130341" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.130195" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:31.130181" 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-10-11T01:03:31.130584" 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-10-11T01:03:31.130762" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.130927" elapsed="0.000029"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:31.130156" elapsed="0.000829"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:31.130069" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.131159" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:31.131225" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:03:31.131334" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-ro...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:03:31.099049" elapsed="0.032309"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:31.132475" 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-10-11T01:03:31.132275" elapsed="0.000259">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-10-11T01:03:31.132617" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:31.131945" elapsed="0.000694"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.132920" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.132701" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.133451" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:31.133173" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.133006" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.132685" elapsed="0.000844"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.134048" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:31.133696" elapsed="0.000376"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:31.134117" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:31.134240" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:31.131633" elapsed="0.002630"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:31.135345" 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-10-11T01:03:31.135162" elapsed="0.000288">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-10-11T01:03:31.135536" 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-10-11T01:03:31.134825" elapsed="0.000734"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:03:31.135720" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:03:31.135622" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.135605" elapsed="0.000190"/>
</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-10-11T01:03:31.135961" elapsed="0.000020"/>
</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-10-11T01:03:31.136138" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:03:31.136197" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:03:31.136320" 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-10-11T01:03:31.134526" elapsed="0.001817"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.137581" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:31.137337" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.138040" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:31.137814" elapsed="0.000267"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:31.189560" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:31.189734" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:31.189867" 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-10-11T01:03:31.138365" elapsed="0.051529"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.138140" elapsed="0.051822"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.190200" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.189995" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.138123" elapsed="0.052159"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.191703" 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-10-11T01:03:31.191317" elapsed="0.000433"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.191055" elapsed="0.000727"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.191036" elapsed="0.000769"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.192383" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:31.192110" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.191856" elapsed="0.000618"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.191841" elapsed="0.000656"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.193062" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:31.192686" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.193367" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.193151" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.193893" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:31.193625" elapsed="0.000365"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.193458" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.193134" elapsed="0.000911"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.194576" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:31.194222" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.194875" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.194665" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.195396" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:31.195128" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.194965" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.194648" elapsed="0.000841"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:31.195638" elapsed="0.000309"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:31.196345" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:31.196110" elapsed="0.000260"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:31.196540" elapsed="0.000213"/>
</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-10-11T01:03:31.190660" elapsed="0.006150"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:31.196969" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:31.196872" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.196855" elapsed="0.000177"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:31.197799" 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-10-11T01:03:31.197174" elapsed="0.000653"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:31.197874" elapsed="0.000032"/>
</return>
<msg time="2026-10-11T01:03:31.198024" 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-10-11T01:03:31.136631" elapsed="0.061419"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:31.198105" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:03:31.198226" 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-10-11T01:03:31.091839" elapsed="0.106412"/>
</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-10-11T01:03:31.208897" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:31.208597" elapsed="0.000326"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:31.209696" 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-10-11T01:03:31.209432" elapsed="0.000404">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-10-11T01:03:31.210015" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:31.209095" elapsed="0.000944"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.210543" 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-10-11T01:03:31.210213" elapsed="0.000389"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:31.210887" 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-10-11T01:03:31.211105" 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-10-11T01:03:31.210775" elapsed="0.000355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.211561" 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-10-11T01:03:31.211323" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:31.211978" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.211668" elapsed="0.000365"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.212677" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:31.212202" elapsed="0.000500"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.212055" elapsed="0.000680"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.211650" elapsed="0.001104"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.213318" 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-10-11T01:03:31.212916" elapsed="0.000429"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:31.213389" elapsed="0.000058"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:31.208075" elapsed="0.005447"/>
</kw>
<msg time="2026-10-11T01:03:31.213573" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:31.203641" elapsed="0.009977"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:31.217848" 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/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-10-11T01:03:31.222143" 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/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-10-11T01:03:31.226391" elapsed="0.000040"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.226674" 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-10-11T01:03:31.226863" 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-10-11T01:03:31.227238" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.227090" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:31.227076" 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-10-11T01:03:31.227486" 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-10-11T01:03:31.227670" 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-10-11T01:03:31.227838" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:31.227046" elapsed="0.000841"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:31.226946" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.228077" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:31.228145" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:31.228261" 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-10-11T01:03:31.202920" elapsed="0.025368"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:31.228471" elapsed="0.000342"/>
</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-10-11T01:03:31.229892" 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-10-11T01:03:31.229495" elapsed="0.000424"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:31.230466" 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-10-11T01:03:31.230082" 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-10-11T01:03:31.230679" elapsed="0.000295"/>
</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-10-11T01:03:31.229105" elapsed="0.001923"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.228883" elapsed="0.002175"/>
</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-10-11T01:03:31.231256" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.231081" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.228866" elapsed="0.002459"/>
</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-10-11T01:03:31.199211" elapsed="0.032157"/>
</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-10-11T01:03:31.198546" elapsed="0.032904"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.198324" elapsed="0.033168"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.198308" elapsed="0.033205"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:31.231544" elapsed="0.000027"/>
</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-10-11T01:03:31.091215" elapsed="0.140432"/>
</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-10-11T01:03:31.089543" elapsed="0.142189"/>
</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-10-11T01:03:31.247384" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:31.247085" elapsed="0.000340"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:31.248114" 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-10-11T01:03:31.247908" elapsed="0.000278">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-10-11T01:03:31.248270" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:31.247591" elapsed="0.000701"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.248798" 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-10-11T01:03:31.248483" elapsed="0.000340"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:31.249111" 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-10-11T01:03:31.249249" 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-10-11T01:03:31.249001" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.249705" 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-10-11T01:03:31.249485" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.250662" 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-10-11T01:03:31.250430" elapsed="0.000273"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.251149" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:31.250879" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.251955" 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-10-11T01:03:31.251506" elapsed="0.000474"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:31.253115" 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-10-11T01:03:31.252601" elapsed="0.000601"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:31.253281" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:03:31.253515" 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-10-11T01:03:31.252150" 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-10-11T01:03:31.253707" elapsed="0.000322"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:03:31.251358" elapsed="0.002709"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.254749" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:31.254298" elapsed="0.000476"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:31.255907" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:31.255380" elapsed="0.000626"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:31.256085" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:03:31.256298" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:31.254953" elapsed="0.001368"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:31.256506" elapsed="0.000444"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:31.254167" elapsed="0.002822"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:31.251215" elapsed="0.005806"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:31.257090" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:31.257224" 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-10-11T01:03:31.250074" elapsed="0.007173"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.249805" elapsed="0.007471"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.257524" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.257298" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.249788" elapsed="0.007807"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.258273" 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-10-11T01:03:31.257753" elapsed="0.000547"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:31.258343" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:31.246572" elapsed="0.011950"/>
</kw>
<msg time="2026-10-11T01:03:31.258572" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:31.242234" elapsed="0.016384"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:31.263103" 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-10-11T01:03:31.267264" 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/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-10-11T01:03:31.271316" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.271509" 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-10-11T01:03:31.271691" 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-10-11T01:03:31.272035" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.271879" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:31.271867" 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-10-11T01:03:31.272261" 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-10-11T01:03:31.272454" 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-10-11T01:03:31.272619" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:31.271842" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:31.271755" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.272838" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:31.272944" elapsed="0.000017"/>
</return>
<msg time="2026-10-11T01:03:31.273055" 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-10-11T01:03:31.241630" elapsed="0.031450"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:31.274189" 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-10-11T01:03:31.273996" elapsed="0.000252">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-10-11T01:03:31.274331" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:31.273661" elapsed="0.000692"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.274653" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.274431" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.275267" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:31.274903" elapsed="0.000388"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.274727" elapsed="0.000596"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.274399" elapsed="0.000943"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.275851" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:31.275518" elapsed="0.000357"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:31.275919" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T01:03:31.276057" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:31.273346" elapsed="0.002734"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:31.277158" 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-10-11T01:03:31.276971" elapsed="0.000248">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-10-11T01:03:31.277302" 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-10-11T01:03:31.276640" elapsed="0.000685"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:03:31.277505" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:03:31.277389" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.277372" elapsed="0.000210"/>
</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-10-11T01:03:31.277737" elapsed="0.000020"/>
</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-10-11T01:03:31.277913" elapsed="0.000032"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:03:31.277985" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:03:31.278109" 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-10-11T01:03:31.276327" elapsed="0.001805"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.279529" 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-10-11T01:03:31.279288" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.279992" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:31.279763" elapsed="0.000269"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:31.285043" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:31.285235" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:03:31.285324" 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-10-11T01:03:31.280321" elapsed="0.005028"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.280092" elapsed="0.005295"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.285585" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.285429" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.280076" elapsed="0.005586"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.286948" 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-10-11T01:03:31.286604" elapsed="0.000390"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.286344" elapsed="0.000682"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.286327" elapsed="0.000722"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.287623" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:31.287339" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.287099" elapsed="0.000596"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.287084" elapsed="0.000633"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.288257" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:31.287896" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.288579" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.288344" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.289088" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:31.288816" elapsed="0.000296"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.288652" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.288328" elapsed="0.000836"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.289688" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:31.289338" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.289995" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.289775" elapsed="0.000271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.290510" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:31.290236" elapsed="0.000299"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.290068" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.289758" elapsed="0.000827"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:31.290731" elapsed="0.000299"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:31.291428" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:31.291192" elapsed="0.000262"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:31.291607" elapsed="0.000209"/>
</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-10-11T01:03:31.286002" elapsed="0.005870"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:31.292029" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:31.291946" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.291918" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:31.292825" 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-10-11T01:03:31.292230" elapsed="0.000678"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:31.292966" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:31.293097" 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-10-11T01:03:31.278430" elapsed="0.014692"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:31.293177" elapsed="0.000023"/>
</return>
<msg time="2026-10-11T01:03:31.293296" 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-10-11T01:03:31.234251" elapsed="0.059069"/>
</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-10-11T01:03:31.303894" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:31.303594" elapsed="0.000326"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:31.304646" 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-10-11T01:03:31.304428" elapsed="0.000335">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-10-11T01:03:31.304923" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:31.304099" elapsed="0.000859"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.305457" 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-10-11T01:03:31.305132" elapsed="0.000351"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:31.305754" 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-10-11T01:03:31.305870" 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-10-11T01:03:31.305647" elapsed="0.000248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.306320" 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-10-11T01:03:31.306100" elapsed="0.000264"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:31.306740" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.306439" elapsed="0.000354"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.307440" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:31.306972" elapsed="0.000494"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.306815" elapsed="0.000684"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.306421" elapsed="0.001097"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.308070" 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-10-11T01:03:31.307679" elapsed="0.000418"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:31.308140" 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/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-10-11T01:03:31.303078" elapsed="0.005161"/>
</kw>
<msg time="2026-10-11T01:03:31.308318" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:31.298703" elapsed="0.009661"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:31.312515" 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/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-10-11T01:03:31.316627" 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/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-10-11T01:03:31.320827" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.321021" 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-10-11T01:03:31.321206" 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-10-11T01:03:31.321677" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.321398" elapsed="0.000333"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:31.321385" elapsed="0.000368"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.321910" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.322117" 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-10-11T01:03:31.322281" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:31.321359" elapsed="0.000970"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:31.321271" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.322524" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:31.322591" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:03:31.322700" 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-10-11T01:03:31.297984" elapsed="0.024740"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:31.322892" elapsed="0.000348"/>
</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-10-11T01:03:31.324347" 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-10-11T01:03:31.323924" elapsed="0.000450"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:31.324901" 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-10-11T01:03:31.324540" elapsed="0.000388"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:03:31.325126" elapsed="0.000275"/>
</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-10-11T01:03:31.323563" elapsed="0.001908"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.323344" elapsed="0.002158"/>
</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-10-11T01:03:31.325699" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.325525" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.323326" elapsed="0.002442"/>
</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-10-11T01:03:31.294278" elapsed="0.031534"/>
</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-10-11T01:03:31.293615" elapsed="0.032262"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.293392" elapsed="0.032524"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.293377" elapsed="0.032571"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:31.325979" elapsed="0.000027"/>
</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-10-11T01:03:31.233628" elapsed="0.092450"/>
</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-10-11T01:03:31.231925" elapsed="0.094205"/>
</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-10-11T01:03:31.326282" elapsed="0.002893"/>
</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-10-11T01:03:31.344795" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:31.344491" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:31.345505" 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-10-11T01:03:31.345318" elapsed="0.000247">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-10-11T01:03:31.345648" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:31.344993" elapsed="0.000678"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.346165" 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-10-11T01:03:31.345844" elapsed="0.000346"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:31.346480" 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-10-11T01:03:31.346596" 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-10-11T01:03:31.346356" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.347046" 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-10-11T01:03:31.346815" 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-10-11T01:03:31.348043" 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-10-11T01:03:31.347799" elapsed="0.000285"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.348530" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:31.348267" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.349306" 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-10-11T01:03:31.348863" elapsed="0.000468"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:31.350482" 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-10-11T01:03:31.349956" elapsed="0.000620"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:31.350657" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:03:31.350868" 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-10-11T01:03:31.349521" 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-10-11T01:03:31.351067" elapsed="0.000300"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:03:31.348733" elapsed="0.002691"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.352100" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:31.351656" elapsed="0.000468"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:31.353253" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:31.352743" elapsed="0.000598"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:31.353440" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:03:31.353650" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:31.352295" 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-10-11T01:03:31.353837" elapsed="0.000309"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:31.351526" elapsed="0.002659"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:31.348597" elapsed="0.005619"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:31.354253" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:31.354379" 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-10-11T01:03:31.347452" elapsed="0.007026"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.347186" elapsed="0.007324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.354681" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.354532" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.347168" elapsed="0.007582"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.355478" 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-10-11T01:03:31.354908" elapsed="0.000598"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:31.355549" 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/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-10-11T01:03:31.343974" elapsed="0.011676"/>
</kw>
<msg time="2026-10-11T01:03:31.355697" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:31.339528" elapsed="0.016213"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:31.360014" 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/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-10-11T01:03:31.364123" 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/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-10-11T01:03:31.368221" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.368402" 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-10-11T01:03:31.368608" 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-10-11T01:03:31.368962" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.368800" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:31.368787" 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-10-11T01:03:31.369192" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.369373" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.369555" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:31.368762" elapsed="0.000840"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:31.368674" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.369778" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:31.369845" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:03:31.369965" 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-10-11T01:03:31.338908" elapsed="0.031083"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:31.371099" 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-10-11T01:03:31.370897" elapsed="0.000262">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-10-11T01:03:31.371242" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:31.370572" elapsed="0.000693"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.371564" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.371327" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.372083" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:31.371806" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.371638" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.371310" elapsed="0.000849"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.372676" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:31.372322" elapsed="0.000378"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:31.372745" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:31.372903" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:31.370255" elapsed="0.002671"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:31.373989" 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-10-11T01:03:31.373834" elapsed="0.000204"/>
</kw>
<msg time="2026-10-11T01:03:31.374114" 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-10-11T01:03:31.373511" elapsed="0.000625"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:03:31.374296" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:31.374200" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.374183" elapsed="0.000173"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:31.374745" 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-10-11T01:03:31.374859" 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-10-11T01:03:31.374620" elapsed="0.000262"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:03:31.375243" 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-10-11T01:03:31.375059" elapsed="0.000207"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:03:31.375308" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:31.375447" 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-10-11T01:03:31.373192" elapsed="0.002279"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.376680" 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-10-11T01:03:31.376458" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.377138" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:31.376911" elapsed="0.000267"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:31.381926" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:31.382054" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:03:31.382147" 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-10-11T01:03:31.377478" elapsed="0.004693"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.377237" elapsed="0.004973"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.382387" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.382234" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.377221" elapsed="0.005264"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.383742" 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-10-11T01:03:31.383393" elapsed="0.000396"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.383153" elapsed="0.000667"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.383136" elapsed="0.000734"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.384465" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:31.384181" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.383925" elapsed="0.000613"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.383909" elapsed="0.000651"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.385090" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:31.384737" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.385396" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.385183" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.385926" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:31.385663" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.385487" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.385166" elapsed="0.000851"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.386544" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:31.386193" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.386843" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.386632" elapsed="0.000263"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.387359" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:31.387099" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.386917" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.386615" elapsed="0.000837"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:31.387597" elapsed="0.000290"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:31.388288" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:31.388065" elapsed="0.000248"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:31.388482" elapsed="0.000210"/>
</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-10-11T01:03:31.382805" elapsed="0.005942"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:31.388897" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:31.388809" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.388793" elapsed="0.000176"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:31.389760" 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-10-11T01:03:31.389111" elapsed="0.000676"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:31.389833" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:31.389975" 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-10-11T01:03:31.375743" elapsed="0.014257"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:31.390054" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:03:31.390176" 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-10-11T01:03:31.331698" elapsed="0.058501"/>
</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-10-11T01:03:31.400833" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:31.400533" elapsed="0.000360"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:31.401647" 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-10-11T01:03:31.401395" elapsed="0.000368">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-10-11T01:03:31.401924" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:31.401072" elapsed="0.000887"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.402464" 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-10-11T01:03:31.402135" elapsed="0.000355"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:31.402765" 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-10-11T01:03:31.402879" 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-10-11T01:03:31.402657" elapsed="0.000247"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.403329" 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-10-11T01:03:31.403112" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:31.403749" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.403447" elapsed="0.000358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.404452" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:31.403987" elapsed="0.000491"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:31.403827" elapsed="0.000684"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:31.403429" elapsed="0.001101"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.405083" 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-10-11T01:03:31.404693" elapsed="0.000417"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:31.405154" 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/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-10-11T01:03:31.400015" elapsed="0.005240"/>
</kw>
<msg time="2026-10-11T01:03:31.405303" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:31.395624" elapsed="0.009722"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:31.409475" 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/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-10-11T01:03:31.413550" 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/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-10-11T01:03:31.418524" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.418708" 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-10-11T01:03:31.418890" 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-10-11T01:03:31.419245" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.419100" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:31.419086" 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-10-11T01:03:31.419489" 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-10-11T01:03:31.419670" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.419834" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:31.419060" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:31.418969" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:31.420071" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:31.420138" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:31.420242" 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-10-11T01:03:31.394896" elapsed="0.025371"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:31.420448" elapsed="0.000313"/>
</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-10-11T01:03:31.421660" 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-10-11T01:03:31.421422" elapsed="0.000264"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:31.422373" 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-10-11T01:03:31.421836" elapsed="0.000564"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:03:31.422872" 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-10-11T01:03:31.423052" 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-10-11T01:03:31.422604" elapsed="0.000552">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-10-11T01:03:31.421044" elapsed="0.002245">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-10-11T01:03:31.420831" elapsed="0.002528">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-10-11T01:03:31.423589" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:31.423392" elapsed="0.000248"/>
</branch>
<status status="FAIL" start="2026-10-11T01:03:31.420814" elapsed="0.002847">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-10-11T01:03:31.391162" elapsed="0.032608">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-10-11T01:03:31.390491" elapsed="0.033406">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-10-11T01:03:31.390272" elapsed="0.033717">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-10-11T01:03:31.390256" elapsed="0.033765">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-10-11T01:03:31.424094" 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-10-11T01:03:31.331062" elapsed="0.093142">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-10-11T01:03:33.459673" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:33.458886" elapsed="0.000852"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:33.461336" 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-10-11T01:03:33.460883" elapsed="0.000638">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-10-11T01:03:33.461719" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:33.460129" elapsed="0.001642"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.462911" 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-10-11T01:03:33.462185" elapsed="0.000808"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:33.463651" 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-10-11T01:03:33.463966" 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-10-11T01:03:33.463367" elapsed="0.000656"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.465010" 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-10-11T01:03:33.464489" elapsed="0.000616"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.467281" 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-10-11T01:03:33.466676" elapsed="0.000702"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.468397" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:33.467808" elapsed="0.000673"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.470047" 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-10-11T01:03:33.469214" elapsed="0.000868"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:33.471733" 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-10-11T01:03:33.470991" elapsed="0.000864"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:33.471988" elapsed="0.000048"/>
</return>
<msg time="2026-10-11T01:03:33.472294" 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-10-11T01:03:33.470324" elapsed="0.002003"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:33.472588" elapsed="0.000456"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:03:33.468893" elapsed="0.004204"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.474070" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:33.473446" elapsed="0.000659"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:33.475815" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:33.475041" elapsed="0.000910"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:33.476065" elapsed="0.000096"/>
</return>
<msg time="2026-10-11T01:03:33.476454" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:33.474342" elapsed="0.002155"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:33.476729" elapsed="0.000435"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:33.473237" elapsed="0.003980"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:33.468583" elapsed="0.008678"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:33.477314" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T01:03:33.477522" 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-10-11T01:03:33.465851" elapsed="0.011705"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:33.465250" elapsed="0.012346"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:33.477839" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:33.477629" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:33.465206" elapsed="0.012768"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.479208" 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-10-11T01:03:33.478200" elapsed="0.001046"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:33.479309" 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/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-10-11T01:03:33.457690" elapsed="0.021788"/>
</kw>
<msg time="2026-10-11T01:03:33.479549" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:33.447735" elapsed="0.031879"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:33.485431" 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-10-11T01:03:33.491164" 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/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-10-11T01:03:33.496555" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:33.496738" 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-10-11T01:03:33.496920" 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-10-11T01:03:33.497273" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:33.497127" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:33.497114" 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-10-11T01:03:33.497513" 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-10-11T01:03:33.497728" 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-10-11T01:03:33.497895" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:33.497089" elapsed="0.000871"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:33.497001" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:33.498138" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:33.498207" elapsed="0.000017"/>
</return>
<msg time="2026-10-11T01:03:33.498316" 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-10-11T01:03:33.446294" elapsed="0.052047"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:33.499501" 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-10-11T01:03:33.499300" elapsed="0.000262">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-10-11T01:03:33.499646" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:33.498973" elapsed="0.000696"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:33.499965" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:33.499730" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.500499" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:33.500220" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:33.500040" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:33.499713" elapsed="0.000862"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.501086" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:33.500735" elapsed="0.000374"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:33.501153" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:33.501276" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:33.498625" elapsed="0.002674"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:33.502350" 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-10-11T01:03:33.502201" elapsed="0.000198"/>
</kw>
<msg time="2026-10-11T01:03:33.502491" 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-10-11T01:03:33.501864" elapsed="0.000649"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:03:33.502673" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:33.502577" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:33.502560" elapsed="0.000174"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:33.503026" 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-10-11T01:03:33.503144" 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-10-11T01:03:33.502886" elapsed="0.000280"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:03:33.503539" 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-10-11T01:03:33.503328" elapsed="0.000235"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:03:33.503604" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:33.503728" 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-10-11T01:03:33.501566" elapsed="0.002217"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.505030" 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-10-11T01:03:33.504797" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.505496" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:33.505263" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:33.511106" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:33.511246" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:03:33.511348" 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-10-11T01:03:33.505827" elapsed="0.005546"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:33.505596" elapsed="0.005834"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:33.511612" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:33.511457" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:33.505579" elapsed="0.006111"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.512982" 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-10-11T01:03:33.512638" elapsed="0.000388"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:33.512377" elapsed="0.000681"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:33.512360" elapsed="0.000721"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.513660" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:33.513374" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:33.513133" elapsed="0.000600"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:33.513117" elapsed="0.000640"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.514365" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:33.513952" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:33.514709" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:33.514477" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.515236" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:33.514967" elapsed="0.000295"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:33.514785" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:33.514459" elapsed="0.000856"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.515845" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:33.515507" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:33.516159" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:33.515946" elapsed="0.000265"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.516680" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:33.516397" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:33.516233" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:33.515917" elapsed="0.000847"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:33.516921" elapsed="0.000312"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:33.517656" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:33.517397" elapsed="0.000283"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:33.517885" elapsed="0.000238"/>
</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-10-11T01:03:33.512033" elapsed="0.006149"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:33.518331" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:33.518246" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:33.518229" elapsed="0.000164"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:33.519054" 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-10-11T01:03:33.518554" elapsed="0.000527"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:33.519127" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:03:33.519260" 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-10-11T01:03:33.504085" elapsed="0.015201"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:33.519342" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:03:33.519483" 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-10-11T01:03:33.429385" elapsed="0.090122"/>
</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-10-11T01:03:33.530224" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:33.529909" elapsed="0.000346"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:33.531008" 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-10-11T01:03:33.530753" elapsed="0.000382">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-10-11T01:03:33.531300" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:33.530430" elapsed="0.000895"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.531828" 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-10-11T01:03:33.531519" elapsed="0.000334"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:33.532143" 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-10-11T01:03:33.532277" 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-10-11T01:03:33.532031" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.532756" 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-10-11T01:03:33.532536" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:33.533166" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:33.532859" elapsed="0.000361"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.533860" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:33.533393" elapsed="0.000492"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:33.533242" elapsed="0.000675"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:33.532842" elapsed="0.001177"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.534612" 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-10-11T01:03:33.534190" elapsed="0.000449"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:33.534682" 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/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-10-11T01:03:33.529389" elapsed="0.005393"/>
</kw>
<msg time="2026-10-11T01:03:33.534829" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:33.524983" elapsed="0.009890"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:33.539025" 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/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-10-11T01:03:33.543205" 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/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-10-11T01:03:33.547498" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:33.547683" 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-10-11T01:03:33.547865" 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-10-11T01:03:33.548225" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:33.548081" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:33.548068" 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-10-11T01:03:33.548465" 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-10-11T01:03:33.548644" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:33.548807" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:33.548041" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:33.547947" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:33.549044" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:33.549110" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:33.549215" 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-10-11T01:03:33.524256" elapsed="0.024988"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:33.549461" elapsed="0.000319"/>
</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-10-11T01:03:33.550679" 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-10-11T01:03:33.550439" elapsed="0.000267"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:33.551099" 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-10-11T01:03:33.550855" elapsed="0.000270"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:03:33.551307" elapsed="0.000297"/>
</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-10-11T01:03:33.550063" elapsed="0.001596"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:33.549849" elapsed="0.001839"/>
</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-10-11T01:03:33.551885" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:33.551711" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:33.549832" elapsed="0.002135"/>
</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-10-11T01:03:33.520495" elapsed="0.031515"/>
</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-10-11T01:03:33.519797" elapsed="0.032277"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:33.519582" elapsed="0.032531"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:33.519566" elapsed="0.032568"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:33.552164" elapsed="0.000030"/>
</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-10-11T01:03:33.427815" elapsed="0.124453"/>
</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-10-11T01:03:31.329362" elapsed="2.222959"/>
</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-10-11T01:03:33.552538" elapsed="0.003085"/>
</kw>
<arg>spmsi_ad</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-10-11T01:03:28.891009" elapsed="4.664678"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:28.810285" elapsed="4.745509"/>
</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-10-11T01:03:33.557122" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:03:33.556857" 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-10-11T01:03:33.558352" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:33.558263" elapsed="0.000133"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:33.558245" elapsed="0.000190"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:33.560577" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:33.560486" elapsed="0.000134"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:33.560469" elapsed="0.000172"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.561567" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:33.561225" elapsed="0.000368"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.562022" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:03:33.561747" elapsed="0.000299"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:03:33.562118" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:03:33.562248" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:03:33.560851" elapsed="0.001420"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:33.564808" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:33.564724" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:33.564706" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:33.565936" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:33.565840" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:33.565823" elapsed="0.000178"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:33.566318" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:03:33.566150" elapsed="0.000192"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:03:33.566666" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:33.566525" elapsed="0.000165"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:03:33.599779" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:03:33.567188" elapsed="0.032686"/>
</kw>
<msg time="2026-10-11T01:03:33.600039" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:03:33.600081" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:33.566847" elapsed="0.033268"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:03:33.628708" 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-10-11T01:03:33.600639" elapsed="0.028166"/>
</kw>
<msg time="2026-10-11T01:03:33.628964" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:03:33.629006" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:33.600282" elapsed="0.028760"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:33.629317" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:33.629109" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:33.629092" elapsed="0.000295"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.629815" 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-10-11T01:03:33.629593" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:33.630152" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:33.629951" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:33.629921" elapsed="0.000301"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:03:33.630251" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:33.632803" elapsed="0.000115"/>
</kw>
<msg time="2026-10-11T01:03:33.632991" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:33.631624" 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-10-11T01:03:33.633446" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:33.633782" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:03:33.631021" 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-10-11T01:03:33.630543" 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-10-11T01:03:33.565583" elapsed="0.068562"/>
</kw>
<msg time="2026-10-11T01:03:33.634227" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:33.634268" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:33.565035" elapsed="0.069268"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:03:33.634484" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:03:33.634371" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:33.634353" 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-10-11T01:03:33.634887" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:33.635202" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:03:33.635266" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T01:03:33.564437" elapsed="0.070913"/>
</kw>
<msg time="2026-10-11T01:03:33.635454" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:33.635495" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:33.562617" elapsed="0.072913"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:33.635816" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:33.635597" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:33.635582" elapsed="0.000303"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:03:33.562473" elapsed="0.073434"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:03:33.562317" elapsed="0.073632"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:03:33.560173" elapsed="0.075824"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:03:33.558004" elapsed="0.078041"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:33.557586" elapsed="0.078499"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:03:33.556513" elapsed="0.079618"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:33.637001" 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-10-11T01:03:33.637148" 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-10-11T01:03:33.636828" elapsed="0.000344"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:03:33.637525" 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-10-11T01:03:33.637333" elapsed="0.000217"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:33.637845" 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-10-11T01:03:33.638019" 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-10-11T01:03:33.637712" elapsed="0.000332"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:03:33.638369" 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-10-11T01:03:33.638203" elapsed="0.000190"/>
</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-10-11T01:03:33.638658" elapsed="0.002113"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:33.638473" elapsed="0.002332"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:33.638456" elapsed="0.002372"/>
</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-10-11T01:03:33.651579" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:33.651262" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:33.652307" 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-10-11T01:03:33.652119" elapsed="0.000254">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-10-11T01:03:33.652474" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:33.651765" elapsed="0.000732"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.652993" 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-10-11T01:03:33.652671" elapsed="0.000347"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:33.653299" 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-10-11T01:03:33.653433" 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-10-11T01:03:33.653190" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.653872" 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-10-11T01:03:33.653654" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.654832" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:03:33.654603" elapsed="0.000270"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.655325" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:33.655069" elapsed="0.000280"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.655959" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:33.655678" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:33.656835" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:33.656478" elapsed="0.000382"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:33.656904" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T01:03:33.657044" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:33.656154" elapsed="0.000913"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:33.657233" elapsed="0.000193"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:03:33.655545" elapsed="0.001918"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.657974" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:33.657693" elapsed="0.000305"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:33.658847" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:33.658494" elapsed="0.000377"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:33.658915" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T01:03:33.659054" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:33.658166" elapsed="0.000911"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:33.659241" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:33.657563" elapsed="0.001897"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:33.655391" elapsed="0.004100"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:33.659528" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:33.659654" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:33.654243" elapsed="0.005434"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:33.653988" elapsed="0.005746"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:33.659909" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:33.659759" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:33.653970" elapsed="0.006024"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.660833" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:33.660155" elapsed="0.000705"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:33.660904" 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/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-10-11T01:03:33.650744" elapsed="0.010276"/>
</kw>
<msg time="2026-10-11T01:03:33.661069" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:33.646387" elapsed="0.014727"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:33.665208" 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/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-10-11T01:03:33.669312" 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/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-10-11T01:03:33.673377" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:33.673571" 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-10-11T01:03:33.673752" 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-10-11T01:03:33.674102" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:33.673955" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:33.673941" 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-10-11T01:03:33.674329" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:33.674524" 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-10-11T01:03:33.674689" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:33.673902" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:33.673816" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:33.674917" elapsed="0.000065"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:33.675031" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:33.675138" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:33.645784" elapsed="0.029408"/>
</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-10-11T01:03:33.684149" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:33.683833" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:33.684834" 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-10-11T01:03:33.684665" elapsed="0.000229">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-10-11T01:03:33.684994" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:33.684333" elapsed="0.000684"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.685510" 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-10-11T01:03:33.685189" elapsed="0.000346"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:33.685817" 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-10-11T01:03:33.685950" 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-10-11T01:03:33.685710" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.686387" 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-10-11T01:03:33.686172" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:33.686762" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:33.686516" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.687288" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', '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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:33.687027" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:33.686838" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:33.686499" elapsed="0.000865"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.687918" 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-10-11T01:03:33.687540" elapsed="0.000427"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:33.688010" 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/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-10-11T01:03:33.683316" elapsed="0.004797"/>
</kw>
<msg time="2026-10-11T01:03:33.688165" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:33.678982" elapsed="0.009229"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:33.692496" 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/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-10-11T01:03:33.696577" 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/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-10-11T01:03:33.700676" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:33.700857" 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-10-11T01:03:33.701053" 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-10-11T01:03:33.701390" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:33.701245" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:33.701231" 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-10-11T01:03:33.701634" 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-10-11T01:03:33.701814" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:33.701992" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:33.701206" elapsed="0.000835"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:33.701118" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:33.702217" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:33.702282" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:33.702397" 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-10-11T01:03:33.678264" elapsed="0.024178"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:33.703564" 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-10-11T01:03:33.703357" elapsed="0.000266">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-10-11T01:03:33.703705" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:33.703033" elapsed="0.000694"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:33.704061" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:33.703822" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.704588" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:33.704306" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:33.704135" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:33.703804" elapsed="0.000861"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.705181" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:33.704826" elapsed="0.000378"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:33.705249" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:33.705372" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:33.702717" elapsed="0.002679"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.706743" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:33.706523" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.707232" 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-10-11T01:03:33.707018" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.707703" 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-10-11T01:03:33.707486" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.708160" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:33.707946" elapsed="0.000253"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:33.708905" 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-10-11T01:03:33.708745" elapsed="0.000200"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:03:33.709241" 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-10-11T01:03:33.709099" elapsed="0.000165"/>
</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-10-11T01:03:33.709440" elapsed="0.000154"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.710020" 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-10-11T01:03:33.709787" elapsed="0.000274"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:03:33.710099" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:33.710224" 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-10-11T01:03:33.708376" elapsed="0.001871"/>
</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-10-11T01:03:33.725026" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.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-10-11T01:03:33.725104" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:33.725255" 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-10-11T01:03:33.710555" elapsed="0.014726"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:33.710310" elapsed="0.015022"/>
</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-10-11T01:03:33.725567" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:33.725359" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:33.710293" elapsed="0.015359"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.727000" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:33.726689" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:33.726433" elapsed="0.000638"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:33.726400" elapsed="0.000694"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.727663" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:33.727381" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:33.727143" elapsed="0.000592"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:33.727128" elapsed="0.000630"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.728319" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:33.727960" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:33.728638" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:33.728422" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.729153" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:33.728876" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:33.728712" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:33.728390" elapsed="0.000843"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.729757" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:33.729424" elapsed="0.000358"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:33.730066" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:33.729845" elapsed="0.000272"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.730576" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:33.730301" elapsed="0.000299"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:33.730140" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:33.729829" elapsed="0.000822"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:33.730798" elapsed="0.000323"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:33.731535" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:33.731282" elapsed="0.000276"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:33.731713" elapsed="0.000229"/>
</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-10-11T01:03:33.726025" elapsed="0.005973"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:03:33.732147" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-10-11T01:03:33.732061" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:33.732044" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:33.732376" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:03:33.732451" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:03:33.732611" 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-10-11T01:03:33.705720" elapsed="0.026915"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:33.732696" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:33.732861" 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-10-11T01:03:33.641792" elapsed="0.091092"/>
</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-10-11T01:03:33.733196" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:33.732990" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:33.732974" elapsed="0.000304"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:33.733308" elapsed="0.000024"/>
</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-10-11T01:03:33.641126" elapsed="0.092294"/>
</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-10-11T01:03:33.736655" level="INFO">${update} = </msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:03:33.734319" elapsed="0.002363"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:03:33.737199" level="FAIL"> == </msg>
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="FAIL" start="2026-10-11T01:03:33.736839" elapsed="0.000423"> == </status>
</kw>
<return>
<value>${update}</value>
<status status="NOT RUN" start="2026-10-11T01:03:33.737313" elapsed="0.000017"/>
</return>
<doc>Returns hex update message.</doc>
<status status="FAIL" start="2026-10-11T01:03:33.734061" elapsed="0.003375"> == </status>
</kw>
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:35.745367" level="INFO">${update} = ffffffffffffffffffffffffffffffff004c0200000035400101014002008004040000000040050400000064800e1d000105047f010101000412020c00010102030401020000000101000001</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:03:35.738912" elapsed="0.006571"/>
</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-10-11T01:03:35.745909" elapsed="0.000782"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:03:35.746794" elapsed="0.000073"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:03:35.738166" elapsed="0.008934"/>
</kw>
<msg time="2026-10-11T01:03:35.747259" 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-10-11T01:03:33.733609" elapsed="2.013704"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.751668" level="INFO">Length is 152.</msg>
<msg time="2026-10-11T01:03:35.751830" 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-10-11T01:03:35.751061" elapsed="0.000820"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.752825" level="INFO">Length is 152.</msg>
<msg time="2026-10-11T01:03:35.753003" 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-10-11T01:03:35.752264" elapsed="0.000790"/>
</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-10-11T01:03:35.753498" elapsed="0.000626"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:35.754843" 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-10-11T01:03:35.754491" elapsed="0.000405"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:35.755614" 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-10-11T01:03:35.755243" elapsed="0.000425"/>
</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-10-11T01:03:35.756207" elapsed="0.000636"/>
</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-10-11T01:03:35.747799" elapsed="0.009192"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:03:35.757307" elapsed="0.003010"/>
</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-10-11T01:03:35.791868" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:35.791431" elapsed="0.000475"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:35.792892" 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-10-11T01:03:35.792616" elapsed="0.000449">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-10-11T01:03:35.793185" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:35.792144" elapsed="0.001073"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.793908" 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-10-11T01:03:35.793479" elapsed="0.000479"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:35.794345" 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-10-11T01:03:35.794543" 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-10-11T01:03:35.794191" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.795170" 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-10-11T01:03:35.794849" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.796537" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:03:35.796191" elapsed="0.000404"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.797215" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:35.796843" elapsed="0.000406"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.798540" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:35.797726" elapsed="0.000849"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:35.800068" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:35.799398" elapsed="0.000778"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:35.800361" elapsed="0.000069"/>
</return>
<msg time="2026-10-11T01:03:35.800629" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:35.798818" 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-10-11T01:03:35.800899" elapsed="0.000439"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:03:35.797536" elapsed="0.003856"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.802371" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:35.801755" elapsed="0.000680"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:35.804047" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:35.803297" elapsed="0.000861"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:35.804339" elapsed="0.000045"/>
</return>
<msg time="2026-10-11T01:03:35.804598" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:35.802699" elapsed="0.001933"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:35.804866" elapsed="0.000442"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:35.801571" elapsed="0.003791"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:35.797312" elapsed="0.008134"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:35.805507" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T01:03:35.805692" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:35.795702" elapsed="0.010023"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:35.795321" elapsed="0.010446"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:35.806029" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:35.805801" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:35.795294" elapsed="0.010834"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.807105" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:35.806353" elapsed="0.000789"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:35.807260" 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/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-10-11T01:03:35.790210" elapsed="0.017221"/>
</kw>
<msg time="2026-10-11T01:03:35.807503" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:35.780322" elapsed="0.027250"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:35.813497" 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/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-10-11T01:03:35.818870" 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/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-10-11T01:03:35.822989" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:35.823170" 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-10-11T01:03:35.823355" 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-10-11T01:03:35.823719" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:35.823571" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:35.823557" 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-10-11T01:03:35.823961" 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-10-11T01:03:35.824142" 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-10-11T01:03:35.824312" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:35.823529" elapsed="0.000830"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:35.823437" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:35.824548" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:35.824614" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:35.824722" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:35.778867" elapsed="0.045880"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.825803" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:35.825576" elapsed="0.000271"/>
</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-10-11T01:03:35.832892" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:35.832952" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:35.833046" 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-10-11T01:03:35.826154" elapsed="0.006917"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:35.825907" elapsed="0.007201"/>
</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-10-11T01:03:35.833303" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:35.833133" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:35.825890" elapsed="0.007577"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.835472" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:35.834778" elapsed="0.000753"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:35.834438" elapsed="0.001140"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:35.834394" elapsed="0.001218"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.836443" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:35.836037" elapsed="0.000467"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:35.835685" elapsed="0.000865"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:35.835662" elapsed="0.000920"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.837349" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:35.836845" elapsed="0.000540"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:35.837797" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:35.837498" elapsed="0.000372"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.838537" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:35.838145" elapsed="0.000427"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:35.837900" elapsed="0.000718"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:35.837473" elapsed="0.001173"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.839383" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:35.838895" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:35.839820" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:35.839527" elapsed="0.000365"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.840560" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:35.840166" elapsed="0.000428"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:35.839936" elapsed="0.000703"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:35.839503" elapsed="0.001163"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:35.840870" elapsed="0.000422"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:35.841848" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:35.841536" 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-10-11T01:03:35.842110" elapsed="0.000315"/>
</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-10-11T01:03:35.833944" elapsed="0.008562"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:03:35.842571" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T01:03:35.842815" 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-10-11T01:03:35.824998" elapsed="0.017898"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:35.842983" elapsed="0.000037"/>
</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-10-11T01:03:35.762554" elapsed="0.080569"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:35.761592" elapsed="0.081599"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:03:35.760770" elapsed="0.082495"/>
</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-10-11T01:03:35.847805" level="INFO">${update} = ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050412020c00010102030401020000000101000001</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:03:35.844540" elapsed="0.003304"/>
</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-10-11T01:03:35.848110" elapsed="0.000432"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:03:35.848603" elapsed="0.000037"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:03:35.844160" elapsed="0.004581"/>
</kw>
<msg time="2026-10-11T01:03:35.848834" 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-10-11T01:03:35.843539" elapsed="0.005327"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.849984" level="INFO">Length is 140.</msg>
<msg time="2026-10-11T01:03:35.850081" 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-10-11T01:03:35.849637" elapsed="0.000474"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.850676" level="INFO">Length is 140.</msg>
<msg time="2026-10-11T01:03:35.850770" 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-10-11T01:03:35.850329" elapsed="0.000471"/>
</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-10-11T01:03:35.851115" elapsed="0.000393"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:35.851938" 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-10-11T01:03:35.851712" elapsed="0.000260"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:35.852375" 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-10-11T01:03:35.852171" elapsed="0.000255"/>
</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-10-11T01:03:35.852678" elapsed="0.000386"/>
</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-10-11T01:03:35.849149" elapsed="0.003993"/>
</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-10-11T01:03:35.870544" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:35.870227" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:35.871280" 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-10-11T01:03:35.871065" elapsed="0.000283">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-10-11T01:03:35.871446" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:35.870729" elapsed="0.000741"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.871978" 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-10-11T01:03:35.871653" elapsed="0.000351"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:35.872283" 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-10-11T01:03:35.872429" 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-10-11T01:03:35.872171" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.872903" 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-10-11T01:03:35.872681" elapsed="0.000280"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.873891" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:03:35.873661" elapsed="0.000284"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.874378" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:35.874122" elapsed="0.000280"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.875207" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:35.874735" elapsed="0.000496"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:35.876271" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:35.875827" elapsed="0.000484"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:35.876436" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:03:35.876624" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:35.875421" elapsed="0.001227"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:35.876812" elapsed="0.000285"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:03:35.874604" elapsed="0.002531"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.877832" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:35.877364" elapsed="0.000492"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:35.878887" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:35.878465" elapsed="0.000476"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:35.879051" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:03:35.879225" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:35.878038" elapsed="0.001211"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:35.879429" elapsed="0.000270"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:35.877234" elapsed="0.002502"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:35.874460" elapsed="0.005307"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:35.879804" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:35.879945" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:35.873277" elapsed="0.006692"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:35.873024" elapsed="0.006974"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:35.880169" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:35.880020" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:35.873006" elapsed="0.007231"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.881122" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:35.880400" elapsed="0.000749"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:35.881194" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:35.869681" elapsed="0.011612"/>
</kw>
<msg time="2026-10-11T01:03:35.881341" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:35.865281" elapsed="0.016116"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:35.885614" 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/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-10-11T01:03:35.889779" 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/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-10-11T01:03:35.893905" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:35.894097" 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-10-11T01:03:35.894277" 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-10-11T01:03:35.894629" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:35.894483" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:35.894470" 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-10-11T01:03:35.894857" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:35.895048" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:35.895212" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:35.894444" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:35.894342" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:35.895453" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:35.895520" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:35.895627" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:35.864623" elapsed="0.031029"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.896693" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:35.896468" elapsed="0.000267"/>
</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-10-11T01:03:35.901654" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:35.901963" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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+xml', 'Content-Length': '635'} 
 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-path xmlns:a="urn:opendaylight:params:xml:ns:yang:bgp-rib" xmlns:b="urn:opendaylight:params:xml:ns:yang:bgp-types" xmlns:c="urn:opendaylight:params:xml:ns:yang:bgp:mvpn" xmlns:d="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;/a:application-rib[a:id='10.30.170.173']/a:tables[a:afi='b:ipv4-address-family'][a:safi='c:mcast-vpn-subsequent-address-family']/d:mvpn-routes-ipv4&lt;/error-path&gt;&lt;error-message&gt;Data does not exist&lt;/error-message&gt;&lt;error-tag&gt;data-missing&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-10-11T01:03:35.902121" level="INFO">${response} = None</msg>
<msg time="2026-10-11T01:03:35.902161" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:35.897035" elapsed="0.005499">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:35.896795" elapsed="0.005813">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:35.902791" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:35.902638" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-11T01:03:35.896778" elapsed="0.006089">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:35.904114" 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-10-11T01:03:35.903829" elapsed="0.000316">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:03:35.903588" elapsed="0.000614">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:03:35.903571" elapsed="0.000660">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-10-11T01:03:35.904808" 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-10-11T01:03:35.904545" elapsed="0.000292">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:03:35.904293" elapsed="0.000600">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:03:35.904277" elapsed="0.000656">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.905638" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:35.905124" elapsed="0.000540"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:35.905953" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:35.905729" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.906480" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:35.906193" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:35.906029" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:35.905711" elapsed="0.000845"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.907081" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:35.906732" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:35.907380" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:35.907169" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.907898" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:35.907635" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:35.907470" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:35.907153" elapsed="0.000858"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:35.908157" elapsed="0.000310"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:35.908854" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:35.908634" elapsed="0.000244"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-10-11T01:03:35.909203" 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-10-11T01:03:35.909042" elapsed="0.000191">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-10-11T01:03:35.903208" elapsed="0.006146">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-10-11T01:03:35.909453" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:35.909707" level="INFO">${response_text} = None</msg>
<msg time="2026-10-11T01:03:35.909734" 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-10-11T01:03:35.895885" elapsed="0.013875">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-10-11T01:03:35.909816" elapsed="0.000024"/>
</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-10-11T01:03:35.854507" elapsed="0.055461">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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:35.853948" elapsed="0.056076"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:03:35.853440" elapsed="0.056636"/>
</kw>
<arg>leaf_ad</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-10-11T01:03:33.636385" elapsed="2.273735"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:33.556107" elapsed="2.354116"/>
</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-10-11T01:03:35.911575" elapsed="0.000202"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:03:35.911303" 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-10-11T01:03:35.912761" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:35.912675" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:35.912657" elapsed="0.000166"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:35.914941" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:35.914846" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:35.914828" elapsed="0.000176"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.915913" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:35.915589" elapsed="0.000363"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.916370" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:03:35.916108" elapsed="0.000287"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:03:35.916451" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:35.916579" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:03:35.915214" elapsed="0.001388"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:35.919106" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:35.919021" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:35.919002" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:35.920222" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:35.920140" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:35.920123" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:35.920625" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:03:35.920454" elapsed="0.000195"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:03:35.920968" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:35.920813" elapsed="0.000179"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:03:35.953940" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:03:35.921499" elapsed="0.032534"/>
</kw>
<msg time="2026-10-11T01:03:35.954215" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:03:35.954258" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:35.921150" elapsed="0.033143"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:03:35.984298" 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-10-11T01:03:35.954820" elapsed="0.029576"/>
</kw>
<msg time="2026-10-11T01:03:35.984564" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:03:35.984605" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:35.954480" elapsed="0.030160"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:35.984914" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:35.984709" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:35.984691" elapsed="0.000310"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.985425" 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-10-11T01:03:35.985182" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:35.985751" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:35.985552" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:35.985535" elapsed="0.000286"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:03:35.985850" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:35.988384" elapsed="0.000135"/>
</kw>
<msg time="2026-10-11T01:03:35.988576" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:35.987207" 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-10-11T01:03:35.989030" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:35.989362" 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-10-11T01:03:35.986623" elapsed="0.002944"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:03:35.986140" 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-10-11T01:03:35.919868" elapsed="0.069832"/>
</kw>
<msg time="2026-10-11T01:03:35.989782" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:35.989821" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:35.919321" elapsed="0.070535"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:03:35.990029" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:03:35.989944" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:35.989907" elapsed="0.000198"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:35.990445" 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-10-11T01:03:35.990748" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:03:35.990811" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T01:03:35.918720" elapsed="0.072175"/>
</kw>
<msg time="2026-10-11T01:03:35.991032" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:35.991073" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:35.916945" elapsed="0.074163"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:35.991507" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:35.991207" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:35.991190" elapsed="0.000390"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:03:35.916787" elapsed="0.074815"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:03:35.916648" elapsed="0.074980"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:03:35.914549" elapsed="0.077127"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:03:35.912396" elapsed="0.079330"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:35.911995" elapsed="0.079772"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:03:35.910958" elapsed="0.080855"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.992884" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:35.992477" elapsed="0.000434"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.993513" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:35.993111" elapsed="0.000428"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:35.994077" 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-10-11T01:03:35.993723" elapsed="0.000379"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:35.994426" 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-10-11T01:03:35.994556" 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-10-11T01:03:35.994270" elapsed="0.000310"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:35.994878" 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-10-11T01:03:35.995006" 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-10-11T01:03:35.994744" elapsed="0.000286"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:03:35.995172" elapsed="0.002466"/>
</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-10-11T01:03:35.997796" elapsed="0.002342"/>
</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-10-11T01:03:36.016091" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:36.015764" elapsed="0.000355"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:36.016842" 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-10-11T01:03:36.016628" elapsed="0.000286">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-10-11T01:03:36.017014" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:36.016288" elapsed="0.000748"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:36.017535" 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-10-11T01:03:36.017211" elapsed="0.000349"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:36.017839" 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-10-11T01:03:36.018033" 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-10-11T01:03:36.017728" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:36.018491" 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-10-11T01:03:36.018255" elapsed="0.000280"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:36.019474" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:36.019220" elapsed="0.000296"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:36.019957" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:36.019693" elapsed="0.000289"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:36.020781" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:36.020306" elapsed="0.000499"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:36.021964" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:36.021436" elapsed="0.000616"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:36.022135" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T01:03:36.022352" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:36.020989" 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-10-11T01:03:36.022566" elapsed="0.000317"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:03:36.020172" elapsed="0.002760"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:36.023616" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:36.023167" elapsed="0.000473"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:36.024766" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:36.024244" elapsed="0.000610"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:36.024945" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:03:36.025154" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:36.023809" 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-10-11T01:03:36.025343" elapsed="0.000370"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:36.023035" elapsed="0.002716"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:36.020028" elapsed="0.005755"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:36.025820" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:36.025959" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:36.018862" elapsed="0.007121"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:36.018602" elapsed="0.007411"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:36.026192" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:36.026035" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:36.018581" elapsed="0.007679"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:36.027179" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-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-10-11T01:03:36.026475" elapsed="0.000732"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:36.027251" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:36.015237" elapsed="0.012113"/>
</kw>
<msg time="2026-10-11T01:03:36.027401" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:36.010827" elapsed="0.016673"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:36.031624" 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/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-10-11T01:03:36.035716" 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/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-10-11T01:03:36.039810" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:36.040003" 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-10-11T01:03:36.040185" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:36.040537" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:36.040374" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:36.040361" 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-10-11T01:03:36.040766" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:36.040963" 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-10-11T01:03:36.041129" elapsed="0.000017"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:36.040337" elapsed="0.000838"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:36.040249" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:36.041351" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:36.041431" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:03:36.041542" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-i...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:03:36.010136" elapsed="0.031431"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:36.042687" 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-10-11T01:03:36.042493" elapsed="0.000254">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-10-11T01:03:36.042830" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:36.042150" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:36.043146" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:36.042914" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:36.043708" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:36.043446" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:36.043248" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:36.042897" elapsed="0.000886"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:36.044288" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:36.043955" elapsed="0.000357"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:36.044356" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:36.044496" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:36.041838" elapsed="0.002681"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:36.045650" 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-10-11T01:03:36.045418" elapsed="0.000292">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-10-11T01:03:36.045794" 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-10-11T01:03:36.045081" elapsed="0.000735"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:03:36.045989" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:03:36.045879" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:36.045862" elapsed="0.000205"/>
</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-10-11T01:03:36.046224" elapsed="0.000019"/>
</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-10-11T01:03:36.046400" elapsed="0.000035"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:03:36.046476" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:03:36.046599" 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-10-11T01:03:36.044770" elapsed="0.001852"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:36.047848" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:36.047628" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:36.048493" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:36.048094" elapsed="0.000440"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:36.053538" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:36.053685" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:36.053775" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:36.048828" elapsed="0.005311">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:36.048595" elapsed="0.005620">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:36.054423" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:36.054247" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-10-11T01:03:36.048578" elapsed="0.005958">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:36.054885" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:36.055019" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:36.054986" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:36.054969" elapsed="0.000107"/>
</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-10-11T01:03:36.055219" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:03:36.055286" 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-10-11T01:03:36.046906" elapsed="0.008475">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:36.055465" 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-10-11T01:03:36.002707" elapsed="0.052845">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:36.055796" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:36.055635" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:36.055619" elapsed="0.000263"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:36.055912" 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-10-11T01:03:36.002075" elapsed="0.053939">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:38.091593" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:38.090819" elapsed="0.000840"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:38.093357" 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-10-11T01:03:38.092903" elapsed="0.000640">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-10-11T01:03:38.093736" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:38.092044" elapsed="0.001744"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.094966" 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-10-11T01:03:38.094201" elapsed="0.000826"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:38.095682" 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-10-11T01:03:38.096001" 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-10-11T01:03:38.095400" elapsed="0.000657"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.097196" 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-10-11T01:03:38.096661" elapsed="0.000632"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.099509" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:38.098959" elapsed="0.000647"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.100615" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:38.100019" elapsed="0.000651"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.102507" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:38.101442" elapsed="0.001122"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:38.104957" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:38.104004" elapsed="0.001076"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:38.105198" elapsed="0.000049"/>
</return>
<msg time="2026-10-11T01:03:38.105543" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:38.102966" elapsed="0.002611"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:38.105813" elapsed="0.000451"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:03:38.101116" elapsed="0.005201"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.107289" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:38.106669" elapsed="0.000654"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:38.108969" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:38.108222" elapsed="0.000872"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:38.109206" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T01:03:38.109593" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:38.107603" elapsed="0.002023"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:38.109858" elapsed="0.000432"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:38.106485" elapsed="0.003857"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:38.100769" elapsed="0.009616"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:38.110488" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T01:03:38.110668" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:38.098097" elapsed="0.012604"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.097471" elapsed="0.013270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.111004" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.110773" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.097396" elapsed="0.013705"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.112081" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-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-10-11T01:03:38.111325" elapsed="0.000793"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:38.112179" 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/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-10-11T01:03:38.089536" elapsed="0.022782"/>
</kw>
<msg time="2026-10-11T01:03:38.112386" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:38.078982" elapsed="0.033539"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:38.120211" 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/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-10-11T01:03:38.125990" 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/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-10-11T01:03:38.131476" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.131662" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.131845" 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-10-11T01:03:38.132201" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.132051" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:38.132038" 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-10-11T01:03:38.132446" 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-10-11T01:03:38.132630" 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-10-11T01:03:38.132797" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:38.132011" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:38.131911" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.133035" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:38.133103" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:38.133216" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-i...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:03:38.077552" elapsed="0.055691"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:38.134373" 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-10-11T01:03:38.134181" elapsed="0.000271">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-10-11T01:03:38.134537" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:38.133837" elapsed="0.000722"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.134846" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.134624" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.135380" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:38.135119" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.134935" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.134606" elapsed="0.000896"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.136016" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:38.135665" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:38.136085" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:38.136209" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:38.133531" elapsed="0.002701"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:38.137324" 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-10-11T01:03:38.137140" elapsed="0.000242">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-10-11T01:03:38.137482" 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-10-11T01:03:38.136803" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:03:38.137665" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:03:38.137568" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.137551" elapsed="0.000191"/>
</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-10-11T01:03:38.137897" elapsed="0.000032"/>
</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-10-11T01:03:38.138088" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:03:38.138147" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:03:38.138268" 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-10-11T01:03:38.136505" elapsed="0.001786"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.139595" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:38.139353" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.140060" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:38.139830" elapsed="0.000270"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:38.146143" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:38.146289" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:38.146388" 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-10-11T01:03:38.140391" elapsed="0.006042"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.140159" elapsed="0.006316"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.146665" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.146500" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.140143" elapsed="0.006601"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.148165" 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-10-11T01:03:38.147815" elapsed="0.000396"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.147573" elapsed="0.000671"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.147556" elapsed="0.000711"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.148888" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:38.148616" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.148345" elapsed="0.000630"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.148302" elapsed="0.000696"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.149550" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:38.149181" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.149853" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.149638" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.150370" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:38.150108" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.149944" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.149622" elapsed="0.000841"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.150996" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:38.150649" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.151293" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.151084" elapsed="0.000261"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.151803" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:38.151543" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.151366" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.151067" elapsed="0.000812"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:38.152036" elapsed="0.000290"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:38.152731" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:38.152505" elapsed="0.000251"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:38.152909" elapsed="0.000224"/>
</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-10-11T01:03:38.147214" elapsed="0.005975"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:38.153334" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:38.153251" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.153234" elapsed="0.000159"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:38.154188" 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-10-11T01:03:38.153553" elapsed="0.000662"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:38.154262" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:38.154387" 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-10-11T01:03:38.138584" elapsed="0.015843"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:38.154483" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:03:38.154602" 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-10-11T01:03:38.061162" elapsed="0.093464"/>
</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-10-11T01:03:38.165356" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:38.165050" elapsed="0.000377"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:38.166145" 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-10-11T01:03:38.165910" elapsed="0.000354">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-10-11T01:03:38.166446" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:38.165590" elapsed="0.000881"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.166963" 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-10-11T01:03:38.166645" elapsed="0.000343"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:38.167263" 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-10-11T01:03:38.167393" 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-10-11T01:03:38.167155" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.167850" 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-10-11T01:03:38.167633" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:38.168266" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.167968" elapsed="0.000353"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.168975" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:38.168512" elapsed="0.000489"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.168343" elapsed="0.000691"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.167951" elapsed="0.001102"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.169639" 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-10-11T01:03:38.169217" elapsed="0.000449"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:38.169709" 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/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-10-11T01:03:38.164533" elapsed="0.005277"/>
</kw>
<msg time="2026-10-11T01:03:38.169861" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:38.160131" elapsed="0.009775"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:38.174052" 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/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-10-11T01:03:38.178168" 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/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-10-11T01:03:38.182437" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.182623" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.182806" 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-10-11T01:03:38.183165" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.183017" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:38.183003" 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-10-11T01:03:38.183393" 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-10-11T01:03:38.183591" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.183756" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:38.182977" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:38.182872" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.183996" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:38.184063" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:38.184186" 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-10-11T01:03:38.159399" elapsed="0.024812"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:38.184379" elapsed="0.000332"/>
</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-10-11T01:03:38.185760" 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-10-11T01:03:38.185362" elapsed="0.000425"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:38.186318" 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-10-11T01:03:38.185948" elapsed="0.000396"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:03:38.186543" elapsed="0.000281"/>
</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-10-11T01:03:38.184997" elapsed="0.001882"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.184781" elapsed="0.002126"/>
</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-10-11T01:03:38.187154" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.186976" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.184763" elapsed="0.002460"/>
</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-10-11T01:03:38.155667" elapsed="0.031599"/>
</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-10-11T01:03:38.154905" elapsed="0.032425"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.154699" elapsed="0.032718"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.154683" elapsed="0.032758"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:38.187472" 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="PASS" start="2026-10-11T01:03:38.059590" elapsed="0.127983"/>
</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-10-11T01:03:36.000339" elapsed="2.187285"/>
</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-10-11T01:03:38.203392" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:38.203089" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:38.204118" 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-10-11T01:03:38.203911" elapsed="0.000266">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-10-11T01:03:38.204261" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:38.203594" elapsed="0.000690"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.204781" 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-10-11T01:03:38.204474" elapsed="0.000332"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:38.205098" 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-10-11T01:03:38.205212" 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-10-11T01:03:38.204988" elapsed="0.000248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.205671" 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-10-11T01:03:38.205450" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.206626" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:38.206379" elapsed="0.000289"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.207121" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:38.206846" elapsed="0.000299"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.207905" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:38.207471" elapsed="0.000472"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:38.209086" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:38.208561" elapsed="0.000614"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:38.209256" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T01:03:38.209495" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:38.208116" 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-10-11T01:03:38.209702" elapsed="0.000318"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/effective-rib-in</var>
<status status="PASS" start="2026-10-11T01:03:38.207324" elapsed="0.002734"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.210746" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:38.210287" elapsed="0.000483"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:38.212059" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:38.211541" elapsed="0.000638"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:38.212263" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:03:38.212502" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:38.211071" elapsed="0.001455"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:38.212692" elapsed="0.000318"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:38.210157" elapsed="0.002892"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:38.207187" elapsed="0.005893"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:38.213118" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:38.213248" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:38.206036" elapsed="0.007236"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.205773" elapsed="0.007527"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.213581" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.213322" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.205755" elapsed="0.007898"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.214322" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-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-10-11T01:03:38.213813" elapsed="0.000535"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:38.214392" 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/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-10-11T01:03:38.202564" elapsed="0.011945"/>
</kw>
<msg time="2026-10-11T01:03:38.214556" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:38.198002" elapsed="0.016598"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:38.218924" 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/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-10-11T01:03:38.223057" 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/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-10-11T01:03:38.227166" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.227347" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.227545" 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-10-11T01:03:38.227883" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.227736" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:38.227723" 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-10-11T01:03:38.228165" 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-10-11T01:03:38.228346" 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-10-11T01:03:38.228525" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:38.227698" elapsed="0.000875"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:38.227611" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.228748" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:38.228813" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:38.228937" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-ro...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:03:38.197380" elapsed="0.031583"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:38.230068" 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-10-11T01:03:38.229870" elapsed="0.000257">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-10-11T01:03:38.230210" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:38.229546" elapsed="0.000687"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.230533" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.230295" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.231054" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:38.230776" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.230608" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.230278" elapsed="0.000852"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.231645" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:38.231292" elapsed="0.000377"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:38.231713" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:38.231837" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:38.229228" elapsed="0.002631"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:38.232967" 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-10-11T01:03:38.232768" elapsed="0.000258">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-10-11T01:03:38.233110" 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-10-11T01:03:38.232442" elapsed="0.000690"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:03:38.233291" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:03:38.233194" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.233177" elapsed="0.000190"/>
</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-10-11T01:03:38.233537" 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-10-11T01:03:38.233714" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:03:38.233771" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:03:38.233897" 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-10-11T01:03:38.232125" elapsed="0.001808"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.235206" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:38.234979" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.235676" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:38.235455" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:38.240680" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:38.240791" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:38.240879" 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-10-11T01:03:38.236045" elapsed="0.004857"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.235775" elapsed="0.005180"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.241134" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.240980" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.235758" elapsed="0.005452"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.242501" 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-10-11T01:03:38.242151" elapsed="0.000395"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.241892" elapsed="0.000686"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.241875" elapsed="0.000726"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.243217" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:38.242890" elapsed="0.000368"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.242651" elapsed="0.000639"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.242635" elapsed="0.000677"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.243851" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:38.243509" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.244163" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.243951" elapsed="0.000264"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.244678" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:38.244400" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.244237" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.243934" elapsed="0.000819"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.245283" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:38.244947" elapsed="0.000360"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.245596" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.245370" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.246107" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:38.245831" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.245669" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.245353" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:38.246324" elapsed="0.000315"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:38.247071" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:38.246834" elapsed="0.000262"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:38.247249" elapsed="0.000227"/>
</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-10-11T01:03:38.241554" elapsed="0.005978"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:38.247676" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:38.247593" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.247576" elapsed="0.000160"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:38.248490" 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-10-11T01:03:38.247876" elapsed="0.000641"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:38.248563" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:38.248688" 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-10-11T01:03:38.234248" elapsed="0.014464"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:38.248766" elapsed="0.000023"/>
</return>
<msg time="2026-10-11T01:03:38.248883" 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-10-11T01:03:38.190110" elapsed="0.058796"/>
</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-10-11T01:03:38.259598" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:38.259277" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:38.260336" 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-10-11T01:03:38.260112" elapsed="0.000365">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-10-11T01:03:38.260639" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:38.259782" elapsed="0.000880"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.261156" 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-10-11T01:03:38.260837" elapsed="0.000344"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:38.261470" 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-10-11T01:03:38.261599" 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-10-11T01:03:38.261345" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.262051" 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-10-11T01:03:38.261820" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:38.262516" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.262156" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.263215" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:38.262742" elapsed="0.000499"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.262595" elapsed="0.000679"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.262139" elapsed="0.001154"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.263882" 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-10-11T01:03:38.263489" elapsed="0.000420"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:38.263964" 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/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-10-11T01:03:38.258765" elapsed="0.005300"/>
</kw>
<msg time="2026-10-11T01:03:38.264116" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:38.254359" elapsed="0.009801"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:38.268354" 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/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-10-11T01:03:38.272474" 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/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-10-11T01:03:38.276690" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.276873" 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-10-11T01:03:38.277072" 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-10-11T01:03:38.277425" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.277266" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:38.277252" 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-10-11T01:03:38.277652" 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-10-11T01:03:38.277830" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.278005" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:38.277227" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:38.277139" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.278227" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:38.278324" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:03:38.278463" 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-10-11T01:03:38.253610" elapsed="0.024879"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:38.278657" elapsed="0.000328"/>
</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-10-11T01:03:38.280040" 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-10-11T01:03:38.279644" elapsed="0.000424"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:38.280606" 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-10-11T01:03:38.280218" elapsed="0.000415"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:03:38.280814" elapsed="0.000290"/>
</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-10-11T01:03:38.279255" elapsed="0.001902"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.279055" elapsed="0.002132"/>
</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-10-11T01:03:38.281385" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.281210" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.279039" elapsed="0.002430"/>
</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-10-11T01:03:38.249865" elapsed="0.031647"/>
</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-10-11T01:03:38.249196" elapsed="0.032381"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.248992" elapsed="0.032626"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.248976" elapsed="0.032669"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:38.281674" elapsed="0.000026"/>
</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-10-11T01:03:38.189492" elapsed="0.092282"/>
</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-10-11T01:03:38.187814" elapsed="0.094012"/>
</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-10-11T01:03:38.297520" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:38.297200" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:38.298524" 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-10-11T01:03:38.298211" elapsed="0.000383">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-10-11T01:03:38.298688" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:38.297719" elapsed="0.000993"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.299282" 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-10-11T01:03:38.298955" elapsed="0.000353"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:38.299619" 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-10-11T01:03:38.299750" 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-10-11T01:03:38.299499" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.300248" 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-10-11T01:03:38.300024" elapsed="0.000267"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.301286" 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-10-11T01:03:38.301053" elapsed="0.000275"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.301781" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:38.301524" elapsed="0.000281"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.302613" 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-10-11T01:03:38.302141" elapsed="0.000497"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:38.303785" 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-10-11T01:03:38.303249" elapsed="0.000625"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:38.303972" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T01:03:38.304194" 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-10-11T01:03:38.302810" 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-10-11T01:03:38.304388" elapsed="0.000339"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:03:38.302007" elapsed="0.002758"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.305466" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:38.305007" elapsed="0.000483"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:38.306629" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:38.306099" elapsed="0.000620"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:38.306798" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:03:38.307022" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:38.305659" elapsed="0.001388"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:38.307211" elapsed="0.000373"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:38.304866" elapsed="0.002756"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:38.301850" elapsed="0.005804"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:38.307691" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:38.307819" 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-10-11T01:03:38.300677" elapsed="0.007165"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.300361" elapsed="0.007510"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.308060" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.307895" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.300339" elapsed="0.007789"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.308860" 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-10-11T01:03:38.308289" elapsed="0.000597"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:38.308950" 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/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-10-11T01:03:38.296679" elapsed="0.012372"/>
</kw>
<msg time="2026-10-11T01:03:38.309134" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:38.292181" elapsed="0.016999"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:38.313557" 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/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-10-11T01:03:38.317646" 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/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-10-11T01:03:38.321724" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.321905" 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-10-11T01:03:38.322099" 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-10-11T01:03:38.322450" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.322292" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:38.322278" 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-10-11T01:03:38.322679" 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-10-11T01:03:38.322857" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.323034" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:38.322253" elapsed="0.000829"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:38.322164" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.323258" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:38.323323" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:38.323447" 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-10-11T01:03:38.291579" elapsed="0.031895"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:38.324586" 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-10-11T01:03:38.324383" elapsed="0.000262">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-10-11T01:03:38.324728" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:38.324060" elapsed="0.000691"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.325086" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.324848" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.325624" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:38.325341" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.325161" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.324830" elapsed="0.000870"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.326213" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:38.325863" elapsed="0.000374"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:38.326281" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:38.326421" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:38.323744" elapsed="0.002701"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:38.327526" 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-10-11T01:03:38.327326" elapsed="0.000258">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-10-11T01:03:38.327668" 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-10-11T01:03:38.327008" elapsed="0.000682"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:03:38.327851" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:03:38.327753" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.327735" elapsed="0.000204"/>
</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-10-11T01:03:38.328094" elapsed="0.000019"/>
</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-10-11T01:03:38.328268" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:03:38.328325" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:03:38.328466" 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-10-11T01:03:38.326695" elapsed="0.001794"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.329715" 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-10-11T01:03:38.329492" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.330174" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:38.329958" elapsed="0.000255"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:38.335577" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:38.335717" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:03:38.335804" 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-10-11T01:03:38.330513" elapsed="0.005315"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.330271" elapsed="0.005594"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.336057" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.335889" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.330254" elapsed="0.005881"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.337404" 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-10-11T01:03:38.337070" elapsed="0.000427"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.336814" elapsed="0.000716"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.336797" elapsed="0.000756"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.338135" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:38.337848" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.337605" elapsed="0.000603"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.337589" elapsed="0.000641"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.338781" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:38.338430" elapsed="0.000377"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.339096" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.338870" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.339617" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:38.339335" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.339170" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.338853" elapsed="0.000843"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.340226" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:38.339872" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.340540" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.340314" elapsed="0.000277"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.341048" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:38.340775" elapsed="0.000298"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.340613" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.340298" elapsed="0.000827"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:38.341270" elapsed="0.000306"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:38.341971" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:38.341737" elapsed="0.000259"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:38.342149" elapsed="0.000211"/>
</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-10-11T01:03:38.336479" elapsed="0.005953"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:38.342577" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:38.342495" elapsed="0.000122"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.342478" elapsed="0.000159"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:38.343403" 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-10-11T01:03:38.342779" elapsed="0.000667"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:38.343493" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:38.343621" 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-10-11T01:03:38.328766" elapsed="0.014880"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:38.343702" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:03:38.343824" 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-10-11T01:03:38.284311" elapsed="0.059537"/>
</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-10-11T01:03:38.355651" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:38.355332" elapsed="0.000346"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:38.356383" 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-10-11T01:03:38.356165" elapsed="0.000356">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-10-11T01:03:38.356683" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:38.355835" elapsed="0.000871"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.357196" 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-10-11T01:03:38.356879" elapsed="0.000343"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:38.357513" 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-10-11T01:03:38.357635" 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-10-11T01:03:38.357388" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.358081" 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-10-11T01:03:38.357850" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:38.358500" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.358187" elapsed="0.000369"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.359186" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:38.358726" elapsed="0.000485"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.358579" elapsed="0.000665"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.358169" elapsed="0.001095"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.359829" 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-10-11T01:03:38.359444" elapsed="0.000411"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:38.359899" 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/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-10-11T01:03:38.354819" elapsed="0.005201"/>
</kw>
<msg time="2026-10-11T01:03:38.360071" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:38.350394" elapsed="0.009722"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:38.364264" 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/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-10-11T01:03:38.368471" 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-10-11T01:03:38.372793" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.372989" 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-10-11T01:03:38.373173" 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-10-11T01:03:38.373538" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.373369" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:38.373355" 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-10-11T01:03:38.373766" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.373958" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.374127" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:38.373330" elapsed="0.000845"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:38.373240" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.374351" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:38.374432" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:03:38.374555" 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-10-11T01:03:38.349662" elapsed="0.024919"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:38.374750" elapsed="0.000330"/>
</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-10-11T01:03:38.376126" 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-10-11T01:03:38.375727" elapsed="0.000427"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:38.376698" 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-10-11T01:03:38.376307" 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-10-11T01:03:38.376906" elapsed="0.000291"/>
</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-10-11T01:03:38.375350" elapsed="0.001903"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.375150" elapsed="0.002134"/>
</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-10-11T01:03:38.377515" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.377306" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.375133" elapsed="0.002486"/>
</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-10-11T01:03:38.344854" elapsed="0.032810"/>
</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-10-11T01:03:38.344180" elapsed="0.033549"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.343972" elapsed="0.033797"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.343954" elapsed="0.033836"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:38.377820" elapsed="0.000027"/>
</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-10-11T01:03:38.283691" elapsed="0.094242"/>
</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-10-11T01:03:38.282027" elapsed="0.095960"/>
</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-10-11T01:03:38.378140" elapsed="0.002938"/>
</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-10-11T01:03:38.396762" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:38.396456" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:38.397468" 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-10-11T01:03:38.397279" elapsed="0.000248">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-10-11T01:03:38.397612" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:38.396960" elapsed="0.000675"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.398131" 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-10-11T01:03:38.397811" elapsed="0.000345"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:38.398446" 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-10-11T01:03:38.398563" 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-10-11T01:03:38.398323" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.399011" 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-10-11T01:03:38.398782" elapsed="0.000271"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.399970" 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-10-11T01:03:38.399722" elapsed="0.000291"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.400459" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:38.400192" elapsed="0.000292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.401250" 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-10-11T01:03:38.400799" elapsed="0.000475"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:38.402420" 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-10-11T01:03:38.401893" elapsed="0.000617"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:38.402590" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:03:38.402801" 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-10-11T01:03:38.401467" elapsed="0.001358"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:38.403044" elapsed="0.000309"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:03:38.400666" elapsed="0.002725"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.404102" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:38.403645" elapsed="0.000481"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:38.405266" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:38.404748" elapsed="0.000608"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:38.405459" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:03:38.405670" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:38.404296" 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-10-11T01:03:38.405861" elapsed="0.000315"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:38.403513" elapsed="0.002702"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:38.400527" elapsed="0.005720"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:38.406284" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:38.406492" 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-10-11T01:03:38.399364" elapsed="0.007154"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.399114" elapsed="0.007434"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.406723" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.406571" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.399096" elapsed="0.007697"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.407520" 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-10-11T01:03:38.406962" elapsed="0.000585"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:38.407591" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:38.395933" elapsed="0.011758"/>
</kw>
<msg time="2026-10-11T01:03:38.407739" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:38.391470" elapsed="0.016313"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:38.412202" 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/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-10-11T01:03:38.416349" 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/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-10-11T01:03:38.420495" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.420709" 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-10-11T01:03:38.420895" elapsed="0.000030"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.421249" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.421101" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:38.421087" 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-10-11T01:03:38.421494" 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-10-11T01:03:38.421678" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.421843" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:38.421061" elapsed="0.000829"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:38.420972" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.422080" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:38.422147" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:38.422256" 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-10-11T01:03:38.390851" elapsed="0.031429"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:38.423393" 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-10-11T01:03:38.423207" elapsed="0.000260">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-10-11T01:03:38.423551" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:38.422867" elapsed="0.000707"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.423859" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.423638" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.424383" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:38.424120" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.423948" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.423621" elapsed="0.000855"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.424993" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:38.424643" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:38.425063" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:38.425187" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:38.422562" elapsed="0.002648"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:38.426251" 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-10-11T01:03:38.426108" elapsed="0.000191"/>
</kw>
<msg time="2026-10-11T01:03:38.426375" 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-10-11T01:03:38.425776" elapsed="0.000621"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:03:38.426576" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:38.426477" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.426460" elapsed="0.000176"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:38.426964" 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-10-11T01:03:38.427079" 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-10-11T01:03:38.426822" elapsed="0.000280"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:03:38.427468" 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-10-11T01:03:38.427266" elapsed="0.000226"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:03:38.427535" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:38.427660" 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-10-11T01:03:38.425475" elapsed="0.002207"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.428908" 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-10-11T01:03:38.428685" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.429373" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:38.429157" elapsed="0.000272"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:38.434157" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:38.434273" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:03:38.434371" 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-10-11T01:03:38.429717" elapsed="0.004680"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.429489" elapsed="0.004967"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.434642" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.434480" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.429473" elapsed="0.005247"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.436001" 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-10-11T01:03:38.435654" elapsed="0.000394"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.435395" elapsed="0.000686"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.435375" elapsed="0.000729"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.436682" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:38.436396" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.436154" elapsed="0.000600"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.436139" elapsed="0.000637"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.437309" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:38.436967" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.437629" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.437397" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.438144" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:38.437868" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.437703" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.437380" elapsed="0.000841"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.438750" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:38.438398" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.439105" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.438869" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.439630" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:38.439343" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.439179" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.438852" elapsed="0.000855"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:38.439853" elapsed="0.000304"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:38.440555" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:38.440320" elapsed="0.000260"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:38.440735" elapsed="0.000223"/>
</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-10-11T01:03:38.435050" elapsed="0.005973"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:38.441169" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:38.441086" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.441069" elapsed="0.000161"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:38.442035" 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-10-11T01:03:38.441372" elapsed="0.000690"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:38.442109" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:38.442235" 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-10-11T01:03:38.427971" elapsed="0.014288"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:38.442314" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:03:38.442450" 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-10-11T01:03:38.383610" elapsed="0.058865"/>
</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-10-11T01:03:38.453116" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:38.452802" elapsed="0.000340"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:38.453849" 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-10-11T01:03:38.453633" elapsed="0.000347">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-10-11T01:03:38.454142" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:38.453301" elapsed="0.000865"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.454672" 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-10-11T01:03:38.454341" elapsed="0.000356"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:38.454982" 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-10-11T01:03:38.455128" 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-10-11T01:03:38.454864" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.455584" 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-10-11T01:03:38.455346" elapsed="0.000280"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:38.456000" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.455687" elapsed="0.000368"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.456695" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:38.456225" elapsed="0.000495"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:38.456077" elapsed="0.000676"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:38.455670" elapsed="0.001103"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.457329" 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-10-11T01:03:38.456951" elapsed="0.000404"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:38.457399" 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/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-10-11T01:03:38.452287" elapsed="0.005241"/>
</kw>
<msg time="2026-10-11T01:03:38.457575" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:38.447863" elapsed="0.009756"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:38.461737" 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/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-10-11T01:03:38.465839" 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/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-10-11T01:03:38.470060" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.470243" 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-10-11T01:03:38.470439" 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-10-11T01:03:38.470781" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.470636" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:38.470622" 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-10-11T01:03:38.471049" 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-10-11T01:03:38.471234" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.471400" elapsed="0.000033"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:38.470596" elapsed="0.000867"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:38.470506" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:38.471641" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:38.471707" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:38.471813" 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-10-11T01:03:38.447141" elapsed="0.024697"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:38.472015" elapsed="0.000315"/>
</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-10-11T01:03:38.473229" 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-10-11T01:03:38.472991" elapsed="0.000264"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:38.473979" 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-10-11T01:03:38.473420" elapsed="0.000586"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:03:38.474475" 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-10-11T01:03:38.474649" 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-10-11T01:03:38.474190" elapsed="0.000523">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-10-11T01:03:38.472617" elapsed="0.002230">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-10-11T01:03:38.472399" elapsed="0.002566">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-10-11T01:03:38.475181" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:38.475001" elapsed="0.000231"/>
</branch>
<status status="FAIL" start="2026-10-11T01:03:38.472383" elapsed="0.002870">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-10-11T01:03:38.443439" elapsed="0.031926">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-10-11T01:03:38.442751" elapsed="0.032763">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-10-11T01:03:38.442548" elapsed="0.033044">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-10-11T01:03:38.442532" elapsed="0.033092">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-10-11T01:03:38.475667" elapsed="0.000015"/>
</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-10-11T01:03:38.382985" elapsed="0.092790">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-10-11T01:03:40.511277" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:40.510548" elapsed="0.000794"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:40.512981" 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-10-11T01:03:40.512521" elapsed="0.000606">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-10-11T01:03:40.513317" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:40.511745" elapsed="0.001624"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.514553" 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-10-11T01:03:40.513801" elapsed="0.000811"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:40.515256" 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-10-11T01:03:40.515615" 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-10-11T01:03:40.515006" elapsed="0.000666"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.516655" 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-10-11T01:03:40.516123" elapsed="0.000628"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.518880" 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-10-11T01:03:40.518324" elapsed="0.000684"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.520026" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:40.519437" elapsed="0.000645"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.521711" 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-10-11T01:03:40.520820" elapsed="0.000926"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:40.523353" 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-10-11T01:03:40.522628" elapsed="0.000874"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:40.523620" elapsed="0.000047"/>
</return>
<msg time="2026-10-11T01:03:40.523935" 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-10-11T01:03:40.522004" elapsed="0.001966"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:40.524203" elapsed="0.000482"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:03:40.520522" elapsed="0.004216"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.525710" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:40.525079" elapsed="0.000665"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:40.527381" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:40.526674" elapsed="0.000881"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:40.527667" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T01:03:40.527975" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:40.525997" elapsed="0.002011"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:40.528237" elapsed="0.000451"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:40.524879" elapsed="0.003862"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:40.520180" elapsed="0.008604"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:40.528836" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T01:03:40.529238" 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-10-11T01:03:40.517532" elapsed="0.011741"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:40.516896" elapsed="0.012417"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:40.529590" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:40.529345" elapsed="0.000359"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:40.516853" elapsed="0.012880"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.530704" 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-10-11T01:03:40.529970" elapsed="0.000772"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:40.530803" 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-10-11T01:03:40.509327" elapsed="0.021631"/>
</kw>
<msg time="2026-10-11T01:03:40.531026" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:40.499326" elapsed="0.031764"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:40.537449" 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/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-10-11T01:03:40.543379" 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/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-10-11T01:03:40.548630" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:40.548811" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:40.549004" 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-10-11T01:03:40.549343" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:40.549197" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:40.549183" 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-10-11T01:03:40.549587" 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-10-11T01:03:40.549768" 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-10-11T01:03:40.549945" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:40.549158" elapsed="0.000835"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:40.549071" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:40.550168" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:40.550234" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:40.550341" 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-10-11T01:03:40.497894" elapsed="0.052471"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:40.551531" 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-10-11T01:03:40.551326" elapsed="0.000268">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-10-11T01:03:40.551679" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:40.550999" elapsed="0.000703"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:40.552005" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:40.551764" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.552539" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:40.552261" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:40.552080" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:40.551747" elapsed="0.000868"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.553126" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:40.552776" elapsed="0.000374"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:40.553194" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:40.553317" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:40.550685" elapsed="0.002655"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:40.554378" 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-10-11T01:03:40.554235" elapsed="0.000206"/>
</kw>
<msg time="2026-10-11T01:03:40.554518" 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-10-11T01:03:40.553903" elapsed="0.000638"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:03:40.554701" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:40.554604" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:40.554587" elapsed="0.000173"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:40.555048" 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-10-11T01:03:40.555164" 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-10-11T01:03:40.554922" elapsed="0.000265"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:03:40.555550" 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-10-11T01:03:40.555348" elapsed="0.000226"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:03:40.555615" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:40.555738" 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-10-11T01:03:40.553605" elapsed="0.002155"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.556997" 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-10-11T01:03:40.556762" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.557620" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:40.557229" elapsed="0.000433"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:40.562979" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:40.563154" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:03:40.563241" 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-10-11T01:03:40.557969" elapsed="0.005297"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:40.557723" elapsed="0.005583"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:40.563561" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:40.563330" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:40.557706" elapsed="0.005966"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.565474" 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-10-11T01:03:40.564996" elapsed="0.000540"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:40.564642" elapsed="0.000938"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:40.564618" elapsed="0.000995"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.566405" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:40.566030" elapsed="0.000455"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:40.565683" elapsed="0.000845"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:40.565662" elapsed="0.000898"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.567305" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:40.566805" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:40.567751" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:40.567451" elapsed="0.000373"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.568495" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:40.568103" elapsed="0.000427"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:40.567855" elapsed="0.000721"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:40.567426" elapsed="0.001178"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.569335" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:40.568850" elapsed="0.000521"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:40.569778" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:40.569482" elapsed="0.000368"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.570511" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:40.570124" elapsed="0.000422"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:40.569881" elapsed="0.000709"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:40.569458" elapsed="0.001160"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:40.570818" elapsed="0.000424"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:40.571801" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:40.571489" 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-10-11T01:03:40.572068" elapsed="0.000296"/>
</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-10-11T01:03:40.564145" elapsed="0.008325"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:40.572674" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:40.572558" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:40.572535" elapsed="0.000224"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:40.573619" 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-10-11T01:03:40.572973" elapsed="0.000684"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:40.573721" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T01:03:40.573898" 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-10-11T01:03:40.556052" elapsed="0.017937"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:40.574071" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T01:03:40.574245" 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-10-11T01:03:40.481086" elapsed="0.093193"/>
</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-10-11T01:03:40.588565" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:40.588227" elapsed="0.000367"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:40.589363" 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-10-11T01:03:40.589098" 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-10-11T01:03:40.589676" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:40.588759" elapsed="0.000941"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.590203" 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-10-11T01:03:40.589877" elapsed="0.000352"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:40.590536" 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-10-11T01:03:40.590677" 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-10-11T01:03:40.590397" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.591127" 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-10-11T01:03:40.590898" elapsed="0.000272"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:40.591576" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:40.591236" elapsed="0.000395"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.592270" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:40.591803" elapsed="0.000492"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:40.591655" elapsed="0.000673"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:40.591216" elapsed="0.001132"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.592944" 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-10-11T01:03:40.592541" elapsed="0.000431"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:40.593016" 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-10-11T01:03:40.587660" elapsed="0.005461"/>
</kw>
<msg time="2026-10-11T01:03:40.593170" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:40.581946" elapsed="0.011269"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:40.597383" 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-10-11T01:03:40.601588" 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/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-10-11T01:03:40.605806" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:40.606004" 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-10-11T01:03:40.606188" 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-10-11T01:03:40.606558" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:40.606395" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:40.606382" 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-10-11T01:03:40.606784" 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-10-11T01:03:40.606979" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:40.607146" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:40.606350" elapsed="0.000844"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:40.606257" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:40.607368" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:40.607450" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:40.607556" 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-10-11T01:03:40.580902" elapsed="0.026680"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:40.607750" elapsed="0.000323"/>
</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-10-11T01:03:40.609000" 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-10-11T01:03:40.608730" elapsed="0.000297"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:40.609456" 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-10-11T01:03:40.609176" 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-10-11T01:03:40.609668" elapsed="0.000293"/>
</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-10-11T01:03:40.608344" elapsed="0.001671"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:40.608142" elapsed="0.001903"/>
</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-10-11T01:03:40.610261" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:40.610068" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:40.608126" elapsed="0.002204"/>
</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-10-11T01:03:40.575665" elapsed="0.034708"/>
</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-10-11T01:03:40.574703" elapsed="0.035753"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:40.574382" elapsed="0.036114"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:40.574359" elapsed="0.036159"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:40.610549" elapsed="0.000025"/>
</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-10-11T01:03:40.479499" elapsed="0.131151"/>
</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-10-11T01:03:38.381266" elapsed="2.229439"/>
</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-10-11T01:03:40.610920" elapsed="0.002893"/>
</kw>
<arg>leaf_ad</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-10-11T01:03:35.992056" elapsed="4.621820"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:35.910527" elapsed="4.703466"/>
</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-10-11T01:03:40.615365" elapsed="0.000219"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:03:40.615114" 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-10-11T01:03:40.616566" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:40.616477" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:40.616459" elapsed="0.000169"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:40.619855" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:40.619770" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:40.619753" elapsed="0.000178"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.620933" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:40.620518" elapsed="0.000442"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.621381" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:03:40.621114" elapsed="0.000306"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:03:40.621464" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:03:40.621602" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:03:40.620144" 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-10-11T01:03:40.624128" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:40.624043" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:40.624025" elapsed="0.000168"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:40.625244" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:40.625159" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:40.625142" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:40.625650" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:03:40.625477" elapsed="0.000231"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:03:40.626037" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:40.625880" elapsed="0.000181"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:03:40.660358" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:03:40.626577" elapsed="0.033892"/>
</kw>
<msg time="2026-10-11T01:03:40.660621" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:03:40.660663" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:40.626221" elapsed="0.034478"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:03:40.700599" 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-10-11T01:03:40.661220" elapsed="0.039481"/>
</kw>
<msg time="2026-10-11T01:03:40.700846" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:03:40.700887" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:40.660867" elapsed="0.040067"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:40.701212" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:40.701004" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:40.700986" elapsed="0.000297"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.701717" 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-10-11T01:03:40.701491" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:40.702057" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:40.701845" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:40.701828" elapsed="0.000301"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:03:40.702159" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:40.704593" elapsed="0.000237"/>
</kw>
<msg time="2026-10-11T01:03:40.704887" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:40.703534" 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-10-11T01:03:40.705342" elapsed="0.000092"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:40.705701" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:03:40.702934" elapsed="0.002951"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:03:40.702457" elapsed="0.003500"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:03:40.624889" elapsed="0.081141"/>
</kw>
<msg time="2026-10-11T01:03:40.706111" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:40.706151" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:40.624345" elapsed="0.081842"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:03:40.706338" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:03:40.706254" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:40.706237" elapsed="0.000204"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:40.706770" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:40.707084" elapsed="0.000054"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:03:40.707182" 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-10-11T01:03:40.623738" elapsed="0.083531"/>
</kw>
<msg time="2026-10-11T01:03:40.707352" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:40.707391" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:40.621963" elapsed="0.085483"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:40.707737" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:40.707515" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:40.707499" elapsed="0.000308"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:03:40.621809" elapsed="0.086020"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:03:40.621671" elapsed="0.086184"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:03:40.619473" elapsed="0.088430"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:03:40.616201" elapsed="0.091765"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:40.615787" elapsed="0.092219"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:03:40.614754" elapsed="0.093296"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:40.708889" 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-10-11T01:03:40.709035" 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-10-11T01:03:40.708748" elapsed="0.000313"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:03:40.709399" 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-10-11T01:03:40.709223" elapsed="0.000217"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:40.709738" 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-10-11T01:03:40.709858" 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-10-11T01:03:40.709603" elapsed="0.000279"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:03:40.710218" 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-10-11T01:03:40.710052" elapsed="0.000190"/>
</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-10-11T01:03:40.710503" elapsed="0.002390"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:40.710305" elapsed="0.002641"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:40.710288" elapsed="0.002681"/>
</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-10-11T01:03:40.723697" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:40.723373" elapsed="0.000350"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:40.724422" 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-10-11T01:03:40.724216" elapsed="0.000273">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-10-11T01:03:40.724575" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:40.723884" elapsed="0.000714"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.725129" 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-10-11T01:03:40.724805" elapsed="0.000351"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:40.725448" 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-10-11T01:03:40.725569" 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-10-11T01:03:40.725324" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.726021" 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-10-11T01:03:40.725789" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.726976" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:03:40.726732" elapsed="0.000286"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.727465" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:40.727195" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.728081" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:40.727800" elapsed="0.000305"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:40.729012" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:40.728642" elapsed="0.000395"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:40.729082" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:40.729208" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:40.728274" 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-10-11T01:03:40.729430" elapsed="0.000203"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:03:40.727668" elapsed="0.002001"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.730180" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:40.729900" elapsed="0.000305"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:40.731064" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:40.730696" elapsed="0.000393"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:40.731132" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:40.731257" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:40.730371" elapsed="0.000909"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:40.731470" elapsed="0.000168"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:40.729768" elapsed="0.001905"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:40.727532" elapsed="0.004173"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:40.731741" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:03:40.731866" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:40.726376" elapsed="0.005514"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:40.726124" elapsed="0.005806"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:40.732103" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:40.731953" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:40.726107" elapsed="0.006064"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.732863" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:40.732332" elapsed="0.000557"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:40.732946" 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/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-10-11T01:03:40.722848" elapsed="0.010199"/>
</kw>
<msg time="2026-10-11T01:03:40.733127" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:40.718330" elapsed="0.014843"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:40.737511" 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/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-10-11T01:03:40.741621" 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/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-10-11T01:03:40.745860" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:40.746054" 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-10-11T01:03:40.746237" 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-10-11T01:03:40.746593" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:40.746446" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:40.746431" 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-10-11T01:03:40.746823" 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-10-11T01:03:40.747016" 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-10-11T01:03:40.747182" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:40.746391" elapsed="0.000838"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:40.746303" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:40.747420" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:40.747490" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:40.747598" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:40.717732" elapsed="0.029890"/>
</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-10-11T01:03:40.756624" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:40.756304" elapsed="0.000346"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:40.757307" 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-10-11T01:03:40.757137" elapsed="0.000259">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-10-11T01:03:40.757498" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:40.756808" elapsed="0.000713"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.758026" 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-10-11T01:03:40.757705" elapsed="0.000346"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:40.758326" 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-10-11T01:03:40.758462" 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-10-11T01:03:40.758218" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.758905" 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-10-11T01:03:40.758687" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:40.759276" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:40.759030" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.759777" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', '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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:40.759513" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:40.759351" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:40.759012" elapsed="0.000841"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.760418" 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-10-11T01:03:40.760025" elapsed="0.000422"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:40.760491" 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/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-10-11T01:03:40.755791" elapsed="0.004802"/>
</kw>
<msg time="2026-10-11T01:03:40.760643" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:40.751446" elapsed="0.009241"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:40.764943" 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/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-10-11T01:03:40.769065" 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/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-10-11T01:03:40.773218" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:40.773401" 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-10-11T01:03:40.773600" 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-10-11T01:03:40.773951" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:40.773794" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:40.773780" 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-10-11T01:03:40.774181" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:40.774359" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:40.774542" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:40.773754" elapsed="0.000836"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:40.773665" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:40.774765" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:40.774831" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:40.774963" 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-10-11T01:03:40.750733" elapsed="0.024257"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:40.776111" 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-10-11T01:03:40.775917" elapsed="0.000254">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-10-11T01:03:40.776255" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:40.775582" elapsed="0.000697"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:40.776578" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:40.776341" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.777094" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:40.776817" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:40.776651" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:40.776324" elapsed="0.000846"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.777684" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:40.777332" elapsed="0.000376"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:40.777753" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:40.777877" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:40.775265" elapsed="0.002635"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.779230" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:40.779009" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.779733" 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-10-11T01:03:40.779516" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.780207" 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-10-11T01:03:40.779987" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.780670" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:40.780453" elapsed="0.000257"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:40.781437" 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-10-11T01:03:40.781261" elapsed="0.000202"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:03:40.781762" 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-10-11T01:03:40.781618" elapsed="0.000168"/>
</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-10-11T01:03:40.781958" elapsed="0.000155"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.782548" 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-10-11T01:03:40.782309" elapsed="0.000280"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:03:40.782627" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:40.782754" 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-10-11T01:03:40.780891" elapsed="0.001887"/>
</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-10-11T01:03:40.794213" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.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-10-11T01:03:40.794296" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:40.794440" 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-10-11T01:03:40.783083" elapsed="0.011384"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:40.782839" elapsed="0.011677"/>
</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-10-11T01:03:40.794726" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:40.794545" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:40.782824" elapsed="0.011985"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.796180" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:40.795868" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:40.795612" elapsed="0.000641"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:40.795594" elapsed="0.000682"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.796855" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:40.796588" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:40.796328" elapsed="0.000613"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:40.796312" elapsed="0.000698"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.797581" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:40.797204" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:40.797884" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:40.797670" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.798402" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:40.798139" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:40.797971" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:40.797653" elapsed="0.000843"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.799020" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:40.798672" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:40.799317" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:40.799108" elapsed="0.000260"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.799833" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:40.799570" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:40.799390" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:40.799092" elapsed="0.000831"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:40.800073" elapsed="0.000291"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:40.800772" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:40.800541" elapsed="0.000255"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:40.800962" elapsed="0.000215"/>
</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-10-11T01:03:40.795189" elapsed="0.006044"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:03:40.801385" elapsed="0.000046"/>
</return>
<status status="PASS" start="2026-10-11T01:03:40.801299" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:40.801282" elapsed="0.000206"/>
</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-10-11T01:03:40.801634" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:03:40.801693" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:40.801855" 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-10-11T01:03:40.778204" elapsed="0.023676"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:40.801956" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:40.802081" 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-10-11T01:03:40.713873" elapsed="0.088231"/>
</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-10-11T01:03:40.802419" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:40.802195" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:40.802179" elapsed="0.000325"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:40.802534" elapsed="0.000024"/>
</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-10-11T01:03:40.713193" elapsed="0.089439"/>
</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-10-11T01:03:40.806748" level="INFO">${update} = </msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:03:40.803594" elapsed="0.003182"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:03:40.807297" level="FAIL"> == </msg>
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="FAIL" start="2026-10-11T01:03:40.806946" elapsed="0.000415"> == </status>
</kw>
<return>
<value>${update}</value>
<status status="NOT RUN" start="2026-10-11T01:03:40.807434" elapsed="0.000017"/>
</return>
<doc>Returns hex update message.</doc>
<status status="FAIL" start="2026-10-11T01:03:40.803316" elapsed="0.004221"> == </status>
</kw>
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:42.812709" level="INFO">${update} = ffffffffffffffffffffffffffffffff004c0200000035400101014002008004040000000040050400000064800e1d000105047f010101000512000101020304010220010000012002000002</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:03:42.809062" elapsed="0.003720"/>
</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-10-11T01:03:42.813219" elapsed="0.000798"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:03:42.814122" elapsed="0.000076"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:03:42.808286" elapsed="0.006086"/>
</kw>
<msg time="2026-10-11T01:03:42.814565" 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-10-11T01:03:40.802859" elapsed="2.011762"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:03:42.817084" level="INFO">Length is 152.</msg>
<msg time="2026-10-11T01:03:42.817244" 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-10-11T01:03:42.816449" elapsed="0.000847"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:03:42.818252" level="INFO">Length is 152.</msg>
<msg time="2026-10-11T01:03:42.818441" 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-10-11T01:03:42.817689" elapsed="0.000807"/>
</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-10-11T01:03:42.818988" elapsed="0.000643"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:42.820340" 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-10-11T01:03:42.819984" elapsed="0.000409"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:42.821126" 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-10-11T01:03:42.820751" elapsed="0.000429"/>
</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-10-11T01:03:42.821621" elapsed="0.000627"/>
</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-10-11T01:03:42.815094" elapsed="0.007278"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:03:42.822721" elapsed="0.003039"/>
</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-10-11T01:03:42.858048" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:42.857307" elapsed="0.000801"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:42.859230" 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-10-11T01:03:42.858946" elapsed="0.000384">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-10-11T01:03:42.859467" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:42.858483" elapsed="0.001017"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:42.860196" 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-10-11T01:03:42.859746" elapsed="0.000484"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:42.860653" 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-10-11T01:03:42.860837" 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-10-11T01:03:42.860485" elapsed="0.000386"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:42.861569" 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-10-11T01:03:42.861222" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:42.862940" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:03:42.862600" elapsed="0.000399"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:42.863804" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:42.863248" elapsed="0.000590"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:42.864968" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:42.864323" elapsed="0.000680"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:42.866500" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:42.865837" elapsed="0.000770"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:42.866786" elapsed="0.000044"/>
</return>
<msg time="2026-10-11T01:03:42.867061" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:42.865248" elapsed="0.001845"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:42.867328" elapsed="0.000446"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:03:42.864134" elapsed="0.003693"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:42.868760" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:42.868175" elapsed="0.000619"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:42.870299" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:42.869683" elapsed="0.000789"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:42.870653" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T01:03:42.870885" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:42.869047" elapsed="0.001886"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:42.871164" elapsed="0.000446"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:42.867992" elapsed="0.003671"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:42.863920" elapsed="0.007787"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:42.871761" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T01:03:42.871962" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:42.862099" elapsed="0.009897"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:42.861720" elapsed="0.010316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:42.872276" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:42.872069" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:42.861693" elapsed="0.010678"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:42.873340" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:42.872622" elapsed="0.000754"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:42.873489" 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/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-10-11T01:03:42.856130" elapsed="0.017499"/>
</kw>
<msg time="2026-10-11T01:03:42.873712" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:42.846187" elapsed="0.027616"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:42.879784" 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/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-10-11T01:03:42.884991" 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/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-10-11T01:03:42.889063" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:42.889254" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:42.889452" 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-10-11T01:03:42.889808" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:42.889657" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:42.889642" 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-10-11T01:03:42.890051" 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-10-11T01:03:42.890231" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:42.890395" elapsed="0.000032"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:42.889615" elapsed="0.000842"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:42.889523" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:42.890635" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:42.890703" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:42.890820" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:42.844744" elapsed="0.046100"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:42.891889" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:42.891649" 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-10-11T01:03:42.900508" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:42.900576" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:42.900689" 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-10-11T01:03:42.892240" elapsed="0.008483"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:42.892005" elapsed="0.008769"/>
</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-10-11T01:03:42.901034" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:42.900808" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:42.891989" elapsed="0.009194"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:42.903192" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:42.902787" elapsed="0.000461"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:42.902447" elapsed="0.000847"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:42.902421" elapsed="0.000905"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:42.904181" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:42.903791" elapsed="0.000448"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:42.903397" elapsed="0.000886"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:42.903375" elapsed="0.000940"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:42.905104" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:42.904596" elapsed="0.000544"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:42.905554" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:42.905229" elapsed="0.000399"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:42.906271" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:42.905889" elapsed="0.000417"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:42.905660" elapsed="0.000691"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:42.905206" elapsed="0.001173"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:42.907127" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:42.906643" elapsed="0.000520"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:42.907565" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:42.907251" elapsed="0.000386"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:42.908291" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:42.907920" elapsed="0.000405"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:42.907668" elapsed="0.000702"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:42.907228" elapsed="0.001169"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:42.908623" elapsed="0.000426"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:42.909617" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:42.909274" elapsed="0.000377"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:42.909892" elapsed="0.000310"/>
</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-10-11T01:03:42.901956" elapsed="0.008324"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:03:42.910339" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T01:03:42.910613" 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-10-11T01:03:42.891094" elapsed="0.019554"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:42.910715" elapsed="0.000034"/>
</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-10-11T01:03:42.828443" elapsed="0.082408"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:42.827279" elapsed="0.083656"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:03:42.826287" elapsed="0.084727"/>
</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-10-11T01:03:42.914818" level="INFO">${update} = ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050512000101020304010220010000012002000002</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:03:42.912263" elapsed="0.002594"/>
</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-10-11T01:03:42.915114" elapsed="0.000431"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:03:42.915606" elapsed="0.000037"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:03:42.911889" elapsed="0.003855"/>
</kw>
<msg time="2026-10-11T01:03:42.915836" 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-10-11T01:03:42.911268" elapsed="0.004658"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:03:42.917048" level="INFO">Length is 140.</msg>
<msg time="2026-10-11T01:03:42.917144" 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-10-11T01:03:42.916698" elapsed="0.000477"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:03:42.917742" level="INFO">Length is 140.</msg>
<msg time="2026-10-11T01:03:42.917835" 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-10-11T01:03:42.917392" elapsed="0.000474"/>
</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-10-11T01:03:42.918134" elapsed="0.000400"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:42.918967" 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-10-11T01:03:42.918740" elapsed="0.000260"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:42.919401" 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-10-11T01:03:42.919198" 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-10-11T01:03:42.919704" elapsed="0.000382"/>
</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-10-11T01:03:42.916202" elapsed="0.003961"/>
</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-10-11T01:03:42.938468" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:42.938144" elapsed="0.000356"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:42.939214" 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-10-11T01:03:42.938998" elapsed="0.000286">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-10-11T01:03:42.939368" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:42.938667" elapsed="0.000724"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:42.939894" 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-10-11T01:03:42.939582" elapsed="0.000348"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:42.940212" 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-10-11T01:03:42.940341" 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-10-11T01:03:42.940100" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:42.940795" 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-10-11T01:03:42.940575" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:42.941773" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:03:42.941543" elapsed="0.000272"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:42.942255" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:42.942002" elapsed="0.000277"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:42.943091" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:42.942611" elapsed="0.000504"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:42.944154" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:42.943708" elapsed="0.000484"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:42.944300" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:03:42.944496" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:42.943285" elapsed="0.001240"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:42.944724" elapsed="0.000287"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:03:42.942480" elapsed="0.002569"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:42.945753" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:42.945278" elapsed="0.000500"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:42.946820" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:42.946362" elapsed="0.000496"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:42.946978" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:03:42.947154" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:42.945959" elapsed="0.001218"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:42.947341" elapsed="0.000291"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:42.945148" elapsed="0.002521"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:42.942322" elapsed="0.005379"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:42.947737" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:42.947864" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:42.941162" elapsed="0.006726"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:42.940897" elapsed="0.007031"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:42.948099" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:42.947951" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:42.940880" elapsed="0.007288"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:42.949079" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:42.948325" elapsed="0.000781"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:42.949150" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:42.937604" elapsed="0.011645"/>
</kw>
<msg time="2026-10-11T01:03:42.949297" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:42.933093" elapsed="0.016260"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:42.953511" 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/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-10-11T01:03:42.957694" 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/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-10-11T01:03:42.961822" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:42.962048" 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-10-11T01:03:42.962232" 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-10-11T01:03:42.962589" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:42.962442" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:42.962427" 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-10-11T01:03:42.962818" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:42.963008" 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-10-11T01:03:42.963173" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:42.962387" elapsed="0.000833"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:42.962298" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:42.963395" elapsed="0.000032"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:42.963475" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:03:42.963583" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:42.932163" elapsed="0.031445"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:42.964633" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:42.964396" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:42.969568" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:42.969863" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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+xml', 'Content-Length': '635'} 
 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-path xmlns:a="urn:opendaylight:params:xml:ns:yang:bgp-rib" xmlns:b="urn:opendaylight:params:xml:ns:yang:bgp-types" xmlns:c="urn:opendaylight:params:xml:ns:yang:bgp:mvpn" xmlns:d="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;/a:application-rib[a:id='10.30.170.173']/a:tables[a:afi='b:ipv4-address-family'][a:safi='c:mcast-vpn-subsequent-address-family']/d:mvpn-routes-ipv4&lt;/error-path&gt;&lt;error-message&gt;Data does not exist&lt;/error-message&gt;&lt;error-tag&gt;data-missing&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-10-11T01:03:42.970006" level="INFO">${response} = None</msg>
<msg time="2026-10-11T01:03:42.970046" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:42.964973" elapsed="0.005425">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:42.964736" elapsed="0.005756">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:42.970681" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:42.970529" elapsed="0.000207"/>
</branch>
<status status="FAIL" start="2026-10-11T01:03:42.964719" elapsed="0.006039">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:42.972055" 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-10-11T01:03:42.971767" elapsed="0.000321">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:03:42.971517" elapsed="0.000627">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:03:42.971499" elapsed="0.000674">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-10-11T01:03:42.972760" 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-10-11T01:03:42.972491" elapsed="0.000299">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:03:42.972234" elapsed="0.000612">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:03:42.972219" elapsed="0.000655">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:42.973584" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:42.973076" elapsed="0.000534"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:42.973887" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:42.973673" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:42.974403" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:42.974138" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:42.973974" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:42.973656" elapsed="0.000840"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:42.975023" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:42.974674" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:42.975321" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:42.975110" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:42.975836" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:42.975576" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:42.975394" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:42.975094" elapsed="0.000836"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:42.976075" elapsed="0.000290"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:42.976757" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:42.976539" elapsed="0.000243"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-10-11T01:03:42.977109" 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-10-11T01:03:42.976946" elapsed="0.000192">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-10-11T01:03:42.971134" elapsed="0.006126">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-10-11T01:03:42.977313" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:03:42.977578" level="INFO">${response_text} = None</msg>
<msg time="2026-10-11T01:03:42.977604" 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-10-11T01:03:42.963840" elapsed="0.013790">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-10-11T01:03:42.977689" elapsed="0.000025"/>
</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-10-11T01:03:42.921527" elapsed="0.056300">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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:42.920967" elapsed="0.056960"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:03:42.920463" elapsed="0.057520"/>
</kw>
<arg>source_active_ad</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-10-11T01:03:40.708305" elapsed="2.269724"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:40.614309" elapsed="2.363822"/>
</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-10-11T01:03:42.979486" elapsed="0.000203"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:03:42.979218" 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-10-11T01:03:42.980660" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:42.980573" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:42.980556" elapsed="0.000168"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:42.984308" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:42.984223" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:42.984206" elapsed="0.000164"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:42.985302" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:42.984977" elapsed="0.000351"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:03:42.985799" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:03:42.985498" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:03:42.985864" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:03:42.986024" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:03:42.984596" elapsed="0.001451"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:42.988609" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:42.988524" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:42.988507" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:42.989725" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:42.989642" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:42.989625" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:42.990116" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:03:42.989945" elapsed="0.000195"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:03:42.990461" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:42.990304" elapsed="0.000186"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:03:43.023798" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:03:42.990992" elapsed="0.032901"/>
</kw>
<msg time="2026-10-11T01:03:43.024056" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:03:43.024097" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:42.990651" elapsed="0.033481"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:03:43.059590" 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-10-11T01:03:43.024657" elapsed="0.035031"/>
</kw>
<msg time="2026-10-11T01:03:43.059831" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:03:43.059872" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:43.024299" elapsed="0.035621"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:43.060228" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:43.059988" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:43.059970" elapsed="0.000332"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:43.060724" 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-10-11T01:03:43.060499" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:43.061060" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:43.060849" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:43.060832" elapsed="0.000299"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:03:43.061161" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:43.063568" elapsed="0.000228"/>
</kw>
<msg time="2026-10-11T01:03:43.063854" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:43.062523" 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-10-11T01:03:43.064301" elapsed="0.000072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:43.064652" elapsed="0.000070"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:03:43.061934" elapsed="0.002900"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:03:43.061457" 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-10-11T01:03:42.989367" elapsed="0.075611"/>
</kw>
<msg time="2026-10-11T01:03:43.065059" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:43.065097" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:42.988823" elapsed="0.076310"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:03:43.065283" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:03:43.065199" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:43.065182" elapsed="0.000176"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:43.065712" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:43.066027" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:03:43.066091" 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-10-11T01:03:42.988218" elapsed="0.077958"/>
</kw>
<msg time="2026-10-11T01:03:43.066258" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:43.066297" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:42.986380" elapsed="0.079951"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:43.066637" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:43.066397" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:43.066381" elapsed="0.000325"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:03:42.986234" elapsed="0.080493"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:03:42.986095" elapsed="0.080660"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:03:42.983883" elapsed="0.082920"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:03:42.980303" elapsed="0.086549"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:42.979894" elapsed="0.086998"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:03:42.978860" elapsed="0.088091"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:43.068082" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:43.067669" elapsed="0.000440"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:43.068688" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:43.068290" elapsed="0.000424"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:43.069236" 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-10-11T01:03:43.068893" elapsed="0.000367"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:43.069586" 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-10-11T01:03:43.069720" 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-10-11T01:03:43.069439" elapsed="0.000306"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:43.070052" 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-10-11T01:03:43.070164" 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-10-11T01:03:43.069917" elapsed="0.000270"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:03:43.070327" elapsed="0.002311"/>
</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-10-11T01:03:43.072785" elapsed="0.002198"/>
</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-10-11T01:03:43.091114" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:43.090764" elapsed="0.000380"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:43.091865" 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-10-11T01:03:43.091645" elapsed="0.000306">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-10-11T01:03:43.092037" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:43.091308" elapsed="0.000752"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:43.092560" 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-10-11T01:03:43.092233" elapsed="0.000352"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:43.092865" 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-10-11T01:03:43.093020" 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-10-11T01:03:43.092749" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:43.093476" 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-10-11T01:03:43.093241" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:43.094444" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:43.094197" elapsed="0.000295"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:43.094930" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:43.094667" elapsed="0.000288"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:43.095797" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:43.095321" elapsed="0.000501"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:43.096979" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:43.096451" elapsed="0.000614"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:43.097148" elapsed="0.000033"/>
</return>
<msg time="2026-10-11T01:03:43.097366" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:43.096006" elapsed="0.001384"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:43.097581" elapsed="0.000317"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:03:43.095186" elapsed="0.002762"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:43.098630" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:43.098179" elapsed="0.000475"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:43.099790" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:43.099261" elapsed="0.000616"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:43.099969" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:03:43.100178" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:43.098825" elapsed="0.001376"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:43.100367" elapsed="0.000398"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:43.098049" elapsed="0.002754"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:43.095040" elapsed="0.005793"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:43.100871" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:03:43.101012" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:43.093844" elapsed="0.007192"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:43.093587" elapsed="0.007478"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:43.101237" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:43.101087" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:43.093565" elapsed="0.007742"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:43.102008" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-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-10-11T01:03:43.101481" elapsed="0.000553"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:43.102077" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:43.090238" elapsed="0.011939"/>
</kw>
<msg time="2026-10-11T01:03:43.102226" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:43.085630" elapsed="0.016639"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:43.106603" 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/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-10-11T01:03:43.110678" 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/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-10-11T01:03:43.114797" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:43.114991" 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-10-11T01:03:43.115173" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:43.115532" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:43.115365" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:43.115351" 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-10-11T01:03:43.115761" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:43.115951" 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-10-11T01:03:43.116121" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:43.115326" elapsed="0.000842"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:43.115238" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:43.116343" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:43.116422" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:03:43.116534" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-i...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:03:43.084963" elapsed="0.031596"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:43.117679" 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-10-11T01:03:43.117479" elapsed="0.000260">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-10-11T01:03:43.117822" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:43.117140" elapsed="0.000705"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:43.118141" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:43.117918" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:43.118670" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:43.118392" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:43.118214" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:43.117890" elapsed="0.000856"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:43.119256" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:43.118919" elapsed="0.000360"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:43.119324" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:43.119466" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:43.116831" elapsed="0.002662"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:43.120588" 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-10-11T01:03:43.120377" elapsed="0.000306">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-10-11T01:03:43.120767" 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-10-11T01:03:43.120059" elapsed="0.000730"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:03:43.120964" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:03:43.120852" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:43.120834" elapsed="0.000207"/>
</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-10-11T01:03:43.121195" elapsed="0.000019"/>
</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-10-11T01:03:43.121369" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:03:43.121445" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:43.121570" 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-10-11T01:03:43.119745" elapsed="0.001848"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:43.122816" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:43.122594" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:43.123279" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:43.123062" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:43.128545" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:43.128683" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:43.128786" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:43.123624" elapsed="0.005524">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:43.123378" elapsed="0.005848">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:43.129431" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:43.129257" elapsed="0.000235"/>
</branch>
<status status="FAIL" start="2026-10-11T01:03:43.123362" elapsed="0.006152">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:43.129855" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:43.129991" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:43.129956" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:43.129940" elapsed="0.000109"/>
</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-10-11T01:03:43.130191" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:03:43.130254" 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-10-11T01:03:43.121871" elapsed="0.008478">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:43.130463" 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-10-11T01:03:43.077519" elapsed="0.053038">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:43.130805" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:43.130640" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:43.130624" elapsed="0.000267"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:43.130979" 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-10-11T01:03:43.076877" elapsed="0.054192">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:45.166759" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:45.166006" elapsed="0.000821"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:45.168520" 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-10-11T01:03:45.168003" elapsed="0.000665">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-10-11T01:03:45.168860" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:45.167216" elapsed="0.001718"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.170086" 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-10-11T01:03:45.169326" elapsed="0.000818"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:45.170858" 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-10-11T01:03:45.171192" 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-10-11T01:03:45.170566" elapsed="0.000681"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.172278" 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-10-11T01:03:45.171751" elapsed="0.000626"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.175022" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:45.174058" elapsed="0.001060"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.176143" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:45.175546" elapsed="0.000651"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.177929" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:45.176981" elapsed="0.000984"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:45.179605" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:45.178842" elapsed="0.000945"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:45.179921" elapsed="0.000050"/>
</return>
<msg time="2026-10-11T01:03:45.180228" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:45.178207" elapsed="0.002055"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:45.180525" elapsed="0.000449"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:03:45.176653" elapsed="0.004375"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.181998" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:45.181352" elapsed="0.000681"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:45.183861" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:45.183024" elapsed="0.000973"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:45.184107" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T01:03:45.184399" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:45.182269" elapsed="0.002201"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:45.184705" elapsed="0.000430"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:45.181168" elapsed="0.004019"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:45.176299" elapsed="0.008934"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:45.185287" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T01:03:45.185495" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:45.173177" elapsed="0.012352"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.172560" elapsed="0.013009"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.185810" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.185601" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.172514" elapsed="0.013408"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.186941" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-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-10-11T01:03:45.186149" elapsed="0.000840"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:45.187067" elapsed="0.000049"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:45.164772" elapsed="0.022475"/>
</kw>
<msg time="2026-10-11T01:03:45.187332" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:45.154533" elapsed="0.032869"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:45.193959" 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/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-10-11T01:03:45.199727" 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/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-10-11T01:03:45.204819" elapsed="0.000058"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.205055" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.205237" 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-10-11T01:03:45.205598" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.205447" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:45.205433" 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-10-11T01:03:45.205826" 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-10-11T01:03:45.206032" 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-10-11T01:03:45.206197" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:45.205392" elapsed="0.000852"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:45.205302" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.206434" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:45.206501" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:45.206619" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-i...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:03:45.153100" elapsed="0.053544"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:45.207778" 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-10-11T01:03:45.207586" elapsed="0.000255">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-10-11T01:03:45.207941" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:45.207241" elapsed="0.000723"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.208252" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.208028" elapsed="0.000276"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.208786" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:45.208524" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.208326" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.208011" elapsed="0.000851"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.209375" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:45.209038" elapsed="0.000361"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:45.209459" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:45.209585" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:45.206937" elapsed="0.002671"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:45.211007" 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-10-11T01:03:45.210768" 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-10-11T01:03:45.211185" 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-10-11T01:03:45.210440" elapsed="0.000767"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:03:45.211371" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:03:45.211271" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.211254" elapsed="0.000211"/>
</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-10-11T01:03:45.211623" elapsed="0.000020"/>
</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-10-11T01:03:45.211800" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:03:45.211858" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:03:45.212000" 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-10-11T01:03:45.210119" elapsed="0.001904"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.213266" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:45.213043" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.213734" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:45.213516" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:45.219678" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:45.219879" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:45.220024" 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-10-11T01:03:45.214105" elapsed="0.005954"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.213833" elapsed="0.006281"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.220366" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.220148" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.213816" elapsed="0.006684"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.222300" 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-10-11T01:03:45.221813" elapsed="0.000551"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.221469" elapsed="0.000961"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.221444" elapsed="0.001020"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.223277" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:45.222879" elapsed="0.000457"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.222538" elapsed="0.000842"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.222514" elapsed="0.000917"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.224186" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:45.223684" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.224633" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.224311" elapsed="0.000396"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.225378" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:45.225007" elapsed="0.000427"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.224738" elapsed="0.000786"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.224287" elapsed="0.001267"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.226298" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:45.225804" elapsed="0.000531"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.226746" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.226444" elapsed="0.000377"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.227495" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:45.227102" elapsed="0.000428"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.226853" elapsed="0.000724"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.226400" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:45.227809" elapsed="0.000432"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:45.228887" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:45.228495" 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-10-11T01:03:45.229167" elapsed="0.000319"/>
</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-10-11T01:03:45.220972" elapsed="0.008610"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:45.229826" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:45.229691" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.229662" elapsed="0.000264"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:45.231214" 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-10-11T01:03:45.230127" elapsed="0.001125"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:45.231316" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T01:03:45.231520" 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-10-11T01:03:45.212310" elapsed="0.019253"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:45.231658" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T01:03:45.231867" 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-10-11T01:03:45.136469" elapsed="0.095460"/>
</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-10-11T01:03:45.246869" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:45.246444" elapsed="0.000500"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:45.247965" 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-10-11T01:03:45.247639" elapsed="0.000492">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-10-11T01:03:45.248356" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:45.247169" elapsed="0.001219"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.249109" 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-10-11T01:03:45.248659" elapsed="0.000537"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:45.249613" 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-10-11T01:03:45.249791" 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-10-11T01:03:45.249458" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.250455" 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-10-11T01:03:45.250122" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:45.251041" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.250606" elapsed="0.000511"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.252034" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:45.251358" elapsed="0.000711"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.251148" elapsed="0.000968"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.250582" elapsed="0.001562"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.252999" 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-10-11T01:03:45.252373" elapsed="0.000653"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:45.253070" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:45.245705" elapsed="0.007465"/>
</kw>
<msg time="2026-10-11T01:03:45.253221" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:45.239573" elapsed="0.013692"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:45.257572" 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/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-10-11T01:03:45.262345" 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/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-10-11T01:03:45.266452" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.266642" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.266858" 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-10-11T01:03:45.267221" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.267073" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:45.267059" 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-10-11T01:03:45.267466" 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-10-11T01:03:45.267650" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.267815" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:45.267033" elapsed="0.000830"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:45.266942" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.268054" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:45.268120" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:45.268241" 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-10-11T01:03:45.238556" elapsed="0.029710"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:45.268466" elapsed="0.000327"/>
</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-10-11T01:03:45.269848" 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-10-11T01:03:45.269475" elapsed="0.000400"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:45.270402" 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-10-11T01:03:45.270042" elapsed="0.000402"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:03:45.270633" elapsed="0.000292"/>
</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-10-11T01:03:45.269096" elapsed="0.001885"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.268863" 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-10-11T01:03:45.271212" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.271034" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.268846" elapsed="0.002434"/>
</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-10-11T01:03:45.233290" elapsed="0.038033"/>
</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-10-11T01:03:45.232326" elapsed="0.039062"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.232034" elapsed="0.039410"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.232011" elapsed="0.039455"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:45.271496" elapsed="0.000026"/>
</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-10-11T01:03:45.134849" elapsed="0.136748"/>
</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-10-11T01:03:43.075169" elapsed="2.196479"/>
</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-10-11T01:03:45.287509" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:45.287192" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:45.288201" 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-10-11T01:03:45.288029" elapsed="0.000232">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-10-11T01:03:45.288345" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:45.287694" elapsed="0.000673"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.288872" 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-10-11T01:03:45.288562" elapsed="0.000347"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:45.289190" 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-10-11T01:03:45.289304" 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-10-11T01:03:45.289081" elapsed="0.000247"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.289762" 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-10-11T01:03:45.289543" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.290723" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:45.290494" elapsed="0.000271"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.291226" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:45.290972" elapsed="0.000277"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.292024" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:45.291580" elapsed="0.000469"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:45.293184" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:45.292668" elapsed="0.000603"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:45.293350" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:03:45.293589" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:45.292222" elapsed="0.001391"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:45.293780" elapsed="0.000315"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/effective-rib-in</var>
<status status="PASS" start="2026-10-11T01:03:45.291445" elapsed="0.002688"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.294817" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:45.294363" elapsed="0.000479"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:45.295986" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:45.295480" elapsed="0.000593"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:45.296153" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:03:45.296362" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:45.295026" elapsed="0.001360"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:45.296571" elapsed="0.000299"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:45.294232" elapsed="0.002687"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:45.291292" elapsed="0.005690"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:45.297023" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:45.297154" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:45.290134" elapsed="0.007044"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.289865" elapsed="0.007341"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.297378" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.297228" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.289848" elapsed="0.007670"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.298344" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-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-10-11T01:03:45.297681" elapsed="0.000691"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:45.298492" 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-10-11T01:03:45.286673" elapsed="0.011924"/>
</kw>
<msg time="2026-10-11T01:03:45.298645" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:45.282299" elapsed="0.016390"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:45.302801" 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/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-10-11T01:03:45.306878" 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/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-10-11T01:03:45.310984" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.311167" 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-10-11T01:03:45.311349" 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-10-11T01:03:45.311701" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.311554" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:45.311540" 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-10-11T01:03:45.311957" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.312141" 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-10-11T01:03:45.312304" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:45.311515" elapsed="0.000836"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:45.311427" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.312576" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:45.312643" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:45.312753" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-ro...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:03:45.281683" elapsed="0.031094"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:45.313925" 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-10-11T01:03:45.313726" elapsed="0.000260">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-10-11T01:03:45.314068" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:45.313382" elapsed="0.000709"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.314372" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.314153" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.314886" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:45.314627" elapsed="0.000298"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.314460" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.314136" elapsed="0.000841"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.315485" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:45.315137" elapsed="0.000372"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:45.315552" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:45.315676" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:45.313081" elapsed="0.002617"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:45.316777" 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-10-11T01:03:45.316594" elapsed="0.000243">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-10-11T01:03:45.316934" 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-10-11T01:03:45.316259" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:03:45.317123" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-11T01:03:45.317024" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.317007" elapsed="0.000190"/>
</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-10-11T01:03:45.317352" elapsed="0.000019"/>
</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-10-11T01:03:45.317548" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:03:45.317606" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:03:45.317729" 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-10-11T01:03:45.315961" elapsed="0.001791"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.318989" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:45.318749" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.319619" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:45.319223" elapsed="0.000438"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:45.325254" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:45.325365" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:45.325472" 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-10-11T01:03:45.320003" elapsed="0.005493"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.319756" elapsed="0.005779"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.325718" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.325559" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.319737" elapsed="0.006056"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.327071" 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-10-11T01:03:45.326722" elapsed="0.000395"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.326477" elapsed="0.000672"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.326460" elapsed="0.000712"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.327743" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:45.327476" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.327222" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.327206" elapsed="0.000631"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.328367" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:45.328027" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.328681" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.328470" elapsed="0.000261"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.329189" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:45.328925" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.328753" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.328453" elapsed="0.000811"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.329793" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:45.329453" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.330102" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.329880" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.330614" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:45.330338" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.330176" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.329863" elapsed="0.000828"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:45.330834" elapsed="0.000306"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:45.331535" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:45.331299" elapsed="0.000261"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:45.331714" elapsed="0.000220"/>
</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-10-11T01:03:45.326124" elapsed="0.005865"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:45.332167" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:45.332083" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.332066" elapsed="0.000161"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:45.332975" 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-10-11T01:03:45.332368" elapsed="0.000634"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:45.333048" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:45.333173" 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-10-11T01:03:45.318043" elapsed="0.015155"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:45.333253" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:03:45.333372" 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-10-11T01:03:45.274238" elapsed="0.059158"/>
</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-10-11T01:03:45.345046" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:45.344730" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:45.345786" 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-10-11T01:03:45.345565" elapsed="0.000356">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-10-11T01:03:45.346088" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:45.345230" elapsed="0.000882"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.346615" 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-10-11T01:03:45.346286" elapsed="0.000354"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:45.346929" 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-10-11T01:03:45.347049" 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-10-11T01:03:45.346808" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.347513" 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-10-11T01:03:45.347269" 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-10-11T01:03:45.347927" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.347619" elapsed="0.000363"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.348620" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:45.348151" elapsed="0.000494"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.348004" elapsed="0.000702"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.347602" elapsed="0.001126"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.349292" 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-10-11T01:03:45.348892" elapsed="0.000427"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:45.349362" 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/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-10-11T01:03:45.344209" elapsed="0.005274"/>
</kw>
<msg time="2026-10-11T01:03:45.349534" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:45.339737" elapsed="0.009843"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:45.353802" 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/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-10-11T01:03:45.357935" 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/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-10-11T01:03:45.362181" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.362367" 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-10-11T01:03:45.362566" 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-10-11T01:03:45.362925" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.362765" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:45.362751" 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-10-11T01:03:45.363156" 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-10-11T01:03:45.363339" 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-10-11T01:03:45.363521" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:45.362725" elapsed="0.000846"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:45.362635" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.363748" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:45.363814" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:45.363948" 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-10-11T01:03:45.339013" elapsed="0.024990"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:45.364177" elapsed="0.000335"/>
</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-10-11T01:03:45.365543" 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-10-11T01:03:45.365163" elapsed="0.000408"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:45.366095" 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-10-11T01:03:45.365723" 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-10-11T01:03:45.366303" elapsed="0.000297"/>
</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-10-11T01:03:45.364786" elapsed="0.001870"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.364583" elapsed="0.002103"/>
</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-10-11T01:03:45.366885" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.366710" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.364566" elapsed="0.002405"/>
</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-10-11T01:03:45.334348" elapsed="0.032666"/>
</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-10-11T01:03:45.333688" elapsed="0.033391"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.333485" elapsed="0.033634"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.333469" elapsed="0.033671"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:45.367170" elapsed="0.000026"/>
</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-10-11T01:03:45.273612" elapsed="0.093657"/>
</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-10-11T01:03:45.271918" elapsed="0.095402"/>
</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-10-11T01:03:45.383627" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:45.383293" elapsed="0.000366"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:45.384367" 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-10-11T01:03:45.384165" elapsed="0.000285">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-10-11T01:03:45.384536" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:45.383823" elapsed="0.000736"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.385063" 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-10-11T01:03:45.384733" elapsed="0.000355"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:45.385448" 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-10-11T01:03:45.385587" 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-10-11T01:03:45.385312" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.386052" 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-10-11T01:03:45.385812" 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-10-11T01:03:45.387038" 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-10-11T01:03:45.386788" elapsed="0.000293"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.387543" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:45.387260" elapsed="0.000308"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.388366" 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-10-11T01:03:45.387910" elapsed="0.000481"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:45.389565" 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-10-11T01:03:45.389036" elapsed="0.000623"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:45.389740" elapsed="0.000033"/>
</return>
<msg time="2026-10-11T01:03:45.389971" 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-10-11T01:03:45.388588" elapsed="0.001407"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:45.390164" elapsed="0.000339"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:03:45.387759" elapsed="0.002782"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.391220" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:45.390772" elapsed="0.000472"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:45.392375" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:45.391865" elapsed="0.000619"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:45.392564" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:03:45.392779" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:45.391440" 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-10-11T01:03:45.392982" elapsed="0.000298"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:45.390641" elapsed="0.002678"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:45.387614" elapsed="0.005736"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:45.393387" elapsed="0.000100"/>
</return>
<msg time="2026-10-11T01:03:45.393595" 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-10-11T01:03:45.386435" elapsed="0.007183"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.386162" elapsed="0.007485"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.393820" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.393670" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.386143" elapsed="0.007746"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.394632" 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-10-11T01:03:45.394062" elapsed="0.000596"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:45.394702" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:45.382766" elapsed="0.012036"/>
</kw>
<msg time="2026-10-11T01:03:45.394852" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:45.378140" elapsed="0.016772"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:45.399245" 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/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-10-11T01:03:45.403366" 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/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-10-11T01:03:45.407487" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.407670" 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-10-11T01:03:45.407853" 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-10-11T01:03:45.408212" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.408064" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:45.408050" 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-10-11T01:03:45.408455" 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-10-11T01:03:45.408638" 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-10-11T01:03:45.408804" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:45.408024" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:45.407934" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.409042" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:45.409109" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:45.409216" 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-10-11T01:03:45.377512" elapsed="0.031729"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:45.410355" 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-10-11T01:03:45.410169" elapsed="0.000262">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-10-11T01:03:45.410516" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:45.409825" elapsed="0.000713"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.410855" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.410601" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.411389" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:45.411126" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.410946" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.410584" elapsed="0.000897"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.412000" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:45.411649" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:45.412068" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:45.412193" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:45.409525" elapsed="0.002691"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:45.413300" 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-10-11T01:03:45.413118" elapsed="0.000240">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-10-11T01:03:45.413457" 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-10-11T01:03:45.412784" elapsed="0.000696"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:03:45.413641" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:03:45.413543" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.413526" elapsed="0.000191"/>
</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-10-11T01:03:45.413872" elapsed="0.000019"/>
</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-10-11T01:03:45.414060" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:03:45.414118" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:03:45.414241" 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-10-11T01:03:45.412484" elapsed="0.001780"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.415510" 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-10-11T01:03:45.415270" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.415974" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:45.415745" elapsed="0.000269"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:45.421729" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:45.421864" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:03:45.421983" 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-10-11T01:03:45.416302" elapsed="0.005707"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.416075" elapsed="0.005973"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.422228" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.422072" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.416056" elapsed="0.006250"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.423613" 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-10-11T01:03:45.423263" elapsed="0.000428"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.423015" elapsed="0.000709"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.422997" elapsed="0.000750"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.424333" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:45.424059" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.423799" elapsed="0.000623"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.423783" elapsed="0.000664"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.424999" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:45.424633" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.425305" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.425089" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.425829" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:45.425563" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.425380" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.425072" elapsed="0.000848"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.426453" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:45.426101" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.426754" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.426542" elapsed="0.000263"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.427271" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:45.427007" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.426828" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.426525" elapsed="0.000823"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:45.427509" elapsed="0.000290"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:45.428205" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:45.427981" elapsed="0.000249"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:45.428385" elapsed="0.000229"/>
</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-10-11T01:03:45.422658" elapsed="0.006014"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:45.428817" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:45.428735" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.428717" elapsed="0.000163"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:45.429643" 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-10-11T01:03:45.429044" elapsed="0.000627"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:45.429717" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:45.429847" 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-10-11T01:03:45.414562" elapsed="0.015310"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:45.429942" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:03:45.430065" 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-10-11T01:03:45.369862" elapsed="0.060228"/>
</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-10-11T01:03:45.440936" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:45.440621" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:45.441693" 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-10-11T01:03:45.441452" elapsed="0.000362">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-10-11T01:03:45.441990" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:45.441121" elapsed="0.000893"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.442516" 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-10-11T01:03:45.442187" elapsed="0.000355"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:45.442918" 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-10-11T01:03:45.443086" 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-10-11T01:03:45.442797" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.443563" 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-10-11T01:03:45.443317" 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-10-11T01:03:45.444065" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.443669" elapsed="0.000450"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.444766" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:45.444289" elapsed="0.000502"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.444141" elapsed="0.000682"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.443651" elapsed="0.001192"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.445402" 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-10-11T01:03:45.445019" elapsed="0.000438"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:45.445502" 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/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-10-11T01:03:45.440096" elapsed="0.005524"/>
</kw>
<msg time="2026-10-11T01:03:45.445671" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:45.435592" elapsed="0.010123"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:45.449867" 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/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-10-11T01:03:45.454012" 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/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-10-11T01:03:45.458251" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.458448" 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-10-11T01:03:45.458632" 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-10-11T01:03:45.459004" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.458827" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:45.458814" 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-10-11T01:03:45.459232" 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-10-11T01:03:45.459427" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.459598" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:45.458788" elapsed="0.000858"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:45.458699" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.459819" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:45.459885" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:03:45.460022" 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-10-11T01:03:45.434816" elapsed="0.025232"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:45.460215" elapsed="0.000343"/>
</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-10-11T01:03:45.461591" 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-10-11T01:03:45.461202" elapsed="0.000416"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:45.462138" 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-10-11T01:03:45.461768" elapsed="0.000396"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:03:45.462348" elapsed="0.000299"/>
</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-10-11T01:03:45.460825" elapsed="0.001876"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.460628" elapsed="0.002104"/>
</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-10-11T01:03:45.462948" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.462755" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.460612" elapsed="0.002434"/>
</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-10-11T01:03:45.431056" elapsed="0.032037"/>
</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-10-11T01:03:45.430370" elapsed="0.032789"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.430163" elapsed="0.033036"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.430147" elapsed="0.033074"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:45.463251" elapsed="0.000026"/>
</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-10-11T01:03:45.369196" elapsed="0.094155"/>
</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-10-11T01:03:45.367526" elapsed="0.095892"/>
</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-10-11T01:03:45.463572" elapsed="0.002633"/>
</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-10-11T01:03:45.481863" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:45.481561" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:45.482631" 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-10-11T01:03:45.482458" elapsed="0.000232">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-10-11T01:03:45.482774" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:45.482122" elapsed="0.000675"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.483288" 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-10-11T01:03:45.482982" elapsed="0.000332"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:45.483604" 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-10-11T01:03:45.483718" 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-10-11T01:03:45.483496" elapsed="0.000245"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.484165" 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-10-11T01:03:45.483947" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.485105" 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-10-11T01:03:45.484866" elapsed="0.000280"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.485586" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:45.485322" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.486363" 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-10-11T01:03:45.485933" elapsed="0.000454"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:45.487538" 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-10-11T01:03:45.487021" elapsed="0.000605"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:45.487710" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:03:45.487929" 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-10-11T01:03:45.486581" 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-10-11T01:03:45.488118" elapsed="0.000319"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:03:45.485788" elapsed="0.002718"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.489186" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:45.488739" elapsed="0.000471"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:45.490337" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:45.489835" elapsed="0.000608"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:45.490526" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:03:45.490732" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:45.489381" 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-10-11T01:03:45.490932" elapsed="0.000299"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:45.488606" elapsed="0.002663"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:45.485651" elapsed="0.005649"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:45.491337" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:45.491574" 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-10-11T01:03:45.484529" elapsed="0.007068"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.484266" elapsed="0.007361"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.491826" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.491649" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.484248" elapsed="0.007674"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.492603" 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-10-11T01:03:45.492097" elapsed="0.000532"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:45.492672" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:45.481028" elapsed="0.011744"/>
</kw>
<msg time="2026-10-11T01:03:45.492820" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:45.476570" elapsed="0.016295"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:45.497144" 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/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-10-11T01:03:45.501235" 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/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-10-11T01:03:45.505300" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.505494" 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-10-11T01:03:45.505711" 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-10-11T01:03:45.506083" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.505934" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:45.505892" 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-10-11T01:03:45.506312" 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-10-11T01:03:45.506510" 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-10-11T01:03:45.506678" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:45.505866" elapsed="0.000861"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:45.505777" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.506986" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:45.507055" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:45.507162" 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-10-11T01:03:45.475959" elapsed="0.031227"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:45.508284" 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-10-11T01:03:45.508101" elapsed="0.000242">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-10-11T01:03:45.508441" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:45.507765" elapsed="0.000699"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.508749" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.508528" elapsed="0.000272"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.509262" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:45.509001" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.508821" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.508511" elapsed="0.000827"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.509851" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:45.509513" elapsed="0.000362"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:45.509932" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:45.510055" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:45.507467" elapsed="0.002610"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:45.511111" 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-10-11T01:03:45.510968" elapsed="0.000190"/>
</kw>
<msg time="2026-10-11T01:03:45.511233" 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-10-11T01:03:45.510635" elapsed="0.000620"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:03:45.511428" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:45.511317" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.511300" elapsed="0.000190"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:45.511764" 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-10-11T01:03:45.511921" 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-10-11T01:03:45.511642" elapsed="0.000303"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:03:45.512290" 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-10-11T01:03:45.512107" elapsed="0.000206"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:03:45.512355" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:03:45.512494" 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-10-11T01:03:45.510322" elapsed="0.002194"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.513726" 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-10-11T01:03:45.513506" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.514184" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:45.513969" elapsed="0.000254"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:45.519782" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:45.519910" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:03:45.519998" 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-10-11T01:03:45.514522" elapsed="0.005500"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.514283" elapsed="0.005777"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.520235" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.520083" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.514266" elapsed="0.006044"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.521578" 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-10-11T01:03:45.521234" elapsed="0.000390"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.520994" elapsed="0.000661"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.520977" elapsed="0.000700"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.522243" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:45.521979" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.521727" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.521712" elapsed="0.000624"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.522871" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:45.522532" elapsed="0.000377"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.523183" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.522973" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.523694" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:45.523433" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.523257" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.522956" elapsed="0.000813"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.524310" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:45.523977" elapsed="0.000358"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.524660" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.524445" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.525170" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:45.524894" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.524733" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.524426" elapsed="0.000819"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:45.525389" elapsed="0.000311"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:45.526116" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:45.525862" elapsed="0.000278"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:45.526293" elapsed="0.000227"/>
</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-10-11T01:03:45.520646" elapsed="0.005929"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:45.526718" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:45.526638" elapsed="0.000119"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.526621" elapsed="0.000156"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:45.527575" 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-10-11T01:03:45.526928" elapsed="0.000674"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:45.527648" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:45.527773" 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-10-11T01:03:45.512790" elapsed="0.015006"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:45.527850" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:03:45.527986" 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-10-11T01:03:45.468740" elapsed="0.059270"/>
</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-10-11T01:03:45.538575" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:45.538258" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:45.539309" 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-10-11T01:03:45.539093" elapsed="0.000353">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-10-11T01:03:45.539609" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:45.538760" elapsed="0.000872"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.540131" 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-10-11T01:03:45.539807" elapsed="0.000349"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:45.540448" 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-10-11T01:03:45.540609" 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-10-11T01:03:45.540322" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.541061" 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-10-11T01:03:45.540827" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:45.541478" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.541163" elapsed="0.000370"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.542155" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:45.541701" elapsed="0.000479"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:45.541554" elapsed="0.000658"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:45.541145" elapsed="0.001087"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.542961" 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-10-11T01:03:45.542394" elapsed="0.000594"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:45.543031" 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-10-11T01:03:45.537746" elapsed="0.005386"/>
</kw>
<msg time="2026-10-11T01:03:45.543178" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:45.533376" elapsed="0.009846"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:45.547330" 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/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-10-11T01:03:45.551507" 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/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-10-11T01:03:45.555719" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.555945" 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-10-11T01:03:45.556129" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.556482" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.556322" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:45.556309" 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-10-11T01:03:45.556710" 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-10-11T01:03:45.556932" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.557102" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:45.556283" elapsed="0.000866"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:45.556194" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:45.557322" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:45.557388" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:45.557508" 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-10-11T01:03:45.532668" elapsed="0.024865"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:45.557700" elapsed="0.000320"/>
</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-10-11T01:03:45.558912" 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-10-11T01:03:45.558664" elapsed="0.000276"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:45.559625" 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-10-11T01:03:45.559089" elapsed="0.000562"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:03:45.560112" 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-10-11T01:03:45.560279" 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-10-11T01:03:45.559833" elapsed="0.000510">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-10-11T01:03:45.558288" elapsed="0.002210">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-10-11T01:03:45.558089" elapsed="0.002489">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-10-11T01:03:45.560818" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:45.560637" elapsed="0.000231"/>
</branch>
<status status="FAIL" start="2026-10-11T01:03:45.558073" elapsed="0.002817">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-10-11T01:03:45.528965" elapsed="0.032047">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-10-11T01:03:45.528284" elapsed="0.032854">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-10-11T01:03:45.528082" elapsed="0.033132">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-10-11T01:03:45.528067" elapsed="0.033179">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-10-11T01:03:45.561289" elapsed="0.000015"/>
</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-10-11T01:03:45.468108" elapsed="0.093287">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-10-11T01:03:47.598564" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:47.597810" elapsed="0.000822"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:47.600223" 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-10-11T01:03:47.599776" elapsed="0.000590">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-10-11T01:03:47.600888" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:47.599017" elapsed="0.001947"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.602206" 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-10-11T01:03:47.601360" elapsed="0.000905"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:47.602980" 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-10-11T01:03:47.603267" 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-10-11T01:03:47.602672" elapsed="0.000649"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.604505" 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-10-11T01:03:47.603931" elapsed="0.000687"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.607166" 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-10-11T01:03:47.606609" elapsed="0.000652"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.608273" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:47.607687" elapsed="0.000640"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.610156" 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-10-11T01:03:47.609086" elapsed="0.001124"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:47.612888" 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-10-11T01:03:47.611647" elapsed="0.001462"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:47.613289" elapsed="0.000073"/>
</return>
<msg time="2026-10-11T01:03:47.613807" 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-10-11T01:03:47.610637" elapsed="0.003223"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:47.614251" elapsed="0.000768"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:03:47.608772" elapsed="0.006331"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.616328" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:47.615672" elapsed="0.000690"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:47.618032" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:47.617288" elapsed="0.000865"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:47.618263" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T01:03:47.618583" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:47.616682" 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-10-11T01:03:47.618845" elapsed="0.000433"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:47.615324" elapsed="0.004006"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:47.608456" elapsed="0.010917"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:47.619460" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T01:03:47.619648" 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-10-11T01:03:47.605381" elapsed="0.014300"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:47.604785" elapsed="0.014936"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:47.619978" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:47.619753" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:47.604740" elapsed="0.015336"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.621269" 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-10-11T01:03:47.620299" elapsed="0.001007"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:47.621367" 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/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-10-11T01:03:47.596620" elapsed="0.024976"/>
</kw>
<msg time="2026-10-11T01:03:47.621710" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:47.586681" elapsed="0.035095"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:47.627572" 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/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-10-11T01:03:47.633295" 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/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-10-11T01:03:47.639004" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:47.639262" 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-10-11T01:03:47.639537" 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-10-11T01:03:47.640028" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:47.639806" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:47.639787" elapsed="0.000343"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:47.640348" 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-10-11T01:03:47.640620" 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-10-11T01:03:47.640849" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:47.639752" elapsed="0.001181"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:47.639630" elapsed="0.001337"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:47.641179" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:47.641271" elapsed="0.000021"/>
</return>
<msg time="2026-10-11T01:03:47.641438" 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-10-11T01:03:47.585197" elapsed="0.056277"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:47.642771" 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-10-11T01:03:47.642585" elapsed="0.000277">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-10-11T01:03:47.642960" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:47.642246" elapsed="0.000737"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:47.643266" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:47.643046" elapsed="0.000271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.643805" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:47.643542" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:47.643339" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:47.643030" elapsed="0.000852"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.644396" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:47.644059" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:47.644479" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:47.644603" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:47.641924" elapsed="0.002702"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:47.645666" 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-10-11T01:03:47.645519" elapsed="0.000198"/>
</kw>
<msg time="2026-10-11T01:03:47.645792" 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-10-11T01:03:47.645186" elapsed="0.000628"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:03:47.645989" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:47.645878" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:47.645861" elapsed="0.000188"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:47.646324" 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-10-11T01:03:47.646456" 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-10-11T01:03:47.646200" elapsed="0.000280"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:03:47.646826" 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-10-11T01:03:47.646640" elapsed="0.000209"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:03:47.646902" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:47.647028" 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-10-11T01:03:47.644874" elapsed="0.002176"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.648265" 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-10-11T01:03:47.648042" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.648730" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:47.648512" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:47.655771" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:47.655961" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:03:47.656059" 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-10-11T01:03:47.649068" elapsed="0.007016"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:47.648830" elapsed="0.007322"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:47.656333" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:47.656178" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:47.648813" elapsed="0.007618"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.657722" 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-10-11T01:03:47.657350" elapsed="0.000435"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:47.657111" elapsed="0.000719"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:47.657094" elapsed="0.000770"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.658610" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:47.658284" elapsed="0.000373"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:47.657958" elapsed="0.000733"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:47.657934" elapsed="0.000780"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.659290" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:47.658926" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:47.659626" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:47.659379" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.660144" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:47.659866" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:47.659700" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:47.659362" elapsed="0.000860"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.660757" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:47.660398" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:47.661068" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:47.660845" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.661591" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:47.661302" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:47.661141" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:47.660828" elapsed="0.000840"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:47.661817" elapsed="0.000310"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:47.662538" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:47.662288" elapsed="0.000275"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:47.662717" elapsed="0.000225"/>
</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-10-11T01:03:47.656763" elapsed="0.006240"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:47.663152" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:47.663067" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:47.663051" elapsed="0.000162"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:47.663853" 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-10-11T01:03:47.663354" elapsed="0.000526"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:47.663937" elapsed="0.000033"/>
</return>
<msg time="2026-10-11T01:03:47.664072" 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-10-11T01:03:47.647325" elapsed="0.016771"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:47.664197" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:47.664322" 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-10-11T01:03:47.566526" elapsed="0.097820"/>
</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-10-11T01:03:47.675129" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:47.674814" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:47.675913" 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-10-11T01:03:47.675654" elapsed="0.000386">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-10-11T01:03:47.676204" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:47.675316" elapsed="0.000911"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.676740" 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-10-11T01:03:47.676422" elapsed="0.000343"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:47.677065" 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-10-11T01:03:47.677202" 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-10-11T01:03:47.676952" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.677660" 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-10-11T01:03:47.677438" elapsed="0.000265"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:47.678082" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:47.677764" elapsed="0.000372"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.678774" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:47.678306" elapsed="0.000494"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:47.678159" elapsed="0.000673"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:47.677747" elapsed="0.001104"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.679436" 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-10-11T01:03:47.679025" elapsed="0.000438"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:47.679506" 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/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-10-11T01:03:47.674297" elapsed="0.005310"/>
</kw>
<msg time="2026-10-11T01:03:47.679655" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:47.669874" elapsed="0.009826"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:47.683865" 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/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-10-11T01:03:47.688038" 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/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-10-11T01:03:47.692290" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:47.692487" 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-10-11T01:03:47.692671" 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-10-11T01:03:47.693035" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:47.692877" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:47.692863" 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-10-11T01:03:47.693263" 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-10-11T01:03:47.693459" 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-10-11T01:03:47.693636" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:47.692837" elapsed="0.000847"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:47.692742" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:47.693864" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:47.693942" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:47.694047" 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-10-11T01:03:47.669154" elapsed="0.024918"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:47.694240" elapsed="0.000328"/>
</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-10-11T01:03:47.695467" 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-10-11T01:03:47.695212" elapsed="0.000282"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:47.695879" 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-10-11T01:03:47.695648" elapsed="0.000270"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:03:47.696102" elapsed="0.000277"/>
</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-10-11T01:03:47.694838" elapsed="0.001613"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:47.694638" elapsed="0.001843"/>
</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-10-11T01:03:47.696679" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:47.696503" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:47.694621" elapsed="0.002163"/>
</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-10-11T01:03:47.665337" elapsed="0.031492"/>
</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-10-11T01:03:47.664649" elapsed="0.032256"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:47.664435" elapsed="0.032511"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:47.664404" elapsed="0.032564"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:47.696998" 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-10-11T01:03:47.564952" elapsed="0.132147"/>
</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-10-11T01:03:45.466393" elapsed="2.230760"/>
</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-10-11T01:03:47.697351" elapsed="0.002784"/>
</kw>
<arg>source_active_ad</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-10-11T01:03:43.067211" elapsed="4.632978"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:42.978436" elapsed="4.721861"/>
</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-10-11T01:03:47.701690" elapsed="0.000229"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:03:47.701433" 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-10-11T01:03:47.702905" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:47.702807" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:47.702790" elapsed="0.000180"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:47.705090" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:47.705008" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:47.704991" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.706068" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:47.705734" elapsed="0.000360"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.706523" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:03:47.706246" elapsed="0.000302"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:03:47.706587" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:47.706713" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:03:47.705361" elapsed="0.001375"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:47.709294" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:47.709210" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:47.709193" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:47.710425" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:47.710322" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:47.710305" elapsed="0.000185"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:47.710808" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:03:47.710639" elapsed="0.000193"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:03:47.711152" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:47.711011" elapsed="0.000164"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:03:47.745649" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:03:47.711692" elapsed="0.034053"/>
</kw>
<msg time="2026-10-11T01:03:47.745909" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:03:47.746005" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:47.711334" elapsed="0.034711"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:03:47.781268" 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-10-11T01:03:47.746577" elapsed="0.034792"/>
</kw>
<msg time="2026-10-11T01:03:47.781538" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:03:47.781579" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:47.746216" elapsed="0.035399"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:47.781905" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:47.781683" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:47.781665" elapsed="0.000312"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.782383" 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-10-11T01:03:47.782159" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:47.782732" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:47.782530" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:47.782513" elapsed="0.000289"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:03:47.782832" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:47.785381" elapsed="0.000144"/>
</kw>
<msg time="2026-10-11T01:03:47.785590" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:47.784200" elapsed="0.001521"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:47.786073" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:47.786439" 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-10-11T01:03:47.783605" elapsed="0.003023"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:03:47.783122" 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-10-11T01:03:47.710065" elapsed="0.076694"/>
</kw>
<msg time="2026-10-11T01:03:47.786840" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:47.786880" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:47.709523" elapsed="0.077404"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:03:47.787083" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:03:47.786997" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:47.786979" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:47.787506" 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-10-11T01:03:47.787807" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:03:47.787871" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T01:03:47.708927" elapsed="0.079044"/>
</kw>
<msg time="2026-10-11T01:03:47.788054" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:47.788095" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:47.707119" elapsed="0.081011"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:47.788529" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:47.788230" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:47.788212" elapsed="0.000395"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:03:47.706975" elapsed="0.081654"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:03:47.706784" elapsed="0.081872"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:03:47.704707" elapsed="0.083997"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:03:47.702547" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:47.702123" elapsed="0.086672"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:03:47.701070" elapsed="0.087770"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:47.789663" 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-10-11T01:03:47.789796" 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-10-11T01:03:47.789519" elapsed="0.000303"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:03:47.790177" 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-10-11T01:03:47.789999" elapsed="0.000202"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:47.790515" 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-10-11T01:03:47.790634" 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-10-11T01:03:47.790364" elapsed="0.000297"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:03:47.791003" 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-10-11T01:03:47.790820" elapsed="0.000208"/>
</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-10-11T01:03:47.791276" elapsed="0.002508"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:47.791091" elapsed="0.002727"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:47.791074" elapsed="0.002767"/>
</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-10-11T01:03:47.804589" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:47.804269" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:47.805302" 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-10-11T01:03:47.805110" elapsed="0.000258">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-10-11T01:03:47.805469" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:47.804776" elapsed="0.000716"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.805989" 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-10-11T01:03:47.805667" elapsed="0.000347"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:47.806289" 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-10-11T01:03:47.806422" 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-10-11T01:03:47.806181" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.806915" 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-10-11T01:03:47.806678" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.807861" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:03:47.807632" elapsed="0.000283"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.808351" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:47.808094" elapsed="0.000281"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.808982" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:47.808704" elapsed="0.000302"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:47.809867" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:47.809503" elapsed="0.000399"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:47.809948" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:47.810073" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:47.809177" 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-10-11T01:03:47.810261" elapsed="0.000193"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:03:47.808572" elapsed="0.001920"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.811024" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:47.810721" elapsed="0.000328"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:47.811907" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:47.811542" elapsed="0.000390"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:47.811976" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:47.812100" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:47.811216" elapsed="0.000907"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:47.812286" elapsed="0.000185"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:47.810590" elapsed="0.001917"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:47.808432" elapsed="0.004106"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:47.812595" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:03:47.812729" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:47.807273" elapsed="0.005479"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:47.807020" elapsed="0.005761"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:47.812963" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:47.812803" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:47.807003" elapsed="0.006028"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.813722" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:47.813192" elapsed="0.000557"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:47.813793" 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-10-11T01:03:47.803746" elapsed="0.010157"/>
</kw>
<msg time="2026-10-11T01:03:47.813952" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:47.799233" elapsed="0.014764"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:47.818284" 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/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-10-11T01:03:47.822438" 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/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-10-11T01:03:47.826563" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:47.826747" 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-10-11T01:03:47.826942" 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-10-11T01:03:47.827282" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:47.827134" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:47.827121" 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-10-11T01:03:47.827528" 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-10-11T01:03:47.827711" 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-10-11T01:03:47.827876" elapsed="0.000029"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:47.827095" elapsed="0.000840"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:47.827009" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:47.828110" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:47.828176" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:47.828283" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:47.798637" elapsed="0.029670"/>
</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-10-11T01:03:47.837231" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:47.836931" elapsed="0.000326"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:47.837930" 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-10-11T01:03:47.837748" elapsed="0.000242">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-10-11T01:03:47.838073" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:47.837431" elapsed="0.000665"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.838590" 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-10-11T01:03:47.838268" elapsed="0.000348"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:47.838900" 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-10-11T01:03:47.839049" 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-10-11T01:03:47.838782" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.839511" 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-10-11T01:03:47.839273" 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-10-11T01:03:47.839875" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:47.839628" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.840373" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', '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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:47.840113" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:47.839965" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:47.839610" elapsed="0.000855"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.841025" 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-10-11T01:03:47.840629" elapsed="0.000424"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:47.841097" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:47.836421" elapsed="0.004776"/>
</kw>
<msg time="2026-10-11T01:03:47.841247" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:47.832079" elapsed="0.009211"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:47.845541" 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/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-10-11T01:03:47.849678" 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/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-10-11T01:03:47.853765" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:47.853996" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:47.854184" 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-10-11T01:03:47.854537" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:47.854376" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:47.854362" 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-10-11T01:03:47.854767" 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-10-11T01:03:47.854964" 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-10-11T01:03:47.855131" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:47.854337" elapsed="0.000841"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:47.854249" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:47.855354" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:47.855438" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:47.855555" 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-10-11T01:03:47.831373" elapsed="0.024209"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:47.856708" 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-10-11T01:03:47.856509" elapsed="0.000259">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-10-11T01:03:47.856851" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:47.856169" elapsed="0.000704"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:47.857168" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:47.856947" elapsed="0.000272"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.857686" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:47.857421" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:47.857240" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:47.856930" elapsed="0.000832"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.858281" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:47.857945" elapsed="0.000359"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:47.858348" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:47.858488" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:47.855856" elapsed="0.002654"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.859818" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:47.859599" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.860277" 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-10-11T01:03:47.860066" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.860796" 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-10-11T01:03:47.860572" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.861253" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:47.861037" elapsed="0.000256"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:47.862026" 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-10-11T01:03:47.861851" elapsed="0.000199"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:03:47.862349" 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-10-11T01:03:47.862206" elapsed="0.000167"/>
</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-10-11T01:03:47.862551" elapsed="0.000155"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.863165" 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-10-11T01:03:47.862942" elapsed="0.000263"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:03:47.863243" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:47.863370" 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-10-11T01:03:47.861493" elapsed="0.001900"/>
</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-10-11T01:03:47.873764" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.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-10-11T01:03:47.873839" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:47.873953" 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-10-11T01:03:47.863703" elapsed="0.010275"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:47.863471" elapsed="0.010555"/>
</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-10-11T01:03:47.874233" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:47.874055" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:47.863454" elapsed="0.010860"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.875676" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:47.875355" elapsed="0.000364"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:47.875097" elapsed="0.000654"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:47.875079" elapsed="0.000695"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.876343" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:47.876076" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:47.875824" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:47.875809" elapsed="0.000647"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.877011" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:47.876643" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:47.877313" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:47.877099" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.877831" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:47.877566" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:47.877387" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:47.877082" elapsed="0.000885"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.878499" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:47.878145" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:47.878798" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:47.878588" elapsed="0.000260"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.879304" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:47.879044" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:47.878870" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:47.878571" elapsed="0.000808"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:47.879543" elapsed="0.000298"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:47.880250" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:47.880018" elapsed="0.000256"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:47.880443" elapsed="0.000215"/>
</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-10-11T01:03:47.874697" elapsed="0.006017"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:03:47.880863" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-10-11T01:03:47.880777" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:47.880760" elapsed="0.000202"/>
</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-10-11T01:03:47.881109" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:03:47.881170" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:03:47.881328" 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-10-11T01:03:47.858802" elapsed="0.022550"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:47.881429" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:47.881556" 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-10-11T01:03:47.794769" elapsed="0.086809"/>
</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-10-11T01:03:47.881872" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:47.881669" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:47.881653" elapsed="0.000315"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:47.881997" elapsed="0.000024"/>
</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-10-11T01:03:47.794086" elapsed="0.088009"/>
</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-10-11T01:03:47.885633" level="INFO">${update} = </msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:03:47.883005" elapsed="0.002653"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:03:47.886179" level="FAIL"> == </msg>
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="FAIL" start="2026-10-11T01:03:47.885815" elapsed="0.000429"> == </status>
</kw>
<return>
<value>${update}</value>
<status status="NOT RUN" start="2026-10-11T01:03:47.886295" elapsed="0.000017"/>
</return>
<doc>Returns hex update message.</doc>
<status status="FAIL" start="2026-10-11T01:03:47.882736" elapsed="0.003661"> == </status>
</kw>
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:49.891509" level="INFO">${update} = ffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f01010100061600010102030401020000001020010000012002000002</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:03:49.887878" elapsed="0.003704"/>
</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-10-11T01:03:49.892022" elapsed="0.000755"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:03:49.892878" elapsed="0.000102"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:03:49.887117" elapsed="0.006038"/>
</kw>
<msg time="2026-10-11T01:03:49.893306" 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-10-11T01:03:47.882283" elapsed="2.011077"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:03:49.895740" level="INFO">Length is 160.</msg>
<msg time="2026-10-11T01:03:49.895921" 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-10-11T01:03:49.895124" elapsed="0.000851"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:03:49.896906" level="INFO">Length is 160.</msg>
<msg time="2026-10-11T01:03:49.897061" 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-10-11T01:03:49.896334" elapsed="0.000776"/>
</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-10-11T01:03:49.897569" elapsed="0.000763"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:49.899234" 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-10-11T01:03:49.898778" elapsed="0.000521"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:49.900158" 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-10-11T01:03:49.899720" 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-10-11T01:03:49.900749" elapsed="0.000779"/>
</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-10-11T01:03:49.893852" elapsed="0.007841"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:03:49.902089" elapsed="0.003642"/>
</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-10-11T01:03:49.937223" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:49.936526" elapsed="0.000756"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:49.938865" 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-10-11T01:03:49.938433" elapsed="0.000606">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-10-11T01:03:49.939229" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:49.937668" elapsed="0.001610"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:49.940213" 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-10-11T01:03:49.939707" elapsed="0.000541"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:49.940661" 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-10-11T01:03:49.940839" 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-10-11T01:03:49.940503" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:49.941487" 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-10-11T01:03:49.941160" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:49.942834" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:03:49.942512" elapsed="0.000397"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:49.945270" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:49.943158" elapsed="0.002192"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:49.946708" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:49.945916" elapsed="0.000830"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:49.948309" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:49.947665" elapsed="0.000781"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:49.948633" elapsed="0.000050"/>
</return>
<msg time="2026-10-11T01:03:49.948882" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:49.947033" elapsed="0.001901"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:49.949173" elapsed="0.000475"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:03:49.945644" elapsed="0.004059"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:49.950651" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:49.950056" elapsed="0.000630"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:49.952217" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:49.951587" elapsed="0.000739"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:49.952563" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T01:03:49.952797" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:49.950943" elapsed="0.001888"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:49.953082" elapsed="0.000445"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:49.949850" elapsed="0.003731"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:49.945438" elapsed="0.008188"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:49.953680" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T01:03:49.953862" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:49.942016" elapsed="0.011896"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:49.941636" elapsed="0.012318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:49.954201" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:49.953987" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:49.941609" elapsed="0.012691"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:49.955307" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:49.954564" elapsed="0.000780"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:49.955431" 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/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-10-11T01:03:49.935316" elapsed="0.020259"/>
</kw>
<msg time="2026-10-11T01:03:49.955642" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:49.925530" elapsed="0.030179"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:49.961616" 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/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-10-11T01:03:49.967067" 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/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-10-11T01:03:49.971210" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:49.971394" 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-10-11T01:03:49.971595" 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-10-11T01:03:49.971955" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:49.971793" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:49.971778" 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-10-11T01:03:49.972187" 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-10-11T01:03:49.972368" 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-10-11T01:03:49.972549" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:49.971752" elapsed="0.000846"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:49.971662" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:49.972773" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:49.972840" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:49.973009" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:49.924079" elapsed="0.048955"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:49.974064" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:49.973822" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:49.983457" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:49.983502" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:49.983601" 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-10-11T01:03:49.974399" elapsed="0.009228"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:49.974168" elapsed="0.009495"/>
</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-10-11T01:03:49.983848" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:49.983689" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:49.974151" elapsed="0.009786"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:49.985349" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:49.985068" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:49.984803" elapsed="0.000636"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:49.984602" elapsed="0.000862"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:49.986045" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:49.985759" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:49.985515" elapsed="0.000634"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:49.985500" elapsed="0.000673"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:49.986744" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:49.986371" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:49.987067" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:49.986837" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:49.987590" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:49.987307" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:49.987142" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:49.986820" elapsed="0.000849"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:49.988195" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:49.987846" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:49.988515" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:49.988283" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:49.989035" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:49.988758" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:49.988591" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:49.988266" elapsed="0.000847"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:49.989259" elapsed="0.000310"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:49.989970" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:49.989733" elapsed="0.000262"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:49.990147" elapsed="0.000213"/>
</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-10-11T01:03:49.984266" elapsed="0.006164"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:03:49.990472" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:49.990645" 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-10-11T01:03:49.973276" elapsed="0.017393"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:49.990715" elapsed="0.000024"/>
</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-10-11T01:03:49.907932" elapsed="0.082878"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:49.906988" elapsed="0.083870"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:03:49.906129" elapsed="0.084794"/>
</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-10-11T01:03:49.994201" level="INFO">${update} = ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105061600010102030401020000001020010000012002000002</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:03:49.991812" elapsed="0.002416"/>
</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-10-11T01:03:49.994385" elapsed="0.000334"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:03:49.994762" elapsed="0.000027"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:03:49.991556" elapsed="0.003318"/>
</kw>
<msg time="2026-10-11T01:03:49.995050" 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-10-11T01:03:49.991106" elapsed="0.003984"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:03:49.996194" level="INFO">Length is 148.</msg>
<msg time="2026-10-11T01:03:49.996291" 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-10-11T01:03:49.995845" elapsed="0.000477"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:03:49.996902" level="INFO">Length is 148.</msg>
<msg time="2026-10-11T01:03:49.996997" 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-10-11T01:03:49.996566" 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-10-11T01:03:49.997331" elapsed="0.000401"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:49.998170" 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-10-11T01:03:49.997956" elapsed="0.000247"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:49.998628" 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-10-11T01:03:49.998400" elapsed="0.000261"/>
</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-10-11T01:03:49.998926" elapsed="0.000372"/>
</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-10-11T01:03:49.995356" elapsed="0.004020"/>
</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-10-11T01:03:50.017213" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:50.016906" elapsed="0.000340"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:50.018024" 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-10-11T01:03:50.017794" elapsed="0.000299">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-10-11T01:03:50.018179" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:50.017458" elapsed="0.000744"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:50.018703" 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-10-11T01:03:50.018375" elapsed="0.000353"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:50.019019" 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-10-11T01:03:50.019151" 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-10-11T01:03:50.018906" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:50.019608" 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-10-11T01:03:50.019373" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:50.020592" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:03:50.020344" elapsed="0.000289"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:50.021074" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:50.020809" elapsed="0.000289"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:50.021879" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:50.021428" elapsed="0.000488"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:50.022958" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:50.022513" elapsed="0.000485"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:50.023109" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:03:50.023286" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:50.022085" elapsed="0.001224"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:50.023489" elapsed="0.000282"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:03:50.021283" elapsed="0.002526"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:50.024521" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:50.024052" elapsed="0.000494"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:50.025630" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:50.025170" elapsed="0.000500"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:50.025777" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:03:50.025983" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:50.024751" elapsed="0.001256"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:50.026171" elapsed="0.000291"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:50.023920" elapsed="0.002581"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:50.021142" elapsed="0.005390"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:50.026569" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:50.026697" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:50.019977" elapsed="0.006743"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:50.019710" elapsed="0.007039"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:50.026931" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:50.026770" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:50.019692" elapsed="0.007308"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:50.027856" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:50.027159" elapsed="0.000735"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:50.027939" 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-10-11T01:03:50.016346" elapsed="0.011695"/>
</kw>
<msg time="2026-10-11T01:03:50.028088" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:50.011978" elapsed="0.016166"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:50.032359" 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/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-10-11T01:03:50.036506" 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/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-10-11T01:03:50.040652" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:50.040833" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:50.041027" 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-10-11T01:03:50.041363" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:50.041218" elapsed="0.000241"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:50.041204" 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-10-11T01:03:50.041643" 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-10-11T01:03:50.041825" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:50.042004" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:50.041179" elapsed="0.000874"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:50.041092" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:50.042228" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:50.042294" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:03:50.042401" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:50.011310" elapsed="0.031130"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:50.043604" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:50.043322" elapsed="0.000325"/>
</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-10-11T01:03:50.049227" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:50.049531" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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+xml', 'Content-Length': '635'} 
 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-path xmlns:a="urn:opendaylight:params:xml:ns:yang:bgp-rib" xmlns:b="urn:opendaylight:params:xml:ns:yang:bgp-types" xmlns:c="urn:opendaylight:params:xml:ns:yang:bgp:mvpn" xmlns:d="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;/a:application-rib[a:id='10.30.170.173']/a:tables[a:afi='b:ipv4-address-family'][a:safi='c:mcast-vpn-subsequent-address-family']/d:mvpn-routes-ipv4&lt;/error-path&gt;&lt;error-message&gt;Data does not exist&lt;/error-message&gt;&lt;error-tag&gt;data-missing&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-10-11T01:03:50.049659" level="INFO">${response} = None</msg>
<msg time="2026-10-11T01:03:50.049701" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:50.043946" elapsed="0.006116">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:50.043707" elapsed="0.006430">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:50.050319" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:50.050168" elapsed="0.000205"/>
</branch>
<status status="FAIL" start="2026-10-11T01:03:50.043690" elapsed="0.006705">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:50.051662" 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-10-11T01:03:50.051376" elapsed="0.000318">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:03:50.051112" elapsed="0.000639">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:03:50.051095" elapsed="0.000717">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-10-11T01:03:50.052397" 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-10-11T01:03:50.052134" elapsed="0.000309">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:03:50.051880" elapsed="0.000621">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:03:50.051864" elapsed="0.000665">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:50.053228" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:50.052720" elapsed="0.000535"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:50.053549" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:50.053320" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:50.054075" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:50.053790" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:50.053625" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:50.053302" elapsed="0.000850"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:50.054696" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:50.054328" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:50.055015" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:50.054790" elapsed="0.000277"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:50.055535" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:50.055253" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:50.055090" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:50.054773" elapsed="0.000840"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:50.055765" elapsed="0.000319"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:50.056484" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:50.056246" elapsed="0.000262"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-10-11T01:03:50.056820" 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-10-11T01:03:50.056660" elapsed="0.000190">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-10-11T01:03:50.050744" elapsed="0.006244">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-10-11T01:03:50.057042" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:50.057292" level="INFO">${response_text} = None</msg>
<msg time="2026-10-11T01:03:50.057319" 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-10-11T01:03:50.042673" elapsed="0.014672">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-10-11T01:03:50.057402" elapsed="0.000039"/>
</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-10-11T01:03:50.000752" elapsed="0.056804">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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:50.000194" elapsed="0.057416"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:03:49.999678" elapsed="0.057984"/>
</kw>
<arg>shared_tree_join</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-10-11T01:03:47.789110" elapsed="2.268629"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:47.700632" elapsed="2.357211"/>
</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-10-11T01:03:50.059206" elapsed="0.000216"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:03:50.058954" 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-10-11T01:03:50.060441" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:50.060338" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:50.060321" elapsed="0.000187"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:50.062643" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:50.062559" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:50.062542" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:50.063630" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:50.063288" elapsed="0.000367"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:03:50.064093" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:03:50.063809" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:03:50.064158" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:50.064284" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:03:50.062928" elapsed="0.001379"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:50.066846" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:50.066763" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:50.066746" elapsed="0.000181"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:50.067971" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:50.067874" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:50.067857" elapsed="0.000177"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:50.068349" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:03:50.068182" elapsed="0.000191"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:03:50.068705" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:50.068566" elapsed="0.000163"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:03:50.102736" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:03:50.069228" elapsed="0.033602"/>
</kw>
<msg time="2026-10-11T01:03:50.102993" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:03:50.103035" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:50.068899" elapsed="0.034171"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:03:50.138740" 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-10-11T01:03:50.103592" elapsed="0.035246"/>
</kw>
<msg time="2026-10-11T01:03:50.138999" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:03:50.139040" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:50.103235" elapsed="0.035840"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:50.139345" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:50.139141" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:50.139124" elapsed="0.000314"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:50.139840" 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-10-11T01:03:50.139620" elapsed="0.000334"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:50.140217" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:50.140017" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:50.140000" elapsed="0.000287"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:03:50.140317" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:50.142852" elapsed="0.000129"/>
</kw>
<msg time="2026-10-11T01:03:50.143037" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:50.141687" elapsed="0.001479"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:50.143487" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:50.143818" 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-10-11T01:03:50.141089" elapsed="0.002934"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:03:50.140607" 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-10-11T01:03:50.067619" elapsed="0.076537"/>
</kw>
<msg time="2026-10-11T01:03:50.144237" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:50.144276" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:50.067078" elapsed="0.077233"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:03:50.144488" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:03:50.144378" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:50.144361" elapsed="0.000203"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:50.144903" 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-10-11T01:03:50.145204" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:03:50.145267" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T01:03:50.066478" elapsed="0.078872"/>
</kw>
<msg time="2026-10-11T01:03:50.145454" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:50.145495" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:50.064650" elapsed="0.080879"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:50.145814" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:50.145596" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:50.145580" elapsed="0.000316"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:03:50.064506" elapsed="0.081412"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:03:50.064353" elapsed="0.081592"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:03:50.062236" elapsed="0.083757"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:03:50.060085" elapsed="0.085958"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:50.059624" elapsed="0.086459"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:03:50.058587" elapsed="0.087543"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:50.147229" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:50.146815" elapsed="0.000440"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:50.147832" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:50.147450" elapsed="0.000456"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:50.148441" 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-10-11T01:03:50.148091" elapsed="0.000376"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:50.148773" 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-10-11T01:03:50.148936" 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-10-11T01:03:50.148632" elapsed="0.000328"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:50.149257" 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-10-11T01:03:50.149369" 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-10-11T01:03:50.149122" elapsed="0.000272"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:03:50.149552" elapsed="0.002480"/>
</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-10-11T01:03:50.152178" elapsed="0.002326"/>
</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-10-11T01:03:50.170499" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:50.170175" elapsed="0.000352"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:50.171240" 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-10-11T01:03:50.171028" elapsed="0.000280">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-10-11T01:03:50.171393" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:50.170688" elapsed="0.000744"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:50.171935" 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-10-11T01:03:50.171608" elapsed="0.000353"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:50.172242" 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-10-11T01:03:50.172379" 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-10-11T01:03:50.172129" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:50.172842" 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-10-11T01:03:50.172616" 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-10-11T01:03:50.173814" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:50.173582" elapsed="0.000274"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:50.174296" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:50.174046" elapsed="0.000274"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:50.175126" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:50.174657" elapsed="0.000493"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:50.176331" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:50.175798" elapsed="0.000638"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:50.176570" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T01:03:50.176793" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:50.175328" elapsed="0.001488"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:50.177000" elapsed="0.000318"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:03:50.174523" elapsed="0.002833"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:50.178055" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:50.177607" elapsed="0.000473"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:50.179225" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:50.178707" elapsed="0.000606"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:50.179394" elapsed="0.000049"/>
</return>
<msg time="2026-10-11T01:03:50.179627" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:50.178249" 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-10-11T01:03:50.179815" elapsed="0.000321"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:50.177476" elapsed="0.002698"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:50.174365" elapsed="0.005840"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:50.180242" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:50.180370" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:50.173226" elapsed="0.007167"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:50.172969" elapsed="0.007566"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:50.180708" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:50.180559" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:50.172948" elapsed="0.007828"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:50.181624" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-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-10-11T01:03:50.180949" elapsed="0.000743"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:50.181738" 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/rib.vanadium/${file_name} exists. 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-10-11T01:03:50.169648" elapsed="0.012192"/>
</kw>
<msg time="2026-10-11T01:03:50.181903" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:50.165281" elapsed="0.016668"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:50.186083" 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/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-10-11T01:03:50.190167" 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/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-10-11T01:03:50.194243" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:50.194471" 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-10-11T01:03:50.194656" 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-10-11T01:03:50.195011" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:50.194850" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:50.194837" 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-10-11T01:03:50.195240" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:50.195436" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:50.195607" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:50.194810" elapsed="0.000844"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:50.194723" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:50.195835" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:50.195917" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:03:50.196029" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-i...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:03:50.164662" elapsed="0.031392"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:50.197172" 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-10-11T01:03:50.196977" elapsed="0.000255">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-10-11T01:03:50.197314" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:50.196639" elapsed="0.000699"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:50.197640" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:50.197400" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:50.198164" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:50.197903" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:50.197714" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:50.197383" elapsed="0.000856"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:50.198753" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:50.198399" elapsed="0.000379"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:50.198821" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:50.198961" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:50.196321" elapsed="0.002663"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:50.200074" 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-10-11T01:03:50.199869" elapsed="0.000263">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-10-11T01:03:50.200214" 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-10-11T01:03:50.199550" elapsed="0.000687"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:03:50.200395" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-10-11T01:03:50.200298" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:50.200282" 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-10-11T01:03:50.200675" elapsed="0.000019"/>
</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-10-11T01:03:50.200850" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:03:50.200969" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:03:50.201093" 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-10-11T01:03:50.199234" elapsed="0.001882"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:50.202345" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:50.202123" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:50.203048" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:50.202601" elapsed="0.000488"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:50.208334" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:50.208497" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:50.208587" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:50.203378" elapsed="0.005578">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:50.203150" elapsed="0.005882">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:50.209218" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:50.209063" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-10-11T01:03:50.203133" elapsed="0.006166">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:50.209661" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:50.209783" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:50.209749" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:50.209733" elapsed="0.000107"/>
</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-10-11T01:03:50.209996" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:03:50.210059" 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-10-11T01:03:50.201397" elapsed="0.008757">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:50.210219" 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-10-11T01:03:50.157208" elapsed="0.053097">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:50.210598" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:50.210433" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:50.210402" elapsed="0.000283"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:50.210716" elapsed="0.000013"/>
</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-10-11T01:03:50.156546" elapsed="0.054258">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:52.246040" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:52.245275" elapsed="0.000831"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:52.247803" 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-10-11T01:03:52.247337" elapsed="0.000637">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-10-11T01:03:52.248167" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:52.246501" elapsed="0.001719"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.249366" 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-10-11T01:03:52.248638" elapsed="0.000816"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:52.250102" 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-10-11T01:03:52.250388" 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-10-11T01:03:52.249830" elapsed="0.000644"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.251451" 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-10-11T01:03:52.250927" elapsed="0.000624"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.253657" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:52.253106" elapsed="0.000647"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.254805" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:52.254200" elapsed="0.000660"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.256700" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:52.255626" elapsed="0.001131"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:52.259348" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:52.258169" elapsed="0.001427"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:52.259777" elapsed="0.000076"/>
</return>
<msg time="2026-10-11T01:03:52.260280" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:52.257161" elapsed="0.003173"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:52.260741" elapsed="0.000775"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:03:52.255297" elapsed="0.006384"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.263257" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:52.262229" elapsed="0.001083"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:52.266040" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:52.264848" elapsed="0.001384"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:52.266454" elapsed="0.000076"/>
</return>
<msg time="2026-10-11T01:03:52.266954" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:52.263825" elapsed="0.003184"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:52.267375" elapsed="0.000727"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:52.261934" elapsed="0.006251"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:52.254982" elapsed="0.013274"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:52.268340" elapsed="0.000058"/>
</return>
<msg time="2026-10-11T01:03:52.268708" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:52.252291" elapsed="0.016471"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.251696" elapsed="0.017130"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.269238" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.268876" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.251652" elapsed="0.017741"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.270621" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-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-10-11T01:03:52.269799" elapsed="0.000860"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:52.270719" 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/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-10-11T01:03:52.244064" elapsed="0.026793"/>
</kw>
<msg time="2026-10-11T01:03:52.270940" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:52.233508" elapsed="0.037495"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:52.277002" 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/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-10-11T01:03:52.282706" 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-10-11T01:03:52.288530" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.288784" elapsed="0.000072"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.289105" 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-10-11T01:03:52.289601" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.289372" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:52.289353" elapsed="0.000349"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.289934" 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-10-11T01:03:52.290187" 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-10-11T01:03:52.290431" elapsed="0.000028"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:52.289318" elapsed="0.001182"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:52.289197" elapsed="0.001335"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.290744" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:52.290836" elapsed="0.000020"/>
</return>
<msg time="2026-10-11T01:03:52.291004" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-i...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:03:52.232098" elapsed="0.058941"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:52.292609" 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-10-11T01:03:52.292321" elapsed="0.000373">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-10-11T01:03:52.292809" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:52.291853" elapsed="0.000986"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.293249" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.292941" elapsed="0.000380"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.294007" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:52.293626" elapsed="0.000415"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.293351" elapsed="0.000734"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.292917" elapsed="0.001195"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.294824" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:52.294335" elapsed="0.000522"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:52.294936" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T01:03:52.295108" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:52.291431" elapsed="0.003708"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:52.296569" 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-10-11T01:03:52.296365" elapsed="0.000263">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-10-11T01:03:52.296710" 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-10-11T01:03:52.295996" elapsed="0.000737"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:03:52.296904" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:03:52.296795" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.296778" elapsed="0.000203"/>
</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-10-11T01:03:52.297174" 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-10-11T01:03:52.297351" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:03:52.297423" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:52.297548" 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-10-11T01:03:52.295509" elapsed="0.002062"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.298802" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:52.298577" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.299269" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:52.299053" elapsed="0.000255"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:52.306318" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:52.306481" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:52.306588" 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-10-11T01:03:52.299609" elapsed="0.007005"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.299368" elapsed="0.007286"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.306904" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.306679" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.299351" elapsed="0.007679"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.308855" 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-10-11T01:03:52.308364" elapsed="0.000574"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.308025" elapsed="0.000958"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.308000" elapsed="0.001015"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.309820" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:52.309442" elapsed="0.000451"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.309085" elapsed="0.000853"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.309063" elapsed="0.000907"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.310728" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:52.310222" elapsed="0.000541"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.311171" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.310853" elapsed="0.000392"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.311912" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:52.311527" elapsed="0.000421"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.311275" elapsed="0.000719"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.310829" elapsed="0.001192"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.312757" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:52.312266" elapsed="0.000526"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.313190" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.312894" elapsed="0.000410"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.313968" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:52.313587" elapsed="0.000416"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.313335" elapsed="0.000713"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.312856" elapsed="0.001218"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:52.314278" elapsed="0.000428"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:52.315257" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:52.314945" 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-10-11T01:03:52.315527" elapsed="0.000294"/>
</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-10-11T01:03:52.307501" elapsed="0.008412"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:52.316116" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:52.316000" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.315977" elapsed="0.000222"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:52.317294" 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-10-11T01:03:52.316394" elapsed="0.000937"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:52.317396" elapsed="0.000059"/>
</return>
<msg time="2026-10-11T01:03:52.317596" 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-10-11T01:03:52.297856" elapsed="0.019774"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:52.317707" elapsed="0.000033"/>
</return>
<msg time="2026-10-11T01:03:52.317871" 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-10-11T01:03:52.215987" elapsed="0.101933"/>
</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-10-11T01:03:52.330936" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:52.330612" elapsed="0.000351"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:52.331683" 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-10-11T01:03:52.331460" elapsed="0.000342">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-10-11T01:03:52.331977" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:52.331124" elapsed="0.000878"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.332505" 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-10-11T01:03:52.332177" elapsed="0.000354"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:52.332805" 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-10-11T01:03:52.332987" 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-10-11T01:03:52.332696" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.333470" 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-10-11T01:03:52.333236" 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-10-11T01:03:52.333888" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.333584" elapsed="0.000360"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.334578" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:52.334114" elapsed="0.000490"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.333966" elapsed="0.000670"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.333566" elapsed="0.001090"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.335214" 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-10-11T01:03:52.334819" elapsed="0.000422"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:52.335284" 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/rib.vanadium/${file_name} exists. 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-10-11T01:03:52.330095" elapsed="0.005290"/>
</kw>
<msg time="2026-10-11T01:03:52.335462" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:52.325448" elapsed="0.010071"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:52.339617" 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/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-10-11T01:03:52.343688" 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/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-10-11T01:03:52.347899" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.348083" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.348266" 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-10-11T01:03:52.348622" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.348476" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:52.348462" 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-10-11T01:03:52.348899" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.349085" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.349251" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:52.348436" elapsed="0.000863"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:52.348332" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.349496" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:52.349566" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:03:52.349675" 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-10-11T01:03:52.324432" elapsed="0.025268"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:52.349866" elapsed="0.000332"/>
</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-10-11T01:03:52.351252" 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-10-11T01:03:52.350846" elapsed="0.000434"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:52.351828" 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-10-11T01:03:52.351445" 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-10-11T01:03:52.352049" elapsed="0.000278"/>
</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-10-11T01:03:52.350483" elapsed="0.001899"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.350267" elapsed="0.002159"/>
</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-10-11T01:03:52.352627" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.352451" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.350251" elapsed="0.002445"/>
</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-10-11T01:03:52.319248" elapsed="0.033491"/>
</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-10-11T01:03:52.318307" elapsed="0.034496"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.318022" elapsed="0.034825"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.318000" elapsed="0.034868"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:52.352909" elapsed="0.000026"/>
</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-10-11T01:03:52.214385" elapsed="0.138622"/>
</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-10-11T01:03:50.154741" elapsed="2.198317"/>
</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-10-11T01:03:52.368763" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:52.368461" elapsed="0.000359"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:52.369505" 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-10-11T01:03:52.369319" elapsed="0.000245">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-10-11T01:03:52.369647" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:52.368995" elapsed="0.000675"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.370185" 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-10-11T01:03:52.369845" elapsed="0.000366"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:52.370503" 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-10-11T01:03:52.370618" 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-10-11T01:03:52.370378" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.371070" 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-10-11T01:03:52.370836" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.372028" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:52.371784" elapsed="0.000286"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.372510" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:52.372247" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.373287" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:52.372845" elapsed="0.000467"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:52.374454" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:52.373938" elapsed="0.000605"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:52.374621" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:03:52.374829" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:52.373502" elapsed="0.001351"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:52.375036" elapsed="0.000301"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/effective-rib-in</var>
<status status="PASS" start="2026-10-11T01:03:52.372714" elapsed="0.002661"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.376066" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:52.375624" elapsed="0.000467"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:52.377218" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:52.376717" elapsed="0.000588"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:52.377383" elapsed="0.000048"/>
</return>
<msg time="2026-10-11T01:03:52.377612" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:52.376259" 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-10-11T01:03:52.377801" elapsed="0.000315"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:52.375494" elapsed="0.002659"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:52.372577" elapsed="0.005608"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:52.378221" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:52.378349" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:52.371439" elapsed="0.006933"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.371173" elapsed="0.007229"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.378690" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.378537" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.371156" elapsed="0.007639"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.379475" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-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-10-11T01:03:52.378968" elapsed="0.000533"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:52.379545" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:52.367943" elapsed="0.011701"/>
</kw>
<msg time="2026-10-11T01:03:52.379692" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:52.363501" elapsed="0.016234"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:52.384037" 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/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-10-11T01:03:52.388180" 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/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-10-11T01:03:52.392283" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.392479" 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-10-11T01:03:52.392662" 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-10-11T01:03:52.393012" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.392852" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:52.392839" 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-10-11T01:03:52.393240" 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-10-11T01:03:52.393434" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.393602" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:52.392814" elapsed="0.000835"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:52.392726" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.393828" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:52.393906" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:52.394016" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-ro...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:03:52.362894" elapsed="0.031176"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:52.395177" 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-10-11T01:03:52.394990" elapsed="0.000247">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-10-11T01:03:52.395319" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:52.394653" elapsed="0.000688"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.395644" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.395419" elapsed="0.000276"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.396160" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:52.395898" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.395718" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.395388" elapsed="0.000847"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.396750" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:52.396397" elapsed="0.000381"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:52.396822" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:52.396959" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:52.394337" elapsed="0.002646"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:52.398064" 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-10-11T01:03:52.397869" elapsed="0.000253">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-10-11T01:03:52.398205" 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-10-11T01:03:52.397544" elapsed="0.000683"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:03:52.398388" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-10-11T01:03:52.398290" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.398274" elapsed="0.000206"/>
</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-10-11T01:03:52.398635" elapsed="0.000020"/>
</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-10-11T01:03:52.398809" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:03:52.398866" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:52.399004" 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-10-11T01:03:52.397229" elapsed="0.001797"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.400270" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:52.400047" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.400739" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:52.400520" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:52.405664" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:52.405820" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:52.405925" 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-10-11T01:03:52.401077" elapsed="0.004873"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.400838" elapsed="0.005150"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.406166" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.406012" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.400821" elapsed="0.005421"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.407525" 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-10-11T01:03:52.407178" elapsed="0.000393"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.406937" elapsed="0.000665"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.406920" elapsed="0.000705"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.408204" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:52.407934" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.407675" elapsed="0.000602"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.407660" elapsed="0.000639"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.408837" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:52.408492" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.409148" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.408937" elapsed="0.000263"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.409664" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:52.409384" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.409222" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.408920" elapsed="0.000820"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.410269" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:52.409933" elapsed="0.000361"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.410582" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.410356" elapsed="0.000277"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.411112" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:52.410817" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.410655" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.410339" elapsed="0.000848"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:52.411331" elapsed="0.000317"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:52.412043" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:52.411809" elapsed="0.000258"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:52.412220" elapsed="0.000228"/>
</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-10-11T01:03:52.406583" elapsed="0.005920"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:52.412647" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:52.412565" elapsed="0.000122"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.412548" elapsed="0.000159"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:52.413464" 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-10-11T01:03:52.412849" elapsed="0.000673"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:52.413570" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:52.413698" 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-10-11T01:03:52.399299" elapsed="0.014423"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:52.413777" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:03:52.413909" 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-10-11T01:03:52.355634" elapsed="0.058300"/>
</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-10-11T01:03:52.424553" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:52.424238" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:52.425287" 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-10-11T01:03:52.425070" elapsed="0.000352">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-10-11T01:03:52.425586" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:52.424739" elapsed="0.000870"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.426103" 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-10-11T01:03:52.425784" elapsed="0.000343"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:52.426424" 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-10-11T01:03:52.426553" 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-10-11T01:03:52.426302" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.427006" 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-10-11T01:03:52.426775" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:52.427424" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.427112" elapsed="0.000369"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.428109" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:52.427653" elapsed="0.000481"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.427504" elapsed="0.000662"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.427094" elapsed="0.001092"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.428764" 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-10-11T01:03:52.428348" elapsed="0.000444"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:52.428835" 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/rib.vanadium/${file_name} exists. 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-10-11T01:03:52.423724" elapsed="0.005224"/>
</kw>
<msg time="2026-10-11T01:03:52.429031" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:52.419314" elapsed="0.009763"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:52.433459" 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/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-10-11T01:03:52.437556" 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/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-10-11T01:03:52.441760" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.442027" 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-10-11T01:03:52.442307" 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-10-11T01:03:52.442722" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.442568" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:52.442552" 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-10-11T01:03:52.442976" 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-10-11T01:03:52.443158" 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-10-11T01:03:52.443323" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:52.442520" elapsed="0.000851"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:52.442391" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.443593" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:52.443661" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:03:52.443797" 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-10-11T01:03:52.418595" elapsed="0.025229"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:52.444062" elapsed="0.000394"/>
</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-10-11T01:03:52.445557" 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-10-11T01:03:52.445140" elapsed="0.000445"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:52.446126" 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-10-11T01:03:52.445738" elapsed="0.000415"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:03:52.446338" elapsed="0.000303"/>
</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-10-11T01:03:52.444748" elapsed="0.001949"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.444528" elapsed="0.002199"/>
</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-10-11T01:03:52.446938" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.446750" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.444511" elapsed="0.002498"/>
</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-10-11T01:03:52.414876" elapsed="0.032178"/>
</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-10-11T01:03:52.414211" elapsed="0.032910"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.414007" elapsed="0.033154"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.413991" elapsed="0.033192"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:52.447214" 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-10-11T01:03:52.355003" elapsed="0.092317"/>
</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-10-11T01:03:52.353254" elapsed="0.094121"/>
</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-10-11T01:03:52.463140" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:52.462820" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:52.463860" 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-10-11T01:03:52.463663" elapsed="0.000280">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-10-11T01:03:52.464028" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:52.463325" elapsed="0.000726"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.464548" 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-10-11T01:03:52.464225" elapsed="0.000348"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:52.464851" 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-10-11T01:03:52.464997" 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-10-11T01:03:52.464740" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.465451" 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-10-11T01:03:52.465218" 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-10-11T01:03:52.466451" 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-10-11T01:03:52.466204" elapsed="0.000290"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.466936" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:52.466672" elapsed="0.000288"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.467754" 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-10-11T01:03:52.467278" elapsed="0.000501"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:52.468937" 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-10-11T01:03:52.468392" elapsed="0.000635"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:52.469107" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:03:52.469320" 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-10-11T01:03:52.467964" 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-10-11T01:03:52.469531" elapsed="0.000313"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:03:52.467144" elapsed="0.002748"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.470585" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:52.470122" elapsed="0.000488"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:52.471753" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:52.471225" elapsed="0.000616"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:52.471934" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:03:52.472144" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:52.470779" 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-10-11T01:03:52.472331" elapsed="0.000401"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:52.469993" elapsed="0.002780"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:52.467003" elapsed="0.005802"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:52.472842" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:03:52.472981" 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-10-11T01:03:52.465845" elapsed="0.007160"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.465588" elapsed="0.007446"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.473205" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.473056" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.465570" elapsed="0.007703"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.473964" 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-10-11T01:03:52.473445" elapsed="0.000545"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:52.474033" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:52.462307" elapsed="0.011825"/>
</kw>
<msg time="2026-10-11T01:03:52.474180" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:52.457809" elapsed="0.016416"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:52.478529" 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/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-10-11T01:03:52.482629" 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/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-10-11T01:03:52.486690" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.486871" 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-10-11T01:03:52.487065" 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-10-11T01:03:52.487418" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.487259" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:52.487245" 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-10-11T01:03:52.487649" 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-10-11T01:03:52.487828" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.488001" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:52.487220" elapsed="0.000829"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:52.487131" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.488226" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:52.488292" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:52.488399" 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-10-11T01:03:52.457204" elapsed="0.031234"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:52.489548" 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-10-11T01:03:52.489348" elapsed="0.000260">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-10-11T01:03:52.489691" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:52.489023" elapsed="0.000691"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.490008" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.489776" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.490536" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:52.490260" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.490082" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.489759" elapsed="0.000852"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.491115" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:52.490773" elapsed="0.000365"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:52.491212" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:52.491341" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:52.488706" elapsed="0.002658"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:52.492494" 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-10-11T01:03:52.492296" elapsed="0.000257">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-10-11T01:03:52.492636" 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-10-11T01:03:52.491976" elapsed="0.000683"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:03:52.492819" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:03:52.492722" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.492705" elapsed="0.000202"/>
</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-10-11T01:03:52.493063" elapsed="0.000019"/>
</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-10-11T01:03:52.493237" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:03:52.493295" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:03:52.493433" 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-10-11T01:03:52.491629" elapsed="0.001828"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.494674" 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-10-11T01:03:52.494451" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.495130" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:52.494917" elapsed="0.000253"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:52.500049" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:52.500276" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:03:52.500474" 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-10-11T01:03:52.495473" elapsed="0.005050"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.495229" elapsed="0.005370"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.500994" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.500645" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.495213" elapsed="0.005949"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.502456" 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-10-11T01:03:52.502110" elapsed="0.000392"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.501856" elapsed="0.000678"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.501836" elapsed="0.000721"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.503127" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:52.502848" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.502608" elapsed="0.000592"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.502593" elapsed="0.000630"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.503770" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:52.503402" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.504128" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.503910" elapsed="0.000271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.504649" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:52.504368" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.504204" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.503892" elapsed="0.000835"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.505251" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:52.504914" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.505566" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.505339" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.506078" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:52.505804" elapsed="0.000298"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.505641" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.505322" elapsed="0.000831"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:52.506297" elapsed="0.000312"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:52.507006" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:52.506770" elapsed="0.000261"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:52.507187" elapsed="0.000209"/>
</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-10-11T01:03:52.501513" elapsed="0.005959"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:52.507617" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:52.507535" elapsed="0.000122"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.507519" elapsed="0.000158"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:52.508434" 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-10-11T01:03:52.507818" elapsed="0.000645"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:52.508510" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:52.508638" 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-10-11T01:03:52.493734" elapsed="0.014929"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:52.508718" elapsed="0.000023"/>
</return>
<msg time="2026-10-11T01:03:52.508838" 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-10-11T01:03:52.449930" elapsed="0.058933"/>
</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-10-11T01:03:52.519554" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:52.519239" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:52.520283" 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-10-11T01:03:52.520065" elapsed="0.000382">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-10-11T01:03:52.520615" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:52.519737" elapsed="0.000901"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.521133" 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-10-11T01:03:52.520813" elapsed="0.000346"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:52.521449" 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-10-11T01:03:52.521577" 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-10-11T01:03:52.521324" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.522027" 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-10-11T01:03:52.521796" elapsed="0.000277"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:52.522443" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.522133" elapsed="0.000364"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.523121" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:52.522667" elapsed="0.000479"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.522520" elapsed="0.000659"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.522115" elapsed="0.001083"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.523768" 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-10-11T01:03:52.523360" elapsed="0.000434"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:52.523838" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:52.518729" elapsed="0.005222"/>
</kw>
<msg time="2026-10-11T01:03:52.524000" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:52.514342" elapsed="0.009702"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:52.528164" 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/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-10-11T01:03:52.532265" 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/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-10-11T01:03:52.537448" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.537635" 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-10-11T01:03:52.537819" 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-10-11T01:03:52.538178" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.538028" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:52.538014" 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-10-11T01:03:52.538423" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.538608" 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-10-11T01:03:52.538775" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:52.537988" elapsed="0.000835"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:52.537897" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.539011" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:52.539080" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:52.539191" 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-10-11T01:03:52.513626" elapsed="0.025591"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:52.539385" elapsed="0.000333"/>
</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-10-11T01:03:52.540780" 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-10-11T01:03:52.540369" elapsed="0.000439"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:52.541344" 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-10-11T01:03:52.540971" 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-10-11T01:03:52.541585" elapsed="0.000284"/>
</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-10-11T01:03:52.540004" elapsed="0.001933"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.539788" elapsed="0.002180"/>
</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-10-11T01:03:52.542181" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.541991" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.539772" elapsed="0.002479"/>
</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-10-11T01:03:52.509920" elapsed="0.032374"/>
</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-10-11T01:03:52.509226" elapsed="0.033133"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.508948" elapsed="0.033496"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.508932" elapsed="0.033536"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:52.542498" elapsed="0.000027"/>
</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-10-11T01:03:52.449294" elapsed="0.093307"/>
</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-10-11T01:03:52.447594" elapsed="0.095058"/>
</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-10-11T01:03:52.542803" elapsed="0.002477"/>
</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-10-11T01:03:52.607168" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:52.606790" elapsed="0.000410"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:52.607955" 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-10-11T01:03:52.607725" 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-10-11T01:03:52.608111" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:52.607375" elapsed="0.000759"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.608642" 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-10-11T01:03:52.608310" elapsed="0.000358"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:52.608961" 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-10-11T01:03:52.609110" 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-10-11T01:03:52.608835" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.609580" 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-10-11T01:03:52.609332" 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-10-11T01:03:52.610597" 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-10-11T01:03:52.610345" elapsed="0.000294"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.611082" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:52.610817" elapsed="0.000289"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.611935" 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-10-11T01:03:52.611446" elapsed="0.000514"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:52.613122" 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-10-11T01:03:52.612589" elapsed="0.000623"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:52.613296" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T01:03:52.613534" 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-10-11T01:03:52.612132" elapsed="0.001426"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:52.613726" elapsed="0.000328"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:03:52.611295" elapsed="0.002799"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.614842" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:52.614386" elapsed="0.000481"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:52.616024" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:52.615506" elapsed="0.000607"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:52.616248" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:03:52.616482" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:52.615048" elapsed="0.001458"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:52.616672" elapsed="0.000317"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:52.614195" elapsed="0.002833"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:52.611152" elapsed="0.005908"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:52.617098" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:52.617225" 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-10-11T01:03:52.610003" elapsed="0.007246"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.609694" elapsed="0.007583"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.617527" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.617300" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.609672" elapsed="0.007927"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.618489" 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-10-11T01:03:52.617757" elapsed="0.000760"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:52.618562" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:52.606130" elapsed="0.012532"/>
</kw>
<msg time="2026-10-11T01:03:52.618713" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:52.555760" elapsed="0.063000"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:52.622904" 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/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-10-11T01:03:52.627013" 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/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-10-11T01:03:52.631120" elapsed="0.000023"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.631301" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.631498" 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-10-11T01:03:52.631841" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.631694" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:52.631680" 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-10-11T01:03:52.632113" 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-10-11T01:03:52.632295" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.632476" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:52.631655" elapsed="0.000870"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:52.631566" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.632700" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:52.632767" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:52.632890" 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-10-11T01:03:52.555148" elapsed="0.077768"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:52.634027" 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-10-11T01:03:52.633827" elapsed="0.000259">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-10-11T01:03:52.634170" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:52.633500" elapsed="0.000693"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.634492" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.634255" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.635015" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:52.634742" elapsed="0.000297"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.634566" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.634239" elapsed="0.000852"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.635605" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:52.635253" elapsed="0.000376"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:52.635673" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:52.635796" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:52.633184" elapsed="0.002635"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:52.636858" 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-10-11T01:03:52.636710" elapsed="0.000209"/>
</kw>
<msg time="2026-10-11T01:03:52.636995" 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-10-11T01:03:52.636375" elapsed="0.000642"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:03:52.637177" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:52.637080" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.637063" elapsed="0.000175"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:52.637528" 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-10-11T01:03:52.637645" 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-10-11T01:03:52.637389" elapsed="0.000279"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:03:52.638024" 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-10-11T01:03:52.637828" elapsed="0.000220"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:03:52.638121" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:52.638247" 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-10-11T01:03:52.636077" elapsed="0.002193"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.639511" 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-10-11T01:03:52.639275" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.639971" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:52.639743" elapsed="0.000268"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:52.645389" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:52.645552" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:03:52.645655" 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-10-11T01:03:52.640298" elapsed="0.005382"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.640071" elapsed="0.005649"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.645914" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.645744" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.640054" elapsed="0.005939"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.647274" 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-10-11T01:03:52.646935" elapsed="0.000386"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.646671" elapsed="0.000683"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.646654" elapsed="0.000723"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.647971" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:52.647687" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.647445" elapsed="0.000601"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.647428" elapsed="0.000640"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.648608" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:52.648247" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.648930" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.648697" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.649450" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:52.649171" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.649006" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.648680" elapsed="0.000847"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.650187" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:52.649706" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.650612" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.650347" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.651138" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:52.650854" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.650688" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.650294" elapsed="0.000967"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:52.651429" elapsed="0.000302"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:52.652216" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:52.651980" elapsed="0.000261"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:52.652397" elapsed="0.000234"/>
</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-10-11T01:03:52.646314" elapsed="0.006376"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:52.652845" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:52.652757" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.652739" elapsed="0.000183"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:52.653769" 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-10-11T01:03:52.653068" elapsed="0.000728"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:52.653843" elapsed="0.000033"/>
</return>
<msg time="2026-10-11T01:03:52.653992" 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-10-11T01:03:52.638569" elapsed="0.015448"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:52.654074" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:03:52.654197" 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-10-11T01:03:52.547807" elapsed="0.106414"/>
</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-10-11T01:03:52.665020" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:52.664705" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:52.665791" 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-10-11T01:03:52.665543" elapsed="0.000386">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-10-11T01:03:52.666094" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:52.665207" elapsed="0.000911"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.666633" 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-10-11T01:03:52.666296" elapsed="0.000363"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:52.666952" 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-10-11T01:03:52.667089" 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-10-11T01:03:52.666827" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.667560" 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-10-11T01:03:52.667311" 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-10-11T01:03:52.668013" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.667699" elapsed="0.000369"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.668722" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:52.668240" elapsed="0.000507"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:52.668092" elapsed="0.000689"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:52.667681" elapsed="0.001120"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.669374" 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-10-11T01:03:52.668983" elapsed="0.000418"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:52.669474" 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/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-10-11T01:03:52.664182" elapsed="0.005405"/>
</kw>
<msg time="2026-10-11T01:03:52.669637" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:52.659742" elapsed="0.009940"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:52.673854" 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/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-10-11T01:03:52.677988" 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/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-10-11T01:03:52.682235" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.682431" 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-10-11T01:03:52.682614" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.682976" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.682818" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:52.682805" 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-10-11T01:03:52.683206" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.683387" elapsed="0.000031"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.683569" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:52.682779" elapsed="0.000838"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:52.682682" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:52.683826" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:52.683907" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:03:52.684014" 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-10-11T01:03:52.659015" elapsed="0.025024"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:52.684208" elapsed="0.000327"/>
</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-10-11T01:03:52.685432" 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-10-11T01:03:52.685180" elapsed="0.000279"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:52.686167" 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-10-11T01:03:52.685611" elapsed="0.000583"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:03:52.686672" 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-10-11T01:03:52.686844" 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-10-11T01:03:52.686380" elapsed="0.000538">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-10-11T01:03:52.684808" elapsed="0.002245">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-10-11T01:03:52.684606" elapsed="0.002517">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-10-11T01:03:52.687366" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:52.687183" elapsed="0.000250"/>
</branch>
<status status="FAIL" start="2026-10-11T01:03:52.684589" elapsed="0.002866">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-10-11T01:03:52.655202" elapsed="0.032376">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-10-11T01:03:52.654526" elapsed="0.033182">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-10-11T01:03:52.654297" elapsed="0.033491">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-10-11T01:03:52.654281" elapsed="0.033540">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-10-11T01:03:52.687866" elapsed="0.000025"/>
</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-10-11T01:03:52.547174" elapsed="0.140814">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-10-11T01:03:54.723569" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:54.722812" elapsed="0.000872"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:54.725438" 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-10-11T01:03:54.724966" elapsed="0.000627">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-10-11T01:03:54.725784" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:54.724170" elapsed="0.001665"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.727013" 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-10-11T01:03:54.726256" elapsed="0.000815"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:54.727724" 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-10-11T01:03:54.728037" 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-10-11T01:03:54.727472" elapsed="0.000618"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.729064" 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-10-11T01:03:54.728553" elapsed="0.000608"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.731622" 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-10-11T01:03:54.731032" elapsed="0.000687"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.732735" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:54.732139" elapsed="0.000652"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.734704" 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-10-11T01:03:54.733632" elapsed="0.001128"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:54.737290" 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-10-11T01:03:54.736184" elapsed="0.001258"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:54.737561" elapsed="0.000054"/>
</return>
<msg time="2026-10-11T01:03:54.737867" 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-10-11T01:03:54.735170" elapsed="0.002747"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:54.738154" elapsed="0.000460"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:03:54.733303" elapsed="0.005364"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.739635" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:54.739005" elapsed="0.000663"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:54.741247" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:54.740551" elapsed="0.000818"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:54.741506" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T01:03:54.741797" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:54.739922" elapsed="0.001908"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:54.742089" elapsed="0.000727"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:54.738808" elapsed="0.004062"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:54.732982" elapsed="0.009953"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:54.742991" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T01:03:54.743172" 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-10-11T01:03:54.730130" elapsed="0.013075"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:54.729306" elapsed="0.013938"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:54.743574" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:54.743277" elapsed="0.000371"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:54.729262" elapsed="0.014415"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.744662" 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-10-11T01:03:54.743915" elapsed="0.000784"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:54.744814" 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-10-11T01:03:54.721633" elapsed="0.023339"/>
</kw>
<msg time="2026-10-11T01:03:54.745041" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:54.711614" elapsed="0.033492"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:54.750866" 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/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-10-11T01:03:54.756565" 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/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-10-11T01:03:54.762321" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:54.762602" 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-10-11T01:03:54.762889" 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-10-11T01:03:54.763355" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:54.763208" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:54.763190" 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-10-11T01:03:54.763622" 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-10-11T01:03:54.763801" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:54.763979" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:54.763155" elapsed="0.000872"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:54.763003" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:54.764202" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:54.764268" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:54.764376" 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-10-11T01:03:54.710173" elapsed="0.054228"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:54.765577" 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-10-11T01:03:54.765359" elapsed="0.000285">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-10-11T01:03:54.765727" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:54.765033" elapsed="0.000716"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:54.766053" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:54.765812" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.766588" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:54.766309" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:54.766128" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:54.765795" elapsed="0.000870"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.767179" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:54.766828" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:54.767248" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:54.767370" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:54.764719" elapsed="0.002674"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:54.768456" 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-10-11T01:03:54.768296" elapsed="0.000210"/>
</kw>
<msg time="2026-10-11T01:03:54.768581" 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-10-11T01:03:54.767975" elapsed="0.000628"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:03:54.768764" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:54.768668" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:54.768651" elapsed="0.000175"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:54.769115" 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-10-11T01:03:54.769248" 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-10-11T01:03:54.768989" elapsed="0.000282"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:03:54.769633" 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-10-11T01:03:54.769448" elapsed="0.000209"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:03:54.769698" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:54.769822" 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-10-11T01:03:54.767664" elapsed="0.002181"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.771245" 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-10-11T01:03:54.770846" elapsed="0.000441"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.771712" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:54.771492" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:54.777088" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:54.777230" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:03:54.777348" 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-10-11T01:03:54.772059" elapsed="0.005314"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:54.771813" elapsed="0.005618"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:54.777611" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:54.777457" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:54.771796" elapsed="0.005893"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.779471" 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-10-11T01:03:54.778996" elapsed="0.000537"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:54.778625" elapsed="0.000951"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:54.778601" elapsed="0.001007"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.780395" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:54.780023" elapsed="0.000451"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:54.779677" elapsed="0.000841"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:54.779657" elapsed="0.000892"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.781289" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:54.780797" elapsed="0.000527"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:54.781731" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:54.781431" elapsed="0.000374"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.782465" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:54.782082" elapsed="0.000419"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:54.781838" elapsed="0.000709"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:54.781388" elapsed="0.001185"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.783296" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:54.782816" elapsed="0.000515"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:54.783731" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:54.783438" elapsed="0.000364"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.784449" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:54.784070" elapsed="0.000416"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:54.783832" elapsed="0.000698"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:54.783395" elapsed="0.001162"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:54.784756" elapsed="0.000422"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:54.785731" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:54.785400" elapsed="0.000365"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:54.785996" elapsed="0.000299"/>
</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-10-11T01:03:54.778134" elapsed="0.008240"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:54.786596" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:54.786483" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:54.786458" elapsed="0.000222"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:54.787553" 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-10-11T01:03:54.786892" elapsed="0.000700"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:54.787657" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T01:03:54.787833" 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-10-11T01:03:54.770142" elapsed="0.017744"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:54.788009" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T01:03:54.788183" 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-10-11T01:03:54.693350" elapsed="0.094867"/>
</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-10-11T01:03:54.802082" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:54.801764" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:54.802817" 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-10-11T01:03:54.802596" elapsed="0.000354">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-10-11T01:03:54.803122" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:54.802267" elapsed="0.000878"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.803650" 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-10-11T01:03:54.803319" elapsed="0.000357"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:54.803964" 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-10-11T01:03:54.804080" 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-10-11T01:03:54.803844" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.804537" 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-10-11T01:03:54.804300" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:54.804948" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:54.804638" elapsed="0.000365"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.805635" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:54.805172" elapsed="0.000489"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:54.805025" elapsed="0.000667"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:54.804621" elapsed="0.001091"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.806268" 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-10-11T01:03:54.805887" elapsed="0.000407"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:54.806336" 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/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-10-11T01:03:54.801240" elapsed="0.005223"/>
</kw>
<msg time="2026-10-11T01:03:54.806511" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:54.795805" elapsed="0.010750"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:54.810696" 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/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-10-11T01:03:54.814987" 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/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-10-11T01:03:54.819284" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:54.819485" 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-10-11T01:03:54.819680" 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-10-11T01:03:54.820041" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:54.819894" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:54.819868" 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-10-11T01:03:54.820268" 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-10-11T01:03:54.820461" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:54.820627" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:54.819840" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:54.819748" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:54.820847" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:54.820927" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:03:54.821033" 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-10-11T01:03:54.794786" elapsed="0.026273"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:54.821226" elapsed="0.000330"/>
</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-10-11T01:03:54.822458" 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-10-11T01:03:54.822200" elapsed="0.000287"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:54.822870" 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-10-11T01:03:54.822639" elapsed="0.000274"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:03:54.823097" elapsed="0.000277"/>
</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-10-11T01:03:54.821827" elapsed="0.001649"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:54.821625" elapsed="0.001881"/>
</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-10-11T01:03:54.823705" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:54.823529" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:54.821609" elapsed="0.002165"/>
</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-10-11T01:03:54.789576" elapsed="0.034241"/>
</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-10-11T01:03:54.788634" elapsed="0.035259"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:54.788319" elapsed="0.035616"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:54.788297" elapsed="0.035659"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:54.823987" elapsed="0.000026"/>
</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-10-11T01:03:54.691765" elapsed="0.132323"/>
</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-10-11T01:03:52.545487" elapsed="2.278655"/>
</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-10-11T01:03:54.824342" elapsed="0.002467"/>
</kw>
<arg>shared_tree_join</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-10-11T01:03:50.146357" elapsed="4.680512"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:50.058150" elapsed="4.768840"/>
</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-10-11T01:03:54.828377" elapsed="0.000223"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:03:54.828126" 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-10-11T01:03:54.829572" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:54.829485" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:54.829468" elapsed="0.000166"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:54.831746" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:54.831664" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:54.831648" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.832725" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:54.832388" elapsed="0.000363"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.833179" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:03:54.832917" elapsed="0.000286"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:03:54.833243" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:54.833369" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:03:54.832032" elapsed="0.001360"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:54.835906" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:54.835805" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:54.835787" elapsed="0.000181"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:54.837057" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:54.836970" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:54.836948" elapsed="0.000172"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:54.837454" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:03:54.837268" elapsed="0.000212"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:03:54.837787" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:54.837645" elapsed="0.000165"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:03:54.874497" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:03:54.838354" elapsed="0.036237"/>
</kw>
<msg time="2026-10-11T01:03:54.874743" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:03:54.874784" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:54.838021" elapsed="0.036797"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:03:54.915459" 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-10-11T01:03:54.875342" elapsed="0.040217"/>
</kw>
<msg time="2026-10-11T01:03:54.915706" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:03:54.915747" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:54.875007" elapsed="0.040773"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:54.916070" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:54.915849" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:54.915831" elapsed="0.000311"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.916571" 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-10-11T01:03:54.916323" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:54.916909" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:54.916696" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:54.916679" elapsed="0.000303"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:03:54.917012" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:54.919581" elapsed="0.000116"/>
</kw>
<msg time="2026-10-11T01:03:54.919754" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:54.918386" elapsed="0.001512"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:54.920203" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:54.920554" 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-10-11T01:03:54.917791" elapsed="0.002946"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:03:54.917290" elapsed="0.003506"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:03:54.836658" elapsed="0.084212"/>
</kw>
<msg time="2026-10-11T01:03:54.920966" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:54.921006" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:54.836118" elapsed="0.084922"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:03:54.921191" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:03:54.921107" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:54.921090" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:54.921613" 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-10-11T01:03:54.921929" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:03:54.921993" 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-10-11T01:03:54.835519" elapsed="0.086558"/>
</kw>
<msg time="2026-10-11T01:03:54.922194" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:54.922234" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:54.833737" elapsed="0.088530"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:54.922657" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:54.922334" elapsed="0.000372"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:54.922318" elapsed="0.000410"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:03:54.833594" elapsed="0.089156"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:03:54.833455" elapsed="0.089321"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:03:54.831357" elapsed="0.091466"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:03:54.829214" elapsed="0.093673"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:54.828802" 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-10-11T01:03:54.827770" elapsed="0.095207"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:54.923736" 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-10-11T01:03:54.923867" 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-10-11T01:03:54.923595" elapsed="0.000311"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:03:54.924245" 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-10-11T01:03:54.924069" elapsed="0.000202"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:54.924585" 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-10-11T01:03:54.924704" 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-10-11T01:03:54.924450" elapsed="0.000279"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:03:54.925072" 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-10-11T01:03:54.924904" elapsed="0.000192"/>
</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-10-11T01:03:54.925345" elapsed="0.002537"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:54.925159" elapsed="0.002757"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:54.925142" elapsed="0.002797"/>
</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-10-11T01:03:54.940068" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:54.939718" elapsed="0.000382"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:54.940833" 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-10-11T01:03:54.940613" elapsed="0.000353">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-10-11T01:03:54.941054" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:54.940271" elapsed="0.000807"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.941585" 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-10-11T01:03:54.941254" elapsed="0.000358"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:54.941960" 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-10-11T01:03:54.942097" 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-10-11T01:03:54.941834" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.942559" 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-10-11T01:03:54.942318" 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-10-11T01:03:54.943568" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:03:54.943317" elapsed="0.000293"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.944059" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:54.943790" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.944692" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:54.944422" elapsed="0.000295"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:54.945627" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:54.945218" elapsed="0.000434"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:54.945703" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:03:54.945835" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:54.944905" 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-10-11T01:03:54.946049" elapsed="0.000181"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:03:54.944274" elapsed="0.001994"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.946785" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:54.946514" elapsed="0.000296"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:54.947691" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:54.947305" elapsed="0.000411"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:54.947761" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:54.947900" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:54.946992" elapsed="0.000932"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:54.948091" elapsed="0.000168"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:54.946367" elapsed="0.001931"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:54.944131" elapsed="0.004199"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:54.948369" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:54.948521" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:54.942970" elapsed="0.005575"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:54.942673" elapsed="0.005900"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:54.948745" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:54.948596" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:54.942651" elapsed="0.006165"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.949688" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:54.948992" elapsed="0.000724"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:54.949760" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:54.939117" elapsed="0.010743"/>
</kw>
<msg time="2026-10-11T01:03:54.949926" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:54.934550" elapsed="0.015452"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:54.954152" 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/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-10-11T01:03:54.958242" 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/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-10-11T01:03:54.962335" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:54.962533" 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-10-11T01:03:54.962719" 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-10-11T01:03:54.963102" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:54.962953" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:54.962939" 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-10-11T01:03:54.963334" 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-10-11T01:03:54.963532" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:54.963711" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:54.962911" elapsed="0.000849"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:54.962786" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:54.963950" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:54.964019" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:03:54.964128" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:54.933941" elapsed="0.030211"/>
</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-10-11T01:03:54.973132" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:54.972808" elapsed="0.000351"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:54.973821" 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-10-11T01:03:54.973650" elapsed="0.000245">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-10-11T01:03:54.974019" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:54.973317" elapsed="0.000725"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.974541" 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-10-11T01:03:54.974217" elapsed="0.000349"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:54.974844" 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-10-11T01:03:54.974980" 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-10-11T01:03:54.974734" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.975435" 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-10-11T01:03:54.975205" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:54.975802" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:54.975552" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.976303" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', '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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:54.976042" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:54.975892" elapsed="0.000468"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:54.975534" elapsed="0.000846"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.976957" 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-10-11T01:03:54.976558" elapsed="0.000427"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:54.977030" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:54.972295" elapsed="0.004835"/>
</kw>
<msg time="2026-10-11T01:03:54.977182" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:54.967963" elapsed="0.009263"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:54.981548" 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/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-10-11T01:03:54.985688" 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/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-10-11T01:03:54.989864" elapsed="0.000039"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:54.990064" 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-10-11T01:03:54.990246" 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-10-11T01:03:54.990605" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:54.990457" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:54.990442" 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-10-11T01:03:54.990834" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:54.991030" 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-10-11T01:03:54.991196" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:54.990400" elapsed="0.000843"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:54.990311" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:54.991437" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:54.991505" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:54.991622" 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-10-11T01:03:54.967249" elapsed="0.024400"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:54.992772" 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-10-11T01:03:54.992581" elapsed="0.000251">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-10-11T01:03:54.992930" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:54.992241" elapsed="0.000712"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:54.993237" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:54.993015" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.993769" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:54.993507" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:54.993310" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:54.992998" elapsed="0.000850"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.994363" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:54.994028" elapsed="0.000358"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:54.994445" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:54.994570" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:54.991941" elapsed="0.002651"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.995929" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:54.995693" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.996428" 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-10-11T01:03:54.996199" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.996904" 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-10-11T01:03:54.996673" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.997354" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:54.997139" elapsed="0.000254"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:54.998131" 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-10-11T01:03:54.997968" elapsed="0.000187"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:03:54.998474" 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-10-11T01:03:54.998313" elapsed="0.000185"/>
</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-10-11T01:03:54.998662" elapsed="0.000154"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:54.999247" 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-10-11T01:03:54.999026" elapsed="0.000262"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:03:54.999326" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:54.999469" 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-10-11T01:03:54.997596" elapsed="0.001896"/>
</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-10-11T01:03:55.009469" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.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-10-11T01:03:55.009532" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:55.009630" 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-10-11T01:03:54.999785" elapsed="0.009870"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:54.999555" elapsed="0.010140"/>
</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-10-11T01:03:55.009889" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:55.009720" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:54.999539" elapsed="0.010432"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.011209" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:55.010925" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:55.010668" elapsed="0.000612"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:55.010651" elapsed="0.000652"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.011885" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:55.011606" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:55.011353" elapsed="0.000636"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:55.011337" elapsed="0.000675"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.012555" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:55.012191" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:55.012855" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:55.012643" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.013373" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:55.013112" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:55.012947" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:55.012627" elapsed="0.000839"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.013987" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:55.013641" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:55.014285" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:55.014075" elapsed="0.000261"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.014798" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:55.014537" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:55.014359" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:55.014058" elapsed="0.000828"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:55.015031" elapsed="0.000290"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:55.015722" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:55.015497" elapsed="0.000250"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:55.015917" elapsed="0.000214"/>
</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-10-11T01:03:55.010294" elapsed="0.005891"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:03:55.016331" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:03:55.016249" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:55.016233" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:55.016569" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:03:55.016629" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:03:55.016786" 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-10-11T01:03:54.994904" elapsed="0.021906"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:55.016882" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:55.017006" 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-10-11T01:03:54.928852" elapsed="0.088176"/>
</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-10-11T01:03:55.017323" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:55.017120" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:55.017103" elapsed="0.000316"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:55.017452" elapsed="0.000024"/>
</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-10-11T01:03:54.928165" elapsed="0.089386"/>
</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-10-11T01:03:55.021252" level="INFO">${update} = ffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f01010100071600010102030401020000000a20010000012002000002</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:03:55.018494" elapsed="0.002786"/>
</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-10-11T01:03:55.021486" elapsed="0.000314"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:03:55.021846" elapsed="0.000046"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:03:55.018222" elapsed="0.003744"/>
</kw>
<msg time="2026-10-11T01:03:55.022033" 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-10-11T01:03:55.017775" elapsed="0.004282"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.022838" level="INFO">Length is 160.</msg>
<msg time="2026-10-11T01:03:55.022919" 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-10-11T01:03:55.022599" elapsed="0.000343"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.023328" level="INFO">Length is 160.</msg>
<msg time="2026-10-11T01:03:55.023396" 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-10-11T01:03:55.023099" elapsed="0.000340"/>
</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-10-11T01:03:55.023626" elapsed="0.000287"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:55.024226" 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-10-11T01:03:55.024062" elapsed="0.000188"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:55.024564" 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-10-11T01:03:55.024392" 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-10-11T01:03:55.024768" elapsed="0.000282"/>
</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-10-11T01:03:55.022253" elapsed="0.002851"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:03:55.025243" elapsed="0.002376"/>
</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-10-11T01:03:55.041673" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:55.041357" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:55.042359" 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-10-11T01:03:55.042185" elapsed="0.000251">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-10-11T01:03:55.042522" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:55.041856" elapsed="0.000688"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.043035" 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-10-11T01:03:55.042716" elapsed="0.000344"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:55.043333" 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-10-11T01:03:55.043463" 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-10-11T01:03:55.043226" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.043913" 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-10-11T01:03:55.043683" elapsed="0.000272"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.044943" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:03:55.044662" elapsed="0.000324"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.045426" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:55.045164" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.046186" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:55.045767" elapsed="0.000443"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:55.047266" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:55.046811" elapsed="0.000534"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:55.047490" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:03:55.047658" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:55.046380" elapsed="0.001301"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:55.047845" elapsed="0.000313"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:03:55.045636" elapsed="0.002561"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.049000" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:55.048449" elapsed="0.000575"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:55.050079" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:55.049624" elapsed="0.000533"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:55.050286" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:03:55.050474" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:55.049196" elapsed="0.001302"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:55.050665" elapsed="0.000313"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:55.048297" elapsed="0.002719"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:55.045494" elapsed="0.005554"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:55.051086" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:55.051214" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:55.044268" elapsed="0.006971"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:55.044016" elapsed="0.007252"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:55.051509" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:55.051290" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:55.043998" elapsed="0.007582"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.052243" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:55.051741" elapsed="0.000528"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:55.052313" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:55.040842" elapsed="0.011634"/>
</kw>
<msg time="2026-10-11T01:03:55.052528" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:55.036537" elapsed="0.016037"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:55.056712" 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/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-10-11T01:03:55.060806" elapsed="0.000055"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-10-11T01:03:55.064961" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:55.065142" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:55.065322" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:55.065676" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:55.065529" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:55.065515" 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-10-11T01:03:55.065914" 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-10-11T01:03:55.066095" 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-10-11T01:03:55.066258" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:55.065489" elapsed="0.000816"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:55.065386" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:55.066493" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:55.066560" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:03:55.066667" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:55.035910" elapsed="0.030781"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.067714" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:55.067488" elapsed="0.000268"/>
</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-10-11T01:03:55.076175" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:55.076217" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:55.076295" 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-10-11T01:03:55.068057" elapsed="0.008262"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:55.067817" elapsed="0.008538"/>
</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-10-11T01:03:55.076553" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:55.076379" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:55.067800" elapsed="0.008857"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.077856" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:55.077585" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:55.077328" elapsed="0.000615"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:55.077311" elapsed="0.000654"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.078528" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:55.078249" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:55.078013" elapsed="0.000586"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:55.077999" elapsed="0.000622"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.079159" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:55.078797" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:55.079473" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:55.079247" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.080153" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:55.079714" elapsed="0.000464"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:55.079549" elapsed="0.000663"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:55.079230" elapsed="0.001002"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.080764" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:55.080422" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:55.081078" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:55.080852" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.081612" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:55.081315" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:55.081152" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:55.080835" elapsed="0.000853"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:55.081833" elapsed="0.000308"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:55.082538" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:55.082302" elapsed="0.000260"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:55.082715" elapsed="0.000220"/>
</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-10-11T01:03:55.077000" elapsed="0.005992"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:03:55.083033" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:55.083206" 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-10-11T01:03:55.066942" elapsed="0.016288"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:55.083277" elapsed="0.000024"/>
</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-10-11T01:03:55.028721" elapsed="0.054651"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:55.028307" elapsed="0.055128"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:03:55.027782" elapsed="0.055707"/>
</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-10-11T01:03:55.086818" level="INFO">${update} = ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105071600010102030401020000000a20010000012002000002</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:03:55.084362" elapsed="0.002484"/>
</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-10-11T01:03:55.087036" elapsed="0.000308"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:03:55.087388" elapsed="0.000047"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:03:55.084104" elapsed="0.003406"/>
</kw>
<msg time="2026-10-11T01:03:55.087576" 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-10-11T01:03:55.083667" elapsed="0.003933"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.088430" level="INFO">Length is 148.</msg>
<msg time="2026-10-11T01:03:55.088502" 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-10-11T01:03:55.088173" elapsed="0.000352"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.088932" level="INFO">Length is 148.</msg>
<msg time="2026-10-11T01:03:55.089001" 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-10-11T01:03:55.088683" elapsed="0.000340"/>
</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-10-11T01:03:55.089206" elapsed="0.000288"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:55.089791" 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-10-11T01:03:55.089642" elapsed="0.000173"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:03:55.090121" 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-10-11T01:03:55.089972" elapsed="0.000172"/>
</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-10-11T01:03:55.090324" elapsed="0.000285"/>
</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-10-11T01:03:55.087823" elapsed="0.002840"/>
</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-10-11T01:03:55.105040" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:55.104722" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:55.105748" 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-10-11T01:03:55.105564" elapsed="0.000241">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-10-11T01:03:55.105901" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:55.105227" elapsed="0.000698"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.106424" 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-10-11T01:03:55.106101" elapsed="0.000349"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:55.106726" 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-10-11T01:03:55.106842" 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-10-11T01:03:55.106618" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.107298" 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-10-11T01:03:55.107081" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.108279" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:03:55.108047" elapsed="0.000273"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.108759" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:55.108511" elapsed="0.000272"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.109580" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:55.109108" elapsed="0.000497"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:55.110640" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:55.110190" elapsed="0.000490"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:55.110790" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:03:55.110982" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:55.109774" elapsed="0.001231"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:55.111202" elapsed="0.000298"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:03:55.108976" elapsed="0.002562"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.112237" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:55.111769" elapsed="0.000493"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:55.113302" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:55.112864" elapsed="0.000476"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:55.113473" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:03:55.113650" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:55.112461" elapsed="0.001213"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:55.113837" elapsed="0.000281"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:55.111638" elapsed="0.002519"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:55.108826" elapsed="0.005363"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:55.114227" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:55.114354" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:55.107665" elapsed="0.006712"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:55.107400" elapsed="0.007065"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:55.114643" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:55.114492" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:55.107383" elapsed="0.007328"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.115591" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:55.114869" elapsed="0.000750"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:55.115663" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:55.104178" elapsed="0.011587"/>
</kw>
<msg time="2026-10-11T01:03:55.115812" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:55.099766" elapsed="0.016100"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:55.120036" 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/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-10-11T01:03:55.124208" 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/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-10-11T01:03:55.128344" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:55.128576" 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-10-11T01:03:55.128760" 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-10-11T01:03:55.129118" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:55.128971" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:55.128958" 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-10-11T01:03:55.129347" 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-10-11T01:03:55.129543" 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-10-11T01:03:55.129708" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:55.128931" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:55.128826" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:55.129944" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:55.130011" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:55.130119" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:55.099115" elapsed="0.031029"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.131173" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:55.130949" elapsed="0.000267"/>
</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-10-11T01:03:55.136106" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:55.136394" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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+xml', 'Content-Length': '635'} 
 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-path xmlns:a="urn:opendaylight:params:xml:ns:yang:bgp-rib" xmlns:b="urn:opendaylight:params:xml:ns:yang:bgp-types" xmlns:c="urn:opendaylight:params:xml:ns:yang:bgp:mvpn" xmlns:d="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;/a:application-rib[a:id='10.30.170.173']/a:tables[a:afi='b:ipv4-address-family'][a:safi='c:mcast-vpn-subsequent-address-family']/d:mvpn-routes-ipv4&lt;/error-path&gt;&lt;error-message&gt;Data does not exist&lt;/error-message&gt;&lt;error-tag&gt;data-missing&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-10-11T01:03:55.136544" level="INFO">${response} = None</msg>
<msg time="2026-10-11T01:03:55.136583" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:55.131517" elapsed="0.005448">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:55.131276" elapsed="0.005765">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:55.137224" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:55.137072" elapsed="0.000207"/>
</branch>
<status status="FAIL" start="2026-10-11T01:03:55.131259" elapsed="0.006041">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:55.138587" 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-10-11T01:03:55.138295" elapsed="0.000324">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:03:55.138049" elapsed="0.000626">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:03:55.138032" elapsed="0.000672">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-10-11T01:03:55.139291" 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-10-11T01:03:55.139025" elapsed="0.000296">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:03:55.138766" elapsed="0.000610">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:03:55.138751" elapsed="0.000809">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.140120" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:55.139755" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:55.140438" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:55.140210" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.140960" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:55.140679" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:55.140515" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:55.140193" elapsed="0.000845"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.141571" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:55.141216" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:55.141882" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:55.141660" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.142386" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:55.142125" elapsed="0.000299"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:55.141962" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:55.141643" elapsed="0.000835"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:55.142626" elapsed="0.000302"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:55.143307" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:55.143090" elapsed="0.000241"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-10-11T01:03:55.143664" 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-10-11T01:03:55.143500" elapsed="0.000194">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-10-11T01:03:55.137682" elapsed="0.006137">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-10-11T01:03:55.143883" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:55.144138" level="INFO">${response_text} = None</msg>
<msg time="2026-10-11T01:03:55.144164" 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-10-11T01:03:55.130375" elapsed="0.013815">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-10-11T01:03:55.144248" elapsed="0.000024"/>
</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-10-11T01:03:55.091624" elapsed="0.052760">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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:55.091226" elapsed="0.053261"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:03:55.090862" elapsed="0.053679"/>
</kw>
<arg>source_tree_join</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-10-11T01:03:54.923230" elapsed="0.221356"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:54.827328" elapsed="0.317364"/>
</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-10-11T01:03:55.146264" elapsed="0.000247"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:03:55.145862" elapsed="0.000708"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:55.147540" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:55.147436" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:55.147400" 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-10-11T01:03:55.149808" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:55.149725" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:55.149708" elapsed="0.000230"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.150888" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:55.150538" elapsed="0.000377"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.151331" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:03:55.151069" elapsed="0.000286"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:03:55.151396" elapsed="0.000048"/>
</return>
<msg time="2026-10-11T01:03:55.151546" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:03:55.150154" elapsed="0.001415"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:55.154099" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:55.154015" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:55.153997" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:55.155231" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:55.155147" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:55.155130" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:55.155641" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:03:55.155468" elapsed="0.000197"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:03:55.155987" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:55.155834" elapsed="0.000177"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:03:55.192679" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:03:55.156516" elapsed="0.036255"/>
</kw>
<msg time="2026-10-11T01:03:55.192934" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:03:55.192976" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:55.156170" elapsed="0.036839"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:03:55.245586" 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-10-11T01:03:55.193534" elapsed="0.052150"/>
</kw>
<msg time="2026-10-11T01:03:55.245833" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:03:55.245884" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:55.193176" elapsed="0.052744"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:55.246249" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:55.245992" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:55.245974" elapsed="0.000348"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.246756" 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-10-11T01:03:55.246526" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:55.247098" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:55.246893" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:55.246864" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:03:55.247198" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:55.249792" elapsed="0.000129"/>
</kw>
<msg time="2026-10-11T01:03:55.249980" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:55.248585" 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-10-11T01:03:55.250438" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:55.250777" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:03:55.247991" elapsed="0.002982"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:03:55.247513" elapsed="0.003519"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:03:55.154891" elapsed="0.096213"/>
</kw>
<msg time="2026-10-11T01:03:55.251184" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:55.251223" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:55.154313" elapsed="0.096944"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:03:55.251435" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T01:03:55.251324" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:55.251306" 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-10-11T01:03:55.251837" 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-10-11T01:03:55.252152" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:03:55.252217" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T01:03:55.153717" elapsed="0.098583"/>
</kw>
<msg time="2026-10-11T01:03:55.252383" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:55.252443" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:55.151925" elapsed="0.100553"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:55.252767" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:55.252545" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:55.252529" elapsed="0.000307"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:03:55.151764" elapsed="0.101093"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:03:55.151618" elapsed="0.101310"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:03:55.149432" elapsed="0.103546"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:03:55.147156" elapsed="0.105872"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:55.146724" elapsed="0.106343"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:03:55.145447" elapsed="0.107666"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.254252" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:55.253833" elapsed="0.000445"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.254860" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:55.254476" elapsed="0.000422"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.255429" 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-10-11T01:03:55.255081" elapsed="0.000374"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:55.255772" 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-10-11T01:03:55.255944" 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-10-11T01:03:55.255623" elapsed="0.000346"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:55.256268" 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-10-11T01:03:55.256379" 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-10-11T01:03:55.256133" elapsed="0.000284"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:03:55.256562" elapsed="0.002443"/>
</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-10-11T01:03:55.259160" elapsed="0.002320"/>
</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-10-11T01:03:55.278452" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:55.278131" elapsed="0.000349"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:55.279183" 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-10-11T01:03:55.278980" elapsed="0.000276">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-10-11T01:03:55.279341" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:55.278643" elapsed="0.000721"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.279864" 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-10-11T01:03:55.279554" elapsed="0.000349"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:55.280180" 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-10-11T01:03:55.280304" 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-10-11T01:03:55.280070" elapsed="0.000259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.280761" 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-10-11T01:03:55.280538" elapsed="0.000265"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.281718" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:55.281489" elapsed="0.000271"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.282195" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:55.281949" elapsed="0.000270"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.283030" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:55.282583" elapsed="0.000472"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:55.284218" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:55.283669" elapsed="0.000637"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:55.284385" elapsed="0.000046"/>
</return>
<msg time="2026-10-11T01:03:55.284616" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:55.283227" elapsed="0.001413"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:55.284808" elapsed="0.000347"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:03:55.282448" elapsed="0.002746"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.285893" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:55.285449" elapsed="0.000470"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:55.287053" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:55.286544" elapsed="0.000596"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:55.287220" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:03:55.287450" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:55.286090" 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-10-11T01:03:55.287640" elapsed="0.000312"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:55.285295" elapsed="0.002696"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:55.282293" elapsed="0.005729"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:55.288059" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:03:55.288187" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:55.281137" elapsed="0.007074"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:55.280884" elapsed="0.007356"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:55.288486" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:55.288263" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:55.280851" elapsed="0.007709"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.289479" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-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-10-11T01:03:55.288720" elapsed="0.000788"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:55.289553" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:55.277609" elapsed="0.012047"/>
</kw>
<msg time="2026-10-11T01:03:55.289706" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:55.273242" elapsed="0.016508"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:55.293863" 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/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-10-11T01:03:55.297974" 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/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-10-11T01:03:55.302113" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:55.302295" 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-10-11T01:03:55.302492" 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-10-11T01:03:55.302833" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:55.302686" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:55.302672" 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-10-11T01:03:55.303075" 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-10-11T01:03:55.303256" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:55.303432" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:55.302647" elapsed="0.000835"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:55.302560" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:55.303657" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:55.303724" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:55.303833" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-i...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:03:55.272627" elapsed="0.031231"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:55.304990" 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-10-11T01:03:55.304783" elapsed="0.000267">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-10-11T01:03:55.305131" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:55.304456" elapsed="0.000697"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:55.305449" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:55.305216" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.305969" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:55.305696" elapsed="0.000297"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:55.305523" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:55.305199" elapsed="0.000846"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.306555" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:55.306206" elapsed="0.000374"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:55.306624" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:55.306747" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:55.304140" elapsed="0.002629"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:55.307856" 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-10-11T01:03:55.307667" elapsed="0.000292">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-10-11T01:03:55.308044" 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-10-11T01:03:55.307330" elapsed="0.000737"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:03:55.308228" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:03:55.308130" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:55.308113" elapsed="0.000191"/>
</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-10-11T01:03:55.308474" 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-10-11T01:03:55.308651" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:03:55.308709" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:03:55.308831" 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-10-11T01:03:55.307033" elapsed="0.001825"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.310090" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:55.309857" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:55.310554" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:55.310322" elapsed="0.000272"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:55.316159" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:55.316301" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:55.316401" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:55.311056" elapsed="0.005717">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:55.310652" elapsed="0.006197">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:55.317050" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:55.316894" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-10-11T01:03:55.310635" elapsed="0.006496">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:55.317483" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:55.317604" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:55.317570" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:55.317554" elapsed="0.000108"/>
</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-10-11T01:03:55.317803" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:03:55.317883" 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-10-11T01:03:55.309152" elapsed="0.008827">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:55.318075" 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-10-11T01:03:55.264011" elapsed="0.054151">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:55.318423" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:55.318245" elapsed="0.000245"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:55.318229" elapsed="0.000282"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:55.318541" elapsed="0.000013"/>
</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-10-11T01:03:55.263369" elapsed="0.055260">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:57.353630" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:57.352811" elapsed="0.000890"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:57.355355" 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-10-11T01:03:57.354855" elapsed="0.000685">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-10-11T01:03:57.355732" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:57.354093" elapsed="0.001690"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.356951" 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-10-11T01:03:57.356195" elapsed="0.000813"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:57.357667" 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-10-11T01:03:57.357983" 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-10-11T01:03:57.357384" elapsed="0.000654"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.359020" 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-10-11T01:03:57.358501" elapsed="0.000616"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.361677" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:57.361113" elapsed="0.000661"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.362814" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:57.362195" elapsed="0.000696"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.364716" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:57.363645" elapsed="0.001126"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:57.367392" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:57.366193" elapsed="0.001539"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:57.367941" elapsed="0.000076"/>
</return>
<msg time="2026-10-11T01:03:57.368460" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:57.365175" elapsed="0.003342"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:57.368917" elapsed="0.000742"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:03:57.363315" elapsed="0.006430"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.370850" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:57.370220" elapsed="0.000679"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:57.372558" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:57.371815" elapsed="0.000862"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:57.372787" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T01:03:57.373098" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:57.371140" elapsed="0.001991"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:57.373362" elapsed="0.000446"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:57.370024" elapsed="0.003836"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:57.362995" elapsed="0.010927"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:57.373975" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T01:03:57.374155" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:57.359896" elapsed="0.014292"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.359266" elapsed="0.014962"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.374509" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.374260" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.359222" elapsed="0.015392"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.375602" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-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-10-11T01:03:57.374838" elapsed="0.000801"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:57.375700" 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/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-10-11T01:03:57.351628" elapsed="0.024213"/>
</kw>
<msg time="2026-10-11T01:03:57.375922" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:57.341627" elapsed="0.034359"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:57.382026" 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/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-10-11T01:03:57.387788" 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/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-10-11T01:03:57.393770" elapsed="0.000076"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.394095" 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-10-11T01:03:57.394353" 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-10-11T01:03:57.394854" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.394645" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:57.394627" elapsed="0.000343"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.395188" 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-10-11T01:03:57.395456" 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-10-11T01:03:57.395689" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:57.394592" elapsed="0.001163"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:57.394464" elapsed="0.001323"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.396016" elapsed="0.000028"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:57.396111" elapsed="0.000020"/>
</return>
<msg time="2026-10-11T01:03:57.396264" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-i...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:03:57.340189" elapsed="0.056110"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:57.397762" 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-10-11T01:03:57.397572" elapsed="0.000249">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-10-11T01:03:57.397918" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:57.397196" elapsed="0.000745"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.398224" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.398005" elapsed="0.000269"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.398760" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:57.398496" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.398297" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.397988" elapsed="0.000849"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.399355" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:57.399014" elapsed="0.000365"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:57.399439" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:03:57.399568" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:57.396695" elapsed="0.002896"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:57.400677" 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-10-11T01:03:57.400491" elapsed="0.000245">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-10-11T01:03:57.400855" 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-10-11T01:03:57.400156" elapsed="0.000734"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:03:57.401060" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:03:57.400955" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.400937" elapsed="0.000199"/>
</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-10-11T01:03:57.401293" elapsed="0.000020"/>
</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-10-11T01:03:57.401485" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:03:57.401546" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:03:57.401670" 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-10-11T01:03:57.399843" elapsed="0.001850"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.402938" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:57.402702" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.403389" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:57.403172" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:57.408966" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:57.409178" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:57.409302" 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-10-11T01:03:57.403735" elapsed="0.005602"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.403506" elapsed="0.005886"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.409672" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.409453" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.403489" elapsed="0.006293"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.411831" 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-10-11T01:03:57.411343" elapsed="0.000656"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.411005" elapsed="0.001042"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.410981" elapsed="0.001100"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.412907" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:57.412512" elapsed="0.000461"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.412153" elapsed="0.000864"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.412131" elapsed="0.000917"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.413805" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:57.413298" elapsed="0.000543"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.414242" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.413944" elapsed="0.000371"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.414979" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:57.414594" elapsed="0.000419"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.414345" elapsed="0.000758"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.413921" elapsed="0.001211"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.415887" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:57.415381" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.416307" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.416013" elapsed="0.000365"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.417038" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:57.416658" elapsed="0.000414"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.416428" elapsed="0.000690"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.415990" elapsed="0.001155"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:57.417347" elapsed="0.000426"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:57.418330" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:57.418015" 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-10-11T01:03:57.418602" elapsed="0.000310"/>
</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-10-11T01:03:57.410498" elapsed="0.008494"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:57.419195" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:57.419081" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.419056" elapsed="0.000224"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:57.420382" 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-10-11T01:03:57.419503" elapsed="0.000938"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:57.420509" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T01:03:57.420689" 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-10-11T01:03:57.401988" elapsed="0.018735"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:57.420802" elapsed="0.000034"/>
</return>
<msg time="2026-10-11T01:03:57.421012" 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-10-11T01:03:57.323906" elapsed="0.097148"/>
</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-10-11T01:03:57.434345" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:57.433999" elapsed="0.000375"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:57.435157" 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-10-11T01:03:57.434902" elapsed="0.000380">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-10-11T01:03:57.435473" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:57.434559" elapsed="0.000939"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.436008" 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-10-11T01:03:57.435676" elapsed="0.000402"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:57.436366" 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-10-11T01:03:57.436537" 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-10-11T01:03:57.436252" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.436997" 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-10-11T01:03:57.436760" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:57.437463" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.437112" elapsed="0.000408"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.438162" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:57.437694" elapsed="0.000494"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.437544" elapsed="0.000678"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.437091" elapsed="0.001151"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.438843" 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-10-11T01:03:57.438433" elapsed="0.000449"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:57.438930" 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_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-10-11T01:03:57.433479" elapsed="0.005558"/>
</kw>
<msg time="2026-10-11T01:03:57.439089" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:57.428927" elapsed="0.010207"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:57.443287" 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/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-10-11T01:03:57.447366" 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/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-10-11T01:03:57.451709" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.451904" 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-10-11T01:03:57.452121" 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-10-11T01:03:57.452493" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.452329" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:57.452315" 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-10-11T01:03:57.452724" 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-10-11T01:03:57.452915" 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-10-11T01:03:57.453081" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:57.452287" elapsed="0.000842"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:57.452192" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.453308" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:57.453374" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:57.453501" 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-10-11T01:03:57.427902" elapsed="0.025625"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:57.453694" elapsed="0.000329"/>
</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-10-11T01:03:57.455103" 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-10-11T01:03:57.454679" elapsed="0.000451"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:57.455679" 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-10-11T01:03:57.455279" 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-10-11T01:03:57.455903" elapsed="0.000282"/>
</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-10-11T01:03:57.454293" elapsed="0.001947"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.454093" elapsed="0.002178"/>
</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-10-11T01:03:57.456484" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.456294" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.454076" elapsed="0.002478"/>
</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-10-11T01:03:57.422533" elapsed="0.034065"/>
</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-10-11T01:03:57.421522" elapsed="0.035143"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.421182" elapsed="0.035524"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.421154" elapsed="0.035574"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:57.456759" elapsed="0.000026"/>
</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-10-11T01:03:57.322303" elapsed="0.134559"/>
</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-10-11T01:03:55.261670" elapsed="2.195299"/>
</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-10-11T01:03:57.472666" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:57.472346" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:57.473355" 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-10-11T01:03:57.473182" elapsed="0.000247">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-10-11T01:03:57.473514" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:57.472851" elapsed="0.000686"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.474031" 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-10-11T01:03:57.473710" elapsed="0.000346"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:57.474329" 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-10-11T01:03:57.474460" 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-10-11T01:03:57.474222" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.474907" 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-10-11T01:03:57.474677" elapsed="0.000271"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.475843" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:57.475613" elapsed="0.000284"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.476327" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:57.476074" elapsed="0.000277"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.477124" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:03:57.476683" elapsed="0.000466"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:57.478287" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:57.477767" elapsed="0.000608"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:57.478471" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T01:03:57.478690" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:57.477319" 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-10-11T01:03:57.478894" elapsed="0.000319"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/effective-rib-in</var>
<status status="PASS" start="2026-10-11T01:03:57.476550" elapsed="0.002700"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.479944" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:57.479502" elapsed="0.000466"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:57.481099" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:57.480590" elapsed="0.000597"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:57.481268" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:03:57.481497" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:57.480136" 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-10-11T01:03:57.481687" elapsed="0.000314"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:57.479350" elapsed="0.002690"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:57.476394" elapsed="0.005708"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:57.482143" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:57.482272" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:57.475255" elapsed="0.007041"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.475008" elapsed="0.007317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.482576" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.482347" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.474991" elapsed="0.007657"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.483321" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-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-10-11T01:03:57.482808" elapsed="0.000539"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:57.483391" elapsed="0.000098"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:57.471834" elapsed="0.011731"/>
</kw>
<msg time="2026-10-11T01:03:57.483614" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:57.467417" elapsed="0.016241"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:57.487932" 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/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-10-11T01:03:57.491983" 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/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-10-11T01:03:57.496053" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.496235" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.496431" 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-10-11T01:03:57.496769" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.496623" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:57.496609" 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-10-11T01:03:57.497008" 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-10-11T01:03:57.497189" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.497353" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:57.496583" elapsed="0.000858"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:57.496498" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.497624" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:57.497690" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:57.497799" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-ro...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:03:57.466794" elapsed="0.031030"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:57.498937" 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-10-11T01:03:57.498739" elapsed="0.000258">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-10-11T01:03:57.499080" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:57.498398" elapsed="0.000704"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.499385" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.499165" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.499928" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:57.499654" elapsed="0.000298"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.499475" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.499148" elapsed="0.000856"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.500514" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:57.500165" elapsed="0.000373"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:57.500583" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:57.500705" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:57.498100" elapsed="0.002628"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:57.501819" 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-10-11T01:03:57.501636" elapsed="0.000256">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-10-11T01:03:57.502003" 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-10-11T01:03:57.501292" elapsed="0.000734"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:03:57.502189" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:03:57.502090" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.502073" elapsed="0.000192"/>
</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-10-11T01:03:57.502438" elapsed="0.000020"/>
</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-10-11T01:03:57.502616" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:03:57.502674" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:03:57.502797" 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-10-11T01:03:57.500991" elapsed="0.001829"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.504057" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:57.503823" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.504523" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:57.504291" 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-10-11T01:03:57.509546" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:57.509682" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:03:57.509770" 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-10-11T01:03:57.504904" elapsed="0.004890"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.504660" elapsed="0.005172"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.510024" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.509856" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.504643" elapsed="0.005458"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.511357" 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-10-11T01:03:57.511027" elapsed="0.000391"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.510771" elapsed="0.000679"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.510754" elapsed="0.000720"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.512048" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:57.511764" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.511524" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.511509" elapsed="0.000636"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.512685" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:57.512323" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.513001" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.512776" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.513520" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:57.513240" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.513076" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.512759" elapsed="0.000838"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.514123" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:57.513774" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.514438" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.514212" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.514952" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:57.514677" elapsed="0.000299"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.514514" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.514195" elapsed="0.000834"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:57.515174" elapsed="0.000304"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:57.515863" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:57.515640" elapsed="0.000260"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:57.516056" elapsed="0.000210"/>
</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-10-11T01:03:57.510436" elapsed="0.005916"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:57.516517" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:57.516432" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.516400" elapsed="0.000178"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:57.517324" 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-10-11T01:03:57.516720" elapsed="0.000632"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:57.517398" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T01:03:57.517541" 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-10-11T01:03:57.503113" elapsed="0.014453"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:57.517622" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:03:57.517741" 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-10-11T01:03:57.459470" elapsed="0.058295"/>
</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-10-11T01:03:57.528366" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:57.528065" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:57.529112" 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-10-11T01:03:57.528894" elapsed="0.000335">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-10-11T01:03:57.529391" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:57.528567" elapsed="0.000868"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.529934" 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-10-11T01:03:57.529612" elapsed="0.000347"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:57.530233" 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-10-11T01:03:57.530351" 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-10-11T01:03:57.530125" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.530810" 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-10-11T01:03:57.530590" elapsed="0.000266"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:57.531225" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.530930" elapsed="0.000350"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.531927" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:57.531468" elapsed="0.000512"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.531302" elapsed="0.000713"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.530913" elapsed="0.001122"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.532621" 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-10-11T01:03:57.532200" elapsed="0.000447"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:57.532691" 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-10-11T01:03:57.527550" elapsed="0.005243"/>
</kw>
<msg time="2026-10-11T01:03:57.532843" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:57.523170" elapsed="0.009730"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:57.536998" 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/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-10-11T01:03:57.541219" 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/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-10-11T01:03:57.546428" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.546614" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.546796" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.547152" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.547006" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:57.546992" 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-10-11T01:03:57.547379" 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-10-11T01:03:57.547576" 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-10-11T01:03:57.547742" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:57.546967" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:57.546875" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.548008" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:57.548075" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:57.548187" 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-10-11T01:03:57.522456" elapsed="0.025825"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:57.548494" elapsed="0.000323"/>
</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-10-11T01:03:57.549882" 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-10-11T01:03:57.549481" elapsed="0.000430"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:57.550534" 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-10-11T01:03:57.550146" elapsed="0.000415"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:03:57.550744" elapsed="0.000291"/>
</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-10-11T01:03:57.549103" elapsed="0.001987"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.548900" elapsed="0.002220"/>
</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-10-11T01:03:57.551319" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.551143" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.548883" 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-10-11T01:03:57.518722" elapsed="0.032738"/>
</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-10-11T01:03:57.518056" elapsed="0.033473"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.517839" elapsed="0.033729"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.517823" elapsed="0.033767"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:57.551620" 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-10-11T01:03:57.458831" elapsed="0.092891"/>
</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-10-11T01:03:57.457161" elapsed="0.094612"/>
</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-10-11T01:03:57.572576" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:57.572251" elapsed="0.000353"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:57.573294" 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-10-11T01:03:57.573103" elapsed="0.000256">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-10-11T01:03:57.573459" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:57.572767" elapsed="0.000716"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.573982" 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-10-11T01:03:57.573657" elapsed="0.000351"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:57.574327" 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-10-11T01:03:57.574468" 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-10-11T01:03:57.574214" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.574920" 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-10-11T01:03:57.574688" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.575880" 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-10-11T01:03:57.575636" elapsed="0.000287"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.576367" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:57.576113" elapsed="0.000279"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.577203" 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-10-11T01:03:57.576733" elapsed="0.000494"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:57.578392" 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-10-11T01:03:57.577878" elapsed="0.000618"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:57.578579" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:03:57.578794" 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-10-11T01:03:57.577426" elapsed="0.001391"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:57.578996" elapsed="0.000314"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:03:57.576599" elapsed="0.002749"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.580049" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:57.579597" elapsed="0.000476"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:57.581210" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:57.580690" elapsed="0.000610"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:57.581380" elapsed="0.000055"/>
</return>
<msg time="2026-10-11T01:03:57.581622" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:57.580244" 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-10-11T01:03:57.581811" elapsed="0.000320"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:57.579466" elapsed="0.002704"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:57.576452" elapsed="0.005749"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:57.582239" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:57.582369" 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-10-11T01:03:57.575279" elapsed="0.007114"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.575025" elapsed="0.007423"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.582624" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.582472" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.575007" elapsed="0.007686"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.583364" 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-10-11T01:03:57.582853" elapsed="0.000538"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:57.583450" 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/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-10-11T01:03:57.571729" elapsed="0.011822"/>
</kw>
<msg time="2026-10-11T01:03:57.583601" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:57.567046" elapsed="0.016600"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:57.588044" 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/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-10-11T01:03:57.592223" 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/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-10-11T01:03:57.596334" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.596530" 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-10-11T01:03:57.596713" 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-10-11T01:03:57.597068" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.596920" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:57.596906" 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-10-11T01:03:57.597298" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.597492" 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-10-11T01:03:57.597659" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:57.596878" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:57.596779" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.597896" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:57.597964" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:57.598073" 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-10-11T01:03:57.566383" elapsed="0.031715"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:57.599219" 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-10-11T01:03:57.599032" elapsed="0.000247">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-10-11T01:03:57.599362" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:57.598690" elapsed="0.000696"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.599720" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.599465" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.600255" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:57.599988" elapsed="0.000292"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.599797" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.599447" elapsed="0.000884"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.600848" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:57.600509" elapsed="0.000377"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:57.600932" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:57.601057" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:57.598367" elapsed="0.002713"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:57.602164" 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-10-11T01:03:57.601980" elapsed="0.000243">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-10-11T01:03:57.602307" 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-10-11T01:03:57.601648" elapsed="0.000681"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:03:57.602507" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:03:57.602392" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.602375" elapsed="0.000209"/>
</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-10-11T01:03:57.602740" elapsed="0.000019"/>
</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-10-11T01:03:57.602927" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:03:57.602987" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:03:57.603112" 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-10-11T01:03:57.601332" elapsed="0.001803"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.604368" 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-10-11T01:03:57.604145" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.604836" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:57.604619" elapsed="0.000270"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:57.609668" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:57.609803" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:03:57.609925" 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-10-11T01:03:57.605178" elapsed="0.004776"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.604949" elapsed="0.005045"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.610177" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.610019" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.604933" elapsed="0.005322"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.611555" 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-10-11T01:03:57.611202" elapsed="0.000431"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.610958" elapsed="0.000709"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.610941" elapsed="0.000750"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.612277" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:57.612003" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.611742" elapsed="0.000609"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.611727" elapsed="0.000647"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.612936" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:57.612571" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.613242" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.613026" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.613766" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:57.613497" elapsed="0.000295"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.613316" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.613009" elapsed="0.000836"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.614373" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:57.614035" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.614690" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.614478" elapsed="0.000264"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.615205" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:57.614941" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.614765" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.614461" elapsed="0.000821"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:57.615444" elapsed="0.000294"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:57.616139" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:57.615913" elapsed="0.000250"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:57.616317" elapsed="0.000227"/>
</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-10-11T01:03:57.610604" elapsed="0.005997"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:57.616746" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:57.616663" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.616646" elapsed="0.000161"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:57.617589" 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-10-11T01:03:57.616960" elapsed="0.000656"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:57.617662" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:57.617790" 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-10-11T01:03:57.603433" elapsed="0.014382"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:57.617886" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:03:57.618010" 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-10-11T01:03:57.554300" elapsed="0.063734"/>
</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-10-11T01:03:57.628741" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:57.628441" elapsed="0.000327"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:57.629497" 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-10-11T01:03:57.629252" elapsed="0.000364">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-10-11T01:03:57.629776" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:57.628937" elapsed="0.000863"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.630297" 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-10-11T01:03:57.629987" elapsed="0.000337"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:57.630615" 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-10-11T01:03:57.630737" 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-10-11T01:03:57.630507" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.631187" 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-10-11T01:03:57.630970" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:57.631612" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.631293" elapsed="0.000373"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.632297" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:57.631837" elapsed="0.000485"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.631689" elapsed="0.000665"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.631275" elapsed="0.001099"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.632982" 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-10-11T01:03:57.632583" elapsed="0.000426"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:57.633053" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:57.627914" elapsed="0.005240"/>
</kw>
<msg time="2026-10-11T01:03:57.633204" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:57.623540" elapsed="0.009708"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:57.637395" 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/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-10-11T01:03:57.641559" 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/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-10-11T01:03:57.646005" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.646225" 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-10-11T01:03:57.646427" 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-10-11T01:03:57.646808" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.646656" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:57.646640" 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-10-11T01:03:57.647055" 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-10-11T01:03:57.647233" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.647397" elapsed="0.000033"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:57.646610" elapsed="0.000851"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:57.646505" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.647639" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:57.647709" elapsed="0.000017"/>
</return>
<msg time="2026-10-11T01:03:57.647838" 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-10-11T01:03:57.622773" elapsed="0.025103"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:57.648047" elapsed="0.000407"/>
</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-10-11T01:03:57.649555" 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-10-11T01:03:57.649129" elapsed="0.000453"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:57.650267" 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-10-11T01:03:57.649733" elapsed="0.000560"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:03:57.650492" elapsed="0.000283"/>
</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-10-11T01:03:57.648738" elapsed="0.002092"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.648525" elapsed="0.002336"/>
</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-10-11T01:03:57.651078" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.650904" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.648509" elapsed="0.002679"/>
</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-10-11T01:03:57.618992" elapsed="0.032245"/>
</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-10-11T01:03:57.618315" elapsed="0.032989"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.618108" elapsed="0.033236"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.618092" elapsed="0.033275"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:57.651398" elapsed="0.000044"/>
</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-10-11T01:03:57.553680" elapsed="0.097840"/>
</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-10-11T01:03:57.551977" elapsed="0.099600"/>
</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-10-11T01:03:57.651730" elapsed="0.002924"/>
</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-10-11T01:03:57.670772" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:57.670468" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:57.671538" 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-10-11T01:03:57.671291" elapsed="0.000327">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-10-11T01:03:57.671707" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:57.670971" elapsed="0.000759"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.672236" 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-10-11T01:03:57.671920" elapsed="0.000342"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:57.672575" 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-10-11T01:03:57.672767" 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-10-11T01:03:57.672457" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.673234" 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-10-11T01:03:57.673008" elapsed="0.000268"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.674210" 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-10-11T01:03:57.673979" elapsed="0.000273"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.674699" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:57.674445" elapsed="0.000278"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.675533" 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-10-11T01:03:57.675052" elapsed="0.000506"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:57.676710" 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-10-11T01:03:57.676180" elapsed="0.000619"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:57.676892" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:03:57.677105" 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-10-11T01:03:57.675731" elapsed="0.001397"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:57.677297" elapsed="0.000339"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:03:57.674920" elapsed="0.002784"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.678386" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:57.677948" elapsed="0.000477"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:57.679571" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:57.679036" elapsed="0.000626"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:57.679742" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:03:57.679969" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:57.678597" elapsed="0.001396"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:57.680158" elapsed="0.000329"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:57.677806" elapsed="0.002720"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:57.674767" elapsed="0.005791"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:57.680597" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:57.680726" 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-10-11T01:03:57.673624" elapsed="0.007126"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.673337" elapsed="0.007443"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.680969" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.680802" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.673320" elapsed="0.007719"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.681713" 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-10-11T01:03:57.681197" elapsed="0.000542"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:57.681782" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:57.669947" elapsed="0.011947"/>
</kw>
<msg time="2026-10-11T01:03:57.681944" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:57.665461" elapsed="0.016529"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:57.686335" 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/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-10-11T01:03:57.690465" 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/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-10-11T01:03:57.694559" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.694740" 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-10-11T01:03:57.694968" 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-10-11T01:03:57.695315" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.695167" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:57.695154" 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-10-11T01:03:57.695560" 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-10-11T01:03:57.695741" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.695917" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:57.695129" elapsed="0.000837"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:57.695040" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.696140" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:57.696206" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:57.696312" 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-10-11T01:03:57.664838" elapsed="0.031498"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:57.697453" 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-10-11T01:03:57.697254" elapsed="0.000259">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-10-11T01:03:57.697595" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:57.696930" elapsed="0.000688"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.697914" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.697681" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.698445" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:57.698169" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.697990" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.697664" elapsed="0.000859"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.699031" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:57.698684" elapsed="0.000371"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:57.699100" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:57.699223" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:57.696619" elapsed="0.002626"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:57.700283" 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-10-11T01:03:57.700141" elapsed="0.000190"/>
</kw>
<msg time="2026-10-11T01:03:57.700421" 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-10-11T01:03:57.699810" elapsed="0.000635"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:03:57.700607" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:57.700509" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.700492" elapsed="0.000177"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:57.700957" 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-10-11T01:03:57.701100" 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-10-11T01:03:57.700819" elapsed="0.000303"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:03:57.701484" 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-10-11T01:03:57.701283" elapsed="0.000225"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:03:57.701549" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:57.701673" 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-10-11T01:03:57.699513" elapsed="0.002183"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.702923" 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-10-11T01:03:57.702690" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.703367" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:57.703155" elapsed="0.000265"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:57.708726" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:57.708892" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:03:57.708983" 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-10-11T01:03:57.703710" elapsed="0.005297"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.703482" elapsed="0.005563"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.709223" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.709069" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.703465" elapsed="0.005834"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.710578" 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-10-11T01:03:57.710230" elapsed="0.000394"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.709989" elapsed="0.000666"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.709973" elapsed="0.000704"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.711246" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:57.710979" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.710727" elapsed="0.000590"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.710712" elapsed="0.000627"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.711892" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:57.711533" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.712192" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.711980" elapsed="0.000263"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.712703" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:57.712441" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.712265" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.711963" elapsed="0.000816"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.713303" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:57.712971" elapsed="0.000356"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.713648" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.713434" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.714160" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:57.713900" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.713723" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.713402" elapsed="0.000833"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:57.714379" elapsed="0.000306"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:57.715082" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:57.714846" elapsed="0.000260"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:57.715261" elapsed="0.000224"/>
</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-10-11T01:03:57.709637" elapsed="0.005902"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:57.715681" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:57.715600" elapsed="0.000120"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.715584" elapsed="0.000156"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:57.716560" 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-10-11T01:03:57.715893" elapsed="0.000695"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:57.716635" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:57.716760" 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-10-11T01:03:57.701987" elapsed="0.014797"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:57.716839" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T01:03:57.716977" 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-10-11T01:03:57.657217" elapsed="0.059784"/>
</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-10-11T01:03:57.727627" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:57.727297" elapsed="0.000356"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:57.728361" 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-10-11T01:03:57.728144" elapsed="0.000363">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-10-11T01:03:57.728669" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:57.727813" elapsed="0.000880"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.729196" 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-10-11T01:03:57.728879" elapsed="0.000342"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:57.729511" 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-10-11T01:03:57.729655" 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-10-11T01:03:57.729386" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.730106" 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-10-11T01:03:57.729888" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:57.730513" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.730206" elapsed="0.000361"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.731193" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:57.730736" elapsed="0.000482"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:57.730589" elapsed="0.000662"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:57.730190" elapsed="0.001081"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.731825" 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-10-11T01:03:57.731447" elapsed="0.000404"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:57.731908" 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/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-10-11T01:03:57.726783" elapsed="0.005226"/>
</kw>
<msg time="2026-10-11T01:03:57.732056" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:57.722369" elapsed="0.009731"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:57.736198" 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/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-10-11T01:03:57.740293" 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/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-10-11T01:03:57.744516" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.744700" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.744893" 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-10-11T01:03:57.745234" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.745090" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:57.745076" 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-10-11T01:03:57.745474" 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-10-11T01:03:57.745688" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.745855" elapsed="0.000034"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:57.745051" elapsed="0.000868"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:57.744961" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:57.746094" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:57.746161" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:57.746266" 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-10-11T01:03:57.721643" elapsed="0.024648"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:57.746473" elapsed="0.000314"/>
</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-10-11T01:03:57.747684" 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-10-11T01:03:57.747445" elapsed="0.000266"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:57.748434" 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-10-11T01:03:57.747860" elapsed="0.000602"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:03:57.748927" 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-10-11T01:03:57.749102" 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-10-11T01:03:57.748647" elapsed="0.000518">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-10-11T01:03:57.747071" elapsed="0.002229">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-10-11T01:03:57.746856" elapsed="0.002543">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-10-11T01:03:57.749629" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:57.749450" elapsed="0.000229"/>
</branch>
<status status="FAIL" start="2026-10-11T01:03:57.746840" elapsed="0.002861">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-10-11T01:03:57.717955" elapsed="0.031856">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-10-11T01:03:57.717278" elapsed="0.032674">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-10-11T01:03:57.717073" elapsed="0.032957">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-10-11T01:03:57.717058" elapsed="0.033004">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-10-11T01:03:57.750106" elapsed="0.000015"/>
</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-10-11T01:03:57.656590" elapsed="0.093624">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-10-11T01:03:59.786685" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:59.785908" elapsed="0.000847"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:59.788405" 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-10-11T01:03:59.787941" elapsed="0.000646">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-10-11T01:03:59.788779" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:59.787165" elapsed="0.001664"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:59.789993" 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-10-11T01:03:59.789241" elapsed="0.000808"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:59.790703" 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-10-11T01:03:59.791029" 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-10-11T01:03:59.790449" elapsed="0.000635"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:59.792055" 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-10-11T01:03:59.791542" elapsed="0.000609"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:59.794364" 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-10-11T01:03:59.793829" elapsed="0.000659"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:03:59.795541" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:03:59.794906" elapsed="0.000689"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:59.797391" 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-10-11T01:03:59.796326" elapsed="0.001176"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:59.799803" 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-10-11T01:03:59.798998" elapsed="0.000947"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:59.800061" elapsed="0.000051"/>
</return>
<msg time="2026-10-11T01:03:59.800367" 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-10-11T01:03:59.797939" elapsed="0.002463"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:59.800684" elapsed="0.000476"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:03:59.796029" elapsed="0.005185"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:03:59.802225" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:03:59.801587" elapsed="0.000672"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:03:59.804061" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:03:59.803169" elapsed="0.001017"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:03:59.804303" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T01:03:59.804643" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:03:59.802541" elapsed="0.002137"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:03:59.804930" elapsed="0.002232"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:03:59.801358" elapsed="0.005863"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:03:59.795695" elapsed="0.011571"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:03:59.807322" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T01:03:59.807615" 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-10-11T01:03:59.792970" elapsed="0.014682"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:59.792301" elapsed="0.015453"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:59.808026" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:59.807792" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:59.792257" elapsed="0.015870"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:59.809125" 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-10-11T01:03:59.808347" elapsed="0.000818"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:59.809228" 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/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-10-11T01:03:59.784647" elapsed="0.024723"/>
</kw>
<msg time="2026-10-11T01:03:59.809490" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:59.774234" elapsed="0.035325"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:59.815330" 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-10-11T01:03:59.821218" 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-10-11T01:03:59.826254" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:59.826451" 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-10-11T01:03:59.826635" 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-10-11T01:03:59.826985" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:59.826829" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:59.826815" 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-10-11T01:03:59.827217" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:59.827395" 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-10-11T01:03:59.827625" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:59.826789" elapsed="0.000888"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:59.826701" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:59.827854" elapsed="0.000030"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:59.827933" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:59.828042" 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-10-11T01:03:59.772811" elapsed="0.055286"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:59.829216" 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-10-11T01:03:59.829026" elapsed="0.000251">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-10-11T01:03:59.829360" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:59.828687" elapsed="0.000696"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:59.829685" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:59.829463" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:59.830223" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:59.829951" elapsed="0.000298"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:59.829759" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:59.829446" elapsed="0.000855"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:59.830819" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:59.830479" elapsed="0.000364"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:03:59.830902" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:59.831028" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:03:59.828370" elapsed="0.002681"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:59.832093" 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-10-11T01:03:59.831948" elapsed="0.000194"/>
</kw>
<msg time="2026-10-11T01:03:59.832217" 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-10-11T01:03:59.831615" elapsed="0.000624"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:03:59.832399" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:59.832302" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:59.832285" elapsed="0.000191"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:59.832751" 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-10-11T01:03:59.832884" 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-10-11T01:03:59.832628" elapsed="0.000279"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:03:59.833253" 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-10-11T01:03:59.833068" elapsed="0.000209"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:03:59.833318" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:03:59.833458" 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-10-11T01:03:59.831299" elapsed="0.002182"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:59.834704" 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-10-11T01:03:59.834480" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:59.835166" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:59.834951" elapsed="0.000255"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:03:59.840529" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:03:59.840698" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:03:59.840795" 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-10-11T01:03:59.835675" elapsed="0.005145"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:59.835265" elapsed="0.005606"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:59.841057" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:59.840897" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:59.835248" elapsed="0.005888"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:59.842404" 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-10-11T01:03:59.842075" elapsed="0.000389"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:59.841817" elapsed="0.000679"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:59.841800" elapsed="0.000719"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:59.843139" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:03:59.842844" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:59.842569" elapsed="0.000647"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:59.842554" elapsed="0.000684"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:59.843803" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:59.843443" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:59.844128" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:59.843909" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:59.844653" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:59.844370" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:59.844206" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:59.843892" elapsed="0.000839"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:59.845255" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:59.844918" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:59.845568" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:59.845343" elapsed="0.000277"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:59.846088" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:03:59.845805" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:59.845642" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:59.845327" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:59.846311" elapsed="0.000310"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:03:59.847020" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:03:59.846783" elapsed="0.000261"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:03:59.847200" elapsed="0.000228"/>
</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-10-11T01:03:59.841478" elapsed="0.006007"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:59.847627" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:59.847546" elapsed="0.000121"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:59.847529" elapsed="0.000158"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:59.848303" 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-10-11T01:03:59.847828" elapsed="0.000531"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:03:59.848422" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:03:59.848552" 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-10-11T01:03:59.833758" elapsed="0.014818"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:59.848631" elapsed="0.000023"/>
</return>
<msg time="2026-10-11T01:03:59.848750" 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-10-11T01:03:59.755725" elapsed="0.093048"/>
</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-10-11T01:03:59.859642" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:59.859265" elapsed="0.000409"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:59.860454" 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-10-11T01:03:59.860197" elapsed="0.000383">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-10-11T01:03:59.860749" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:59.859873" elapsed="0.000899"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:59.861273" 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-10-11T01:03:59.860961" elapsed="0.000337"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:59.861622" 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-10-11T01:03:59.861785" 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-10-11T01:03:59.861508" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:59.862243" 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-10-11T01:03:59.862023" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:03:59.862679" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:59.862345" elapsed="0.000389"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:03:59.863382" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:59.862919" elapsed="0.000510"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:59.862758" elapsed="0.000712"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:59.862328" elapsed="0.001162"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:03:59.864055" 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-10-11T01:03:59.863655" elapsed="0.000427"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:03:59.864126" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:59.858661" elapsed="0.005565"/>
</kw>
<msg time="2026-10-11T01:03:59.864305" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:59.854195" elapsed="0.010156"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:03:59.868551" 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/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-10-11T01:03:59.872650" 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/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-10-11T01:03:59.876891" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:59.877075" 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-10-11T01:03:59.877258" 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-10-11T01:03:59.877641" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:59.877469" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:03:59.877455" 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-10-11T01:03:59.877887" 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-10-11T01:03:59.878069" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:59.878232" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:03:59.877428" elapsed="0.000851"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:03:59.877325" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:59.878470" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:03:59.878537" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:03:59.878643" 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-10-11T01:03:59.853476" elapsed="0.025193"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:59.878836" elapsed="0.000328"/>
</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-10-11T01:03:59.880062" 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-10-11T01:03:59.879812" elapsed="0.000308"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:03:59.880521" 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-10-11T01:03:59.880273" elapsed="0.000275"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:03:59.880728" elapsed="0.000294"/>
</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-10-11T01:03:59.879450" elapsed="0.001625"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:59.879234" elapsed="0.001871"/>
</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-10-11T01:03:59.881303" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:59.881128" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:59.879217" elapsed="0.002154"/>
</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-10-11T01:03:59.849723" elapsed="0.031707"/>
</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-10-11T01:03:59.849063" elapsed="0.032434"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:59.848845" elapsed="0.032691"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:59.848830" elapsed="0.032728"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:03:59.881588" elapsed="0.000026"/>
</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-10-11T01:03:59.754075" elapsed="0.127612"/>
</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-10-11T01:03:57.654853" elapsed="2.226885"/>
</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-10-11T01:03:59.881949" elapsed="0.002687"/>
</kw>
<arg>source_tree_join</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-10-11T01:03:55.253373" elapsed="4.631317"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:55.145003" elapsed="4.739794"/>
</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-10-11T01:03:59.886474" elapsed="0.000232"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:03:59.886183" 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-10-11T01:03:59.887889" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:59.887782" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:59.887764" 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-10-11T01:03:59.890104" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:59.890019" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:59.890002" elapsed="0.000166"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:59.891094" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:03:59.890757" elapsed="0.000363"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:03:59.891552" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:03:59.891275" elapsed="0.000301"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:03:59.891617" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:03:59.891743" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:03:59.890381" elapsed="0.001385"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:59.894273" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:59.894188" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:59.894171" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:03:59.895383" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:03:59.895298" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:59.895282" elapsed="0.000235"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:03:59.895848" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:03:59.895674" elapsed="0.000213"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:03:59.896203" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:03:59.896059" elapsed="0.000168"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:03:59.931870" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:03:59.896750" elapsed="0.035261"/>
</kw>
<msg time="2026-10-11T01:03:59.932212" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:03:59.932255" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:59.896388" elapsed="0.035903"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:03:59.972826" 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-10-11T01:03:59.932951" elapsed="0.040002"/>
</kw>
<msg time="2026-10-11T01:03:59.973107" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:03:59.973149" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:59.932538" elapsed="0.040647"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:59.973520" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:59.973263" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:59.973241" elapsed="0.000355"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:59.974031" 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-10-11T01:03:59.973781" elapsed="0.000322"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:59.974366" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:59.974164" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:59.974147" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:03:59.974488" 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-10-11T01:03:59.977232" elapsed="0.000122"/>
</kw>
<msg time="2026-10-11T01:03:59.977517" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:59.975951" elapsed="0.001733"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:59.978040" elapsed="0.000078"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:59.978390" 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-10-11T01:03:59.975316" elapsed="0.003295"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:03:59.974814" elapsed="0.003858"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:03:59.895042" elapsed="0.083706"/>
</kw>
<msg time="2026-10-11T01:03:59.979040" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:59.979088" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:59.894504" elapsed="0.084621"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:03:59.979285" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T01:03:59.979196" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:59.979179" elapsed="0.000185"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:59.979718" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:59.980089" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:03:59.980155" 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-10-11T01:03:59.893902" elapsed="0.086340"/>
</kw>
<msg time="2026-10-11T01:03:59.980329" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:03:59.980369" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:59.892106" elapsed="0.088314"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:03:59.980716" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:03:59.980490" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:59.980474" elapsed="0.000313"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:03:59.891961" elapsed="0.088864"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:03:59.891812" elapsed="0.089043"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:03:59.889711" elapsed="0.091207"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:03:59.887519" elapsed="0.093451"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:03:59.887007" elapsed="0.094005"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:03:59.885789" elapsed="0.095273"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:59.981912" 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-10-11T01:03:59.982073" 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-10-11T01:03:59.981744" elapsed="0.000354"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:03:59.982485" 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-10-11T01:03:59.982263" elapsed="0.000249"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:59.982817" 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-10-11T01:03:59.982951" 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-10-11T01:03:59.982678" elapsed="0.000298"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:03:59.983307" 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-10-11T01:03:59.983135" elapsed="0.000198"/>
</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-10-11T01:03:59.983614" elapsed="0.002442"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:59.983396" elapsed="0.002694"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:59.983378" elapsed="0.002737"/>
</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-10-11T01:03:59.996993" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:03:59.996674" elapsed="0.000346"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:03:59.997725" 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-10-11T01:03:59.997521" elapsed="0.000280">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-10-11T01:03:59.997936" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:03:59.997182" elapsed="0.000778"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:03:59.998465" 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-10-11T01:03:59.998136" elapsed="0.000356"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:03:59.998769" 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-10-11T01:03:59.998903" 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-10-11T01:03:59.998659" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:03:59.999343" 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-10-11T01:03:59.999124" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:00.000316" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:04:00.000085" elapsed="0.000272"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:00.000808" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:00.000549" elapsed="0.000283"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:00.001453" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:00.001168" elapsed="0.000310"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:00.002333" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:00.001975" elapsed="0.000383"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:00.002402" elapsed="0.000107"/>
</return>
<msg time="2026-10-11T01:04:00.002632" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:00.001651" 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-10-11T01:04:00.002824" elapsed="0.000201"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:04:00.001034" elapsed="0.002028"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:00.003597" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:00.003293" elapsed="0.000329"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:00.004512" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:00.004117" elapsed="0.000421"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:00.004585" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:00.004712" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:00.003792" 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-10-11T01:04:00.004912" elapsed="0.000173"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:00.003162" elapsed="0.001959"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:00.000889" elapsed="0.004264"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:00.005191" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:04:00.005319" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:03:59.999721" elapsed="0.005622"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:59.999463" elapsed="0.005908"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:00.005585" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:00.005394" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-10-11T01:03:59.999444" elapsed="0.006212"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:00.006359" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:00.005820" elapsed="0.000566"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:00.006460" 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-10-11T01:03:59.996146" elapsed="0.010420"/>
</kw>
<msg time="2026-10-11T01:04:00.006648" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:03:59.991606" elapsed="0.015090"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:00.011041" 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/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-10-11T01:04:00.015175" 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/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-10-11T01:04:00.019274" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:00.019471" 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-10-11T01:04:00.019656" 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-10-11T01:04:00.020009" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:00.019850" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:00.019836" 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-10-11T01:04:00.020239" 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-10-11T01:04:00.020434" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:00.020602" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:00.019811" elapsed="0.000839"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:00.019722" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:00.020828" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:00.020907" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:00.021014" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:03:59.991001" elapsed="0.030038"/>
</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-10-11T01:04:00.030021" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:00.029706" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:00.030709" 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-10-11T01:04:00.030538" elapsed="0.000230">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-10-11T01:04:00.030852" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:00.030206" elapsed="0.000681"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:00.031366" 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-10-11T01:04:00.031062" elapsed="0.000329"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:00.031683" 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-10-11T01:04:00.031803" 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-10-11T01:04:00.031574" elapsed="0.000256"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:00.032252" 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-10-11T01:04:00.032036" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:00.032633" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:00.032369" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:00.033126" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', '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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:00.032853" elapsed="0.000299"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:00.032707" elapsed="0.000477"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:00.032352" elapsed="0.000884"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:00.033807" 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-10-11T01:04:00.033418" elapsed="0.000418"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:00.033892" 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-10-11T01:04:00.029151" elapsed="0.004844"/>
</kw>
<msg time="2026-10-11T01:04:00.034047" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:00.024805" elapsed="0.009285"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:00.038421" 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/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-10-11T01:04:00.042624" 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/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-10-11T01:04:00.046737" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:00.046930" 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-10-11T01:04:00.047114" 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-10-11T01:04:00.047472" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:00.047308" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:00.047294" 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-10-11T01:04:00.047702" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:00.047891" 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-10-11T01:04:00.048058" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:00.047269" elapsed="0.000835"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:00.047179" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:00.048279" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:00.048344" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:00.048480" 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-10-11T01:04:00.024107" elapsed="0.024401"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:00.049635" 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-10-11T01:04:00.049442" elapsed="0.000253">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-10-11T01:04:00.049777" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:00.049101" elapsed="0.000698"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:00.050094" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:00.049873" elapsed="0.000271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:00.050650" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:00.050369" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:00.050195" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:00.049846" elapsed="0.000880"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:00.051255" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:00.050900" elapsed="0.000379"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:00.051323" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:00.051483" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:00.048786" elapsed="0.002724"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:00.052871" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:00.052634" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:00.053321" 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-10-11T01:04:00.053108" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:00.053824" 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-10-11T01:04:00.053603" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:00.054284" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:00.054068" elapsed="0.000256"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:00.055073" 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-10-11T01:04:00.054908" elapsed="0.000190"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:04:00.055397" 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-10-11T01:04:00.055253" 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-10-11T01:04:00.055622" elapsed="0.000156"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:00.056211" 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-10-11T01:04:00.055988" elapsed="0.000263"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:04:00.056288" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:00.056429" 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-10-11T01:04:00.054539" elapsed="0.001914"/>
</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-10-11T01:04:00.066430" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.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-10-11T01:04:00.066533" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:00.066619" 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-10-11T01:04:00.056748" elapsed="0.009896"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:00.056516" elapsed="0.010169"/>
</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-10-11T01:04:00.066874" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:00.066708" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:00.056500" elapsed="0.010454"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:00.068177" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:00.067899" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:00.067644" elapsed="0.000604"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:00.067627" elapsed="0.000644"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:00.068841" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:00.068573" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:00.068320" elapsed="0.000609"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:00.068305" elapsed="0.000646"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:00.069490" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:00.069127" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:00.069788" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:00.069578" elapsed="0.000261"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:00.070305" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:00.070040" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:00.069874" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:00.069561" elapsed="0.000821"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:00.070922" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:00.070577" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:00.071218" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:00.071009" elapsed="0.000260"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:00.071730" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:00.071468" elapsed="0.000295"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:00.071291" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:00.070992" elapsed="0.000828"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:00.071978" elapsed="0.000295"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:00.072686" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:00.072460" elapsed="0.000250"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:00.072874" elapsed="0.000218"/>
</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-10-11T01:04:00.067272" elapsed="0.005874"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:04:00.073290" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:04:00.073209" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:00.073192" elapsed="0.000174"/>
</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-10-11T01:04:00.073525" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:04:00.073585" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:04:00.073742" 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-10-11T01:04:00.051809" elapsed="0.021957"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:00.073892" elapsed="0.000032"/>
</return>
<msg time="2026-10-11T01:04:00.074028" 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-10-11T01:03:59.987084" elapsed="0.086967"/>
</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-10-11T01:04:00.074350" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:00.074142" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:00.074126" elapsed="0.000341"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:00.074500" 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-10-11T01:03:59.986343" elapsed="0.088257"/>
</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-10-11T01:04:00.078257" level="INFO">${update} = </msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:04:00.075508" elapsed="0.002776"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:04:00.078821" level="FAIL"> == </msg>
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="FAIL" start="2026-10-11T01:04:00.078474" elapsed="0.000422"> == </status>
</kw>
<return>
<value>${update}</value>
<status status="NOT RUN" start="2026-10-11T01:04:00.078947" elapsed="0.000016"/>
</return>
<doc>Returns hex update message.</doc>
<status status="FAIL" start="2026-10-11T01:04:00.075234" elapsed="0.003819"> == </status>
</kw>
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:04:02.085236" level="INFO">${update} = ffffffffffffffffffffffffffffffff00570200000040c01b0e0a0a0a0104e3800a0a140204e3c0400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0a</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:04:02.081216" elapsed="0.004092"/>
</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-10-11T01:04:02.085820" elapsed="0.000853"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:04:02.086781" elapsed="0.000113"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:04:02.080340" elapsed="0.006732"/>
</kw>
<msg time="2026-10-11T01:04:02.087226" 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-10-11T01:04:00.074787" elapsed="2.012494"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.089794" level="INFO">Length is 174.</msg>
<msg time="2026-10-11T01:04:02.089976" 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-10-11T01:04:02.089182" elapsed="0.000845"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.090971" level="INFO">Length is 174.</msg>
<msg time="2026-10-11T01:04:02.091126" 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-10-11T01:04:02.090384" elapsed="0.000792"/>
</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-10-11T01:04:02.091621" elapsed="0.000628"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:04:02.093006" 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-10-11T01:04:02.092617" elapsed="0.000442"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:04:02.093762" 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-10-11T01:04:02.093381" elapsed="0.000433"/>
</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-10-11T01:04:02.094241" elapsed="0.000654"/>
</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-10-11T01:04:02.087812" elapsed="0.007209"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:04:02.095335" elapsed="0.002816"/>
</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-10-11T01:04:02.129989" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:02.129250" elapsed="0.000915"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:02.131623" 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-10-11T01:04:02.131285" elapsed="0.000440">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-10-11T01:04:02.131845" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:02.130565" elapsed="0.001328"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.132594" 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-10-11T01:04:02.132139" elapsed="0.000489"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:02.133033" 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-10-11T01:04:02.133248" 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-10-11T01:04:02.132877" elapsed="0.000407"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.133922" 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-10-11T01:04:02.133595" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.135274" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:04:02.134954" elapsed="0.000379"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.136156" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:02.135601" elapsed="0.000589"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.137302" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:02.136691" elapsed="0.000646"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:02.138939" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:02.138234" elapsed="0.000816"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:02.139230" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T01:04:02.139510" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:02.137633" elapsed="0.001914"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:02.139784" elapsed="0.000454"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:04:02.136501" elapsed="0.003791"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.141248" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:02.140667" elapsed="0.000617"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:02.142937" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:02.142173" elapsed="0.000876"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:02.143231" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T01:04:02.143528" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:02.141572" elapsed="0.001991"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:02.143798" elapsed="0.000454"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:02.140477" elapsed="0.003831"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:02.136271" elapsed="0.008081"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:02.144432" elapsed="0.000051"/>
</return>
<msg time="2026-10-11T01:04:02.144641" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:02.134458" elapsed="0.010218"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:02.134073" elapsed="0.010644"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:02.144985" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:02.144749" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:02.134045" elapsed="0.011041"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.146152" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:02.145359" elapsed="0.000831"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:02.146253" 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_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-10-11T01:04:02.128076" elapsed="0.018321"/>
</kw>
<msg time="2026-10-11T01:04:02.146514" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:02.118233" elapsed="0.028349"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:02.152578" 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/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-10-11T01:04:02.157531" 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/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-10-11T01:04:02.161593" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:02.161774" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:02.161967" 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-10-11T01:04:02.162303" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:02.162156" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:02.162143" 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-10-11T01:04:02.162546" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:02.162725" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:02.162923" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:02.162118" elapsed="0.000854"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:02.162032" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:02.163145" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:02.163209" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:02.163316" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:02.116715" elapsed="0.046626"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.164391" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:02.164168" 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-10-11T01:04:02.174745" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:02.174791" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:02.174889" 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-10-11T01:04:02.164760" elapsed="0.010155"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:02.164525" elapsed="0.010426"/>
</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-10-11T01:04:02.175128" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:02.174975" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:02.164508" elapsed="0.010695"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.177847" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:02.177569" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:02.177309" elapsed="0.000624"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:02.177292" elapsed="0.000665"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.178530" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:02.178245" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:02.178007" elapsed="0.000597"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:02.177991" elapsed="0.000636"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.179177" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:02.178816" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:02.179498" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:02.179267" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.180018" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:02.179739" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:02.179573" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:02.179250" elapsed="0.000851"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.180633" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:02.180278" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:02.180943" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:02.180722" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.181463" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:02.181181" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:02.181018" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:02.180705" elapsed="0.000837"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:02.181688" elapsed="0.000334"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:02.182438" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:02.182186" elapsed="0.000281"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:02.182625" elapsed="0.000221"/>
</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-10-11T01:04:02.176964" elapsed="0.005953"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:04:02.182961" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:04:02.183198" 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-10-11T01:04:02.163627" elapsed="0.019601"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:02.183289" 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="PASS" start="2026-10-11T01:04:02.100446" elapsed="0.082945"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:02.099472" elapsed="0.083995"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:04:02.098633" elapsed="0.084887"/>
</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-10-11T01:04:02.186923" level="INFO">${update} = ffffffffffffffffffffffffffffffff0051020000003ac01b0e0a0a0a0104e3800a0a140204e3c0400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:04:02.184425" 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-10-11T01:04:02.187110" elapsed="0.000511"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:04:02.187683" elapsed="0.000039"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:04:02.184154" elapsed="0.003670"/>
</kw>
<msg time="2026-10-11T01:04:02.187940" 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-10-11T01:04:02.183707" elapsed="0.004267"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.189110" level="INFO">Length is 162.</msg>
<msg time="2026-10-11T01:04:02.189206" 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-10-11T01:04:02.188747" elapsed="0.000491"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.189830" level="INFO">Length is 162.</msg>
<msg time="2026-10-11T01:04:02.189946" 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-10-11T01:04:02.189498" elapsed="0.000480"/>
</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-10-11T01:04:02.190236" elapsed="0.000415"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:04:02.191092" 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-10-11T01:04:02.190874" elapsed="0.000251"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:04:02.191556" 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-10-11T01:04:02.191323" elapsed="0.000266"/>
</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-10-11T01:04:02.191837" elapsed="0.000384"/>
</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-10-11T01:04:02.188240" elapsed="0.004056"/>
</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-10-11T01:04:02.209573" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:02.209256" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:02.210282" 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-10-11T01:04:02.210088" elapsed="0.000256">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-10-11T01:04:02.210442" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:02.209757" elapsed="0.000710"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.210961" 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-10-11T01:04:02.210640" elapsed="0.000347"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:02.211261" 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-10-11T01:04:02.211383" 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-10-11T01:04:02.211153" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.211879" 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-10-11T01:04:02.211647" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.212842" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:04:02.212613" elapsed="0.000283"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.213334" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:02.213085" elapsed="0.000273"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.214168" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:02.213691" elapsed="0.000501"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:02.215276" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:02.214809" elapsed="0.000509"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:02.215459" elapsed="0.000033"/>
</return>
<msg time="2026-10-11T01:04:02.215648" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:02.214362" elapsed="0.001310"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:02.215840" elapsed="0.000292"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:04:02.213558" elapsed="0.002613"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.216921" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:02.216405" elapsed="0.000542"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:02.218033" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:02.217575" elapsed="0.000499"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:02.218188" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:04:02.218368" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:02.217120" elapsed="0.001274"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:02.218743" elapsed="0.000314"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:02.216272" elapsed="0.002828"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:02.213400" elapsed="0.005733"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:02.219180" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T01:04:02.219345" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:02.212233" elapsed="0.007139"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:02.211984" elapsed="0.007419"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:02.219694" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:02.219525" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:02.211966" elapsed="0.007801"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.220821" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:02.219945" elapsed="0.000995"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:02.220990" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:02.208706" elapsed="0.012389"/>
</kw>
<msg time="2026-10-11T01:04:02.221148" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:02.204316" elapsed="0.016893"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:02.225428" 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/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-10-11T01:04:02.229598" 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/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-10-11T01:04:02.233758" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:02.233959" 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-10-11T01:04:02.234147" 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-10-11T01:04:02.234513" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:02.234350" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:02.234335" 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-10-11T01:04:02.234744" 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-10-11T01:04:02.234938" 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-10-11T01:04:02.235105" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:02.234307" elapsed="0.000846"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:02.234215" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:02.235329" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:02.235394" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:04:02.235520" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:02.203662" elapsed="0.031883"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.236598" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:02.236353" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:02.241696" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:02.241983" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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+xml', 'Content-Length': '635'} 
 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-path xmlns:a="urn:opendaylight:params:xml:ns:yang:bgp-rib" xmlns:b="urn:opendaylight:params:xml:ns:yang:bgp-types" xmlns:c="urn:opendaylight:params:xml:ns:yang:bgp:mvpn" xmlns:d="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;/a:application-rib[a:id='10.30.170.173']/a:tables[a:afi='b:ipv4-address-family'][a:safi='c:mcast-vpn-subsequent-address-family']/d:mvpn-routes-ipv4&lt;/error-path&gt;&lt;error-message&gt;Data does not exist&lt;/error-message&gt;&lt;error-tag&gt;data-missing&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-10-11T01:04:02.242147" level="INFO">${response} = None</msg>
<msg time="2026-10-11T01:04:02.242189" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:02.236940" elapsed="0.005624">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:02.236700" elapsed="0.005938">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:02.242824" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:02.242669" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-10-11T01:04:02.236683" elapsed="0.006234">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:02.244172" 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-10-11T01:04:02.243897" elapsed="0.000306">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:04:02.243640" elapsed="0.000621">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:04:02.243623" elapsed="0.000667">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-10-11T01:04:02.244885" 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-10-11T01:04:02.244611" elapsed="0.000305">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:04:02.244354" elapsed="0.000619">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:04:02.244338" elapsed="0.000664">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.245733" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:02.245206" elapsed="0.000553"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:02.246055" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:02.245824" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.246581" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:02.246294" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:02.246130" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:02.245806" elapsed="0.000852"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.247186" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:02.246835" elapsed="0.000377"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:02.247500" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:02.247274" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.248016" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:02.247740" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:02.247576" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:02.247257" elapsed="0.000835"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:02.248238" elapsed="0.000309"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:02.248945" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:02.248708" elapsed="0.000261"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-10-11T01:04:02.249285" 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-10-11T01:04:02.249123" elapsed="0.000191">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-10-11T01:04:02.243259" elapsed="0.006191">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-10-11T01:04:02.249537" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:02.249794" level="INFO">${response_text} = None</msg>
<msg time="2026-10-11T01:04:02.249821" 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-10-11T01:04:02.235782" elapsed="0.014065">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-10-11T01:04:02.249918" elapsed="0.000025"/>
</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-10-11T01:04:02.193651" elapsed="0.056409">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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:02.193098" elapsed="0.057024"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:04:02.192593" elapsed="0.057583"/>
</kw>
<arg>intra_pe_distinguisher</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-10-11T01:03:59.981325" elapsed="2.268897"/>
</kw>
<status status="PASS" start="2026-10-11T01:03:59.885238" elapsed="2.365085"/>
</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-10-11T01:04:02.251789" elapsed="0.000224"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:04:02.251474" 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-10-11T01:04:02.253131" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:02.253037" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:02.253019" elapsed="0.000177"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:02.255348" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:02.255265" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:02.255247" elapsed="0.000179"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.256345" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:02.256012" elapsed="0.000358"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.256804" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:04:02.256540" elapsed="0.000289"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:04:02.256881" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:02.257008" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:04:02.255638" elapsed="0.001394"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:02.260246" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:02.260160" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:02.260142" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:02.261381" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:02.261298" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:02.261281" elapsed="0.000203"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:02.261805" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:04:02.261636" elapsed="0.000194"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:02.262149" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:02.262008" elapsed="0.000165"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:04:02.296392" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:04:02.262677" elapsed="0.033821"/>
</kw>
<msg time="2026-10-11T01:04:02.296793" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:04:02.296836" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:02.262329" elapsed="0.034555"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:04:02.337728" 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-10-11T01:04:02.297455" elapsed="0.040381"/>
</kw>
<msg time="2026-10-11T01:04:02.338000" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:04:02.338041" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:02.297078" elapsed="0.040999"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:02.338353" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:02.338146" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:02.338128" elapsed="0.000329"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.338890" 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-10-11T01:04:02.338646" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:02.339224" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:02.339021" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:02.339004" elapsed="0.000290"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:04:02.339323" 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-10-11T01:04:02.341994" elapsed="0.000118"/>
</kw>
<msg time="2026-10-11T01:04:02.342168" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:02.340729" 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-10-11T01:04:02.342645" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:02.343130" 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-10-11T01:04:02.340108" elapsed="0.003223"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:04:02.339631" elapsed="0.003760"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:04:02.261042" elapsed="0.082460"/>
</kw>
<msg time="2026-10-11T01:04:02.343585" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:02.343624" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:02.260489" elapsed="0.083171"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:04:02.343815" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:04:02.343730" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:02.343712" elapsed="0.000192"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:02.344225" 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-10-11T01:04:02.344559" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:04:02.344625" 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-10-11T01:04:02.259844" elapsed="0.084867"/>
</kw>
<msg time="2026-10-11T01:04:02.344795" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:02.344834" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:02.257362" elapsed="0.087519"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:02.345211" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:02.344987" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:02.344969" elapsed="0.000315"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:04:02.257218" elapsed="0.088087"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:04:02.257077" elapsed="0.088254"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:04:02.254965" elapsed="0.090413"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:04:02.252739" elapsed="0.092808"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:02.252214" elapsed="0.093380"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:04:02.251061" elapsed="0.094580"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.346689" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:02.346254" elapsed="0.000462"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.347292" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:02.346910" elapsed="0.000408"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.347843" 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-10-11T01:04:02.347511" elapsed="0.000366"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:02.348195" 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-10-11T01:04:02.348337" 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-10-11T01:04:02.348043" elapsed="0.000319"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:02.348676" 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-10-11T01:04:02.348788" 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-10-11T01:04:02.348539" elapsed="0.000273"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:04:02.348966" 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-10-11T01:04:02.351468" elapsed="0.001967"/>
</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-10-11T01:04:02.369257" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:02.368954" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:02.370029" 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-10-11T01:04:02.369788" elapsed="0.000310">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-10-11T01:04:02.370187" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:02.369466" elapsed="0.000744"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.370719" 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-10-11T01:04:02.370383" elapsed="0.000361"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:02.371093" 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-10-11T01:04:02.371259" 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-10-11T01:04:02.370978" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.371732" 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-10-11T01:04:02.371507" elapsed="0.000267"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.372700" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:02.372471" elapsed="0.000270"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.373171" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:02.372928" elapsed="0.000267"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.373971" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:02.373522" elapsed="0.000474"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:02.375162" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:02.374629" elapsed="0.000624"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:02.375334" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:04:02.375579" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:02.374168" elapsed="0.001436"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:02.375770" elapsed="0.000329"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:04:02.373376" elapsed="0.002763"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.376838" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:02.376368" elapsed="0.000506"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:02.378039" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:02.377523" elapsed="0.000606"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:02.378209" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:04:02.378449" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:02.377050" 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-10-11T01:04:02.378647" elapsed="0.000317"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:02.376238" elapsed="0.002766"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:02.373238" elapsed="0.005797"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:02.379072" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:02.379204" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:02.372115" elapsed="0.007113"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:02.371837" elapsed="0.007420"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:02.379557" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:02.379280" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:02.371819" elapsed="0.007817"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.380495" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-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-10-11T01:04:02.379799" elapsed="0.000724"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:02.380567" 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-10-11T01:04:02.368418" elapsed="0.012251"/>
</kw>
<msg time="2026-10-11T01:04:02.380752" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:02.364070" elapsed="0.016728"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:02.384931" 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/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-10-11T01:04:02.389018" 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/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-10-11T01:04:02.393090" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:02.393271" 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-10-11T01:04:02.393467" 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-10-11T01:04:02.393805" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:02.393661" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:02.393647" 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-10-11T01:04:02.394042" 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-10-11T01:04:02.394219" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:02.394381" elapsed="0.000017"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:02.393622" elapsed="0.000819"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:02.393534" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:02.394616" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:02.394681" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:02.394791" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-i...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:04:02.363459" elapsed="0.031357"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:02.395941" 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-10-11T01:04:02.395739" elapsed="0.000261">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-10-11T01:04:02.396082" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:02.395398" elapsed="0.000735"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:02.396435" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:02.396199" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.396949" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:02.396675" elapsed="0.000298"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:02.396510" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:02.396181" elapsed="0.000844"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.397537" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:02.397186" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:02.397606" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:02.397728" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:02.395097" elapsed="0.002654"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:02.398842" 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-10-11T01:04:02.398654" elapsed="0.000260">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-10-11T01:04:02.398997" 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-10-11T01:04:02.398315" elapsed="0.000705"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:04:02.399179" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:04:02.399082" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:02.399065" elapsed="0.000190"/>
</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-10-11T01:04:02.399424" elapsed="0.000020"/>
</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-10-11T01:04:02.399602" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:04:02.399660" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:04:02.399783" 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-10-11T01:04:02.398016" elapsed="0.001789"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.401042" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:02.400807" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:02.401692" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:02.401274" elapsed="0.000459"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:02.406726" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:02.406867" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:02.406956" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:02.402039" elapsed="0.005245">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:02.401795" elapsed="0.005564">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:02.407605" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:02.407441" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-10-11T01:04:02.401777" elapsed="0.005908">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:02.408041" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:02.408160" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:02.408127" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:02.408112" elapsed="0.000105"/>
</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-10-11T01:04:02.408358" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:04:02.408436" 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-10-11T01:04:02.400099" elapsed="0.008433">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:02.408596" elapsed="0.000014"/>
</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-10-11T01:04:02.356038" elapsed="0.052642">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:02.408939" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:02.408760" elapsed="0.000242"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:02.408745" elapsed="0.000278"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:02.409054" elapsed="0.000013"/>
</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-10-11T01:04:02.355373" elapsed="0.053767">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:04.445729" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:04.444929" elapsed="0.000869"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:04.447697" 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-10-11T01:04:04.447039" elapsed="0.000839">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-10-11T01:04:04.448089" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:04.446214" elapsed="0.001930"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.449370" 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-10-11T01:04:04.448597" elapsed="0.000881"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:04.450322" 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-10-11T01:04:04.450647" 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-10-11T01:04:04.450055" elapsed="0.000646"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.451686" 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-10-11T01:04:04.451158" elapsed="0.000625"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.453914" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:04.453350" elapsed="0.000659"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.455010" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:04.454402" elapsed="0.000662"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.456976" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:04.455841" elapsed="0.001191"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:04.459962" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:04.458535" elapsed="0.001627"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:04.460352" elapsed="0.000125"/>
</return>
<msg time="2026-10-11T01:04:04.460944" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:04.457457" elapsed="0.003542"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:04.461375" elapsed="0.000818"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:04:04.455542" elapsed="0.006736"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.464070" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:04.462893" elapsed="0.001232"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:04.466888" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:04.465648" elapsed="0.001436"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:04.467263" elapsed="0.000068"/>
</return>
<msg time="2026-10-11T01:04:04.467766" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:04.464597" elapsed="0.003221"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:04.468231" elapsed="0.000502"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:04.462572" elapsed="0.006216"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:04.455172" elapsed="0.013659"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:04.468903" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T01:04:04.469088" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:04.452563" elapsed="0.016558"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.451953" elapsed="0.017209"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.469448" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.469197" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.451906" elapsed="0.017652"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.470579" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-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-10-11T01:04:04.469785" elapsed="0.000832"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:04.470679" 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/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-10-11T01:04:04.443704" elapsed="0.027116"/>
</kw>
<msg time="2026-10-11T01:04:04.470952" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:04.433191" elapsed="0.037832"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:04.477131" 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/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-10-11T01:04:04.482921" 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-10-11T01:04:04.488600" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.488870" 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-10-11T01:04:04.489126" 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-10-11T01:04:04.489621" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.489393" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:04.489374" elapsed="0.000346"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.489949" 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-10-11T01:04:04.490197" 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-10-11T01:04:04.490440" elapsed="0.000027"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:04.489339" elapsed="0.001168"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:04.489218" elapsed="0.001321"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.490762" elapsed="0.000027"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:04.490866" elapsed="0.000021"/>
</return>
<msg time="2026-10-11T01:04:04.491037" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-i...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:04:04.431244" elapsed="0.059827"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:04.492712" 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-10-11T01:04:04.492399" elapsed="0.000397">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-10-11T01:04:04.492934" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:04.491941" elapsed="0.001025"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.493442" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.493102" elapsed="0.000423"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.494221" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:04.493810" elapsed="0.000454"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.493557" elapsed="0.000762"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.493076" elapsed="0.001277"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.494938" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:04.494590" elapsed="0.000372"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:04.495007" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:04.495131" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:04.491480" elapsed="0.003673"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:04.496239" 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-10-11T01:04:04.496053" elapsed="0.000245">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-10-11T01:04:04.496382" 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-10-11T01:04:04.495722" elapsed="0.000682"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:04:04.496581" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:04:04.496483" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.496466" elapsed="0.000191"/>
</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-10-11T01:04:04.496812" elapsed="0.000019"/>
</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-10-11T01:04:04.497000" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:04:04.497059" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:04:04.497180" 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-10-11T01:04:04.495405" elapsed="0.001798"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.498434" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:04.498199" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.498893" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:04.498667" elapsed="0.000265"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:04.504801" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:04.504971" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:04.505063" 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-10-11T01:04:04.499222" elapsed="0.005867"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.498993" elapsed="0.006145"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.505446" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.505168" elapsed="0.000447"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.498976" elapsed="0.006690"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.507673" 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-10-11T01:04:04.507125" elapsed="0.000619"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.506737" elapsed="0.001054"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.506711" elapsed="0.001113"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.508703" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:04.508257" elapsed="0.000505"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.507912" elapsed="0.000894"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.507890" elapsed="0.000947"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.509635" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:04.509117" elapsed="0.000553"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.510078" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.509759" elapsed="0.000408"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.510904" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:04.510515" elapsed="0.000426"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.510206" elapsed="0.000780"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.509735" elapsed="0.001279"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.511752" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:04.511258" elapsed="0.000529"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.512207" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.511891" elapsed="0.000404"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.512973" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:04.512590" elapsed="0.000417"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.512333" elapsed="0.000720"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.511867" elapsed="0.001213"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:04.513288" elapsed="0.000432"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:04.514284" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:04.513962" elapsed="0.000356"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:04.514554" elapsed="0.000311"/>
</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-10-11T01:04:04.506158" elapsed="0.008787"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:04.515149" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:04.515033" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.515010" elapsed="0.000228"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:04.516497" 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-10-11T01:04:04.515454" elapsed="0.001088"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:04.516606" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T01:04:04.516787" 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-10-11T01:04:04.497499" elapsed="0.019322"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:04.516913" elapsed="0.000033"/>
</return>
<msg time="2026-10-11T01:04:04.517138" 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-10-11T01:04:04.415015" elapsed="0.102157"/>
</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-10-11T01:04:04.531265" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:04.530958" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:04.532051" 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-10-11T01:04:04.531791" elapsed="0.000385">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-10-11T01:04:04.532338" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:04.531468" elapsed="0.000894"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.532899" 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-10-11T01:04:04.532569" elapsed="0.000356"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:04.533207" 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-10-11T01:04:04.533370" 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-10-11T01:04:04.533094" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.533842" 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-10-11T01:04:04.533620" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:04.534265" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.533965" elapsed="0.000354"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.534998" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:04.534526" elapsed="0.000498"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.534342" elapsed="0.000715"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.533948" elapsed="0.001129"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.535673" 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-10-11T01:04:04.535244" elapsed="0.000456"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:04.535744" 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/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-10-11T01:04:04.530433" elapsed="0.005424"/>
</kw>
<msg time="2026-10-11T01:04:04.535913" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:04.525959" elapsed="0.009999"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:04.540142" 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/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-10-11T01:04:04.544269" 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/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-10-11T01:04:04.548512" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.548700" 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-10-11T01:04:04.548897" 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-10-11T01:04:04.549251" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.549103" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:04.549090" 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-10-11T01:04:04.549495" 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-10-11T01:04:04.549678" 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-10-11T01:04:04.549859" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:04.549063" elapsed="0.000846"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:04.548968" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.550087" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:04.550153" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:04.550280" 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-10-11T01:04:04.525231" elapsed="0.025074"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:04.550487" elapsed="0.000319"/>
</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-10-11T01:04:04.551943" 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-10-11T01:04:04.551464" elapsed="0.000507"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:04.552670" 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-10-11T01:04:04.552175" 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-10-11T01:04:04.552897" elapsed="0.000283"/>
</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-10-11T01:04:04.551089" elapsed="0.002147"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.550887" elapsed="0.002379"/>
</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-10-11T01:04:04.553494" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.553291" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.550870" elapsed="0.002697"/>
</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-10-11T01:04:04.518530" elapsed="0.035081"/>
</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-10-11T01:04:04.517584" elapsed="0.036091"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.517275" elapsed="0.036439"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.517253" elapsed="0.036481"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:04.553764" elapsed="0.000026"/>
</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-10-11T01:04:04.413366" elapsed="0.140509"/>
</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-10-11T01:04:02.353632" elapsed="2.200295"/>
</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-10-11T01:04:04.569642" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:04.569322" elapsed="0.000348"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:04.570329" 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-10-11T01:04:04.570158" elapsed="0.000230">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-10-11T01:04:04.570488" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:04.569828" elapsed="0.000683"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.571000" 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-10-11T01:04:04.570683" elapsed="0.000342"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:04.571300" 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-10-11T01:04:04.571430" 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-10-11T01:04:04.571192" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.571880" 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-10-11T01:04:04.571650" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.572823" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:04.572592" elapsed="0.000286"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.573309" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:04.573056" elapsed="0.000277"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.574161" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:04.573714" elapsed="0.000472"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:04.575339" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:04.574817" elapsed="0.000635"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:04.575538" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:04:04.575752" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:04.574357" elapsed="0.001419"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:04.575957" elapsed="0.000309"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/effective-rib-in</var>
<status status="PASS" start="2026-10-11T01:04:04.573580" elapsed="0.002725"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.577020" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:04.576568" elapsed="0.000477"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:04.578211" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:04.577689" elapsed="0.000612"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:04.578381" elapsed="0.000049"/>
</return>
<msg time="2026-10-11T01:04:04.578625" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:04.577218" elapsed="0.001432"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:04.578817" elapsed="0.000313"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:04.576424" elapsed="0.002745"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:04.573425" elapsed="0.005775"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:04.579239" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:04.579369" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:04.572235" elapsed="0.007157"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.571984" elapsed="0.007571"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.579735" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.579581" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.571967" elapsed="0.007837"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.580502" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-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-10-11T01:04:04.579975" elapsed="0.000554"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:04.580573" 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_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-10-11T01:04:04.568805" elapsed="0.011887"/>
</kw>
<msg time="2026-10-11T01:04:04.580742" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:04.564365" elapsed="0.016421"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:04.585075" 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/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-10-11T01:04:04.589225" 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/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-10-11T01:04:04.593415" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.593602" 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-10-11T01:04:04.593784" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.594132" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.593986" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:04.593972" 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-10-11T01:04:04.594359" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.594557" 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-10-11T01:04:04.594722" elapsed="0.000017"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:04.593947" elapsed="0.000821"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:04.593858" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.594950" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:04.595016" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:04.595125" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-ro...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:04:04.563757" elapsed="0.031393"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:04.596256" 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-10-11T01:04:04.596071" elapsed="0.000244">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-10-11T01:04:04.596397" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:04.595730" elapsed="0.000705"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.596720" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.596500" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.597234" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:04.596971" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.596793" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.596483" elapsed="0.000827"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.597822" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:04.597486" elapsed="0.000371"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:04.597903" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:04.598028" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:04.595427" elapsed="0.002624"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:04.599130" 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-10-11T01:04:04.598946" elapsed="0.000282">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-10-11T01:04:04.599314" 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-10-11T01:04:04.598614" elapsed="0.000722"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:04:04.599514" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:04:04.599399" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.599382" elapsed="0.000208"/>
</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-10-11T01:04:04.599744" elapsed="0.000019"/>
</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-10-11T01:04:04.599932" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:04:04.599991" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:04.600115" 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-10-11T01:04:04.598301" elapsed="0.001837"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.601356" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:04.601136" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.601821" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:04.601605" elapsed="0.000269"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:04.606888" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:04.607004" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:04.607104" 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-10-11T01:04:04.602160" elapsed="0.004970"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.601934" elapsed="0.005238"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.607349" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.607197" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.601917" elapsed="0.005537"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.608730" 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-10-11T01:04:04.608379" elapsed="0.000397"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.608139" elapsed="0.000668"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.608122" elapsed="0.000708"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.609403" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:04.609134" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.608894" elapsed="0.000600"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.608879" elapsed="0.000636"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.610044" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:04.609691" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.610340" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.610131" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.610906" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:04.610631" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.610462" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.610115" elapsed="0.000869"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.611509" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:04.611159" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.611805" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.611596" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.612317" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:04.612056" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.611893" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.611580" elapsed="0.000813"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:04.612553" elapsed="0.000303"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:04.613238" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:04.613018" elapsed="0.000245"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:04.613430" elapsed="0.000212"/>
</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-10-11T01:04:04.607786" elapsed="0.005912"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:04.613841" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:04.613760" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.613743" elapsed="0.000173"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:04.614713" 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-10-11T01:04:04.614056" elapsed="0.000684"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:04.614786" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:04.614926" 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-10-11T01:04:04.600429" elapsed="0.014522"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:04.615005" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:04:04.615124" 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-10-11T01:04:04.556484" elapsed="0.058663"/>
</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-10-11T01:04:04.625787" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:04.625484" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:04.626557" 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-10-11T01:04:04.626304" elapsed="0.000374">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-10-11T01:04:04.626843" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:04.625986" elapsed="0.000894"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.627425" 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-10-11T01:04:04.627092" elapsed="0.000366"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:04.627742" 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-10-11T01:04:04.627874" 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-10-11T01:04:04.627631" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.628312" 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-10-11T01:04:04.628094" elapsed="0.000265"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:04.628754" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.628446" elapsed="0.000364"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.629476" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:04.628996" elapsed="0.000506"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.628833" elapsed="0.000702"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.628402" elapsed="0.001153"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.630121" 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-10-11T01:04:04.629718" elapsed="0.000430"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:04.630196" 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-10-11T01:04:04.624963" elapsed="0.005335"/>
</kw>
<msg time="2026-10-11T01:04:04.630350" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:04.620527" elapsed="0.009867"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:04.634556" 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/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-10-11T01:04:04.638604" 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/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-10-11T01:04:04.642829" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.643066" 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-10-11T01:04:04.643257" 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-10-11T01:04:04.643614" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.643468" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:04.643454" 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-10-11T01:04:04.643841" elapsed="0.000032"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.644037" 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-10-11T01:04:04.644202" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:04.643427" elapsed="0.000823"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:04.643323" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.644437" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:04.644505" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:04.644630" 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-10-11T01:04:04.619796" elapsed="0.024859"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:04.644822" elapsed="0.000330"/>
</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-10-11T01:04:04.646311" 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-10-11T01:04:04.645838" elapsed="0.000500"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:04.646995" 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-10-11T01:04:04.646526" 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-10-11T01:04:04.647211" elapsed="0.000304"/>
</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-10-11T01:04:04.645436" elapsed="0.002135"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.645222" elapsed="0.002379"/>
</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-10-11T01:04:04.647800" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.647624" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.645206" 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-10-11T01:04:04.616096" elapsed="0.031828"/>
</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-10-11T01:04:04.615437" elapsed="0.032551"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.615220" elapsed="0.032837"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.615204" elapsed="0.032877"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:04.648112" elapsed="0.000026"/>
</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-10-11T01:04:04.555817" elapsed="0.092395"/>
</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-10-11T01:04:04.554115" elapsed="0.094148"/>
</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-10-11T01:04:04.664240" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:04.663935" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:04.664944" 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-10-11T01:04:04.664757" elapsed="0.000246">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-10-11T01:04:04.665086" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:04.664439" elapsed="0.000669"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.665607" 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-10-11T01:04:04.665283" elapsed="0.000349"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:04.665919" 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-10-11T01:04:04.666033" 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-10-11T01:04:04.665798" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.666490" 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-10-11T01:04:04.666256" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.667440" 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-10-11T01:04:04.667195" elapsed="0.000288"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.667916" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:04.667657" elapsed="0.000283"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.668724" 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-10-11T01:04:04.668248" elapsed="0.000500"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:04.669906" 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-10-11T01:04:04.669363" elapsed="0.000633"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:04.670077" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:04:04.670287" 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-10-11T01:04:04.668934" elapsed="0.001376"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:04.670510" elapsed="0.000310"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:04:04.668119" elapsed="0.002753"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.671573" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:04.671105" elapsed="0.000493"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:04.672745" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:04.672205" elapsed="0.000628"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:04.672930" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:04:04.673144" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:04.671767" 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-10-11T01:04:04.673366" elapsed="0.000425"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:04.670974" elapsed="0.002857"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:04.667982" elapsed="0.005892"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:04.673913" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:04.674046" 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-10-11T01:04:04.666842" elapsed="0.007227"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.666592" elapsed="0.007506"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.674274" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.674121" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.666575" elapsed="0.007769"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.675051" 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-10-11T01:04:04.674538" elapsed="0.000539"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:04.675122" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:04.663416" elapsed="0.011806"/>
</kw>
<msg time="2026-10-11T01:04:04.675270" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:04.658675" elapsed="0.016639"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:04.679628" 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/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-10-11T01:04:04.683688" 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/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-10-11T01:04:04.687783" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.687977" 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-10-11T01:04:04.688163" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.688515" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.688356" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:04.688343" 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-10-11T01:04:04.688744" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.688988" 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-10-11T01:04:04.689159" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:04.688318" elapsed="0.000890"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:04.688231" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.689383" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:04.689475" elapsed="0.000017"/>
</return>
<msg time="2026-10-11T01:04:04.689587" 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-10-11T01:04:04.658060" elapsed="0.031552"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:04.690732" 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-10-11T01:04:04.690527" elapsed="0.000268">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-10-11T01:04:04.690897" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:04.690188" elapsed="0.000733"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.691211" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.690985" elapsed="0.000277"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.691744" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:04.691477" elapsed="0.000293"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.691285" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.690968" elapsed="0.000862"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.692364" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:04.692015" elapsed="0.000373"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:04.692460" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:04.692588" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:04.689890" elapsed="0.002721"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:04.693711" 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-10-11T01:04:04.693506" elapsed="0.000266">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-10-11T01:04:04.693868" 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-10-11T01:04:04.693173" elapsed="0.000719"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:04:04.694058" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:04:04.693958" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.693941" elapsed="0.000193"/>
</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-10-11T01:04:04.694290" elapsed="0.000019"/>
</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-10-11T01:04:04.694493" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:04:04.694555" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:04.694680" 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-10-11T01:04:04.692872" elapsed="0.001830"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.696037" 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-10-11T01:04:04.695796" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.696505" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:04.696272" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:04.701227" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:04.701340" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:04:04.701453" 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-10-11T01:04:04.696832" elapsed="0.004649"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.696605" elapsed="0.004916"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.701697" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.701545" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.696589" elapsed="0.005185"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.703045" 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-10-11T01:04:04.702702" elapsed="0.000389"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.702462" elapsed="0.000660"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.702444" elapsed="0.000701"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.703720" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:04.703452" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.703198" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.703181" elapsed="0.000632"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.704346" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:04.704001" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.704661" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.704449" elapsed="0.000263"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.705168" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:04.704906" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.704734" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.704431" elapsed="0.000813"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.705786" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:04.705445" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.706096" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.705885" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.706610" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:04.706330" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.706169" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.705867" elapsed="0.000817"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:04.706827" elapsed="0.000301"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:04.707563" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:04.707324" elapsed="0.000263"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:04.707740" elapsed="0.000221"/>
</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-10-11T01:04:04.702111" elapsed="0.005905"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:04.708158" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:04.708077" elapsed="0.000121"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.708061" elapsed="0.000157"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:04.709026" 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-10-11T01:04:04.708357" elapsed="0.000696"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:04.709099" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:04.709225" 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-10-11T01:04:04.695067" elapsed="0.014182"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:04.709303" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:04:04.709439" 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-10-11T01:04:04.650804" elapsed="0.058661"/>
</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-10-11T01:04:04.720309" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:04.720001" elapsed="0.000337"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:04.721089" 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-10-11T01:04:04.720834" elapsed="0.000376">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-10-11T01:04:04.721374" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:04.720515" elapsed="0.000882"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.721934" 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-10-11T01:04:04.721607" elapsed="0.000353"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:04.722240" 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-10-11T01:04:04.722382" 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-10-11T01:04:04.722127" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.722862" 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-10-11T01:04:04.722631" 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-10-11T01:04:04.723320" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.723015" elapsed="0.000359"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.724060" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:04.723581" elapsed="0.000504"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.723397" elapsed="0.000722"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.722995" elapsed="0.001144"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.724743" 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-10-11T01:04:04.724304" elapsed="0.000466"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:04.724818" 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_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-10-11T01:04:04.719484" elapsed="0.005451"/>
</kw>
<msg time="2026-10-11T01:04:04.724988" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:04.715006" elapsed="0.010028"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:04.729205" 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/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-10-11T01:04:04.733256" 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/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-10-11T01:04:04.737440" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.737623" 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-10-11T01:04:04.737803" 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-10-11T01:04:04.738169" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.738022" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:04.738009" 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-10-11T01:04:04.738395" elapsed="0.000032"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.738589" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.738752" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:04.737983" elapsed="0.000817"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:04.737886" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.739026" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:04.739093" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:04.739220" 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-10-11T01:04:04.714212" elapsed="0.025033"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:04.739426" elapsed="0.000315"/>
</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-10-11T01:04:04.740903" 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-10-11T01:04:04.740389" elapsed="0.000541"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:04.741564" 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-10-11T01:04:04.741079" elapsed="0.000514"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:04:04.741779" 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-10-11T01:04:04.740026" elapsed="0.002131"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.739811" 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-10-11T01:04:04.742386" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.742210" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.739794" elapsed="0.002690"/>
</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-10-11T01:04:04.710431" elapsed="0.032098"/>
</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-10-11T01:04:04.709743" elapsed="0.032852"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.709538" elapsed="0.033097"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.709522" elapsed="0.033135"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:04.742688" elapsed="0.000026"/>
</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-10-11T01:04:04.650157" elapsed="0.092634"/>
</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-10-11T01:04:04.648484" elapsed="0.094373"/>
</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-10-11T01:04:04.743014" elapsed="0.002456"/>
</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-10-11T01:04:04.762279" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:04.761965" elapsed="0.000341"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:04.763091" 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-10-11T01:04:04.762830" elapsed="0.000327">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-10-11T01:04:04.763292" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:04.762486" elapsed="0.000829"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.763832" 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-10-11T01:04:04.763518" elapsed="0.000352"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:04.764146" 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-10-11T01:04:04.764265" 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-10-11T01:04:04.764037" elapsed="0.000252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.764718" 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-10-11T01:04:04.764499" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.765669" 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-10-11T01:04:04.765439" elapsed="0.000272"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.766151" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:04.765899" elapsed="0.000276"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.766957" 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-10-11T01:04:04.766506" elapsed="0.000475"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:04.768153" 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-10-11T01:04:04.767618" elapsed="0.000623"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:04.768323" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:04:04.768571" 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-10-11T01:04:04.767153" 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-10-11T01:04:04.768765" elapsed="0.000329"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:04:04.766360" elapsed="0.002772"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.769839" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:04.769364" elapsed="0.000513"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:04.771038" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:04.770520" elapsed="0.000608"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:04.771209" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:04:04.771444" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:04.770051" elapsed="0.001425"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:04.771648" elapsed="0.000323"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:04.769232" elapsed="0.002780"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:04.766218" elapsed="0.005826"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:04.772083" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:04.772218" 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-10-11T01:04:04.765085" elapsed="0.007156"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.764821" elapsed="0.007449"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.772578" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.772294" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.764803" elapsed="0.007851"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.773330" 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-10-11T01:04:04.772818" elapsed="0.000538"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:04.773401" 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-10-11T01:04:04.761437" elapsed="0.012097"/>
</kw>
<msg time="2026-10-11T01:04:04.773618" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:04.755835" elapsed="0.017830"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:04.777966" 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/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-10-11T01:04:04.782086" 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/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-10-11T01:04:04.786237" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.786434" 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-10-11T01:04:04.786619" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.786968" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.786809" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:04.786796" 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-10-11T01:04:04.787197" 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-10-11T01:04:04.787377" elapsed="0.000069"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.787594" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:04.786771" elapsed="0.000871"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:04.786684" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.787815" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:04.787894" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:04:04.788001" 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-10-11T01:04:04.755225" elapsed="0.032801"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:04.789128" 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-10-11T01:04:04.788941" elapsed="0.000277">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-10-11T01:04:04.789303" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:04.788605" elapsed="0.000721"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.789630" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.789390" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.790159" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:04.789896" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.789703" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.789373" elapsed="0.000863"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.790750" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:04.790398" elapsed="0.000376"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:04.790820" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T01:04:04.790958" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:04.788290" elapsed="0.002690"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:04.792032" 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-10-11T01:04:04.791876" elapsed="0.000209"/>
</kw>
<msg time="2026-10-11T01:04:04.792163" 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-10-11T01:04:04.791544" elapsed="0.000641"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:04:04.792348" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:04.792250" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.792233" elapsed="0.000195"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:04.792718" 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-10-11T01:04:04.792835" 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-10-11T01:04:04.792592" elapsed="0.000279"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:04:04.793222" 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-10-11T01:04:04.793036" elapsed="0.000210"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:04:04.793288" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:04.793430" 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-10-11T01:04:04.791228" elapsed="0.002226"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.794679" 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-10-11T01:04:04.794456" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.795167" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:04.794943" elapsed="0.000265"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:04.800863" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:04.801005" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:04:04.801136" 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-10-11T01:04:04.795526" elapsed="0.005635"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.795270" elapsed="0.005931"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.801381" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.801226" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.795253" elapsed="0.006242"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.802775" 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-10-11T01:04:04.802436" elapsed="0.000387"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.802180" elapsed="0.000688"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.802162" elapsed="0.000729"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.803469" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:04.803185" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.802942" elapsed="0.000601"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.802927" elapsed="0.000639"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.804104" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:04.803744" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.804422" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.804194" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.804940" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:04.804663" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.804498" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.804177" elapsed="0.000841"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.805550" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:04.805195" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.805863" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.805639" elapsed="0.000277"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.806364" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:04.806100" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.805938" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.805622" elapsed="0.000835"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:04.806602" elapsed="0.000311"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:04.807301" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:04.807076" elapsed="0.000250"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:04.807497" elapsed="0.000233"/>
</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-10-11T01:04:04.801821" elapsed="0.005969"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:04.807952" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:04.807866" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.807835" elapsed="0.000177"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:04.808898" 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-10-11T01:04:04.808156" elapsed="0.000769"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:04.808972" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:04.809099" 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-10-11T01:04:04.793732" elapsed="0.015420"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:04.809210" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:04:04.809334" 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-10-11T01:04:04.748038" elapsed="0.061320"/>
</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-10-11T01:04:04.820124" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:04.819808" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:04.820881" 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-10-11T01:04:04.820646" elapsed="0.000353">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-10-11T01:04:04.821163" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:04.820311" elapsed="0.000876"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.821711" 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-10-11T01:04:04.821362" elapsed="0.000374"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:04.822030" 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-10-11T01:04:04.822149" 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-10-11T01:04:04.821919" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.822620" 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-10-11T01:04:04.822370" 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-10-11T01:04:04.823032" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.822724" elapsed="0.000363"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.823743" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:04.823256" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:04.823109" elapsed="0.000694"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:04.822706" elapsed="0.001117"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.824383" 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-10-11T01:04:04.824000" elapsed="0.000443"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:04.824491" 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-10-11T01:04:04.819273" elapsed="0.005323"/>
</kw>
<msg time="2026-10-11T01:04:04.824645" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:04.814790" elapsed="0.009900"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:04.828922" 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/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-10-11T01:04:04.833022" 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/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-10-11T01:04:04.837245" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.837442" 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-10-11T01:04:04.837625" 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-10-11T01:04:04.837978" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.837819" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:04.837806" 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-10-11T01:04:04.838207" 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-10-11T01:04:04.838387" 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-10-11T01:04:04.838569" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:04.837780" elapsed="0.000837"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:04.837691" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:04.838792" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:04.838870" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:04:04.838976" 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-10-11T01:04:04.814066" elapsed="0.024935"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:04.839167" elapsed="0.000327"/>
</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-10-11T01:04:04.840370" 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-10-11T01:04:04.840135" elapsed="0.000261"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:04.841228" 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-10-11T01:04:04.840560" elapsed="0.000723"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:04:04.841779" 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-10-11T01:04:04.841999" 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-10-11T01:04:04.841504" elapsed="0.000562">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-10-11T01:04:04.839765" elapsed="0.002468">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-10-11T01:04:04.839565" elapsed="0.002749">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-10-11T01:04:04.842552" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:04.842347" elapsed="0.000259"/>
</branch>
<status status="FAIL" start="2026-10-11T01:04:04.839548" elapsed="0.003079">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-10-11T01:04:04.810344" elapsed="0.032411">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-10-11T01:04:04.809678" elapsed="0.033262">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-10-11T01:04:04.809471" elapsed="0.033559">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-10-11T01:04:04.809453" elapsed="0.033610">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-10-11T01:04:04.843108" elapsed="0.000015"/>
</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-10-11T01:04:04.747368" elapsed="0.095863">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-10-11T01:04:06.879965" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:06.879199" elapsed="0.000831"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:06.881637" 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-10-11T01:04:06.881174" elapsed="0.000607">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-10-11T01:04:06.881998" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:06.880398" elapsed="0.001650"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:06.883186" 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-10-11T01:04:06.882464" elapsed="0.000779"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:06.883910" 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-10-11T01:04:06.884199" 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-10-11T01:04:06.883641" elapsed="0.000611"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:06.885230" 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-10-11T01:04:06.884717" elapsed="0.000738"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:06.887571" 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-10-11T01:04:06.887023" elapsed="0.000641"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:06.888671" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:06.888081" elapsed="0.000644"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:06.890591" 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-10-11T01:04:06.889486" elapsed="0.001164"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:06.893378" 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-10-11T01:04:06.892127" elapsed="0.001524"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:06.893836" elapsed="0.000101"/>
</return>
<msg time="2026-10-11T01:04:06.894352" 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-10-11T01:04:06.891067" elapsed="0.003338"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:06.894878" elapsed="0.000822"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:04:06.889161" elapsed="0.006626"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:06.896969" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:06.896287" elapsed="0.000716"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:06.898741" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:06.897994" elapsed="0.000887"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:06.898994" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T01:04:06.899285" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:06.897245" elapsed="0.002072"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:06.899596" elapsed="0.000448"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:06.896044" elapsed="0.004054"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:06.888824" elapsed="0.011318"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:06.900196" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T01:04:06.900378" 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-10-11T01:04:06.886211" elapsed="0.014244"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:06.885607" elapsed="0.014898"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:06.900749" elapsed="0.000257"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:06.900537" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:06.885563" elapsed="0.015518"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:06.902113" 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-10-11T01:04:06.901312" elapsed="0.000840"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:06.902214" 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/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-10-11T01:04:06.878005" elapsed="0.024350"/>
</kw>
<msg time="2026-10-11T01:04:06.902527" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:06.867901" elapsed="0.034700"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:06.908427" 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-10-11T01:04:06.914150" 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/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-10-11T01:04:06.919825" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:06.920094" 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-10-11T01:04:06.920350" 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-10-11T01:04:06.920859" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:06.920641" elapsed="0.000288"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:06.920622" elapsed="0.000338"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:06.921178" 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-10-11T01:04:06.921446" 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-10-11T01:04:06.921679" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:06.920586" elapsed="0.001159"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:06.920463" elapsed="0.001315"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:06.922004" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:06.922096" elapsed="0.000020"/>
</return>
<msg time="2026-10-11T01:04:06.922267" 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-10-11T01:04:06.866333" elapsed="0.055976"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:06.923536" 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-10-11T01:04:06.923323" elapsed="0.000273">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-10-11T01:04:06.923678" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:06.922997" elapsed="0.000704"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:06.923993" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:06.923762" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:06.924521" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:06.924244" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:06.924066" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:06.923745" elapsed="0.000852"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:06.925105" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:06.924757" elapsed="0.000371"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:06.925172" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:06.925332" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:06.922684" elapsed="0.002671"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:06.926491" 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-10-11T01:04:06.926292" elapsed="0.000251"/>
</kw>
<msg time="2026-10-11T01:04:06.926619" 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-10-11T01:04:06.925932" elapsed="0.000709"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:04:06.926804" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:06.926706" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:06.926689" elapsed="0.000192"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:06.927161" 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-10-11T01:04:06.927280" 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-10-11T01:04:06.927035" elapsed="0.000269"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:04:06.927682" 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-10-11T01:04:06.927494" elapsed="0.000212"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:04:06.927747" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:06.927886" 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-10-11T01:04:06.925620" elapsed="0.002290"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:06.929158" 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-10-11T01:04:06.928935" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:06.929786" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:06.929391" elapsed="0.000437"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:06.935292" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:06.935452" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:04:06.935543" 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-10-11T01:04:06.930134" elapsed="0.005434"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:06.929903" elapsed="0.005704"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:06.935787" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:06.935631" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:06.929885" elapsed="0.005995"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:06.937554" 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-10-11T01:04:06.937072" elapsed="0.000544"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:06.936716" elapsed="0.000945"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:06.936692" elapsed="0.001001"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:06.938516" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:06.938118" elapsed="0.000457"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:06.937764" elapsed="0.000856"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:06.937743" elapsed="0.000908"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:06.939397" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:06.938914" elapsed="0.000539"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:06.939904" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:06.939586" elapsed="0.000392"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:06.940631" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:06.940239" elapsed="0.000427"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:06.940009" elapsed="0.000703"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:06.939561" elapsed="0.001179"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:06.941489" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:06.940998" elapsed="0.000527"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:06.941917" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:06.941612" elapsed="0.000378"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:06.942635" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:06.942249" elapsed="0.000420"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:06.942021" elapsed="0.000693"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:06.941588" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:06.942955" elapsed="0.000404"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:06.943931" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:06.943604" 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-10-11T01:04:06.944177" elapsed="0.000316"/>
</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-10-11T01:04:06.936212" elapsed="0.008359"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:06.944771" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:06.944657" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:06.944633" elapsed="0.000236"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:06.945718" 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-10-11T01:04:06.945066" elapsed="0.000690"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:06.945820" elapsed="0.000053"/>
</return>
<msg time="2026-10-11T01:04:06.946013" 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-10-11T01:04:06.928193" elapsed="0.017854"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:06.946123" elapsed="0.000033"/>
</return>
<msg time="2026-10-11T01:04:06.946288" 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-10-11T01:04:06.849251" elapsed="0.097070"/>
</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-10-11T01:04:06.959263" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:06.958965" elapsed="0.000325"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:06.960012" 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-10-11T01:04:06.959779" elapsed="0.000351">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-10-11T01:04:06.960328" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:06.959463" elapsed="0.000889"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:06.960890" 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-10-11T01:04:06.960562" elapsed="0.000354"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:06.961197" 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-10-11T01:04:06.961315" 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-10-11T01:04:06.961088" elapsed="0.000252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:06.961784" 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-10-11T01:04:06.961565" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:06.962192" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:06.961900" elapsed="0.000345"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:06.962911" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:06.962440" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:06.962267" elapsed="0.000703"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:06.961883" elapsed="0.001107"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:06.963573" 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-10-11T01:04:06.963153" elapsed="0.000447"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:06.963643" 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/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-10-11T01:04:06.958450" elapsed="0.005293"/>
</kw>
<msg time="2026-10-11T01:04:06.963789" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:06.953949" elapsed="0.009884"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:06.967995" 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/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-10-11T01:04:06.972042" 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/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-10-11T01:04:06.976249" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:06.976507" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:06.976696" 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-10-11T01:04:06.977064" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:06.976918" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:06.976904" 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-10-11T01:04:06.977291" 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-10-11T01:04:06.977510" 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-10-11T01:04:06.977684" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:06.976877" elapsed="0.000855"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:06.976762" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:06.977918" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:06.977987" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:06.978093" 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-10-11T01:04:06.952931" elapsed="0.025187"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:06.978283" elapsed="0.000341"/>
</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-10-11T01:04:06.979525" 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-10-11T01:04:06.979273" elapsed="0.000279"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:06.979940" 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-10-11T01:04:06.979701" elapsed="0.000265"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:04:06.980147" elapsed="0.000290"/>
</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-10-11T01:04:06.978907" elapsed="0.001584"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:06.978694" elapsed="0.001827"/>
</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-10-11T01:04:06.980718" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:06.980544" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:06.978678" elapsed="0.002108"/>
</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-10-11T01:04:06.947674" elapsed="0.033155"/>
</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-10-11T01:04:06.946730" elapsed="0.034174"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:06.946442" elapsed="0.034501"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:06.946400" elapsed="0.034564"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:06.980995" elapsed="0.000026"/>
</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-10-11T01:04:06.847563" elapsed="0.133531"/>
</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-10-11T01:04:04.745684" elapsed="2.235515"/>
</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-10-11T01:04:06.981418" elapsed="0.002714"/>
</kw>
<arg>intra_pe_distinguisher</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-10-11T01:04:02.345882" elapsed="4.638306"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:02.250567" elapsed="4.733728"/>
</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-10-11T01:04:06.985989" elapsed="0.000505"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:04:06.985700" elapsed="0.000849"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:06.987624" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:06.987537" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:06.987519" elapsed="0.000167"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:06.989773" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:06.989691" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:06.989674" elapsed="0.000160"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:06.990745" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:06.990422" elapsed="0.000348"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:04:06.991196" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:04:06.990935" elapsed="0.000288"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:04:06.991262" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:06.991387" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:04:06.990054" elapsed="0.001369"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:06.993907" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:06.993811" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:06.993794" elapsed="0.000175"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:06.995011" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:06.994928" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:06.994911" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:06.995389" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:04:06.995222" elapsed="0.000213"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:06.995757" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:06.995614" elapsed="0.000167"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:04:07.030388" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:04:06.996287" elapsed="0.034244"/>
</kw>
<msg time="2026-10-11T01:04:07.030726" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:04:07.030770" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:06.995953" elapsed="0.034851"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:04:07.063912" 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-10-11T01:04:07.031402" elapsed="0.032610"/>
</kw>
<msg time="2026-10-11T01:04:07.064159" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:04:07.064202" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:07.031014" elapsed="0.033224"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:07.064577" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:07.064314" elapsed="0.000371"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:07.064291" elapsed="0.000420"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:07.065152" 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-10-11T01:04:07.064915" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:07.065509" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:07.065276" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:07.065259" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:04:07.065618" 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-10-11T01:04:07.068400" elapsed="0.000149"/>
</kw>
<msg time="2026-10-11T01:04:07.068608" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:07.067084" elapsed="0.001659"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:07.069064" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:07.069402" elapsed="0.000183"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:04:07.066470" elapsed="0.003238"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:04:07.065954" elapsed="0.003815"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:04:06.994659" elapsed="0.075199"/>
</kw>
<msg time="2026-10-11T01:04:07.069945" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:07.069987" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:06.994119" elapsed="0.075902"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:04:07.070202" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-10-11T01:04:07.070091" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:07.070073" 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-10-11T01:04:07.070699" 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-10-11T01:04:07.071187" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:04:07.071257" 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-10-11T01:04:06.993528" elapsed="0.077817"/>
</kw>
<msg time="2026-10-11T01:04:07.071527" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:07.071572" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:06.991750" elapsed="0.079857"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:07.071917" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:07.071678" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:07.071662" elapsed="0.000329"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:04:06.991608" elapsed="0.080405"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:04:06.991470" elapsed="0.080572"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:04:06.989385" elapsed="0.082706"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:04:06.987251" elapsed="0.084892"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:06.986705" elapsed="0.085480"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:04:06.985295" elapsed="0.086940"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:07.073083" 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-10-11T01:04:07.073239" 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-10-11T01:04:07.072933" elapsed="0.000331"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:04:07.073624" 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-10-11T01:04:07.073443" elapsed="0.000206"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:07.073966" 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-10-11T01:04:07.074085" 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-10-11T01:04:07.073813" elapsed="0.000297"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:04:07.074465" 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-10-11T01:04:07.074274" elapsed="0.000224"/>
</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-10-11T01:04:07.074752" elapsed="0.002316"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:07.074565" elapsed="0.002536"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:07.074548" elapsed="0.002577"/>
</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-10-11T01:04:07.089041" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:07.088718" elapsed="0.000351"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:07.089770" 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-10-11T01:04:07.089569" elapsed="0.000282">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-10-11T01:04:07.089939" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:07.089231" elapsed="0.000731"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:07.090468" 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-10-11T01:04:07.090138" elapsed="0.000356"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:07.090772" 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-10-11T01:04:07.090907" 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-10-11T01:04:07.090663" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:07.091348" 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-10-11T01:04:07.091128" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:07.092313" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:04:07.092080" elapsed="0.000276"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:07.092808" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:07.092551" elapsed="0.000282"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:07.093451" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:07.093166" elapsed="0.000310"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:07.094326" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:07.093966" elapsed="0.000386"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:07.094455" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T01:04:07.094597" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:07.093646" 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-10-11T01:04:07.094791" elapsed="0.000197"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:04:07.093034" elapsed="0.001992"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:07.095560" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:07.095259" elapsed="0.000327"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:07.096477" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:07.096087" elapsed="0.000417"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:07.096549" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:07.096676" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:07.095760" elapsed="0.000939"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:07.096879" elapsed="0.000169"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:07.095127" elapsed="0.001958"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:07.092890" elapsed="0.004226"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:07.097153" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:04:07.097281" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:07.091723" elapsed="0.005582"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:07.091471" elapsed="0.005862"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:07.097543" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:07.097355" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:07.091452" elapsed="0.006164"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:07.098322" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:07.097777" elapsed="0.000572"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:07.098394" 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_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-10-11T01:04:07.088191" elapsed="0.010341"/>
</kw>
<msg time="2026-10-11T01:04:07.098581" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:07.082570" elapsed="0.016057"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:07.102996" 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/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-10-11T01:04:07.107150" 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/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-10-11T01:04:07.111263" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:07.111526" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:07.111716" 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-10-11T01:04:07.112072" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:07.111925" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:07.111911" 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-10-11T01:04:07.112300" 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-10-11T01:04:07.112496" 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-10-11T01:04:07.112663" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:07.111885" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:07.111784" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:07.112899" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:07.112967" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:07.113074" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:07.081967" elapsed="0.031131"/>
</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-10-11T01:04:07.122186" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:07.121881" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:07.122891" 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-10-11T01:04:07.122707" elapsed="0.000243">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-10-11T01:04:07.123032" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:07.122373" elapsed="0.000682"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:07.123549" 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-10-11T01:04:07.123228" elapsed="0.000346"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:07.123860" 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-10-11T01:04:07.123981" 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-10-11T01:04:07.123741" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:07.124433" 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-10-11T01:04:07.124201" 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-10-11T01:04:07.124835" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:07.124583" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:07.125335" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', '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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:07.125072" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:07.124924" elapsed="0.000468"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:07.124566" elapsed="0.000861"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:07.125988" 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-10-11T01:04:07.125591" elapsed="0.000425"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:07.126060" 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/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-10-11T01:04:07.121351" elapsed="0.004811"/>
</kw>
<msg time="2026-10-11T01:04:07.126214" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:07.116983" elapsed="0.009275"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:07.130506" 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/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-10-11T01:04:07.134626" 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/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-10-11T01:04:07.138741" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:07.138933" 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-10-11T01:04:07.139117" 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-10-11T01:04:07.139470" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:07.139309" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:07.139295" 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-10-11T01:04:07.139699" 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-10-11T01:04:07.139916" 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-10-11T01:04:07.140084" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:07.139270" elapsed="0.000861"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:07.139182" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:07.140343" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:07.140424" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:04:07.140549" 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-10-11T01:04:07.116219" elapsed="0.024357"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:07.141697" 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-10-11T01:04:07.141505" elapsed="0.000251">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-10-11T01:04:07.141851" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:07.141164" elapsed="0.000711"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:07.142158" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:07.141938" elapsed="0.000271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:07.142677" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:07.142400" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:07.142231" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:07.141921" elapsed="0.000832"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:07.143263" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:07.142929" elapsed="0.000358"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:07.143331" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:07.143471" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:07.140861" elapsed="0.002633"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:07.144819" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:07.144598" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:07.145288" 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-10-11T01:04:07.145077" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:07.145766" 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-10-11T01:04:07.145550" elapsed="0.000256"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:07.146223" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:07.146010" elapsed="0.000253"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:07.146991" 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-10-11T01:04:07.146815" elapsed="0.000201"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:04:07.147311" 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-10-11T01:04:07.147170" elapsed="0.000193"/>
</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-10-11T01:04:07.147546" elapsed="0.000156"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:07.148134" 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-10-11T01:04:07.147911" elapsed="0.000268"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:04:07.148231" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:04:07.148364" 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-10-11T01:04:07.146459" elapsed="0.001929"/>
</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-10-11T01:04:07.160038" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.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-10-11T01:04:07.160104" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:07.160198" 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-10-11T01:04:07.148712" elapsed="0.011510"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:07.148479" elapsed="0.011784"/>
</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-10-11T01:04:07.160473" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:07.160287" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:07.148461" elapsed="0.012096"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:07.161782" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:07.161509" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:07.161250" elapsed="0.000622"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:07.161233" elapsed="0.000662"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:07.162469" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:07.162183" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:07.161945" elapsed="0.000597"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:07.161930" elapsed="0.000634"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:07.163113" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:07.162739" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:07.163432" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:07.163200" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:07.163972" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:07.163691" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:07.163525" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:07.163184" elapsed="0.000865"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:07.164590" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:07.164225" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:07.164951" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:07.164678" elapsed="0.000330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:07.165497" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:07.165197" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:07.165031" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:07.164661" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:07.165719" elapsed="0.000308"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:07.166426" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:07.166187" elapsed="0.000265"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:07.166606" elapsed="0.000211"/>
</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-10-11T01:04:07.160894" elapsed="0.005991"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:04:07.167032" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:04:07.166949" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:07.166933" elapsed="0.000176"/>
</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-10-11T01:04:07.167252" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:04:07.167311" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:07.167484" 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-10-11T01:04:07.143789" elapsed="0.023719"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:07.167568" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:04:07.167687" 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-10-11T01:04:07.078078" elapsed="0.089632"/>
</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-10-11T01:04:07.168015" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:07.167799" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:07.167783" elapsed="0.000314"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:07.168128" elapsed="0.000023"/>
</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-10-11T01:04:07.077377" elapsed="0.090846"/>
</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-10-11T01:04:07.171468" level="INFO">${update} = </msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:04:07.169133" elapsed="0.002363"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:04:07.172013" level="FAIL"> == </msg>
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="FAIL" start="2026-10-11T01:04:07.171657" elapsed="0.000413"> == </status>
</kw>
<return>
<value>${update}</value>
<status status="NOT RUN" start="2026-10-11T01:04:07.172123" elapsed="0.000016"/>
</return>
<doc>Returns hex update message.</doc>
<status status="FAIL" start="2026-10-11T01:04:07.168874" elapsed="0.003347"> == </status>
</kw>
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:04:09.177100" level="INFO">${update} = ffffffffffffffffffffffffffffffff0051020000003a400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac01008010b0a0000013130</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:04:09.173711" elapsed="0.003460"/>
</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-10-11T01:04:09.177667" elapsed="0.000779"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:04:09.178556" elapsed="0.000076"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:04:09.172968" elapsed="0.005836"/>
</kw>
<msg time="2026-10-11T01:04:09.178985" 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-10-11T01:04:07.168424" elapsed="2.010716"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.181602" level="INFO">Length is 162.</msg>
<msg time="2026-10-11T01:04:09.181762" 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-10-11T01:04:09.181003" elapsed="0.000809"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.182745" level="INFO">Length is 162.</msg>
<msg time="2026-10-11T01:04:09.182919" 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-10-11T01:04:09.182192" elapsed="0.000778"/>
</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-10-11T01:04:09.183383" elapsed="0.000648"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:04:09.184750" 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-10-11T01:04:09.184365" elapsed="0.000440"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:04:09.185530" 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-10-11T01:04:09.185152" elapsed="0.000431"/>
</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-10-11T01:04:09.186009" elapsed="0.000624"/>
</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-10-11T01:04:09.179665" elapsed="0.007090"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:04:09.187090" elapsed="0.002732"/>
</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-10-11T01:04:09.222090" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:09.221351" elapsed="0.000819"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:09.223288" 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-10-11T01:04:09.222991" elapsed="0.000392">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-10-11T01:04:09.223532" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:09.222524" elapsed="0.001040"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.224256" 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-10-11T01:04:09.223809" elapsed="0.000482"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:09.224700" 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-10-11T01:04:09.224903" 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-10-11T01:04:09.224545" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.225555" 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-10-11T01:04:09.225221" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.226915" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:04:09.226578" elapsed="0.000396"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.227766" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:09.227219" elapsed="0.000581"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.228916" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:09.228275" elapsed="0.000675"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:09.230572" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:09.229783" elapsed="0.000898"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:09.230923" elapsed="0.000045"/>
</return>
<msg time="2026-10-11T01:04:09.231163" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:09.229191" elapsed="0.002004"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:09.231453" elapsed="0.000456"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:04:09.228087" elapsed="0.003876"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.232897" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:09.232287" elapsed="0.000645"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:09.234575" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:09.233806" elapsed="0.000896"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:09.234939" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T01:04:09.235175" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:09.233170" elapsed="0.002037"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:09.235526" elapsed="0.000437"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:09.232105" elapsed="0.003913"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:09.227882" elapsed="0.008179"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:09.236115" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T01:04:09.236294" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:09.226083" elapsed="0.010243"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:09.225705" elapsed="0.010661"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:09.236635" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:09.236398" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:09.225678" elapsed="0.011054"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.237730" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:09.236969" elapsed="0.000798"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:09.237828" 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/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-10-11T01:04:09.220174" elapsed="0.017808"/>
</kw>
<msg time="2026-10-11T01:04:09.238050" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:09.210146" elapsed="0.027965"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:09.244074" 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/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-10-11T01:04:09.249806" 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/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-10-11T01:04:09.255568" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:09.255881" 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-10-11T01:04:09.256141" 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-10-11T01:04:09.256641" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:09.256430" elapsed="0.000281"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:09.256392" elapsed="0.000350"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:09.256975" 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-10-11T01:04:09.257232" 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-10-11T01:04:09.257481" elapsed="0.000027"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:09.256356" elapsed="0.001193"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:09.256234" elapsed="0.001348"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:09.257794" elapsed="0.000025"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:09.257974" elapsed="0.000022"/>
</return>
<msg time="2026-10-11T01:04:09.258127" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:09.208678" elapsed="0.049483"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.259704" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:09.259349" elapsed="0.000416"/>
</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-10-11T01:04:09.268335" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:09.268397" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:09.268537" 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-10-11T01:04:09.260181" elapsed="0.008395"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:09.259860" elapsed="0.008767"/>
</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-10-11T01:04:09.268886" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:09.268660" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:09.259824" elapsed="0.009168"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.270998" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:09.270591" elapsed="0.000462"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:09.270234" elapsed="0.000864"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:09.270210" elapsed="0.000920"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.271977" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:09.271583" elapsed="0.000452"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:09.271200" elapsed="0.000879"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:09.271178" elapsed="0.000931"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.272895" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:09.272376" elapsed="0.000556"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:09.273320" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:09.273021" elapsed="0.000436"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.274118" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:09.273728" elapsed="0.000425"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:09.273490" elapsed="0.000709"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:09.272997" elapsed="0.001229"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.274991" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:09.274493" elapsed="0.000533"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:09.275424" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:09.275114" elapsed="0.000386"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.276144" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:09.275760" elapsed="0.000418"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:09.275531" elapsed="0.000693"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:09.275091" elapsed="0.001160"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:09.276473" elapsed="0.000421"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:09.277448" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:09.277118" elapsed="0.000366"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:09.277696" elapsed="0.000316"/>
</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-10-11T01:04:09.269751" elapsed="0.008338"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:04:09.278146" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T01:04:09.278385" 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-10-11T01:04:09.258573" elapsed="0.019865"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:09.278505" elapsed="0.000034"/>
</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-10-11T01:04:09.191988" elapsed="0.086650"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:09.191053" elapsed="0.087651"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:04:09.190247" elapsed="0.088527"/>
</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-10-11T01:04:09.282774" level="INFO">${update} = ffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac01008010b0a0000013130</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:04:09.280094" elapsed="0.002719"/>
</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-10-11T01:04:09.283047" elapsed="0.000457"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:04:09.283565" elapsed="0.000038"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:04:09.279719" elapsed="0.003983"/>
</kw>
<msg time="2026-10-11T01:04:09.283794" 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-10-11T01:04:09.279040" elapsed="0.004786"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.284936" level="INFO">Length is 150.</msg>
<msg time="2026-10-11T01:04:09.285032" 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-10-11T01:04:09.284590" elapsed="0.000473"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.285627" level="INFO">Length is 150.</msg>
<msg time="2026-10-11T01:04:09.285719" 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-10-11T01:04:09.285280" elapsed="0.000469"/>
</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-10-11T01:04:09.286018" elapsed="0.000367"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:04:09.286846" 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-10-11T01:04:09.286618" elapsed="0.000263"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:04:09.287286" 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-10-11T01:04:09.287079" elapsed="0.000239"/>
</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-10-11T01:04:09.287636" elapsed="0.000387"/>
</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-10-11T01:04:09.284106" elapsed="0.003994"/>
</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-10-11T01:04:09.304684" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:09.304345" elapsed="0.000368"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:09.305443" 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-10-11T01:04:09.305212" elapsed="0.000298">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-10-11T01:04:09.305597" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:09.304889" elapsed="0.000731"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.306118" 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-10-11T01:04:09.305794" elapsed="0.000350"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:09.306440" 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-10-11T01:04:09.306580" 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-10-11T01:04:09.306312" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.307032" 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-10-11T01:04:09.306799" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.308025" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:04:09.307778" elapsed="0.000289"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.308510" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:09.308244" elapsed="0.000290"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.309337" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:09.308865" elapsed="0.000496"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:09.310487" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:09.310000" elapsed="0.000537"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:09.310648" elapsed="0.000033"/>
</return>
<msg time="2026-10-11T01:04:09.310828" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:09.309554" elapsed="0.001310"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:09.311032" elapsed="0.000279"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:04:09.308720" elapsed="0.002627"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.312067" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:09.311599" elapsed="0.000493"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:09.313141" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:09.312702" elapsed="0.000478"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:09.313290" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:04:09.313486" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:09.312261" elapsed="0.001249"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:09.313674" elapsed="0.000284"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:09.311468" elapsed="0.002569"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:09.308578" elapsed="0.005491"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:09.314108" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:09.314236" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:09.307395" elapsed="0.006864"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:09.307140" elapsed="0.007152"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:09.314526" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:09.314315" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:09.307119" elapsed="0.007478"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.315489" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:09.314755" elapsed="0.000762"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:09.315561" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:09.303800" elapsed="0.011860"/>
</kw>
<msg time="2026-10-11T01:04:09.315709" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:09.299374" elapsed="0.016392"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:09.319894" 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/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-10-11T01:04:09.323988" 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/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-10-11T01:04:09.328081" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:09.328260" 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-10-11T01:04:09.328453" 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-10-11T01:04:09.328789" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:09.328643" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:09.328630" 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-10-11T01:04:09.329031" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:09.329208" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:09.329376" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:09.328605" elapsed="0.000862"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:09.328519" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:09.329648" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:09.329714" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:09.329820" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:09.298691" elapsed="0.031167"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.330897" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:09.330661" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:09.336419" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:09.336734" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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+xml', 'Content-Length': '635'} 
 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-path xmlns:a="urn:opendaylight:params:xml:ns:yang:bgp-rib" xmlns:b="urn:opendaylight:params:xml:ns:yang:bgp-types" xmlns:c="urn:opendaylight:params:xml:ns:yang:bgp:mvpn" xmlns:d="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;/a:application-rib[a:id='10.30.170.173']/a:tables[a:afi='b:ipv4-address-family'][a:safi='c:mcast-vpn-subsequent-address-family']/d:mvpn-routes-ipv4&lt;/error-path&gt;&lt;error-message&gt;Data does not exist&lt;/error-message&gt;&lt;error-tag&gt;data-missing&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-10-11T01:04:09.336877" level="INFO">${response} = None</msg>
<msg time="2026-10-11T01:04:09.336918" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:09.331228" elapsed="0.006063">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:09.331001" elapsed="0.006363">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:09.337566" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:09.337395" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-10-11T01:04:09.330984" elapsed="0.006659">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:09.338937" 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-10-11T01:04:09.338613" elapsed="0.000357">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:04:09.338356" elapsed="0.000672">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:04:09.338339" elapsed="0.000719">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-10-11T01:04:09.339640" 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-10-11T01:04:09.339360" elapsed="0.000310">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:04:09.339120" elapsed="0.000605">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:04:09.339105" elapsed="0.000677">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.340514" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:09.340001" elapsed="0.000540"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:09.340820" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:09.340605" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.341339" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:09.341073" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:09.340907" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:09.340588" elapsed="0.000844"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.341956" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:09.341607" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:09.342255" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:09.342044" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.342773" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:09.342511" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:09.342332" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:09.342027" elapsed="0.000834"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:09.343006" elapsed="0.000292"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:09.343697" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:09.343474" elapsed="0.000247"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-10-11T01:04:09.344048" 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-10-11T01:04:09.343886" elapsed="0.000191">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-10-11T01:04:09.337995" elapsed="0.006203">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-10-11T01:04:09.344251" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:09.344515" level="INFO">${response_text} = None</msg>
<msg time="2026-10-11T01:04:09.344542" 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-10-11T01:04:09.330093" elapsed="0.014475">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-10-11T01:04:09.344625" elapsed="0.000024"/>
</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-10-11T01:04:09.289465" elapsed="0.055294">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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:09.288906" elapsed="0.055908"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:04:09.288377" elapsed="0.056504"/>
</kw>
<arg>intra_vrf</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-10-11T01:04:07.072523" elapsed="2.272405"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:06.984779" elapsed="2.360251"/>
</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-10-11T01:04:09.346938" elapsed="0.000219"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:04:09.346349" 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-10-11T01:04:09.348127" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:09.348041" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:09.348024" 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-10-11T01:04:09.350340" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:09.350257" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:09.350240" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.351328" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:09.351001" elapsed="0.000356"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.351792" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:04:09.351528" elapsed="0.000289"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:04:09.351872" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:04:09.352002" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:04:09.350629" elapsed="0.001396"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:09.354537" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:09.354452" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:09.354434" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:09.355652" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:09.355569" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:09.355552" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:09.356044" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:04:09.355875" elapsed="0.000193"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:09.356374" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:09.356234" elapsed="0.000163"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:04:09.388472" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:04:09.356921" elapsed="0.031646"/>
</kw>
<msg time="2026-10-11T01:04:09.388719" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:04:09.388760" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:09.356576" elapsed="0.032218"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:04:09.418431" 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-10-11T01:04:09.389315" elapsed="0.029211"/>
</kw>
<msg time="2026-10-11T01:04:09.418671" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:04:09.418711" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:09.388975" elapsed="0.029770"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:09.419033" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:09.418812" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:09.418795" elapsed="0.000310"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.419549" 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-10-11T01:04:09.419287" elapsed="0.000326"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:09.419882" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:09.419672" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:09.419655" elapsed="0.000298"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:04:09.419982" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:09.422632" elapsed="0.000116"/>
</kw>
<msg time="2026-10-11T01:04:09.422805" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:09.421350" elapsed="0.001601"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:09.423259" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:09.423734" 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-10-11T01:04:09.420739" elapsed="0.003207"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:04:09.420256" elapsed="0.003751"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:04:09.355290" elapsed="0.068792"/>
</kw>
<msg time="2026-10-11T01:04:09.424163" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:09.424201" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:09.354751" elapsed="0.069485"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:04:09.424393" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-10-11T01:04:09.424304" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:09.424286" 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-10-11T01:04:09.424828" 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-10-11T01:04:09.425138" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:04:09.425201" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T01:04:09.354149" elapsed="0.071135"/>
</kw>
<msg time="2026-10-11T01:04:09.425366" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:09.425425" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:09.352353" elapsed="0.073109"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:09.425748" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:09.425529" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:09.425513" elapsed="0.000305"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:04:09.352210" elapsed="0.073640"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:04:09.352070" elapsed="0.073807"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:04:09.349962" elapsed="0.075963"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:04:09.347775" elapsed="0.078199"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:09.347359" elapsed="0.078655"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:04:09.345968" elapsed="0.080093"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.427146" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:09.426738" elapsed="0.000434"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.427747" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:09.427352" elapsed="0.000420"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.428290" 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-10-11T01:04:09.427963" elapsed="0.000351"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:09.428635" 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-10-11T01:04:09.428795" 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-10-11T01:04:09.428493" elapsed="0.000327"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:09.429133" 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-10-11T01:04:09.429243" 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-10-11T01:04:09.428997" elapsed="0.000270"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:04:09.429423" elapsed="0.002402"/>
</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-10-11T01:04:09.431983" elapsed="0.001976"/>
</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-10-11T01:04:09.450847" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:09.450531" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:09.451566" 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-10-11T01:04:09.451356" elapsed="0.000274">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-10-11T01:04:09.451715" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:09.451035" elapsed="0.000704"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.452235" 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-10-11T01:04:09.451925" elapsed="0.000335"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:09.452557" 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-10-11T01:04:09.452677" 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-10-11T01:04:09.452447" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.453129" 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-10-11T01:04:09.452908" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.454083" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:09.453852" elapsed="0.000272"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.454562" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:09.454298" elapsed="0.000288"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.455342" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:09.454911" elapsed="0.000455"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:09.456510" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:09.455996" elapsed="0.000603"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:09.456680" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:04:09.456906" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:09.455558" 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-10-11T01:04:09.457095" elapsed="0.000303"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:04:09.454769" elapsed="0.002686"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.458134" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:09.457690" elapsed="0.000469"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:09.459325" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:09.458818" elapsed="0.000612"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:09.459513" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:04:09.459721" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:09.458363" elapsed="0.001382"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:09.459922" elapsed="0.000299"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:09.457558" elapsed="0.002701"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:09.454629" elapsed="0.005662"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:09.460328" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:09.460531" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:09.453504" elapsed="0.007051"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:09.453233" elapsed="0.007351"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:09.460755" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:09.460606" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:09.453215" elapsed="0.007609"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.461713" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-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-10-11T01:04:09.460994" elapsed="0.000745"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:09.461783" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:09.450007" elapsed="0.011887"/>
</kw>
<msg time="2026-10-11T01:04:09.461943" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:09.445698" elapsed="0.016287"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:09.466098" 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/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-10-11T01:04:09.470177" 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/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-10-11T01:04:09.474298" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:09.474493" 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-10-11T01:04:09.474675" 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-10-11T01:04:09.475026" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:09.474880" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:09.474866" 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-10-11T01:04:09.475286" 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-10-11T01:04:09.475481" 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-10-11T01:04:09.475646" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:09.474827" elapsed="0.000867"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:09.474739" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:09.475880" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:09.475946" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:09.476055" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-i...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:04:09.445085" elapsed="0.030995"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:09.477186" 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-10-11T01:04:09.476994" elapsed="0.000252">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-10-11T01:04:09.477328" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:09.476658" elapsed="0.000693"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:09.477649" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:09.477428" elapsed="0.000272"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.478161" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:09.477901" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:09.477722" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:09.477397" elapsed="0.000839"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.478744" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:09.478396" elapsed="0.000371"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:09.478811" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T01:04:09.478949" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:09.476344" elapsed="0.002627"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:09.480056" 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-10-11T01:04:09.479868" elapsed="0.000246">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-10-11T01:04:09.480196" 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-10-11T01:04:09.479535" elapsed="0.000683"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:04:09.480377" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:04:09.480281" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:09.480264" elapsed="0.000204"/>
</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-10-11T01:04:09.480622" elapsed="0.000019"/>
</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-10-11T01:04:09.480796" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:04:09.480865" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:09.481020" 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-10-11T01:04:09.479221" elapsed="0.001822"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.482275" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:09.482055" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:09.482738" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:09.482522" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:09.488646" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:09.488793" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:09.488903" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:09.483243" elapsed="0.005993">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:09.482850" elapsed="0.006462">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:09.489514" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:09.489342" elapsed="0.000230"/>
</branch>
<status status="FAIL" start="2026-10-11T01:04:09.482821" elapsed="0.006773">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:09.489945" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:09.490064" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:09.490031" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:09.490015" elapsed="0.000106"/>
</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-10-11T01:04:09.490261" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:04:09.490322" 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-10-11T01:04:09.481322" elapsed="0.009109">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:09.490497" elapsed="0.000014"/>
</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-10-11T01:04:09.436526" elapsed="0.054056">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:09.490823" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:09.490661" elapsed="0.000268"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:09.490646" elapsed="0.000306"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:09.490982" 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-10-11T01:04:09.435897" elapsed="0.055173">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:11.526306" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:11.525563" elapsed="0.000808"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:11.528100" 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-10-11T01:04:11.527645" elapsed="0.000599">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-10-11T01:04:11.528466" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:11.526772" elapsed="0.001748"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.529677" 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-10-11T01:04:11.528953" elapsed="0.000781"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:11.530375" 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-10-11T01:04:11.530693" 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-10-11T01:04:11.530126" elapsed="0.000621"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.531762" 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-10-11T01:04:11.531237" elapsed="0.000642"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.534380" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:11.533856" elapsed="0.000652"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.535528" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:11.534928" elapsed="0.000655"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.537384" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:11.536327" elapsed="0.001153"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:11.540115" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:11.538907" elapsed="0.001403"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:11.540550" elapsed="0.000075"/>
</return>
<msg time="2026-10-11T01:04:11.541058" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:11.537883" elapsed="0.003229"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:11.541525" elapsed="0.000721"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:04:11.536028" elapsed="0.006363"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.544049" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:11.543010" elapsed="0.001093"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:11.546794" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:11.545588" elapsed="0.001422"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:11.547270" elapsed="0.000068"/>
</return>
<msg time="2026-10-11T01:04:11.547793" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:11.544566" elapsed="0.003305"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:11.548244" elapsed="0.000578"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:11.542694" elapsed="0.006197"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:11.535684" elapsed="0.013251"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:11.548989" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T01:04:11.549169" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:11.532630" elapsed="0.016573"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.532024" elapsed="0.017219"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.549511" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.549275" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.531981" elapsed="0.017629"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.550641" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-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-10-11T01:04:11.549847" elapsed="0.000832"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:11.550741" 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_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-10-11T01:04:11.524345" elapsed="0.026551"/>
</kw>
<msg time="2026-10-11T01:04:11.550964" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:11.514275" elapsed="0.036751"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:11.557012" 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-10-11T01:04:11.562938" 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/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-10-11T01:04:11.568994" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.569253" 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-10-11T01:04:11.569527" 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-10-11T01:04:11.570021" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.569797" elapsed="0.000294"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:11.569778" elapsed="0.000343"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.570386" 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-10-11T01:04:11.570662" 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-10-11T01:04:11.570906" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:11.569744" elapsed="0.001229"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:11.569622" elapsed="0.001384"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.571218" elapsed="0.000027"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:11.571311" elapsed="0.000021"/>
</return>
<msg time="2026-10-11T01:04:11.571484" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-i...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:04:11.512863" elapsed="0.058656"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:11.573091" 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-10-11T01:04:11.572809" elapsed="0.000366">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-10-11T01:04:11.573290" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:11.572328" elapsed="0.000994"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.573742" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.573430" elapsed="0.000384"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.574532" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:11.574116" elapsed="0.000454"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.573863" elapsed="0.000758"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.573386" elapsed="0.001265"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.575167" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:11.574819" elapsed="0.000371"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:11.575235" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:11.575359" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:11.571906" elapsed="0.003476"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:11.576482" 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-10-11T01:04:11.576282" elapsed="0.000259">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-10-11T01:04:11.576626" 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-10-11T01:04:11.575959" elapsed="0.000689"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:04:11.576808" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-10-11T01:04:11.576711" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.576694" elapsed="0.000203"/>
</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-10-11T01:04:11.577054" elapsed="0.000020"/>
</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-10-11T01:04:11.577232" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:04:11.577290" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:11.577428" 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-10-11T01:04:11.575646" elapsed="0.001807"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.578966" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:11.578710" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.579445" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:11.579209" elapsed="0.000277"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:11.585285" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:11.585496" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:11.585646" 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-10-11T01:04:11.579793" elapsed="0.005888"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.579549" elapsed="0.006187"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.586010" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.585770" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.579531" elapsed="0.006589"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.588217" 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-10-11T01:04:11.587730" elapsed="0.000553"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.587364" elapsed="0.000965"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.587337" elapsed="0.001024"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.589187" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:11.588793" elapsed="0.000454"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.588454" elapsed="0.000837"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.588431" elapsed="0.000892"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.590115" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:11.589606" elapsed="0.000545"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.590561" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.590240" elapsed="0.000396"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.591286" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:11.590915" elapsed="0.000406"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.590667" elapsed="0.000700"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.590217" elapsed="0.001178"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.592153" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:11.591664" elapsed="0.000525"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.592592" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.592279" elapsed="0.000387"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.593306" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:11.592939" elapsed="0.000401"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.592697" elapsed="0.000688"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.592255" elapsed="0.001177"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:11.593639" elapsed="0.000488"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:11.594708" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:11.594356" 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-10-11T01:04:11.595084" elapsed="0.000355"/>
</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-10-11T01:04:11.586881" elapsed="0.008640"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:11.595726" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:11.595608" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.595585" elapsed="0.000228"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:11.597000" 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-10-11T01:04:11.596027" elapsed="0.001010"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:11.597102" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T01:04:11.597285" 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-10-11T01:04:11.577807" elapsed="0.019512"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:11.597395" elapsed="0.000056"/>
</return>
<msg time="2026-10-11T01:04:11.597591" 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-10-11T01:04:11.496281" elapsed="0.101344"/>
</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-10-11T01:04:11.610639" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:11.610317" elapsed="0.000349"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:11.611450" 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-10-11T01:04:11.611164" elapsed="0.000453">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-10-11T01:04:11.611787" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:11.610838" elapsed="0.000972"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.612310" 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-10-11T01:04:11.612001" elapsed="0.000334"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:11.612630" 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-10-11T01:04:11.612771" 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-10-11T01:04:11.612518" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.613216" 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-10-11T01:04:11.613000" 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-10-11T01:04:11.613672" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.613355" elapsed="0.000371"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.614354" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:11.613908" elapsed="0.000471"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.613748" elapsed="0.000682"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.613338" elapsed="0.001113"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.615029" 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-10-11T01:04:11.614625" elapsed="0.000430"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:11.615099" 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/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-10-11T01:04:11.609803" elapsed="0.005397"/>
</kw>
<msg time="2026-10-11T01:04:11.615252" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:11.605200" elapsed="0.010098"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:11.619439" 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/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-10-11T01:04:11.623525" 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/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-10-11T01:04:11.627790" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.627986" 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-10-11T01:04:11.628169" 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-10-11T01:04:11.628530" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.628370" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:11.628357" 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-10-11T01:04:11.628759" 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-10-11T01:04:11.628955" 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-10-11T01:04:11.629121" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:11.628330" elapsed="0.000838"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:11.628237" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.629394" elapsed="0.000038"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:11.629481" elapsed="0.000018"/>
</return>
<msg time="2026-10-11T01:04:11.629616" 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-10-11T01:04:11.604191" elapsed="0.025450"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:11.629809" elapsed="0.000333"/>
</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-10-11T01:04:11.631260" 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-10-11T01:04:11.630788" elapsed="0.000499"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:11.631914" 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-10-11T01:04:11.631459" elapsed="0.000481"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:04:11.632124" elapsed="0.000277"/>
</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-10-11T01:04:11.630427" elapsed="0.002046"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.630212" elapsed="0.002290"/>
</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-10-11T01:04:11.632701" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.632525" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.630195" elapsed="0.002575"/>
</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-10-11T01:04:11.599005" elapsed="0.033807"/>
</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-10-11T01:04:11.598029" elapsed="0.034863"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.597727" elapsed="0.035204"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.597705" elapsed="0.035248"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:11.632982" elapsed="0.000026"/>
</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-10-11T01:04:11.494702" elapsed="0.138383"/>
</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-10-11T01:04:09.434147" elapsed="2.198994"/>
</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-10-11T01:04:11.648968" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:11.648651" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:11.649655" 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-10-11T01:04:11.649484" elapsed="0.000230">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-10-11T01:04:11.649796" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:11.649151" elapsed="0.000713"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.650352" 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-10-11T01:04:11.650042" elapsed="0.000334"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:11.650667" 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-10-11T01:04:11.650781" 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-10-11T01:04:11.650558" elapsed="0.000247"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.651232" 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-10-11T01:04:11.651014" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.652184" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:11.651956" elapsed="0.000269"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.652667" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:11.652401" elapsed="0.000290"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.653475" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:11.653022" elapsed="0.000478"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:11.654647" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:11.654113" elapsed="0.000625"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:11.654817" elapsed="0.000045"/>
</return>
<msg time="2026-10-11T01:04:11.655045" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:11.653670" 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-10-11T01:04:11.655234" elapsed="0.000330"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/effective-rib-in</var>
<status status="PASS" start="2026-10-11T01:04:11.652891" elapsed="0.002710"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.656277" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:11.655844" elapsed="0.000457"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:11.657478" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:11.656945" elapsed="0.000623"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:11.657648" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:04:11.657870" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:11.656505" 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-10-11T01:04:11.658058" elapsed="0.000301"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:11.655699" elapsed="0.002698"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:11.652733" elapsed="0.005737"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:11.658509" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:04:11.658637" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:11.651605" elapsed="0.007056"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.651335" elapsed="0.007354"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.658877" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.658711" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.651317" elapsed="0.007629"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.659649" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-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-10-11T01:04:11.659106" elapsed="0.000569"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:11.659718" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:11.648122" elapsed="0.011695"/>
</kw>
<msg time="2026-10-11T01:04:11.659916" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:11.643591" elapsed="0.016371"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:11.664303" 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/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-10-11T01:04:11.668371" 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/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-10-11T01:04:11.672463" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.672645" 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-10-11T01:04:11.672841" 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-10-11T01:04:11.673177" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.673032" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:11.673019" 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-10-11T01:04:11.673416" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.673598" 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-10-11T01:04:11.673762" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:11.672994" elapsed="0.000815"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:11.672908" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.673993" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:11.674058" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:11.674166" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-ro...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:04:11.642972" elapsed="0.031219"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:11.675321" 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-10-11T01:04:11.675103" elapsed="0.000278">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-10-11T01:04:11.675482" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:11.674764" elapsed="0.000741"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.675789" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.675568" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.676312" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:11.676050" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.675878" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.675551" elapsed="0.000842"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.676923" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:11.676573" elapsed="0.000373"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:11.676992" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:11.677114" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:11.674465" elapsed="0.002672"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:11.678218" 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-10-11T01:04:11.678036" elapsed="0.000241">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-10-11T01:04:11.678359" 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-10-11T01:04:11.677700" elapsed="0.000681"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:04:11.678558" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:04:11.678460" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.678443" elapsed="0.000190"/>
</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-10-11T01:04:11.678787" elapsed="0.000020"/>
</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-10-11T01:04:11.678975" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:04:11.679033" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:11.679155" 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-10-11T01:04:11.677385" elapsed="0.001793"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.680396" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:11.680175" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.680876" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:11.680644" elapsed="0.000272"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:11.685666" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:11.685778" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:11.685904" 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-10-11T01:04:11.681199" elapsed="0.004757"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.680975" elapsed="0.005021"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.686173" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.686021" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.680958" elapsed="0.005291"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.687513" 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-10-11T01:04:11.687167" elapsed="0.000392"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.686928" elapsed="0.000662"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.686911" elapsed="0.000702"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.688179" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:11.687915" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.687662" elapsed="0.000589"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.687647" elapsed="0.000626"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.688805" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:11.688468" elapsed="0.000377"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.689119" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.688909" elapsed="0.000261"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.689639" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:11.689356" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.689193" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.688892" elapsed="0.000823"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.690235" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:11.689903" elapsed="0.000356"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.690546" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.690322" elapsed="0.000276"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.691054" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:11.690781" elapsed="0.000298"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.690619" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.690305" elapsed="0.000824"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:11.691272" elapsed="0.000314"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:11.691974" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:11.691745" elapsed="0.000253"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:11.692150" elapsed="0.000205"/>
</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-10-11T01:04:11.686582" elapsed="0.005848"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:11.692575" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:11.692494" elapsed="0.000120"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.692477" elapsed="0.000157"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:11.693429" 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-10-11T01:04:11.692774" elapsed="0.000683"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:11.693503" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:11.693628" 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-10-11T01:04:11.679473" elapsed="0.014207"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:11.693738" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:04:11.693874" 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-10-11T01:04:11.635746" elapsed="0.058152"/>
</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-10-11T01:04:11.704403" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:11.704104" elapsed="0.000340"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:11.705151" 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-10-11T01:04:11.704933" elapsed="0.000334">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-10-11T01:04:11.705446" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:11.704603" elapsed="0.000867"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.705963" 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-10-11T01:04:11.705646" elapsed="0.000342"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:11.706260" 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-10-11T01:04:11.706375" 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-10-11T01:04:11.706153" elapsed="0.000247"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.706842" 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-10-11T01:04:11.706615" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:11.707241" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.706950" elapsed="0.000345"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.707937" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:11.707484" elapsed="0.000478"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.707317" elapsed="0.000677"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.706933" elapsed="0.001080"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.708589" 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-10-11T01:04:11.708175" elapsed="0.000440"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:11.708659" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:11.703592" elapsed="0.005165"/>
</kw>
<msg time="2026-10-11T01:04:11.708853" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:11.699225" elapsed="0.009676"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:11.713074" 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/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-10-11T01:04:11.717173" 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/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-10-11T01:04:11.722232" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.722431" 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-10-11T01:04:11.722626" 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-10-11T01:04:11.722979" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.722821" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:11.722807" 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-10-11T01:04:11.723206" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.723385" 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-10-11T01:04:11.723565" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:11.722782" elapsed="0.000831"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:11.722694" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.723789" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:11.723866" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:04:11.723994" 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-10-11T01:04:11.698516" elapsed="0.025503"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:11.724185" elapsed="0.000345"/>
</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-10-11T01:04:11.725658" 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-10-11T01:04:11.725177" elapsed="0.000537"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:11.726329" 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-10-11T01:04:11.725880" 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-10-11T01:04:11.726584" elapsed="0.000288"/>
</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-10-11T01:04:11.724804" elapsed="0.002123"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.724604" elapsed="0.002353"/>
</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-10-11T01:04:11.727157" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.726980" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.724587" elapsed="0.002638"/>
</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-10-11T01:04:11.694843" elapsed="0.032425"/>
</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-10-11T01:04:11.694173" elapsed="0.033159"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.693972" elapsed="0.033405"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.693956" elapsed="0.033441"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:11.727447" elapsed="0.000027"/>
</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-10-11T01:04:11.635114" elapsed="0.092434"/>
</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-10-11T01:04:11.633332" elapsed="0.094266"/>
</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-10-11T01:04:11.743334" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:11.743031" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:11.744042" 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-10-11T01:04:11.743868" elapsed="0.000233">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-10-11T01:04:11.744184" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:11.743535" elapsed="0.000671"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.744704" 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-10-11T01:04:11.744381" elapsed="0.000348"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:11.745036" 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-10-11T01:04:11.745150" 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-10-11T01:04:11.744926" elapsed="0.000248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.745603" 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-10-11T01:04:11.745368" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.746560" 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-10-11T01:04:11.746309" elapsed="0.000293"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.747041" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:11.746777" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.747876" 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-10-11T01:04:11.747429" elapsed="0.000472"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:11.749036" 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-10-11T01:04:11.748517" elapsed="0.000608"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:11.749205" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:04:11.749430" 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-10-11T01:04:11.748071" elapsed="0.001384"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:11.749631" elapsed="0.000317"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:04:11.747278" elapsed="0.002708"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.750678" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:11.750221" elapsed="0.000481"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:11.751847" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:11.751310" elapsed="0.000627"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:11.752016" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:04:11.752224" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:11.750884" elapsed="0.001364"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:11.752435" elapsed="0.000303"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:11.750089" elapsed="0.002687"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:11.747139" elapsed="0.005668"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:11.752856" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:11.753053" 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-10-11T01:04:11.745970" elapsed="0.007109"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.745705" elapsed="0.007404"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.753281" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.753131" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.745687" elapsed="0.007662"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.754081" 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-10-11T01:04:11.753578" elapsed="0.000529"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:11.754150" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:11.742515" elapsed="0.011735"/>
</kw>
<msg time="2026-10-11T01:04:11.754297" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:11.737954" elapsed="0.016386"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:11.758680" 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/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-10-11T01:04:11.762805" 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_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-10-11T01:04:11.766928" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.767111" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.767291" 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-10-11T01:04:11.767644" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.767499" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:11.767485" 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-10-11T01:04:11.767885" 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-10-11T01:04:11.768065" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.768227" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:11.767459" elapsed="0.000815"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:11.767356" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.768462" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:11.768529" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:11.768637" 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-10-11T01:04:11.737334" elapsed="0.031327"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:11.769764" 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-10-11T01:04:11.769578" elapsed="0.000255">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-10-11T01:04:11.769918" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:11.769237" elapsed="0.000704"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.770222" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.770004" elapsed="0.000269"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.770739" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:11.770475" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.770295" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.769987" elapsed="0.000828"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.771364" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:11.771025" elapsed="0.000364"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:11.771450" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:11.771576" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:11.768936" elapsed="0.002663"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:11.772679" 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-10-11T01:04:11.772494" elapsed="0.000243">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-10-11T01:04:11.772868" 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-10-11T01:04:11.772154" elapsed="0.000737"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:04:11.773052" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:04:11.772955" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.772938" elapsed="0.000190"/>
</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-10-11T01:04:11.773282" elapsed="0.000020"/>
</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-10-11T01:04:11.773471" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:04:11.773530" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:11.773654" 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-10-11T01:04:11.771855" elapsed="0.001823"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.774947" 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-10-11T01:04:11.774709" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.775394" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:11.775178" elapsed="0.000272"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:11.780751" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:11.780877" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:04:11.780977" 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-10-11T01:04:11.775734" elapsed="0.005267"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.775509" elapsed="0.005531"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.781215" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.781063" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.775493" elapsed="0.005799"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.782578" 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-10-11T01:04:11.782229" elapsed="0.000396"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.781989" elapsed="0.000667"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.781972" elapsed="0.000707"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.783253" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:11.782984" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.782728" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.782713" elapsed="0.000636"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.783909" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:11.783546" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.784209" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.783997" elapsed="0.000263"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.784759" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:11.784459" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.784282" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.783980" elapsed="0.000870"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.785363" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:11.785027" elapsed="0.000361"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.785682" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.785467" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.786453" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:11.786039" elapsed="0.000443"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.785781" elapsed="0.000742"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.785450" elapsed="0.001094"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:11.786703" elapsed="0.000325"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:11.787444" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:11.787191" elapsed="0.000278"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:11.787624" elapsed="0.000228"/>
</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-10-11T01:04:11.781636" elapsed="0.006276"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:11.788065" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:11.787979" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.787961" elapsed="0.000166"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:11.788985" 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-10-11T01:04:11.788270" elapsed="0.000742"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:11.789060" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:04:11.789194" 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-10-11T01:04:11.773967" elapsed="0.015253"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:11.789275" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:04:11.789398" 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-10-11T01:04:11.730065" elapsed="0.059372"/>
</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-10-11T01:04:11.800159" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:11.799854" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:11.800947" 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-10-11T01:04:11.800692" elapsed="0.000381">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-10-11T01:04:11.801238" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:11.800345" elapsed="0.000917"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.801816" 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-10-11T01:04:11.801457" elapsed="0.000398"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:11.802138" 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-10-11T01:04:11.802274" 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-10-11T01:04:11.802024" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.802732" 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-10-11T01:04:11.802510" elapsed="0.000270"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:11.803156" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.802854" elapsed="0.000356"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.803865" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:11.803382" elapsed="0.000509"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.803233" elapsed="0.000692"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.802836" elapsed="0.001109"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.804543" 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-10-11T01:04:11.804108" elapsed="0.000461"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:11.804613" 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/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-10-11T01:04:11.799315" elapsed="0.005399"/>
</kw>
<msg time="2026-10-11T01:04:11.804768" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:11.794927" elapsed="0.009887"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:11.808920" 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/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-10-11T01:04:11.813078" 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/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-10-11T01:04:11.817273" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.817499" 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-10-11T01:04:11.817685" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.818049" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.817902" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:11.817888" 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-10-11T01:04:11.818277" 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-10-11T01:04:11.818473" 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-10-11T01:04:11.818640" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:11.817861" elapsed="0.000827"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:11.817755" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.818880" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:11.818946" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:11.819072" 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-10-11T01:04:11.794189" elapsed="0.024908"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:11.819262" elapsed="0.000333"/>
</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-10-11T01:04:11.820714" 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-10-11T01:04:11.820237" elapsed="0.000504"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:11.821344" 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-10-11T01:04:11.820904" 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-10-11T01:04:11.821572" elapsed="0.000288"/>
</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-10-11T01:04:11.819877" elapsed="0.002038"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.819664" elapsed="0.002282"/>
</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-10-11T01:04:11.822149" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.821969" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.819647" elapsed="0.002571"/>
</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-10-11T01:04:11.790427" elapsed="0.031834"/>
</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-10-11T01:04:11.789727" elapsed="0.032598"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.789512" elapsed="0.032852"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.789495" elapsed="0.032890"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:11.822434" elapsed="0.000027"/>
</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-10-11T01:04:11.729449" elapsed="0.093088"/>
</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-10-11T01:04:11.727784" elapsed="0.094837"/>
</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-10-11T01:04:11.822774" elapsed="0.002697"/>
</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-10-11T01:04:11.841244" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:11.840943" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:11.841956" 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-10-11T01:04:11.841764" elapsed="0.000252">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-10-11T01:04:11.842101" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:11.841445" elapsed="0.000678"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.842628" 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-10-11T01:04:11.842296" elapsed="0.000357"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:11.842946" 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-10-11T01:04:11.843068" 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-10-11T01:04:11.842819" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.843531" 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-10-11T01:04:11.843290" 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-10-11T01:04:11.844486" 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-10-11T01:04:11.844243" elapsed="0.000284"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.844965" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:11.844704" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.845765" 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-10-11T01:04:11.845306" elapsed="0.000483"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:11.846939" 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-10-11T01:04:11.846399" elapsed="0.000628"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:11.847107" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:04:11.847319" 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-10-11T01:04:11.845971" 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-10-11T01:04:11.847528" elapsed="0.000322"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:04:11.845170" elapsed="0.002718"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.848653" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:11.848116" elapsed="0.000561"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:11.849840" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:11.849289" elapsed="0.000640"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:11.850008" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:04:11.850217" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:11.848860" 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-10-11T01:04:11.850404" elapsed="0.000385"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:11.847986" elapsed="0.002881"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:11.845031" elapsed="0.005871"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:11.850941" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:11.851072" 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-10-11T01:04:11.843894" elapsed="0.007201"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.843633" elapsed="0.007492"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.851296" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.851147" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.843616" elapsed="0.007749"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.852092" 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-10-11T01:04:11.851577" elapsed="0.000542"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:11.852162" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:11.840429" elapsed="0.011831"/>
</kw>
<msg time="2026-10-11T01:04:11.852307" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:11.836008" elapsed="0.016343"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:11.856656" 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/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-10-11T01:04:11.860836" 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/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-10-11T01:04:11.864964" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.865147" 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-10-11T01:04:11.865328" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.865682" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.865536" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:11.865523" 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-10-11T01:04:11.865939" 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-10-11T01:04:11.866120" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.866282" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:11.865497" elapsed="0.000837"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:11.865392" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.866565" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:11.866633" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:11.866739" 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-10-11T01:04:11.835338" elapsed="0.031425"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:11.867879" 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-10-11T01:04:11.867682" elapsed="0.000257">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-10-11T01:04:11.868023" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:11.867343" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.868327" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.868109" elapsed="0.000269"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.868861" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:11.868588" elapsed="0.000298"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.868400" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.868092" elapsed="0.000845"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.869458" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:11.869096" elapsed="0.000386"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:11.869527" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:11.869648" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:11.867044" elapsed="0.002626"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:11.870710" 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-10-11T01:04:11.870567" elapsed="0.000191"/>
</kw>
<msg time="2026-10-11T01:04:11.870845" 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-10-11T01:04:11.870232" elapsed="0.000636"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:04:11.871027" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:11.870932" elapsed="0.000135"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.870915" elapsed="0.000171"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:11.871365" 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-10-11T01:04:11.871495" 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-10-11T01:04:11.871242" elapsed="0.000276"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:04:11.871874" 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-10-11T01:04:11.871680" elapsed="0.000217"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:04:11.871938" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:04:11.872060" 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-10-11T01:04:11.869935" elapsed="0.002147"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.873342" 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-10-11T01:04:11.873117" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.873858" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:11.873628" elapsed="0.000270"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:11.878982" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:11.879104" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:04:11.879195" 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-10-11T01:04:11.874187" elapsed="0.005032"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.873958" elapsed="0.005299"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.879458" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.879281" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.873941" elapsed="0.005598"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.880790" 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-10-11T01:04:11.880458" elapsed="0.000394"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.880199" elapsed="0.000686"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.880183" elapsed="0.000724"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.881487" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:11.881200" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.880956" elapsed="0.000603"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.880941" elapsed="0.000640"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.882117" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:11.881759" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.882429" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.882203" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.882938" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:11.882666" elapsed="0.000297"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.882504" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.882187" elapsed="0.000827"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.883534" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:11.883188" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.883842" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.883621" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.884343" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:11.884079" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.883916" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.883605" elapsed="0.000833"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:11.884581" elapsed="0.000299"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:11.885296" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:11.885074" elapsed="0.000246"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:11.885487" elapsed="0.000211"/>
</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-10-11T01:04:11.879868" elapsed="0.005885"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:11.885907" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:11.885814" elapsed="0.000133"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.885797" elapsed="0.000169"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:11.886852" 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-10-11T01:04:11.886106" elapsed="0.000773"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:11.886925" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:11.887048" 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-10-11T01:04:11.872359" elapsed="0.014713"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:11.887126" elapsed="0.000023"/>
</return>
<msg time="2026-10-11T01:04:11.887244" 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-10-11T01:04:11.828125" elapsed="0.059142"/>
</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-10-11T01:04:11.897880" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:11.897567" elapsed="0.000339"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:11.898608" 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-10-11T01:04:11.898377" elapsed="0.000349">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-10-11T01:04:11.898898" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:11.898063" elapsed="0.000858"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.899403" 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-10-11T01:04:11.899097" elapsed="0.000351"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:11.899721" 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-10-11T01:04:11.899848" 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-10-11T01:04:11.899613" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.900292" 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-10-11T01:04:11.900074" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:11.900713" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.900393" elapsed="0.000375"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.901394" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:11.900952" elapsed="0.000514"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:11.900790" elapsed="0.000712"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:11.900376" elapsed="0.001145"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.902085" 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-10-11T01:04:11.901685" elapsed="0.000426"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:11.902154" 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/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-10-11T01:04:11.897050" elapsed="0.005203"/>
</kw>
<msg time="2026-10-11T01:04:11.902300" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:11.892649" elapsed="0.009695"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:11.906474" 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/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-10-11T01:04:11.910537" 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/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-10-11T01:04:11.914758" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.914953" 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-10-11T01:04:11.915134" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.915485" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.915326" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:11.915313" 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-10-11T01:04:11.915737" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.915927" 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-10-11T01:04:11.916092" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:11.915288" elapsed="0.000851"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:11.915199" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:11.916312" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:11.916377" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:11.916496" 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-10-11T01:04:11.891940" elapsed="0.024610"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:11.916720" elapsed="0.000346"/>
</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-10-11T01:04:11.917968" 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-10-11T01:04:11.917712" elapsed="0.000283"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:11.918742" 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-10-11T01:04:11.918144" elapsed="0.000624"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:04:11.919238" 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-10-11T01:04:11.919458" 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-10-11T01:04:11.918967" elapsed="0.000567">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-10-11T01:04:11.917334" elapsed="0.002351">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-10-11T01:04:11.917135" elapsed="0.002628">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-10-11T01:04:11.920033" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:11.919837" elapsed="0.000248"/>
</branch>
<status status="FAIL" start="2026-10-11T01:04:11.917118" elapsed="0.002988">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-10-11T01:04:11.888221" elapsed="0.032014">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-10-11T01:04:11.887567" elapsed="0.032813">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-10-11T01:04:11.887339" elapsed="0.033152">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-10-11T01:04:11.887323" elapsed="0.033202">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-10-11T01:04:11.920571" elapsed="0.000015"/>
</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-10-11T01:04:11.827358" elapsed="0.093337">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-10-11T01:04:13.955921" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:13.955168" elapsed="0.000820"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:13.957616" 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-10-11T01:04:13.957126" elapsed="0.000635">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-10-11T01:04:13.957974" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:13.956353" elapsed="0.001673"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:13.959161" 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-10-11T01:04:13.958440" elapsed="0.000778"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:13.959890" 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-10-11T01:04:13.960225" 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-10-11T01:04:13.959619" elapsed="0.000660"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:13.961262" 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-10-11T01:04:13.960754" elapsed="0.000603"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:13.963661" 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-10-11T01:04:13.963108" elapsed="0.000645"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:13.964765" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:13.964171" elapsed="0.000667"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:13.966620" 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-10-11T01:04:13.965595" elapsed="0.001060"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:13.968315" 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-10-11T01:04:13.967573" elapsed="0.000890"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:13.968581" elapsed="0.000104"/>
</return>
<msg time="2026-10-11T01:04:13.968967" 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-10-11T01:04:13.966907" elapsed="0.002093"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:13.969234" elapsed="0.000483"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:04:13.965249" elapsed="0.004521"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:13.970750" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:13.970112" elapsed="0.000672"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:13.972788" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:13.971728" elapsed="0.001198"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:13.973040" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T01:04:13.973327" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:13.971036" elapsed="0.002324"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:13.973624" elapsed="0.002071"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:13.969923" elapsed="0.005828"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:13.964939" elapsed="0.010857"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:13.975866" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T01:04:13.976052" 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-10-11T01:04:13.962267" elapsed="0.013819"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:13.961683" elapsed="0.014443"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:13.976525" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:13.976224" elapsed="0.000377"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:13.961490" elapsed="0.015139"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:13.977614" 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-10-11T01:04:13.976870" elapsed="0.000782"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:13.977714" 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/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-10-11T01:04:13.953987" elapsed="0.023883"/>
</kw>
<msg time="2026-10-11T01:04:13.977938" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:13.944069" elapsed="0.033933"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:13.983754" 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/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-10-11T01:04:13.989470" 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-10-11T01:04:13.995163" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:13.995434" 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-10-11T01:04:13.995697" 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-10-11T01:04:13.996189" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:13.995983" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:13.995963" elapsed="0.000325"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:13.996532" 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-10-11T01:04:13.996797" elapsed="0.000093"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:13.997099" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:13.995927" elapsed="0.001238"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:13.995789" elapsed="0.001408"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:13.997426" elapsed="0.000028"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:13.997522" elapsed="0.000020"/>
</return>
<msg time="2026-10-11T01:04:13.997672" 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-10-11T01:04:13.942652" elapsed="0.055095"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:13.999319" 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-10-11T01:04:13.999059" 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-10-11T01:04:13.999544" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:13.998583" elapsed="0.000993"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:13.999988" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:13.999664" elapsed="0.000397"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.000729" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:14.000340" elapsed="0.000423"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:14.000091" elapsed="0.000717"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:13.999640" elapsed="0.001213"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.001568" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:14.001080" elapsed="0.000521"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:14.001663" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T01:04:14.001848" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:13.998141" elapsed="0.003740"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:14.003375" 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-10-11T01:04:14.003177" elapsed="0.000286"/>
</kw>
<msg time="2026-10-11T01:04:14.003569" 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-10-11T01:04:14.002714" elapsed="0.000886"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:04:14.003839" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:14.003689" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.003664" elapsed="0.000261"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:14.004348" 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-10-11T01:04:14.004538" 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-10-11T01:04:14.004169" elapsed="0.000402"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:04:14.005066" 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-10-11T01:04:14.004795" elapsed="0.000304"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:04:14.005157" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T01:04:14.005328" 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-10-11T01:04:14.002225" elapsed="0.003134"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.007043" 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-10-11T01:04:14.006788" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.007503" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:14.007276" elapsed="0.000268"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:14.061098" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:14.061306" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:04:14.061438" 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-10-11T01:04:14.055731" elapsed="0.005735"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:14.007603" elapsed="0.053910"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.061706" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.061542" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.007586" elapsed="0.054201"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.063192" 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-10-11T01:04:14.062825" elapsed="0.000412"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:14.062551" elapsed="0.000719"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.062533" elapsed="0.000760"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.063895" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:14.063610" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:14.063345" elapsed="0.000625"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.063329" elapsed="0.000664"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.064567" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:14.064184" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.064885" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.064658" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.065391" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:14.065125" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:14.064960" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.064640" elapsed="0.000847"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.066010" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:14.065662" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.066311" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.066100" elapsed="0.000263"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.066877" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:14.066565" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:14.066385" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.066083" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:14.067105" elapsed="0.000296"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:14.067864" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:14.067582" 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-10-11T01:04:14.068049" elapsed="0.000215"/>
</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-10-11T01:04:14.062160" elapsed="0.006161"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:14.068487" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:14.068386" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.068369" elapsed="0.000183"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:14.069168" 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-10-11T01:04:14.068695" elapsed="0.000500"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:14.069241" elapsed="0.000034"/>
</return>
<msg time="2026-10-11T01:04:14.069375" 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-10-11T01:04:14.005760" elapsed="0.063692"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:14.069511" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:04:14.069635" 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-10-11T01:04:13.926023" elapsed="0.143636"/>
</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-10-11T01:04:14.080456" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:14.080132" elapsed="0.000353"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:14.081250" 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-10-11T01:04:14.080988" 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-10-11T01:04:14.081574" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:14.080650" elapsed="0.000949"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.082104" 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-10-11T01:04:14.081777" elapsed="0.000352"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:14.082427" 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-10-11T01:04:14.082580" 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-10-11T01:04:14.082300" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.083032" 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-10-11T01:04:14.082801" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:14.083459" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.083139" elapsed="0.000375"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.084163" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:14.083691" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:14.083537" elapsed="0.000684"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.083120" elapsed="0.001121"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.084839" 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-10-11T01:04:14.084426" elapsed="0.000441"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:14.084912" 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-10-11T01:04:14.079614" elapsed="0.005401"/>
</kw>
<msg time="2026-10-11T01:04:14.085063" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:14.075184" elapsed="0.009924"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:14.089417" 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-10-11T01:04:14.093560" 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/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-10-11T01:04:14.097638" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.097833" 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-10-11T01:04:14.098018" 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-10-11T01:04:14.098374" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.098225" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:14.098211" 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-10-11T01:04:14.098618" 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-10-11T01:04:14.098799" 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-10-11T01:04:14.098976" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:14.098184" elapsed="0.000840"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:14.098090" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.099201" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:14.099267" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:14.099371" 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-10-11T01:04:14.074311" elapsed="0.025086"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:14.099581" elapsed="0.000325"/>
</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-10-11T01:04:14.100803" 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-10-11T01:04:14.100550" elapsed="0.000294"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:14.101257" 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-10-11T01:04:14.100995" elapsed="0.000288"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:04:14.101479" elapsed="0.000276"/>
</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-10-11T01:04:14.100175" elapsed="0.001634"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:14.099975" elapsed="0.001878"/>
</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-10-11T01:04:14.102051" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.101876" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.099959" elapsed="0.002161"/>
</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-10-11T01:04:14.070741" elapsed="0.031422"/>
</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-10-11T01:04:14.069954" elapsed="0.032276"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:14.069733" elapsed="0.032537"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.069717" elapsed="0.032574"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:14.102322" elapsed="0.000026"/>
</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-10-11T01:04:13.924333" elapsed="0.178108"/>
</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-10-11T01:04:11.825659" elapsed="2.276837"/>
</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-10-11T01:04:14.102696" elapsed="0.002606"/>
</kw>
<arg>intra_vrf</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-10-11T01:04:09.426287" elapsed="4.679070"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:09.345455" elapsed="4.760026"/>
</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-10-11T01:04:14.107099" elapsed="0.000563"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:04:14.106846" elapsed="0.000967"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:14.108741" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:14.108653" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.108635" elapsed="0.000168"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:14.110946" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:14.110863" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.110846" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.111930" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:14.111594" elapsed="0.000361"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.112367" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:04:14.112108" elapsed="0.000283"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:04:14.112448" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:04:14.112580" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:04:14.111214" elapsed="0.001389"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:14.115101" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:14.115017" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.115000" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:14.116209" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:14.116126" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.116109" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:14.116610" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:04:14.116438" elapsed="0.000226"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:14.116990" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:14.116845" elapsed="0.000169"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:04:14.149639" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:04:14.117524" elapsed="0.032206"/>
</kw>
<msg time="2026-10-11T01:04:14.149893" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:04:14.149935" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:14.117171" elapsed="0.032798"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:04:14.182639" 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-10-11T01:04:14.150517" elapsed="0.032220"/>
</kw>
<msg time="2026-10-11T01:04:14.182897" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:04:14.182938" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:14.150157" elapsed="0.032815"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.183250" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.183041" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.183023" elapsed="0.000297"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.183747" 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-10-11T01:04:14.183522" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.184080" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.183881" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.183864" elapsed="0.000287"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:04:14.184180" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:14.186798" elapsed="0.000132"/>
</kw>
<msg time="2026-10-11T01:04:14.186987" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:14.185562" elapsed="0.001558"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.187451" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.187925" 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-10-11T01:04:14.184967" elapsed="0.003154"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:04:14.184484" 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-10-11T01:04:14.115871" elapsed="0.072383"/>
</kw>
<msg time="2026-10-11T01:04:14.188334" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:14.188373" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:14.115315" elapsed="0.073120"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:04:14.188598" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:04:14.188512" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.188486" elapsed="0.000189"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.189011" elapsed="0.000022"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.189311" elapsed="0.000051"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:04:14.189424" 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-10-11T01:04:14.114702" elapsed="0.074812"/>
</kw>
<msg time="2026-10-11T01:04:14.189596" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:14.189636" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:14.112944" elapsed="0.076725"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.189965" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.189735" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.189719" elapsed="0.000316"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:04:14.112787" elapsed="0.077270"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:04:14.112649" elapsed="0.077434"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:04:14.110559" elapsed="0.079572"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:04:14.108381" elapsed="0.081798"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:14.107983" elapsed="0.082236"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:04:14.106439" elapsed="0.083826"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:14.191115" 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-10-11T01:04:14.191249" 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-10-11T01:04:14.190974" elapsed="0.000300"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:04:14.191634" 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-10-11T01:04:14.191451" elapsed="0.000208"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:14.191988" 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-10-11T01:04:14.192105" 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-10-11T01:04:14.191852" elapsed="0.000277"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:04:14.192470" 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-10-11T01:04:14.192287" elapsed="0.000207"/>
</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-10-11T01:04:14.192739" elapsed="0.002223"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:14.192557" elapsed="0.002438"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.192540" elapsed="0.002478"/>
</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-10-11T01:04:14.205664" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:14.205346" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:14.206431" 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-10-11T01:04:14.206213" elapsed="0.000284">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-10-11T01:04:14.206583" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:14.205892" elapsed="0.000714"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.207137" 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-10-11T01:04:14.206811" elapsed="0.000352"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:14.207453" 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-10-11T01:04:14.207573" 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-10-11T01:04:14.207329" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.208024" 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-10-11T01:04:14.207791" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.208983" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:04:14.208740" elapsed="0.000283"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.209469" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:14.209199" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.210088" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:14.209807" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:14.210988" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:14.210614" elapsed="0.000399"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:14.211058" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:04:14.211184" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:14.210282" elapsed="0.000924"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:14.211373" elapsed="0.000201"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:04:14.209675" elapsed="0.001936"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.212117" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:14.211851" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:14.213014" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:14.212644" elapsed="0.000395"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:14.213084" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:14.213209" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:14.212310" elapsed="0.000922"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:14.213394" elapsed="0.000192"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:14.211710" elapsed="0.001913"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:14.209537" elapsed="0.004118"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:14.213693" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:14.213832" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:14.208379" elapsed="0.005477"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:14.208126" elapsed="0.005760"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.214058" elapsed="0.000166"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.213909" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.208109" elapsed="0.006168"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.214997" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:14.214466" elapsed="0.000558"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:14.215068" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:14.204842" elapsed="0.010325"/>
</kw>
<msg time="2026-10-11T01:04:14.215246" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:14.200518" elapsed="0.014774"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:14.219455" 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/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-10-11T01:04:14.223557" 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/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-10-11T01:04:14.227652" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.227847" 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-10-11T01:04:14.228032" 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-10-11T01:04:14.228369" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.228223" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:14.228209" 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-10-11T01:04:14.228615" 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-10-11T01:04:14.228794" 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-10-11T01:04:14.228975" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:14.228184" elapsed="0.000838"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:14.228098" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.229197" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:14.229262" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:14.229368" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:14.199906" elapsed="0.029487"/>
</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-10-11T01:04:14.238320" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:14.238021" elapsed="0.000325"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:14.239017" 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-10-11T01:04:14.238846" elapsed="0.000260">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-10-11T01:04:14.239191" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:14.238518" elapsed="0.000696"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.239706" 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-10-11T01:04:14.239385" elapsed="0.000346"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:14.240021" 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-10-11T01:04:14.240141" 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-10-11T01:04:14.239912" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.240598" 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-10-11T01:04:14.240365" 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-10-11T01:04:14.240979" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.240718" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.241479" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', '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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:14.241200" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:14.241055" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.240700" elapsed="0.000862"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.242116" 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-10-11T01:04:14.241723" elapsed="0.000421"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:14.242187" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:14.237511" elapsed="0.004776"/>
</kw>
<msg time="2026-10-11T01:04:14.242338" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:14.233188" elapsed="0.009193"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:14.246619" 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/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-10-11T01:04:14.250699" 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/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-10-11T01:04:14.254814" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.255008" 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-10-11T01:04:14.255189" 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-10-11T01:04:14.255539" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.255379" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:14.255365" 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-10-11T01:04:14.255767" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.255978" 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-10-11T01:04:14.256143" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:14.255341" elapsed="0.000849"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:14.255254" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.256364" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:14.256447" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:04:14.256567" 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-10-11T01:04:14.232475" elapsed="0.024119"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:14.257712" 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-10-11T01:04:14.257520" elapsed="0.000251">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-10-11T01:04:14.257869" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:14.257182" elapsed="0.000710"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.258181" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.257954" elapsed="0.000277"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.258701" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:14.258436" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:14.258253" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.257937" elapsed="0.000839"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.259284" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:14.258949" elapsed="0.000359"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:14.259352" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:14.259491" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:14.256884" elapsed="0.002630"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.260836" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:14.260601" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.261321" 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-10-11T01:04:14.261108" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.261814" 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-10-11T01:04:14.261596" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.262270" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:14.262057" elapsed="0.000253"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:14.263038" 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-10-11T01:04:14.262876" elapsed="0.000187"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:04:14.263359" 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-10-11T01:04:14.263216" elapsed="0.000166"/>
</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-10-11T01:04:14.263559" elapsed="0.000154"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.264144" 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-10-11T01:04:14.263923" elapsed="0.000261"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:04:14.264222" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:14.264347" 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-10-11T01:04:14.262506" elapsed="0.001864"/>
</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-10-11T01:04:14.274049" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.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-10-11T01:04:14.274112" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:14.274195" 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-10-11T01:04:14.264680" elapsed="0.009539"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:14.264447" elapsed="0.009813"/>
</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-10-11T01:04:14.274463" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.274284" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.264430" elapsed="0.010115"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.275772" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:14.275497" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:14.275235" elapsed="0.000650"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.275218" elapsed="0.000694"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.276482" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:14.276200" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:14.275963" elapsed="0.000601"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.275948" elapsed="0.000638"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.277122" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:14.276767" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.277435" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.277209" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.277965" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:14.277673" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:14.277510" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.277193" elapsed="0.000850"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.278566" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:14.278219" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.278876" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.278654" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.279367" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:14.279109" elapsed="0.000282"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:14.278949" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.278637" elapsed="0.000824"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:14.279607" elapsed="0.000300"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:14.280289" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:14.280067" elapsed="0.000246"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:14.280480" elapsed="0.000211"/>
</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-10-11T01:04:14.274883" elapsed="0.005863"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:04:14.280904" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:04:14.280809" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.280792" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.281200" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:04:14.281262" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:04:14.281437" 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-10-11T01:04:14.259802" elapsed="0.021660"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:14.281521" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:04:14.281654" 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-10-11T01:04:14.195937" elapsed="0.085741"/>
</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-10-11T01:04:14.281988" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.281771" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.281753" elapsed="0.000354"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:14.282142" elapsed="0.000028"/>
</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-10-11T01:04:14.195243" elapsed="0.087037"/>
</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-10-11T01:04:14.285789" level="INFO">${update} = ffffffffffffffffffffffffffffffff0051020000003a400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac010080009004100000000</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:04:14.283257" elapsed="0.002575"/>
</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-10-11T01:04:14.285990" elapsed="0.000317"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:04:14.286351" elapsed="0.000027"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:04:14.282988" elapsed="0.003488"/>
</kw>
<msg time="2026-10-11T01:04:14.286545" 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-10-11T01:04:14.282503" elapsed="0.004066"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.287356" level="INFO">Length is 162.</msg>
<msg time="2026-10-11T01:04:14.287445" 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-10-11T01:04:14.287112" elapsed="0.000356"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.287878" level="INFO">Length is 162.</msg>
<msg time="2026-10-11T01:04:14.287945" 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-10-11T01:04:14.287636" elapsed="0.000331"/>
</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-10-11T01:04:14.288150" elapsed="0.000291"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:04:14.288751" 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-10-11T01:04:14.288592" elapsed="0.000184"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:04:14.289083" 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-10-11T01:04:14.288932" elapsed="0.000175"/>
</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-10-11T01:04:14.289288" elapsed="0.000295"/>
</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-10-11T01:04:14.286764" elapsed="0.002873"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:04:14.289779" elapsed="0.002475"/>
</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-10-11T01:04:14.306228" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:14.305927" elapsed="0.000327"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:14.306954" 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-10-11T01:04:14.306747" elapsed="0.000273">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-10-11T01:04:14.307103" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:14.306428" elapsed="0.000697"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.307629" 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-10-11T01:04:14.307299" elapsed="0.000355"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:14.307943" 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-10-11T01:04:14.308069" 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-10-11T01:04:14.307833" elapsed="0.000261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.308522" 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-10-11T01:04:14.308288" 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-10-11T01:04:14.309535" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:04:14.309289" elapsed="0.000287"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.310076" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:14.309752" elapsed="0.000348"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.310876" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:14.310438" elapsed="0.000463"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:14.312076" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:14.311499" elapsed="0.000658"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:14.312291" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:04:14.312474" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:14.311073" elapsed="0.001425"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:14.312667" elapsed="0.000327"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:04:14.310290" elapsed="0.002743"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.313690" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:14.313267" elapsed="0.000447"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:14.314775" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:14.314302" elapsed="0.000564"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:14.314997" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:04:14.315163" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:14.313900" elapsed="0.001286"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:14.315351" elapsed="0.000319"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:14.313136" elapsed="0.002572"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:14.310146" elapsed="0.005594"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:14.315780" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:04:14.315923" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:14.308949" elapsed="0.006998"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:14.308682" elapsed="0.007293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.316146" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.315997" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.308664" elapsed="0.007552"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.316991" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:14.316376" elapsed="0.000642"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:14.317061" 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/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-10-11T01:04:14.305401" elapsed="0.011761"/>
</kw>
<msg time="2026-10-11T01:04:14.317211" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:14.301047" elapsed="0.016208"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:14.321483" 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/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-10-11T01:04:14.326628" 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/app.vanadium/${file_name} exists. 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-10-11T01:04:14.331230" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.331431" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.331618" 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-10-11T01:04:14.331981" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.331830" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:14.331803" 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-10-11T01:04:14.332213" 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-10-11T01:04:14.332394" 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-10-11T01:04:14.332576" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:14.331776" elapsed="0.000849"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:14.331686" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.332804" elapsed="0.000032"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:14.332886" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:04:14.332998" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:14.300424" elapsed="0.032600"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.334056" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:14.333814" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:14.340464" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:14.340510" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:14.340591" 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-10-11T01:04:14.334394" elapsed="0.006221"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:14.334161" elapsed="0.006490"/>
</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-10-11T01:04:14.340839" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.340675" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.334145" elapsed="0.006816"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.342177" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:14.341901" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:14.341648" elapsed="0.000600"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.341631" elapsed="0.000639"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.343027" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:14.342578" elapsed="0.000491"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:14.342319" elapsed="0.000782"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.342304" elapsed="0.000820"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.343687" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:14.343316" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.344012" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.343776" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.344529" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:14.344250" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:14.344087" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.343760" elapsed="0.000846"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.345130" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:14.344780" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.345439" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.345217" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.345951" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:14.345681" elapsed="0.000294"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:14.345519" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.345201" elapsed="0.000825"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:14.346169" elapsed="0.000305"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:14.346871" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:14.346633" elapsed="0.000262"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:14.347049" elapsed="0.000210"/>
</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-10-11T01:04:14.341294" elapsed="0.006020"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:04:14.347355" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:04:14.347546" 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-10-11T01:04:14.333263" elapsed="0.014307"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:14.347617" elapsed="0.000025"/>
</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-10-11T01:04:14.293198" elapsed="0.054515"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:14.292799" elapsed="0.054962"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:04:14.292450" elapsed="0.055364"/>
</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-10-11T01:04:14.351075" level="INFO">${update} = ffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac010080009004100000000</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:04:14.348702" elapsed="0.002400"/>
</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-10-11T01:04:14.351258" elapsed="0.000326"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:04:14.351628" elapsed="0.000026"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:04:14.348445" elapsed="0.003280"/>
</kw>
<msg time="2026-10-11T01:04:14.351792" 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-10-11T01:04:14.348006" elapsed="0.003854"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.352649" level="INFO">Length is 150.</msg>
<msg time="2026-10-11T01:04:14.352716" 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-10-11T01:04:14.352383" elapsed="0.000355"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.353132" level="INFO">Length is 150.</msg>
<msg time="2026-10-11T01:04:14.353199" 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-10-11T01:04:14.352905" elapsed="0.000315"/>
</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-10-11T01:04:14.353401" elapsed="0.000289"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:04:14.354003" 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-10-11T01:04:14.353850" elapsed="0.000177"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:04:14.354318" 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-10-11T01:04:14.354169" elapsed="0.000172"/>
</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-10-11T01:04:14.354545" elapsed="0.000263"/>
</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-10-11T01:04:14.352055" elapsed="0.002821"/>
</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-10-11T01:04:14.370156" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:14.369850" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:14.370905" 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-10-11T01:04:14.370684" elapsed="0.000285">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-10-11T01:04:14.371052" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:14.370345" elapsed="0.000730"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.371572" 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-10-11T01:04:14.371248" elapsed="0.000349"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:14.371885" 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-10-11T01:04:14.372012" 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-10-11T01:04:14.371764" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.372462" 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-10-11T01:04:14.372230" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.373435" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:04:14.373191" elapsed="0.000286"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.373915" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:14.373653" elapsed="0.000286"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.374738" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:14.374253" elapsed="0.000509"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:14.375802" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:14.375352" elapsed="0.000510"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:14.375975" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:04:14.376154" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:14.374946" elapsed="0.001232"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:14.376376" elapsed="0.000303"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:04:14.374122" elapsed="0.002595"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.377428" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:14.376961" elapsed="0.000493"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:14.378492" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:14.378050" elapsed="0.000481"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:14.378640" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:04:14.378826" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:14.377634" elapsed="0.001217"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:14.379017" elapsed="0.000269"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:14.376829" elapsed="0.002494"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:14.373982" elapsed="0.005373"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:14.379392" elapsed="0.000085"/>
</return>
<msg time="2026-10-11T01:04:14.379582" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:14.372827" elapsed="0.006778"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:14.372566" elapsed="0.007068"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.379806" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.379657" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.372548" elapsed="0.007339"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.380757" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:14.380046" elapsed="0.000738"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:14.380840" 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/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-10-11T01:04:14.369288" elapsed="0.011655"/>
</kw>
<msg time="2026-10-11T01:04:14.380990" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:14.364904" elapsed="0.016141"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:14.385191" 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/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-10-11T01:04:14.389355" 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/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-10-11T01:04:14.393574" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.393789" 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-10-11T01:04:14.393989" 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-10-11T01:04:14.394328" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.394181" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:14.394167" 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-10-11T01:04:14.394579" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.394759" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.394935" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:14.394141" elapsed="0.000842"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:14.394054" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.395159" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:14.395224" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:14.395331" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:14.364231" elapsed="0.031124"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.396585" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:14.396344" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:14.401791" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:14.402089" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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+xml', 'Content-Length': '635'} 
 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-path xmlns:a="urn:opendaylight:params:xml:ns:yang:bgp-rib" xmlns:b="urn:opendaylight:params:xml:ns:yang:bgp-types" xmlns:c="urn:opendaylight:params:xml:ns:yang:bgp:mvpn" xmlns:d="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;/a:application-rib[a:id='10.30.170.173']/a:tables[a:afi='b:ipv4-address-family'][a:safi='c:mcast-vpn-subsequent-address-family']/d:mvpn-routes-ipv4&lt;/error-path&gt;&lt;error-message&gt;Data does not exist&lt;/error-message&gt;&lt;error-tag&gt;data-missing&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-10-11T01:04:14.402226" level="INFO">${response} = None</msg>
<msg time="2026-10-11T01:04:14.402265" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:14.396926" elapsed="0.005713">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:14.396688" elapsed="0.006025">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:14.402909" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.402744" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-10-11T01:04:14.396671" elapsed="0.006315">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:14.404246" 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-10-11T01:04:14.403976" elapsed="0.000302">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:04:14.403724" elapsed="0.000610">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:04:14.403707" elapsed="0.000656">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-10-11T01:04:14.404955" 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-10-11T01:04:14.404680" elapsed="0.000305">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:04:14.404441" elapsed="0.000600">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:04:14.404424" elapsed="0.000646">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.405764" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:14.405261" elapsed="0.000529"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.406084" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.405869" elapsed="0.000269"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.406610" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:14.406325" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:14.406160" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.405851" elapsed="0.000837"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.407217" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:14.406877" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.407530" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.407305" elapsed="0.000277"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.408044" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:14.407767" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:14.407604" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.407288" elapsed="0.000832"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:14.408267" elapsed="0.000309"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:14.408971" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:14.408737" elapsed="0.000258"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-10-11T01:04:14.409310" 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-10-11T01:04:14.409149" elapsed="0.000190">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-10-11T01:04:14.403345" elapsed="0.006133">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-10-11T01:04:14.409537" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:14.409787" level="INFO">${response_text} = None</msg>
<msg time="2026-10-11T01:04:14.409814" 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-10-11T01:04:14.395603" elapsed="0.014249">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-10-11T01:04:14.409910" elapsed="0.000024"/>
</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-10-11T01:04:14.355843" elapsed="0.054203">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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:14.355441" elapsed="0.054691"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:04:14.355075" elapsed="0.055112"/>
</kw>
<arg>intra_source_as</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-10-11T01:04:14.190613" elapsed="0.219617"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:14.105922" elapsed="0.304409"/>
</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-10-11T01:04:14.411768" elapsed="0.000215"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:04:14.411402" elapsed="0.000631"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:14.412979" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:14.412890" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.412872" elapsed="0.000169"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:14.415396" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:14.415310" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.415293" elapsed="0.000182"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.416385" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:14.416058" elapsed="0.000367"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.416856" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:04:14.416581" elapsed="0.000300"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:04:14.416922" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:14.417050" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:04:14.415683" elapsed="0.001390"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:14.419571" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:14.419478" elapsed="0.000135"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.419461" elapsed="0.000172"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:14.420672" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:14.420589" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.420572" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:14.421062" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:04:14.420893" elapsed="0.000193"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:14.421392" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:14.421252" elapsed="0.000180"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:04:14.453745" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:04:14.421939" elapsed="0.031907"/>
</kw>
<msg time="2026-10-11T01:04:14.453997" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:04:14.454055" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:14.421597" elapsed="0.032493"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:04:14.487264" 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-10-11T01:04:14.454626" elapsed="0.032734"/>
</kw>
<msg time="2026-10-11T01:04:14.487532" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:04:14.487573" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:14.454258" elapsed="0.033348"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.487922" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.487673" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.487656" elapsed="0.000341"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.488403" 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-10-11T01:04:14.488178" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.488747" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.488546" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.488530" elapsed="0.000298"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:04:14.488860" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:14.491619" elapsed="0.000124"/>
</kw>
<msg time="2026-10-11T01:04:14.491827" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:14.490205" elapsed="0.001767"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.492285" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.492653" 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-10-11T01:04:14.489613" 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-10-11T01:04:14.489135" elapsed="0.003784"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:04:14.420314" elapsed="0.072680"/>
</kw>
<msg time="2026-10-11T01:04:14.493079" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:14.493119" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:14.419784" elapsed="0.073370"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:04:14.493318" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T01:04:14.493228" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.493208" elapsed="0.000189"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.493926" 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-10-11T01:04:14.494233" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:04:14.494298" 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-10-11T01:04:14.419178" elapsed="0.075206"/>
</kw>
<msg time="2026-10-11T01:04:14.494552" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:14.494593" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:14.417400" elapsed="0.077228"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.494931" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.494696" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.494679" elapsed="0.000324"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:04:14.417256" elapsed="0.077769"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:04:14.417119" elapsed="0.077934"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:04:14.415009" elapsed="0.080093"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:04:14.412590" elapsed="0.082565"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:14.412184" elapsed="0.083013"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:04:14.411060" elapsed="0.084186"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.496376" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:14.495963" elapsed="0.000454"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.497008" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:14.496605" elapsed="0.000429"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.497581" 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-10-11T01:04:14.497219" elapsed="0.000388"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:14.497938" 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-10-11T01:04:14.498090" 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-10-11T01:04:14.497778" elapsed="0.000337"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:14.498432" 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-10-11T01:04:14.498592" 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-10-11T01:04:14.498280" elapsed="0.000337"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:04:14.498763" elapsed="0.002398"/>
</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-10-11T01:04:14.501309" elapsed="0.002416"/>
</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-10-11T01:04:14.519525" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:14.519206" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:14.520241" 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-10-11T01:04:14.520042" elapsed="0.000273">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-10-11T01:04:14.520399" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:14.519711" elapsed="0.000726"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.520932" 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-10-11T01:04:14.520614" elapsed="0.000343"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:14.521230" 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-10-11T01:04:14.521349" 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-10-11T01:04:14.521123" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.521806" 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-10-11T01:04:14.521587" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.522772" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:14.522538" elapsed="0.000275"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.523252" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:14.523004" elapsed="0.000272"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.524115" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:14.523663" elapsed="0.000477"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:14.525284" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:14.524767" elapsed="0.000605"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:14.525475" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:04:14.525687" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:14.524313" elapsed="0.001397"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:14.525903" elapsed="0.000315"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:04:14.523528" elapsed="0.002728"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.526953" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:14.526508" elapsed="0.000469"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:14.528103" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:14.527599" elapsed="0.000590"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:14.528268" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:04:14.528499" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:14.527145" 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-10-11T01:04:14.528689" elapsed="0.000312"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:14.526355" elapsed="0.002685"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:14.523355" elapsed="0.005716"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:14.529109" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:14.529238" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:14.522177" elapsed="0.007085"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:14.521924" elapsed="0.007367"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.529541" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.529313" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.521906" elapsed="0.007707"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.530531" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-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-10-11T01:04:14.529773" elapsed="0.000785"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:14.530603" 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/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-10-11T01:04:14.518689" elapsed="0.012016"/>
</kw>
<msg time="2026-10-11T01:04:14.530752" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:14.514362" elapsed="0.016433"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:14.534977" 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/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-10-11T01:04:14.539064" 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/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-10-11T01:04:14.543227" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.543425" 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-10-11T01:04:14.543609" 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-10-11T01:04:14.543962" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.543800" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:14.543786" 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-10-11T01:04:14.544190" 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-10-11T01:04:14.544371" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.544553" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:14.543762" elapsed="0.000839"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:14.543674" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.544777" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:14.544854" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:04:14.544965" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-i...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:04:14.513752" elapsed="0.031238"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:14.546107" 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-10-11T01:04:14.545913" elapsed="0.000254">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-10-11T01:04:14.546249" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:14.545576" elapsed="0.000695"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:14.546571" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.546334" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.547099" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:14.546835" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:14.546644" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.546317" elapsed="0.000858"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.547688" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:14.547336" elapsed="0.000376"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:14.547757" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:14.547894" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:14.545256" elapsed="0.002661"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:14.549006" 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-10-11T01:04:14.548802" elapsed="0.000294">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-10-11T01:04:14.549181" 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-10-11T01:04:14.548480" elapsed="0.000724"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:04:14.549366" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:04:14.549267" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:14.549250" elapsed="0.000210"/>
</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-10-11T01:04:14.549615" elapsed="0.000020"/>
</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-10-11T01:04:14.549793" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:04:14.549866" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:14.549990" 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-10-11T01:04:14.548166" elapsed="0.001848"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.551226" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:14.551005" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:14.551877" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:14.551473" elapsed="0.000447"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:14.556705" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:14.556875" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:14.556967" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:14.552218" elapsed="0.005099">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:14.551981" elapsed="0.005413">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:14.557601" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.557444" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-10-11T01:04:14.551963" elapsed="0.005718">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:14.558034" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:14.558153" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:14.558120" elapsed="0.000069"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:14.558104" elapsed="0.000105"/>
</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-10-11T01:04:14.558349" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:04:14.558426" 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-10-11T01:04:14.550289" elapsed="0.008239">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:14.558623" 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-10-11T01:04:14.506325" elapsed="0.052386">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:14.558990" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:14.558793" elapsed="0.000261"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:14.558777" elapsed="0.000299"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:14.559105" 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-10-11T01:04:14.505665" elapsed="0.053528">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:16.594856" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:16.594061" elapsed="0.000861"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:16.596643" 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-10-11T01:04:16.596159" elapsed="0.000637">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-10-11T01:04:16.597010" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:16.595290" elapsed="0.001770"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.598197" 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-10-11T01:04:16.597475" elapsed="0.000778"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:16.599019" 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-10-11T01:04:16.599310" 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-10-11T01:04:16.598691" elapsed="0.000673"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.600349" 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-10-11T01:04:16.599854" elapsed="0.000623"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.602658" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:16.602081" elapsed="0.000672"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.603770" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:16.603172" elapsed="0.000674"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.605660" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:16.604591" elapsed="0.001124"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:16.608402" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:16.607133" elapsed="0.001624"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:16.608976" elapsed="0.000075"/>
</return>
<msg time="2026-10-11T01:04:16.609504" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:16.606117" elapsed="0.003445"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:16.609958" elapsed="0.000772"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:04:16.604266" elapsed="0.006578"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.612552" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:16.611371" elapsed="0.001242"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:16.615253" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:16.614065" elapsed="0.001443"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:16.615693" elapsed="0.000066"/>
</return>
<msg time="2026-10-11T01:04:16.616191" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:16.613023" elapsed="0.003222"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:16.616655" elapsed="0.000708"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:16.611077" elapsed="0.006444"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:16.603948" elapsed="0.013660"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:16.617678" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T01:04:16.617875" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:16.601226" elapsed="0.016684"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.600627" elapsed="0.017323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.618192" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.617984" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.600583" elapsed="0.017708"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.619278" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-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-10-11T01:04:16.618556" elapsed="0.000760"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:16.619377" elapsed="0.000108"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:16.592829" elapsed="0.026763"/>
</kw>
<msg time="2026-10-11T01:04:16.619660" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:16.582433" elapsed="0.037292"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:16.625762" 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_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-10-11T01:04:16.631536" 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_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-10-11T01:04:16.637244" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.637568" 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-10-11T01:04:16.637846" 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-10-11T01:04:16.638330" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.638124" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:16.638104" 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-10-11T01:04:16.638675" 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-10-11T01:04:16.638949" 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-10-11T01:04:16.639183" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:16.638068" elapsed="0.001183"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:16.637942" elapsed="0.001342"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.639517" elapsed="0.000027"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:16.639612" elapsed="0.000021"/>
</return>
<msg time="2026-10-11T01:04:16.639767" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-i...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:04:16.580990" elapsed="0.058813"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:16.641533" 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-10-11T01:04:16.641248" elapsed="0.000371">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-10-11T01:04:16.641737" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:16.640778" elapsed="0.000991"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.642185" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.641875" elapsed="0.000382"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.642949" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:16.642554" elapsed="0.000431"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.642289" elapsed="0.000742"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.641850" elapsed="0.001209"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.643868" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:16.643287" elapsed="0.000609"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:16.643942" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:16.644069" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:16.640195" elapsed="0.003897"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:16.645166" 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-10-11T01:04:16.644984" elapsed="0.000240">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-10-11T01:04:16.645341" 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-10-11T01:04:16.644654" elapsed="0.000710"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:04:16.645545" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:04:16.645444" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.645426" elapsed="0.000195"/>
</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-10-11T01:04:16.645777" elapsed="0.000020"/>
</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-10-11T01:04:16.645967" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:04:16.646026" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:16.646150" 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-10-11T01:04:16.644340" elapsed="0.001833"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.647444" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:16.647206" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.647912" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:16.647679" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:16.654288" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:16.654451" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:16.654550" 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-10-11T01:04:16.648239" elapsed="0.006335"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.648013" elapsed="0.006601"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.654793" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.654639" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.647996" elapsed="0.006892"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.656157" 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-10-11T01:04:16.655821" elapsed="0.000382"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.655567" elapsed="0.000669"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.655550" elapsed="0.000709"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.656858" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:16.656573" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.656310" elapsed="0.000622"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.656295" elapsed="0.000659"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.657497" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:16.657132" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.657800" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.657587" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.658316" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:16.658052" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.657888" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.657570" elapsed="0.000870"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.658977" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:16.658624" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.659278" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.659067" elapsed="0.000263"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.659796" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:16.659532" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.659352" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.659050" elapsed="0.000836"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:16.660032" elapsed="0.000295"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:16.660736" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:16.660510" elapsed="0.000252"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:16.660953" elapsed="0.000213"/>
</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-10-11T01:04:16.655210" elapsed="0.006013"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:16.661370" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:16.661287" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.661270" elapsed="0.000181"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:16.662249" 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-10-11T01:04:16.661600" elapsed="0.000677"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:16.662323" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:16.662468" 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-10-11T01:04:16.646470" elapsed="0.016024"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:16.662551" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:04:16.662675" 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-10-11T01:04:16.564462" elapsed="0.098238"/>
</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-10-11T01:04:16.673313" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:16.673014" elapsed="0.000325"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:16.674065" 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-10-11T01:04:16.673846" elapsed="0.000337">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-10-11T01:04:16.674346" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:16.673517" elapsed="0.000852"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.674886" 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-10-11T01:04:16.674563" elapsed="0.000376"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:16.675217" 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-10-11T01:04:16.675342" 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-10-11T01:04:16.675109" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.675801" 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-10-11T01:04:16.675582" elapsed="0.000277"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:16.676219" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.675920" elapsed="0.000353"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.676921" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:16.676464" elapsed="0.000482"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.676296" elapsed="0.000682"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.675902" elapsed="0.001096"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.677582" 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-10-11T01:04:16.677161" elapsed="0.000449"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:16.677653" 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/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-10-11T01:04:16.672473" elapsed="0.005281"/>
</kw>
<msg time="2026-10-11T01:04:16.677804" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:16.668095" elapsed="0.009768"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:16.681966" 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/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-10-11T01:04:16.686061" 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/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-10-11T01:04:16.691326" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.691581" 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-10-11T01:04:16.691769" 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-10-11T01:04:16.692125" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.691977" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:16.691964" 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-10-11T01:04:16.692355" 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-10-11T01:04:16.692553" 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-10-11T01:04:16.692721" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:16.691938" elapsed="0.000832"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:16.691848" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.692960" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:16.693027" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:16.693153" 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-10-11T01:04:16.667362" elapsed="0.025816"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:16.693346" elapsed="0.000335"/>
</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-10-11T01:04:16.694783" 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-10-11T01:04:16.694331" elapsed="0.000492"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:16.695421" 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-10-11T01:04:16.694976" 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-10-11T01:04:16.695634" elapsed="0.000293"/>
</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-10-11T01:04:16.693967" elapsed="0.002015"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.693751" elapsed="0.002261"/>
</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-10-11T01:04:16.696212" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.696035" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.693735" elapsed="0.002545"/>
</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-10-11T01:04:16.663667" elapsed="0.032657"/>
</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-10-11T01:04:16.662997" elapsed="0.033392"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.662775" elapsed="0.033671"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.662759" elapsed="0.033709"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:16.696509" elapsed="0.000026"/>
</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-10-11T01:04:16.562882" elapsed="0.133731"/>
</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-10-11T01:04:14.503924" elapsed="2.192777"/>
</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-10-11T01:04:16.712483" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:16.712162" elapsed="0.000348"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:16.713181" 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-10-11T01:04:16.713002" elapsed="0.000237">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-10-11T01:04:16.713323" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:16.712668" elapsed="0.000677"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.713864" 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-10-11T01:04:16.713537" elapsed="0.000352"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:16.714165" 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-10-11T01:04:16.714291" 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-10-11T01:04:16.714057" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.714752" 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-10-11T01:04:16.714532" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.715721" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:16.715484" elapsed="0.000280"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.716200" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:16.715951" elapsed="0.000273"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.716994" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:16.716553" elapsed="0.000466"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:16.718145" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:16.717633" elapsed="0.000601"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:16.718313" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:04:16.718538" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:16.717189" 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-10-11T01:04:16.718739" elapsed="0.000313"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/effective-rib-in</var>
<status status="PASS" start="2026-10-11T01:04:16.716419" elapsed="0.002671"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.719853" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:16.719321" elapsed="0.000557"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:16.721014" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:16.720502" elapsed="0.000602"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:16.721184" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:04:16.721393" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:16.720049" 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-10-11T01:04:16.721606" elapsed="0.000315"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:16.719192" elapsed="0.002767"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:16.716267" elapsed="0.005754"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:16.722060" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:16.722189" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:16.715122" elapsed="0.007091"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.714870" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.722524" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.722264" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.714852" elapsed="0.007745"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.723295" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-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-10-11T01:04:16.722756" elapsed="0.000565"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:16.723365" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:16.711640" elapsed="0.011842"/>
</kw>
<msg time="2026-10-11T01:04:16.723531" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:16.707158" elapsed="0.016417"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:16.727866" 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/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-10-11T01:04:16.731974" 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/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-10-11T01:04:16.736060" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.736241" 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-10-11T01:04:16.736439" 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-10-11T01:04:16.736777" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.736631" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:16.736617" 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-10-11T01:04:16.737024" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.737202" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.737366" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:16.736592" elapsed="0.000835"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:16.736505" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.737645" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:16.737712" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:16.737837" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-ro...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:04:16.706550" elapsed="0.031313"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:16.738969" 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-10-11T01:04:16.738769" elapsed="0.000259">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-10-11T01:04:16.739110" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:16.738443" elapsed="0.000690"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.739431" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.739196" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.739952" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:16.739674" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.739507" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.739179" elapsed="0.000849"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.740548" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:16.740189" elapsed="0.000382"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:16.740616" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:16.740857" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:16.738129" elapsed="0.002752"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:16.741984" 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-10-11T01:04:16.741764" elapsed="0.000278">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-10-11T01:04:16.742125" 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-10-11T01:04:16.741443" elapsed="0.000704"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:04:16.742306" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:04:16.742210" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.742193" elapsed="0.000189"/>
</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-10-11T01:04:16.742551" elapsed="0.000020"/>
</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-10-11T01:04:16.742726" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:04:16.742782" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:16.742921" 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-10-11T01:04:16.741130" elapsed="0.001814"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.744164" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:16.743942" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.744625" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:16.744395" 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-10-11T01:04:16.750025" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:16.750142" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:16.750239" 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-10-11T01:04:16.745004" elapsed="0.005260"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.744760" elapsed="0.005543"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.750501" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.750327" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.744743" elapsed="0.005842"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.751865" 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-10-11T01:04:16.751520" elapsed="0.000391"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.751260" elapsed="0.000682"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.751242" elapsed="0.000723"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.752536" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:16.752253" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.752015" elapsed="0.000594"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.751999" elapsed="0.000632"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.753167" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:16.752823" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.753482" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.753255" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.753996" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:16.753720" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.753557" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.753238" elapsed="0.000836"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.754607" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:16.754249" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.754917" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.754695" elapsed="0.000275"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.755423" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:16.755151" elapsed="0.000298"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.754991" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.754678" elapsed="0.000823"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:16.755645" elapsed="0.000303"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:16.756328" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:16.756109" elapsed="0.000244"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:16.756523" elapsed="0.000250"/>
</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-10-11T01:04:16.750923" elapsed="0.005920"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:16.756989" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:16.756906" elapsed="0.000122"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.756890" elapsed="0.000157"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:16.757834" 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-10-11T01:04:16.757189" elapsed="0.000673"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:16.757909" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:16.758035" 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-10-11T01:04:16.743217" elapsed="0.014842"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:16.758114" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:04:16.758232" 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-10-11T01:04:16.699220" elapsed="0.059036"/>
</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-10-11T01:04:16.768933" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:16.768619" elapsed="0.000340"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:16.769673" 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-10-11T01:04:16.769453" elapsed="0.000337">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-10-11T01:04:16.769966" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:16.769120" elapsed="0.000869"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.770500" 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-10-11T01:04:16.770166" elapsed="0.000359"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:16.770804" 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-10-11T01:04:16.770937" 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-10-11T01:04:16.770694" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.771382" 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-10-11T01:04:16.771161" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:16.771827" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.771522" elapsed="0.000361"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.772551" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:16.772086" elapsed="0.000491"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.771933" elapsed="0.000677"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.771495" elapsed="0.001134"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.773195" 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-10-11T01:04:16.772793" elapsed="0.000428"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:16.773265" 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/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-10-11T01:04:16.768094" elapsed="0.005272"/>
</kw>
<msg time="2026-10-11T01:04:16.773439" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:16.763677" elapsed="0.009808"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:16.777662" 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/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-10-11T01:04:16.781917" 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-10-11T01:04:16.786195" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.786388" 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-10-11T01:04:16.786591" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.786974" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.786802" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:16.786787" 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-10-11T01:04:16.787205" 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-10-11T01:04:16.787387" 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-10-11T01:04:16.787573" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:16.786757" elapsed="0.000864"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:16.786663" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.787799" elapsed="0.000032"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:16.787925" elapsed="0.000018"/>
</return>
<msg time="2026-10-11T01:04:16.788070" 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-10-11T01:04:16.762954" elapsed="0.025142"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:16.788264" elapsed="0.000378"/>
</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-10-11T01:04:16.789846" 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-10-11T01:04:16.789346" elapsed="0.000528"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:16.790469" 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-10-11T01:04:16.790026" 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-10-11T01:04:16.790682" elapsed="0.000300"/>
</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-10-11T01:04:16.788973" elapsed="0.002065"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.788713" elapsed="0.002354"/>
</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-10-11T01:04:16.791264" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.791090" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.788696" elapsed="0.002636"/>
</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-10-11T01:04:16.759208" elapsed="0.032168"/>
</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-10-11T01:04:16.758546" elapsed="0.032916"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.758328" elapsed="0.033182"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.758312" elapsed="0.033219"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:16.791562" 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-10-11T01:04:16.698562" elapsed="0.093104"/>
</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-10-11T01:04:16.696902" elapsed="0.094818"/>
</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-10-11T01:04:16.807504" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:16.807096" elapsed="0.000438"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:16.808221" 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-10-11T01:04:16.808027" elapsed="0.000260">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-10-11T01:04:16.808370" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:16.807691" elapsed="0.000701"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.808900" 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-10-11T01:04:16.808581" elapsed="0.000375"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:16.809238" 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-10-11T01:04:16.809370" 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-10-11T01:04:16.809126" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.809843" 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-10-11T01:04:16.809606" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.810790" 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-10-11T01:04:16.810559" elapsed="0.000285"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.811271" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:16.811022" elapsed="0.000273"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.812086" 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-10-11T01:04:16.811633" elapsed="0.000477"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:16.813256" 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-10-11T01:04:16.812732" elapsed="0.000613"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:16.813443" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:04:16.813658" 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-10-11T01:04:16.812281" 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-10-11T01:04:16.813863" elapsed="0.000315"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:04:16.811495" elapsed="0.002721"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.814907" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:16.814465" elapsed="0.000466"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:16.816070" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:16.815561" elapsed="0.000596"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:16.816235" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:04:16.816464" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:16.815100" elapsed="0.001388"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:16.816658" elapsed="0.000309"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:16.814316" elapsed="0.002689"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:16.811339" elapsed="0.005697"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:16.817074" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:04:16.817201" 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-10-11T01:04:16.810201" elapsed="0.007023"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.809948" elapsed="0.007305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.817537" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.817275" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.809931" elapsed="0.007679"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.818284" 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-10-11T01:04:16.817769" elapsed="0.000540"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:16.818352" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:16.806550" elapsed="0.011920"/>
</kw>
<msg time="2026-10-11T01:04:16.818549" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:16.802084" elapsed="0.016512"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:16.822910" 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/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-10-11T01:04:16.827152" 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/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-10-11T01:04:16.831258" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.831452" 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-10-11T01:04:16.831635" 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-10-11T01:04:16.831990" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.831839" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:16.831825" 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-10-11T01:04:16.832218" 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-10-11T01:04:16.832398" 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-10-11T01:04:16.832578" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:16.831787" elapsed="0.000838"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:16.831700" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.832797" elapsed="0.000033"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:16.832879" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:16.832985" 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-10-11T01:04:16.801477" elapsed="0.031533"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:16.834115" 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-10-11T01:04:16.833930" elapsed="0.000243">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-10-11T01:04:16.834255" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:16.833594" elapsed="0.000683"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.834616" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.834376" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.835144" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:16.834882" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.834690" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.834357" elapsed="0.000862"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.835733" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:16.835381" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:16.835801" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T01:04:16.835939" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:16.833277" elapsed="0.002685"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:16.837045" 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-10-11T01:04:16.836861" elapsed="0.000242">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-10-11T01:04:16.837185" 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-10-11T01:04:16.836526" elapsed="0.000682"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:04:16.837368" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:04:16.837271" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.837254" elapsed="0.000205"/>
</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-10-11T01:04:16.837612" elapsed="0.000020"/>
</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-10-11T01:04:16.837787" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:04:16.837858" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:16.837981" 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-10-11T01:04:16.836212" elapsed="0.001792"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.839229" 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-10-11T01:04:16.839009" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.839715" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:16.839501" elapsed="0.000254"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:16.845243" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:16.845379" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:04:16.845486" 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-10-11T01:04:16.840056" elapsed="0.005454"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.839829" elapsed="0.005723"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.845735" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.845579" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.839798" elapsed="0.006049"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.847164" 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-10-11T01:04:16.846828" elapsed="0.000382"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.846538" elapsed="0.000704"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.846519" elapsed="0.000746"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.847856" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:16.847573" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.847316" elapsed="0.000614"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.847300" elapsed="0.000652"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.848493" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:16.848132" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.848798" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.848583" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.849319" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:16.849053" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.848888" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.848566" elapsed="0.000831"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.849939" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:16.849590" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.850238" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.850028" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.850758" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:16.850490" elapsed="0.000293"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.850312" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.850011" elapsed="0.000840"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:16.850997" elapsed="0.000291"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:16.851684" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:16.851463" elapsed="0.000246"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:16.851877" elapsed="0.000211"/>
</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-10-11T01:04:16.846178" elapsed="0.005967"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:16.852288" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:16.852206" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.852190" elapsed="0.000160"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:16.853157" 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-10-11T01:04:16.852523" elapsed="0.000661"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:16.853231" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:16.853359" 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-10-11T01:04:16.838281" elapsed="0.015103"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:16.853456" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:16.853591" 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-10-11T01:04:16.794225" elapsed="0.059392"/>
</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-10-11T01:04:16.864309" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:16.864007" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:16.865061" 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-10-11T01:04:16.864840" elapsed="0.000338">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-10-11T01:04:16.865340" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:16.864509" elapsed="0.000855"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.865884" 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-10-11T01:04:16.865560" elapsed="0.000350"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:16.866194" 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-10-11T01:04:16.866315" 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-10-11T01:04:16.866086" elapsed="0.000254"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.866777" 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-10-11T01:04:16.866554" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:16.867198" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.866901" elapsed="0.000352"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.867910" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:16.867446" elapsed="0.000489"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.867276" elapsed="0.000692"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.866884" elapsed="0.001104"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.868572" 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-10-11T01:04:16.868152" elapsed="0.000447"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:16.868643" 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/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-10-11T01:04:16.863477" elapsed="0.005268"/>
</kw>
<msg time="2026-10-11T01:04:16.868797" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:16.859067" elapsed="0.009788"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:16.872988" 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/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-10-11T01:04:16.877116" 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/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-10-11T01:04:16.881330" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.881528" 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-10-11T01:04:16.881713" 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-10-11T01:04:16.882099" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.881951" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:16.881937" 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-10-11T01:04:16.882329" 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-10-11T01:04:16.882540" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.882711" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:16.881911" elapsed="0.000849"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:16.881782" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.882951" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:16.883019" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:16.883142" 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-10-11T01:04:16.858337" elapsed="0.024831"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:16.883336" elapsed="0.000333"/>
</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-10-11T01:04:16.884772" 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-10-11T01:04:16.884316" elapsed="0.000483"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:16.885384" 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-10-11T01:04:16.884964" 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-10-11T01:04:16.885621" elapsed="0.000289"/>
</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-10-11T01:04:16.883953" elapsed="0.002014"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.883738" elapsed="0.002259"/>
</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-10-11T01:04:16.886195" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.886019" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.883722" elapsed="0.002572"/>
</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-10-11T01:04:16.854610" elapsed="0.031728"/>
</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-10-11T01:04:16.853941" elapsed="0.032463"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.853721" elapsed="0.032740"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.853704" elapsed="0.032779"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:16.886518" elapsed="0.000026"/>
</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-10-11T01:04:16.793600" elapsed="0.093018"/>
</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-10-11T01:04:16.791921" elapsed="0.094749"/>
</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-10-11T01:04:16.886836" elapsed="0.002693"/>
</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-10-11T01:04:16.905086" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:16.904767" elapsed="0.000346"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:16.905773" 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-10-11T01:04:16.905602" elapsed="0.000248">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-10-11T01:04:16.905934" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:16.905271" elapsed="0.000686"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.906453" 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-10-11T01:04:16.906130" elapsed="0.000348"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:16.906752" 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-10-11T01:04:16.906888" 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-10-11T01:04:16.906644" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.907346" 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-10-11T01:04:16.907130" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.908295" 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-10-11T01:04:16.908069" elapsed="0.000267"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.908776" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:16.908530" elapsed="0.000270"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.909577" 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-10-11T01:04:16.909125" elapsed="0.000477"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:16.910749" 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-10-11T01:04:16.910225" elapsed="0.000659"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:16.910965" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:04:16.911177" 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-10-11T01:04:16.909772" 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-10-11T01:04:16.911422" elapsed="0.000315"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:04:16.908994" elapsed="0.002781"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.912473" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:16.912018" elapsed="0.000480"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:16.913630" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:16.913108" elapsed="0.000610"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:16.913799" elapsed="0.000046"/>
</return>
<msg time="2026-10-11T01:04:16.914025" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:16.912668" 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-10-11T01:04:16.914213" elapsed="0.000370"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:16.911888" elapsed="0.002734"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:16.908858" elapsed="0.005795"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:16.914690" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:16.914833" 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-10-11T01:04:16.907712" elapsed="0.007145"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.907464" elapsed="0.007423"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.915058" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.914909" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.907446" elapsed="0.007680"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.915856" 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-10-11T01:04:16.915284" elapsed="0.000599"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:16.915926" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:16.904247" elapsed="0.011777"/>
</kw>
<msg time="2026-10-11T01:04:16.916071" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:16.899837" elapsed="0.016277"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:16.921329" 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/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-10-11T01:04:16.925438" 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/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-10-11T01:04:16.929536" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.929758" 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-10-11T01:04:16.929957" 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-10-11T01:04:16.930297" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.930152" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:16.930138" 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-10-11T01:04:16.930549" 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-10-11T01:04:16.930730" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.930936" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:16.930113" elapsed="0.000872"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:16.930024" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.931160" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:16.931226" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:16.931333" 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-10-11T01:04:16.899222" elapsed="0.032135"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:16.932482" 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-10-11T01:04:16.932276" elapsed="0.000266">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-10-11T01:04:16.932626" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:16.931952" elapsed="0.000697"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.932947" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.932712" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.933466" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:16.933188" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.933022" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.932695" elapsed="0.000856"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.934065" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:16.933712" elapsed="0.000378"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:16.934135" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:16.934258" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:16.931637" elapsed="0.002644"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:16.935325" 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-10-11T01:04:16.935177" elapsed="0.000198"/>
</kw>
<msg time="2026-10-11T01:04:16.935466" 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-10-11T01:04:16.934857" elapsed="0.000631"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:04:16.935655" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:16.935557" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.935539" elapsed="0.000213"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:16.936053" 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-10-11T01:04:16.936176" 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-10-11T01:04:16.935927" elapsed="0.000273"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:04:16.936564" 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-10-11T01:04:16.936363" elapsed="0.000225"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:04:16.936630" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:04:16.936753" 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-10-11T01:04:16.934544" elapsed="0.002232"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.938027" 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-10-11T01:04:16.937792" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.938489" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:16.938261" elapsed="0.000267"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:16.943058" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:16.943176" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:04:16.943273" 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-10-11T01:04:16.938829" elapsed="0.004469"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.938588" elapsed="0.004750"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.943540" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.943362" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.938571" elapsed="0.005047"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.945087" 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-10-11T01:04:16.944727" elapsed="0.000407"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.944469" elapsed="0.000699"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.944451" elapsed="0.000740"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.945772" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:16.945503" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.945242" elapsed="0.000624"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.945226" elapsed="0.000665"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.946429" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:16.946071" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.946737" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.946524" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.947278" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:16.947014" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.946847" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.946504" elapsed="0.000881"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.947938" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:16.947583" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.948239" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.948027" elapsed="0.000264"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.948763" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:16.948494" elapsed="0.000294"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.948314" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.948010" elapsed="0.000848"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:16.949004" elapsed="0.000291"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:16.949703" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:16.949475" elapsed="0.000253"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:16.949897" elapsed="0.000212"/>
</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-10-11T01:04:16.943953" elapsed="0.006213"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:16.950312" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:16.950229" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.950212" elapsed="0.000161"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:16.951234" 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-10-11T01:04:16.950532" elapsed="0.000731"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:16.951309" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:16.951451" 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-10-11T01:04:16.937064" elapsed="0.014413"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:16.951532" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:04:16.951650" 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-10-11T01:04:16.892042" elapsed="0.059632"/>
</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-10-11T01:04:16.962312" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:16.962008" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:16.963082" 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-10-11T01:04:16.962859" elapsed="0.000343">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-10-11T01:04:16.963367" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:16.962524" elapsed="0.000866"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.963929" 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-10-11T01:04:16.963586" elapsed="0.000368"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:16.964264" 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-10-11T01:04:16.964383" 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-10-11T01:04:16.964154" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.964858" 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-10-11T01:04:16.964625" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:16.965258" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.964961" elapsed="0.000351"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.965968" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:16.965503" elapsed="0.000492"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:16.965334" elapsed="0.000693"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:16.964943" elapsed="0.001104"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.966626" 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-10-11T01:04:16.966210" elapsed="0.000443"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:16.966698" 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/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-10-11T01:04:16.961485" elapsed="0.005313"/>
</kw>
<msg time="2026-10-11T01:04:16.966859" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:16.956935" elapsed="0.009969"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:16.971050" 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/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-10-11T01:04:16.975153" 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/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-10-11T01:04:16.979266" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.979461" 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-10-11T01:04:16.979644" 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-10-11T01:04:16.980002" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.979856" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:16.979842" 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-10-11T01:04:16.980265" 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-10-11T01:04:16.980462" 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-10-11T01:04:16.980629" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:16.979801" elapsed="0.000875"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:16.979710" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:16.980866" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:16.980934" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:16.981040" 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-10-11T01:04:16.956206" elapsed="0.024860"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:16.981233" elapsed="0.000330"/>
</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-10-11T01:04:16.982469" 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-10-11T01:04:16.982213" elapsed="0.000283"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:16.983384" 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-10-11T01:04:16.982652" elapsed="0.000778"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:04:16.983904" 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-10-11T01:04:16.984097" 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-10-11T01:04:16.983617" elapsed="0.000545">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-10-11T01:04:16.981850" elapsed="0.002460">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-10-11T01:04:16.981634" elapsed="0.002800">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-10-11T01:04:16.984654" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:16.984471" elapsed="0.000234"/>
</branch>
<status status="FAIL" start="2026-10-11T01:04:16.981617" elapsed="0.003109">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-10-11T01:04:16.952624" elapsed="0.032246">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-10-11T01:04:16.951965" elapsed="0.033053">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-10-11T01:04:16.951745" elapsed="0.033360">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-10-11T01:04:16.951730" elapsed="0.033409">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-10-11T01:04:16.985184" elapsed="0.000015"/>
</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-10-11T01:04:16.891399" elapsed="0.093909">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-10-11T01:04:19.020533" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:19.019778" elapsed="0.000827"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:19.022381" 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-10-11T01:04:19.021902" elapsed="0.000681">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-10-11T01:04:19.022779" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:19.021066" elapsed="0.001790"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.023992" 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-10-11T01:04:19.023246" elapsed="0.000802"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:19.024697" 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-10-11T01:04:19.025074" 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-10-11T01:04:19.024446" elapsed="0.000684"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.026132" 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-10-11T01:04:19.025615" elapsed="0.000612"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.028323" 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-10-11T01:04:19.027787" elapsed="0.000656"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.029452" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:19.028859" elapsed="0.000664"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.031453" 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-10-11T01:04:19.030390" elapsed="0.001108"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:19.033167" 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-10-11T01:04:19.032402" elapsed="0.000886"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:19.033402" elapsed="0.000089"/>
</return>
<msg time="2026-10-11T01:04:19.033765" 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-10-11T01:04:19.031772" elapsed="0.002027"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:19.034056" elapsed="0.000490"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:04:19.029976" elapsed="0.004626"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.035594" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:19.034953" elapsed="0.000676"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:19.037329" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:19.036607" elapsed="0.000910"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:19.037632" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T01:04:19.037942" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:19.035896" elapsed="0.002079"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:19.038207" elapsed="0.000470"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:19.034751" elapsed="0.003981"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:19.029628" elapsed="0.009148"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:19.038851" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T01:04:19.039037" 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-10-11T01:04:19.026998" elapsed="0.012072"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:19.026376" elapsed="0.012800"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:19.039469" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:19.039214" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:19.026332" elapsed="0.013244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.040590" 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-10-11T01:04:19.039820" elapsed="0.000807"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:19.040688" 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/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-10-11T01:04:19.018590" elapsed="0.022257"/>
</kw>
<msg time="2026-10-11T01:04:19.040919" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:19.008685" elapsed="0.032298"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:19.046945" 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-10-11T01:04:19.052764" 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-10-11T01:04:19.058471" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:19.058723" 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-10-11T01:04:19.059033" 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-10-11T01:04:19.059640" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:19.059358" elapsed="0.000368"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:19.059335" elapsed="0.000428"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:19.060020" 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-10-11T01:04:19.060277" 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-10-11T01:04:19.060541" elapsed="0.000028"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:19.059293" elapsed="0.001320"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:19.059148" elapsed="0.001498"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:19.060876" elapsed="0.000027"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:19.060971" elapsed="0.000020"/>
</return>
<msg time="2026-10-11T01:04:19.061122" 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-10-11T01:04:19.007254" elapsed="0.053944"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:19.062870" 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-10-11T01:04:19.062588" elapsed="0.000366">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-10-11T01:04:19.063072" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:19.062095" elapsed="0.001008"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:19.063522" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:19.063191" elapsed="0.000404"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.064260" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:19.063894" elapsed="0.000400"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:19.063627" elapsed="0.000712"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:19.063168" elapsed="0.001198"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.065100" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:19.064611" elapsed="0.000523"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:19.065196" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T01:04:19.065368" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:19.061621" elapsed="0.003780"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:19.067356" 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-10-11T01:04:19.067148" elapsed="0.000317"/>
</kw>
<msg time="2026-10-11T01:04:19.067578" 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-10-11T01:04:19.066659" elapsed="0.000951"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:04:19.067870" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:19.067703" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:19.067678" elapsed="0.000280"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:19.068351" 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-10-11T01:04:19.068548" 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-10-11T01:04:19.068173" elapsed="0.000409"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:04:19.068949" 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-10-11T01:04:19.068748" elapsed="0.000225"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:04:19.069015" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:04:19.069145" 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-10-11T01:04:19.066148" elapsed="0.003021"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.070428" 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-10-11T01:04:19.070187" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.070897" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:19.070665" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:19.076343" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:19.076547" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:04:19.076636" 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-10-11T01:04:19.071231" elapsed="0.005431"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:19.070998" elapsed="0.005703"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:19.076892" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:19.076725" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:19.070981" elapsed="0.005989"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.078232" 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-10-11T01:04:19.077903" elapsed="0.000372"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:19.077647" elapsed="0.000659"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:19.077630" elapsed="0.000699"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.078926" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:19.078641" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:19.078379" elapsed="0.000620"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:19.078364" elapsed="0.000657"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.079580" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:19.079209" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:19.079896" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:19.079669" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.080395" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:19.080135" elapsed="0.000299"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:19.079971" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:19.079652" elapsed="0.000834"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.081007" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:19.080659" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:19.081303" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:19.081094" elapsed="0.000259"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.081868" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:19.081572" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:19.081376" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:19.081077" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:19.082093" elapsed="0.000292"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:19.082821" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:19.082574" elapsed="0.000273"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:19.083001" elapsed="0.000213"/>
</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-10-11T01:04:19.077296" elapsed="0.005973"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:19.083426" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:19.083330" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:19.083313" elapsed="0.000174"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:19.084108" 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-10-11T01:04:19.083629" elapsed="0.000541"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:19.084219" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:19.084348" 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-10-11T01:04:19.069473" elapsed="0.014900"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:19.084445" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:04:19.084573" 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-10-11T01:04:18.990703" elapsed="0.093897"/>
</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-10-11T01:04:19.095326" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:19.095024" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:19.096090" 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-10-11T01:04:19.095858" elapsed="0.000358">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-10-11T01:04:19.096380" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:19.095527" elapsed="0.000894"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.096941" 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-10-11T01:04:19.096613" elapsed="0.000353"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:19.097244" 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-10-11T01:04:19.097363" 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-10-11T01:04:19.097136" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.097841" 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-10-11T01:04:19.097610" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:19.098239" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:19.097945" elapsed="0.000349"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.098971" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:19.098498" elapsed="0.000498"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:19.098316" elapsed="0.000712"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:19.097927" elapsed="0.001121"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.099635" 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-10-11T01:04:19.099212" elapsed="0.000450"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:19.099705" 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-10-11T01:04:19.094499" elapsed="0.005326"/>
</kw>
<msg time="2026-10-11T01:04:19.099907" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:19.090037" elapsed="0.009917"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:19.104247" 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/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-10-11T01:04:19.108490" 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/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-10-11T01:04:19.112642" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:19.112837" 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-10-11T01:04:19.113018" 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-10-11T01:04:19.113360" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:19.113217" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:19.113203" 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-10-11T01:04:19.113604" 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-10-11T01:04:19.113784" 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-10-11T01:04:19.113962" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:19.113177" elapsed="0.000833"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:19.113085" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:19.114186" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:19.114252" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:19.114357" 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-10-11T01:04:19.089308" elapsed="0.025074"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:19.114564" elapsed="0.000328"/>
</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-10-11T01:04:19.115773" 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-10-11T01:04:19.115537" elapsed="0.000304"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:19.116224" 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-10-11T01:04:19.115994" elapsed="0.000256"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:04:19.116447" elapsed="0.000282"/>
</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-10-11T01:04:19.115163" elapsed="0.001621"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:19.114963" elapsed="0.001863"/>
</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-10-11T01:04:19.117024" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:19.116849" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:19.114946" elapsed="0.002147"/>
</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-10-11T01:04:19.085717" elapsed="0.031419"/>
</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-10-11T01:04:19.085044" elapsed="0.032158"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:19.084829" elapsed="0.032413"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:19.084659" elapsed="0.032604"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:19.117294" elapsed="0.000025"/>
</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-10-11T01:04:18.989089" elapsed="0.128305"/>
</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-10-11T01:04:16.889715" elapsed="2.227748"/>
</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-10-11T01:04:19.117663" elapsed="0.002669"/>
</kw>
<arg>intra_source_as</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-10-11T01:04:14.495579" elapsed="4.624809"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:14.410660" elapsed="4.709864"/>
</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-10-11T01:04:19.122438" elapsed="0.000491"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:04:19.121959" elapsed="0.001026"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:19.124102" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:19.124011" elapsed="0.000134"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:19.123993" elapsed="0.000172"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:19.126295" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:19.126210" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:19.126193" elapsed="0.000164"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.127275" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:19.126954" elapsed="0.000346"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.127730" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:04:19.127470" elapsed="0.000284"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:04:19.127794" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T01:04:19.127934" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:04:19.126582" elapsed="0.001375"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:19.130488" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:19.130376" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:19.130358" 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-10-11T01:04:19.131626" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:19.131540" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:19.131522" elapsed="0.000220"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:19.132095" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:04:19.131920" elapsed="0.000200"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:19.132454" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:19.132287" elapsed="0.000194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:04:19.164707" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:04:19.132989" elapsed="0.031830"/>
</kw>
<msg time="2026-10-11T01:04:19.164990" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:04:19.165033" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:19.132641" elapsed="0.032426"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:04:19.199109" 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-10-11T01:04:19.165614" elapsed="0.033604"/>
</kw>
<msg time="2026-10-11T01:04:19.199369" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:04:19.199437" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:19.165238" elapsed="0.034236"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:19.199754" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:19.199546" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:19.199528" elapsed="0.000309"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.200243" 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-10-11T01:04:19.200022" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:19.200587" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:19.200368" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:19.200352" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:04:19.200688" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:19.203226" elapsed="0.000116"/>
</kw>
<msg time="2026-10-11T01:04:19.203399" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:19.202052" 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-10-11T01:04:19.203872" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:19.204208" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:04:19.201457" 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-10-11T01:04:19.200979" 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-10-11T01:04:19.131251" elapsed="0.073289"/>
</kw>
<msg time="2026-10-11T01:04:19.204621" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:19.204660" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:19.130705" elapsed="0.073989"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:04:19.204859" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:04:19.204761" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:19.204743" elapsed="0.000192"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:19.205261" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:19.205624" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:04:19.205689" 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-10-11T01:04:19.130071" elapsed="0.075704"/>
</kw>
<msg time="2026-10-11T01:04:19.205870" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:19.205909" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:19.128285" elapsed="0.077657"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:19.206229" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:19.206008" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:19.205992" elapsed="0.000306"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:04:19.128142" elapsed="0.078177"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:04:19.128002" elapsed="0.078343"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:04:19.125916" elapsed="0.080477"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:04:19.123585" elapsed="0.082879"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:19.123143" elapsed="0.083361"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:04:19.121592" elapsed="0.084958"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:19.207304" 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-10-11T01:04:19.207456" 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-10-11T01:04:19.207165" elapsed="0.000317"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:04:19.207836" 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-10-11T01:04:19.207648" elapsed="0.000213"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:19.208156" 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-10-11T01:04:19.208275" 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-10-11T01:04:19.208023" elapsed="0.000276"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:04:19.208729" 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-10-11T01:04:19.208560" elapsed="0.000193"/>
</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-10-11T01:04:19.209009" elapsed="0.002317"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:19.208826" elapsed="0.002533"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:19.208799" elapsed="0.002584"/>
</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-10-11T01:04:19.222147" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:19.221844" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:19.222872" 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-10-11T01:04:19.222669" elapsed="0.000268">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-10-11T01:04:19.223022" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:19.222333" elapsed="0.000740"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.223579" 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-10-11T01:04:19.223251" elapsed="0.000353"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:19.224017" 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-10-11T01:04:19.224134" 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-10-11T01:04:19.223908" elapsed="0.000250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.224588" 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-10-11T01:04:19.224354" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.225546" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:04:19.225297" elapsed="0.000291"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.226033" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:19.225765" elapsed="0.000292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.226652" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:19.226369" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:19.227546" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:19.227169" elapsed="0.000402"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:19.227615" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:19.227740" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:19.226859" elapsed="0.000904"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:19.227943" elapsed="0.000174"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:04:19.226237" elapsed="0.001917"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.228671" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:19.228381" elapsed="0.000314"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:19.229563" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:19.229187" elapsed="0.000400"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:19.229632" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:19.229754" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:19.228879" elapsed="0.000898"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:19.229953" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:19.228251" elapsed="0.001903"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:19.226100" elapsed="0.004085"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:19.230222" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:04:19.230347" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:19.224954" elapsed="0.005416"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:19.224691" elapsed="0.005708"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:19.230601" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:19.230446" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:19.224674" elapsed="0.005996"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.231334" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:19.230842" elapsed="0.000518"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:19.231403" 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/app.vanadium/${file_name} exists. 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-10-11T01:04:19.221314" elapsed="0.010209"/>
</kw>
<msg time="2026-10-11T01:04:19.231603" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:19.216773" elapsed="0.014876"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:19.235984" 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/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-10-11T01:04:19.240101" 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/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-10-11T01:04:19.244199" elapsed="0.000023"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:19.244381" 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-10-11T01:04:19.244579" 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-10-11T01:04:19.244930" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:19.244772" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:19.244758" 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-10-11T01:04:19.245159" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:19.245337" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:19.245516" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:19.244733" elapsed="0.000832"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:19.244645" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:19.245741" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:19.245818" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:04:19.245927" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:19.216171" elapsed="0.029780"/>
</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-10-11T01:04:19.255009" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:19.254696" elapsed="0.000339"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:19.255700" 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-10-11T01:04:19.255524" elapsed="0.000271">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-10-11T01:04:19.255893" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:19.255194" elapsed="0.000722"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.256395" 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-10-11T01:04:19.256090" elapsed="0.000346"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:19.256723" 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-10-11T01:04:19.256860" 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-10-11T01:04:19.256615" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.257305" 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-10-11T01:04:19.257087" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:19.257697" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:19.257437" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.258196" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', '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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:19.257933" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:19.257772" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:19.257419" elapsed="0.000853"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.258845" 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-10-11T01:04:19.258449" elapsed="0.000425"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:19.259882" 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-10-11T01:04:19.254181" elapsed="0.005809"/>
</kw>
<msg time="2026-10-11T01:04:19.260041" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:19.249729" elapsed="0.010356"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:19.265366" 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/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-10-11T01:04:19.269469" 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/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-10-11T01:04:19.273665" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:19.273858" 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-10-11T01:04:19.274042" 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-10-11T01:04:19.274378" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:19.274233" elapsed="0.000438"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:19.274220" elapsed="0.000483"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:19.274881" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:19.275064" 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-10-11T01:04:19.275231" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:19.274194" elapsed="0.001092"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:19.274107" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:19.275482" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:19.275560" elapsed="0.000019"/>
</return>
<msg time="2026-10-11T01:04:19.275736" 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-10-11T01:04:19.249029" elapsed="0.026740"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:19.277011" 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-10-11T01:04:19.276769" elapsed="0.000307">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-10-11T01:04:19.277161" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:19.276398" 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-10-11T01:04:19.277491" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:19.277247" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.278027" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:19.277747" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:19.277567" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:19.277230" elapsed="0.000873"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.278620" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:19.278265" elapsed="0.000380"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:19.278691" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:04:19.278876" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:19.276076" elapsed="0.002824"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.280228" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:19.280003" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.280695" 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-10-11T01:04:19.280478" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.281168" 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-10-11T01:04:19.280950" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.281628" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:19.281396" elapsed="0.000272"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:19.282384" 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-10-11T01:04:19.282221" elapsed="0.000203"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:04:19.282724" 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-10-11T01:04:19.282579" elapsed="0.000169"/>
</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-10-11T01:04:19.282921" elapsed="0.000162"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.283522" 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-10-11T01:04:19.283275" elapsed="0.000294"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:04:19.283616" elapsed="0.000033"/>
</return>
<msg time="2026-10-11T01:04:19.283772" 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-10-11T01:04:19.281863" elapsed="0.001932"/>
</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-10-11T01:04:19.293683" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.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-10-11T01:04:19.293747" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:19.293858" 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-10-11T01:04:19.284104" elapsed="0.009778"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:19.283872" elapsed="0.010051"/>
</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-10-11T01:04:19.294102" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:19.293948" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:19.283856" elapsed="0.010356"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.295451" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:19.295163" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:19.294925" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:19.294908" elapsed="0.000637"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.296111" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:19.295846" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:19.295594" elapsed="0.000588"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:19.295579" elapsed="0.000625"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.296751" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:19.296381" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:19.297063" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:19.296852" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.297575" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:19.297297" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:19.297136" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:19.296835" elapsed="0.000817"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.298173" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:19.297838" elapsed="0.000360"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:19.298481" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:19.298258" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.298998" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:19.298725" elapsed="0.000296"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:19.298565" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:19.298242" elapsed="0.000831"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:19.299216" elapsed="0.000304"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:19.299925" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:19.299685" elapsed="0.000264"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:19.300101" elapsed="0.000210"/>
</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-10-11T01:04:19.294556" elapsed="0.005810"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:04:19.300527" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:04:19.300445" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:19.300427" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:19.300747" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:04:19.300819" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:19.300978" 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-10-11T01:04:19.279198" elapsed="0.021804"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:19.301061" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:19.301185" 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-10-11T01:04:19.212296" elapsed="0.088912"/>
</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-10-11T01:04:19.301567" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:19.301340" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:19.301323" elapsed="0.000325"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:19.301679" elapsed="0.000024"/>
</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-10-11T01:04:19.211649" elapsed="0.090127"/>
</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-10-11T01:04:19.305359" level="INFO">${update} = </msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:04:19.302685" elapsed="0.002700"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:04:19.305922" level="FAIL"> == </msg>
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="FAIL" start="2026-10-11T01:04:19.305565" elapsed="0.000414"> == </status>
</kw>
<return>
<value>${update}</value>
<status status="NOT RUN" start="2026-10-11T01:04:19.306029" elapsed="0.000017"/>
</return>
<doc>Returns hex update message.</doc>
<status status="FAIL" start="2026-10-11T01:04:19.302420" elapsed="0.003710"> == </status>
</kw>
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:04:21.311049" level="INFO">${update} = ffffffffffffffffffffffffffffffff0051020000003a400101004002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac0100802d10000fbf00000</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:04:21.307777" elapsed="0.003344"/>
</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-10-11T01:04:21.311587" elapsed="0.000763"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:04:21.312512" elapsed="0.000083"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:04:21.307004" elapsed="0.005767"/>
</kw>
<msg time="2026-10-11T01:04:21.312950" 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-10-11T01:04:19.301974" elapsed="2.011031"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.315380" level="INFO">Length is 162.</msg>
<msg time="2026-10-11T01:04:21.315574" 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-10-11T01:04:21.314783" elapsed="0.000844"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.316600" level="INFO">Length is 162.</msg>
<msg time="2026-10-11T01:04:21.316757" 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-10-11T01:04:21.316012" elapsed="0.000815"/>
</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-10-11T01:04:21.317245" elapsed="0.000681"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:04:21.318651" 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-10-11T01:04:21.318265" elapsed="0.000439"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:04:21.319391" 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-10-11T01:04:21.319049" elapsed="0.000424"/>
</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-10-11T01:04:21.319900" elapsed="0.000624"/>
</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-10-11T01:04:21.313488" elapsed="0.007158"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:04:21.320976" elapsed="0.002870"/>
</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-10-11T01:04:21.355890" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:21.355110" elapsed="0.000845"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:21.357209" 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-10-11T01:04:21.356927" elapsed="0.000377">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-10-11T01:04:21.357444" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:21.356316" elapsed="0.001163"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.358262" 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-10-11T01:04:21.357815" elapsed="0.000483"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:21.358714" 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-10-11T01:04:21.358914" 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-10-11T01:04:21.358554" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.359554" 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-10-11T01:04:21.359223" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.360952" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:04:21.360612" elapsed="0.000399"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.361859" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:21.361261" elapsed="0.000634"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.362999" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:21.362353" elapsed="0.000681"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:21.364548" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:21.363901" elapsed="0.000756"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:21.364854" elapsed="0.000047"/>
</return>
<msg time="2026-10-11T01:04:21.365093" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:21.363277" elapsed="0.001849"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:21.365362" elapsed="0.000464"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:04:21.362165" elapsed="0.003717"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.366822" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:21.366205" elapsed="0.000652"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:21.368334" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:21.367713" elapsed="0.000749"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:21.368641" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T01:04:21.368892" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:21.367093" 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-10-11T01:04:21.369156" elapsed="0.000447"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:21.366022" elapsed="0.003633"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:21.361961" elapsed="0.007738"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:21.369757" elapsed="0.000051"/>
</return>
<msg time="2026-10-11T01:04:21.369956" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:21.360111" elapsed="0.009878"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:21.359708" elapsed="0.010321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:21.370270" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:21.370061" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:21.359679" elapsed="0.010687"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.371342" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:21.370611" elapsed="0.000767"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:21.371483" 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_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-10-11T01:04:21.353874" elapsed="0.017765"/>
</kw>
<msg time="2026-10-11T01:04:21.371790" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:21.343968" elapsed="0.027907"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:21.377870" 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_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-10-11T01:04:21.383449" 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/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-10-11T01:04:21.387572" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:21.387761" 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-10-11T01:04:21.387956" 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-10-11T01:04:21.388299" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:21.388150" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:21.388136" 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-10-11T01:04:21.388544" 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-10-11T01:04:21.388724" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:21.388900" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:21.388109" elapsed="0.000840"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:21.388022" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:21.389125" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:21.389191" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:21.389301" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:21.342506" elapsed="0.046820"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.390360" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:21.390134" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:21.398555" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:21.398634" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:21.398718" 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-10-11T01:04:21.390712" elapsed="0.008031"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:21.390480" elapsed="0.008299"/>
</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-10-11T01:04:21.398970" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:21.398818" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:21.390463" elapsed="0.008583"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.400470" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:21.400178" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:21.399936" elapsed="0.000607"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:21.399918" elapsed="0.000648"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.401140" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:21.400868" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:21.400617" elapsed="0.000597"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:21.400601" elapsed="0.000635"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.401807" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:21.401441" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:21.402114" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:21.401900" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.402637" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:21.402356" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:21.402190" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:21.401882" elapsed="0.000834"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.403244" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:21.402908" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:21.403559" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:21.403333" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.404074" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:21.403812" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:21.403634" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:21.403315" elapsed="0.000836"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:21.404297" elapsed="0.000318"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:21.405017" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:21.404777" elapsed="0.000265"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:21.405197" elapsed="0.000228"/>
</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-10-11T01:04:21.399582" elapsed="0.005901"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:04:21.405525" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:04:21.405700" 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-10-11T01:04:21.389587" elapsed="0.016138"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:21.405773" elapsed="0.000039"/>
</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-10-11T01:04:21.326026" elapsed="0.079859"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:21.325084" elapsed="0.080850"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:04:21.324257" elapsed="0.081730"/>
</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-10-11T01:04:21.409389" level="INFO">${update} = ffffffffffffffffffffffffffffffff004b0200000034400101004002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac0100802d10000fbf00000</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:04:21.406923" elapsed="0.002542"/>
</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-10-11T01:04:21.409722" elapsed="0.000429"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:04:21.410212" elapsed="0.000038"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:04:21.406615" elapsed="0.003739"/>
</kw>
<msg time="2026-10-11T01:04:21.410470" 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-10-11T01:04:21.406170" elapsed="0.004335"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.411613" level="INFO">Length is 150.</msg>
<msg time="2026-10-11T01:04:21.411714" 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-10-11T01:04:21.411251" elapsed="0.000494"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.412303" level="INFO">Length is 150.</msg>
<msg time="2026-10-11T01:04:21.412397" 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-10-11T01:04:21.411980" elapsed="0.000469"/>
</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-10-11T01:04:21.412705" elapsed="0.000391"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:04:21.413554" 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-10-11T01:04:21.413302" elapsed="0.000286"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:04:21.414015" 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-10-11T01:04:21.413788" elapsed="0.000260"/>
</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-10-11T01:04:21.414296" elapsed="0.000396"/>
</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-10-11T01:04:21.410773" elapsed="0.003996"/>
</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-10-11T01:04:21.431960" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:21.431640" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:21.432674" 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-10-11T01:04:21.432480" elapsed="0.000261">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-10-11T01:04:21.432839" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:21.432145" elapsed="0.000717"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.433347" 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-10-11T01:04:21.433036" elapsed="0.000337"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:21.433670" 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-10-11T01:04:21.433789" 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-10-11T01:04:21.433555" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.434238" 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-10-11T01:04:21.434020" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.435218" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:04:21.434989" elapsed="0.000271"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.435703" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:21.435452" elapsed="0.000275"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.436575" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:21.436088" elapsed="0.000511"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:21.437643" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:21.437192" elapsed="0.000490"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:21.437804" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:04:21.437985" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:21.436770" elapsed="0.001239"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:21.438174" elapsed="0.000286"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:04:21.435955" elapsed="0.002542"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.439194" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:21.438728" elapsed="0.000490"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:21.440250" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:21.439826" elapsed="0.000463"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:21.440395" elapsed="0.000056"/>
</return>
<msg time="2026-10-11T01:04:21.440600" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:21.439388" elapsed="0.001235"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:21.440787" elapsed="0.000282"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:21.438597" elapsed="0.002509"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:21.435811" elapsed="0.005326"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:21.441173" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:21.441300" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:21.434606" elapsed="0.006718"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:21.434339" elapsed="0.007013"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:21.441549" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:21.441374" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:21.434322" elapsed="0.007297"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.442458" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:21.441778" elapsed="0.000707"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:21.442529" 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/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-10-11T01:04:21.431096" elapsed="0.011536"/>
</kw>
<msg time="2026-10-11T01:04:21.442680" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:21.426711" elapsed="0.016025"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:21.446950" 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/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-10-11T01:04:21.451099" 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/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-10-11T01:04:21.455242" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:21.455437" 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-10-11T01:04:21.455620" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:21.455966" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:21.455820" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:21.455805" 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-10-11T01:04:21.456193" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:21.456372" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:21.456551" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:21.455769" elapsed="0.000830"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:21.455683" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:21.456772" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:21.456849" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:21.456957" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:21.426053" elapsed="0.030929"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.458007" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:21.457773" elapsed="0.000278"/>
</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-10-11T01:04:21.463202" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:21.463498" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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+xml', 'Content-Length': '635'} 
 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-path xmlns:a="urn:opendaylight:params:xml:ns:yang:bgp-rib" xmlns:b="urn:opendaylight:params:xml:ns:yang:bgp-types" xmlns:c="urn:opendaylight:params:xml:ns:yang:bgp:mvpn" xmlns:d="urn:opendaylight:params:xml:ns:yang:bgp:mvpn:ipv4"&gt;/a:application-rib[a:id='10.30.170.173']/a:tables[a:afi='b:ipv4-address-family'][a:safi='c:mcast-vpn-subsequent-address-family']/d:mvpn-routes-ipv4&lt;/error-path&gt;&lt;error-message&gt;Data does not exist&lt;/error-message&gt;&lt;error-tag&gt;data-missing&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-10-11T01:04:21.463631" level="INFO">${response} = None</msg>
<msg time="2026-10-11T01:04:21.463674" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:21.458333" elapsed="0.005704">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:21.458110" elapsed="0.006001">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:21.464325" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:21.464170" elapsed="0.000210"/>
</branch>
<status status="FAIL" start="2026-10-11T01:04:21.458094" elapsed="0.006308">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:21.465649" 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-10-11T01:04:21.465362" elapsed="0.000319">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:04:21.465121" elapsed="0.000616">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:04:21.465104" elapsed="0.000662">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-10-11T01:04:21.466343" 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-10-11T01:04:21.466082" elapsed="0.000291">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:04:21.465844" elapsed="0.000600">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:04:21.465828" elapsed="0.000647">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.467168" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:21.466664" elapsed="0.000530"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:21.467488" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:21.467258" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.468011" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:21.467730" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:21.467565" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:21.467241" elapsed="0.000847"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.468618" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:21.468264" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:21.468931" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:21.468707" elapsed="0.000277"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.469443" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:21.469167" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:21.469006" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:21.468690" elapsed="0.000831"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:21.469666" elapsed="0.000301"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:21.470345" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:21.470127" elapsed="0.000242"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-10-11T01:04:21.470706" 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-10-11T01:04:21.470544" elapsed="0.000191">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-10-11T01:04:21.464753" elapsed="0.006120">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-10-11T01:04:21.470927" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:21.471173" level="INFO">${response_text} = None</msg>
<msg time="2026-10-11T01:04:21.471229" 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-10-11T01:04:21.457213" elapsed="0.014045">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-10-11T01:04:21.471317" elapsed="0.000024"/>
</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-10-11T01:04:21.416133" elapsed="0.055337">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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:21.415580" elapsed="0.055946"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:04:21.415067" elapsed="0.056512"/>
</kw>
<arg>intra_source_as_4</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-10-11T01:04:19.206818" elapsed="2.264806"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:19.121034" elapsed="2.350691"/>
</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-10-11T01:04:21.473173" elapsed="0.000220"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:04:21.472918" 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-10-11T01:04:21.474578" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:21.474490" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:21.474473" elapsed="0.000169"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:21.476755" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:21.476672" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:21.476655" elapsed="0.000176"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.477742" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:21.477401" elapsed="0.000367"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.478199" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:04:21.477935" elapsed="0.000288"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:04:21.478264" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:21.478390" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:04:21.477040" elapsed="0.001388"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:21.480943" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:21.480857" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:21.480840" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:21.482058" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:21.481973" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:21.481956" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:21.482465" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:04:21.482270" elapsed="0.000222"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:21.482810" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:21.482659" elapsed="0.000176"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:04:21.515249" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:04:21.483324" elapsed="0.032019"/>
</kw>
<msg time="2026-10-11T01:04:21.515511" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:04:21.515553" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:21.482993" elapsed="0.032594"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:04:21.548805" 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-10-11T01:04:21.516106" elapsed="0.032840"/>
</kw>
<msg time="2026-10-11T01:04:21.549093" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:04:21.549134" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:21.515753" elapsed="0.033417"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:21.549474" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:21.549239" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:21.549220" elapsed="0.000327"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.549970" 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-10-11T01:04:21.549727" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:21.550297" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:21.550097" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:21.550080" elapsed="0.000287"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:04:21.550397" 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-10-11T01:04:21.552984" elapsed="0.000117"/>
</kw>
<msg time="2026-10-11T01:04:21.553159" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:21.551783" elapsed="0.001510"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:21.553618" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:21.553969" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:04:21.551185" elapsed="0.002966"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:04:21.550698" elapsed="0.003514"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:04:21.481702" elapsed="0.072582"/>
</kw>
<msg time="2026-10-11T01:04:21.554364" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:21.554417" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:21.481159" elapsed="0.073295"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:04:21.554608" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:04:21.554523" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:21.554505" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:21.555030" 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-10-11T01:04:21.555332" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:04:21.555394" 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-10-11T01:04:21.480559" elapsed="0.074946"/>
</kw>
<msg time="2026-10-11T01:04:21.555588" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:21.555628" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:21.478761" elapsed="0.076902"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:21.555970" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:21.555733" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:21.555717" elapsed="0.000323"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:04:21.478616" elapsed="0.077445"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:04:21.478476" elapsed="0.077612"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:04:21.476367" elapsed="0.079769"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:04:21.474191" elapsed="0.082028"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:21.473611" elapsed="0.082649"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:04:21.472392" elapsed="0.083916"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.557332" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:21.556929" elapsed="0.000429"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.557964" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:21.557560" elapsed="0.000429"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.558608" 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-10-11T01:04:21.558170" elapsed="0.000463"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:21.558958" 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-10-11T01:04:21.559089" 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-10-11T01:04:21.558814" elapsed="0.000300"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:21.559424" 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-10-11T01:04:21.559537" 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-10-11T01:04:21.559275" elapsed="0.000287"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:04:21.559704" elapsed="0.002468"/>
</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-10-11T01:04:21.562369" elapsed="0.002071"/>
</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-10-11T01:04:21.580457" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:21.580133" elapsed="0.000352"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:21.581197" 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-10-11T01:04:21.580987" elapsed="0.000281">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-10-11T01:04:21.581354" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:21.580644" elapsed="0.000733"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.581896" 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-10-11T01:04:21.581569" elapsed="0.000353"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:21.582203" 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-10-11T01:04:21.582338" 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-10-11T01:04:21.582089" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.582806" 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-10-11T01:04:21.582573" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.583820" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:21.583574" elapsed="0.000289"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.584290" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:21.584039" elapsed="0.000276"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.585120" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:21.584656" elapsed="0.000490"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:21.586293" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:21.585771" elapsed="0.000612"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:21.586482" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T01:04:21.586700" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:21.585319" 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-10-11T01:04:21.586913" elapsed="0.000314"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:04:21.584521" elapsed="0.002745"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.587968" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:21.587519" elapsed="0.000474"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:21.589132" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:21.588616" elapsed="0.000605"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:21.589301" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:04:21.589528" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:21.588163" 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-10-11T01:04:21.589723" elapsed="0.000316"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:21.587368" elapsed="0.002709"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:21.584361" elapsed="0.005748"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:21.590147" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:21.590278" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:21.583215" elapsed="0.007087"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:21.582956" elapsed="0.007375"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:21.590525" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:21.590353" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:21.582934" elapsed="0.007662"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.591509" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-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-10-11T01:04:21.590757" elapsed="0.000780"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:21.591581" 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/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-10-11T01:04:21.579612" elapsed="0.012071"/>
</kw>
<msg time="2026-10-11T01:04:21.591733" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:21.575221" elapsed="0.016556"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:21.595940" 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/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-10-11T01:04:21.600052" 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/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-10-11T01:04:21.604123" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:21.604305" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:21.604500" 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-10-11T01:04:21.604850" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:21.604693" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:21.604679" 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-10-11T01:04:21.605077" 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-10-11T01:04:21.605256" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:21.605433" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:21.604655" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:21.604566" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:21.605658" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:21.605723" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:21.605845" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-i...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:04:21.574603" elapsed="0.031267"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:21.606986" 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-10-11T01:04:21.606779" elapsed="0.000268">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-10-11T01:04:21.607129" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:21.606452" elapsed="0.000699"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:21.607449" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:21.607213" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.607979" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:21.607702" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:21.607525" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:21.607196" elapsed="0.000858"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.608561" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:21.608213" elapsed="0.000372"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:21.608658" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:21.608785" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:21.606139" elapsed="0.002682"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:21.609910" 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-10-11T01:04:21.609706" elapsed="0.000262">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-10-11T01:04:21.610051" 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-10-11T01:04:21.609370" elapsed="0.000703"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:04:21.610231" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:04:21.610135" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:21.610118" elapsed="0.000189"/>
</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-10-11T01:04:21.610476" elapsed="0.000020"/>
</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-10-11T01:04:21.610653" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:04:21.610711" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:21.610849" 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-10-11T01:04:21.609073" elapsed="0.001799"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.612100" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:21.611877" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:21.613952" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:21.612332" elapsed="0.001663"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:21.618937" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:21.619071" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:21.619168" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:21.614291" elapsed="0.005244">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:21.614058" elapsed="0.005554">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:21.619814" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:21.619643" elapsed="0.000230"/>
</branch>
<status status="FAIL" start="2026-10-11T01:04:21.614040" elapsed="0.005855">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:21.620234" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:21.620382" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:21.620320" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:21.620304" elapsed="0.000156"/>
</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-10-11T01:04:21.620602" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:04:21.620665" elapsed="0.000013"/>
</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-10-11T01:04:21.611154" elapsed="0.009605">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:21.620838" 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-10-11T01:04:21.567090" elapsed="0.053835">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:21.621170" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:21.621006" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:21.620990" elapsed="0.000265"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:21.621285" elapsed="0.000013"/>
</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-10-11T01:04:21.566425" elapsed="0.054947">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:23.656825" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:23.656061" elapsed="0.000831"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:23.658602" 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-10-11T01:04:23.658143" elapsed="0.000606">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-10-11T01:04:23.658966" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:23.657337" elapsed="0.001681"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.660160" 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-10-11T01:04:23.659435" elapsed="0.000783"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:23.660902" 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-10-11T01:04:23.661192" 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-10-11T01:04:23.660627" elapsed="0.000621"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.662251" 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-10-11T01:04:23.661730" elapsed="0.000618"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.664936" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:23.664354" elapsed="0.000682"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.666148" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:23.665556" elapsed="0.000647"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.668049" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:23.666981" elapsed="0.001124"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:23.670745" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:23.669557" elapsed="0.001409"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:23.671150" elapsed="0.000076"/>
</return>
<msg time="2026-10-11T01:04:23.671674" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:23.668532" elapsed="0.003198"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:23.672129" elapsed="0.000752"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:04:23.666659" elapsed="0.006307"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.674578" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:23.673551" elapsed="0.001082"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:23.677351" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:23.676157" elapsed="0.001428"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:23.677761" elapsed="0.000093"/>
</return>
<msg time="2026-10-11T01:04:23.678256" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:23.675035" elapsed="0.003274"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:23.678723" elapsed="0.000752"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:23.673194" elapsed="0.006357"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:23.666305" elapsed="0.013291"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:23.679651" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T01:04:23.679845" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:23.663130" elapsed="0.016748"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:23.662526" elapsed="0.017393"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.680162" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:23.679951" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.662481" elapsed="0.017777"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.681350" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-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-10-11T01:04:23.680552" elapsed="0.000835"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:23.681494" 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_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-10-11T01:04:23.654869" elapsed="0.026766"/>
</kw>
<msg time="2026-10-11T01:04:23.681703" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:23.644945" elapsed="0.036821"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:23.687745" 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_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-10-11T01:04:23.693516" 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_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-10-11T01:04:23.699560" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.699834" 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-10-11T01:04:23.700092" 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-10-11T01:04:23.700591" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:23.700363" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:23.700345" 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-10-11T01:04:23.700930" 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-10-11T01:04:23.701184" 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-10-11T01:04:23.701435" elapsed="0.000027"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:23.700308" elapsed="0.001196"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:23.700183" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.701751" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:23.701861" elapsed="0.000021"/>
</return>
<msg time="2026-10-11T01:04:23.702015" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-routes-i...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:04:23.643489" elapsed="0.058561"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:23.703624" 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-10-11T01:04:23.703341" elapsed="0.000366">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-10-11T01:04:23.703845" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:23.702883" elapsed="0.000995"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.704280" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:23.703968" elapsed="0.000385"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.705047" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:23.704657" elapsed="0.000424"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:23.704385" elapsed="0.000741"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.703943" elapsed="0.001211"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.705894" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:23.705380" elapsed="0.000549"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:23.705992" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T01:04:23.706210" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:23.702445" elapsed="0.003797"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:23.707784" 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-10-11T01:04:23.707524" elapsed="0.000361">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-10-11T01:04:23.708002" 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-10-11T01:04:23.707054" elapsed="0.000980"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:04:23.708261" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-10-11T01:04:23.708123" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.708099" 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-10-11T01:04:23.708610" elapsed="0.000028"/>
</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-10-11T01:04:23.708875" elapsed="0.000027"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:04:23.708959" elapsed="0.000019"/>
</return>
<msg time="2026-10-11T01:04:23.709131" 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-10-11T01:04:23.706617" elapsed="0.002547"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.710908" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:23.710582" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.711563" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:23.711238" 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="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:23.718513" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:23.718713" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:23.718855" 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-10-11T01:04:23.712038" elapsed="0.006852"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:23.711703" elapsed="0.007241"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.719191" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:23.718977" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.711679" 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-10-11T01:04:23.721546" 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-10-11T01:04:23.721050" elapsed="0.000561"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:23.720689" elapsed="0.000967"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.720665" elapsed="0.001023"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.722516" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:23.722114" elapsed="0.000464"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:23.721760" elapsed="0.000862"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.721738" elapsed="0.000915"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.723470" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:23.722961" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.723915" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:23.723598" elapsed="0.000391"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.724641" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:23.724249" elapsed="0.000427"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:23.724020" elapsed="0.000702"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.723575" elapsed="0.001174"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.725526" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:23.725011" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.725960" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:23.725651" elapsed="0.000382"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.726680" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:23.726292" elapsed="0.000421"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:23.726064" elapsed="0.000694"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.725628" elapsed="0.001172"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:23.727005" elapsed="0.000424"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:23.727988" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:23.727658" 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-10-11T01:04:23.728238" elapsed="0.000315"/>
</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-10-11T01:04:23.720185" elapsed="0.008447"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:23.728853" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:23.728718" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.728695" elapsed="0.000241"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:23.730068" 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-10-11T01:04:23.729134" elapsed="0.000972"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:23.730171" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T01:04:23.730347" 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-10-11T01:04:23.709575" elapsed="0.020807"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:23.730480" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T01:04:23.730649" 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-10-11T01:04:23.626558" elapsed="0.104124"/>
</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-10-11T01:04:23.742038" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:23.741717" elapsed="0.000348"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:23.742779" 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-10-11T01:04:23.742558" elapsed="0.000388">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-10-11T01:04:23.743111" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:23.742224" elapsed="0.000911"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.743644" 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-10-11T01:04:23.743310" elapsed="0.000360"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:23.743961" 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-10-11T01:04:23.744089" 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-10-11T01:04:23.743851" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.744549" 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-10-11T01:04:23.744310" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:23.744967" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:23.744657" elapsed="0.000364"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.745658" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:23.745193" elapsed="0.000490"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:23.745044" elapsed="0.000671"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.744639" elapsed="0.001096"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.746300" 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-10-11T01:04:23.745913" elapsed="0.000413"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:23.746370" 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/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-10-11T01:04:23.741192" elapsed="0.005317"/>
</kw>
<msg time="2026-10-11T01:04:23.746561" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:23.736679" elapsed="0.009926"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:23.750712" 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/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-10-11T01:04:23.754809" 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/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-10-11T01:04:23.758910" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.759093" 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-10-11T01:04:23.759276" 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-10-11T01:04:23.759635" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:23.759485" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:23.759470" 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-10-11T01:04:23.759886" 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-10-11T01:04:23.760077" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.760244" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:23.759444" elapsed="0.000847"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:23.759341" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.760482" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:23.760550" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:23.760675" 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-10-11T01:04:23.735963" elapsed="0.024737"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:23.760877" elapsed="0.000321"/>
</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-10-11T01:04:23.762309" 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-10-11T01:04:23.761864" elapsed="0.000472"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:23.763202" 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-10-11T01:04:23.762599" elapsed="0.000631"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:04:23.763432" elapsed="0.000296"/>
</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-10-11T01:04:23.761485" elapsed="0.002312"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:23.761267" elapsed="0.002562"/>
</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-10-11T01:04:23.764028" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:23.763852" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.761250" elapsed="0.002848"/>
</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-10-11T01:04:23.732042" elapsed="0.032100"/>
</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-10-11T01:04:23.731088" elapsed="0.033119"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:23.730783" elapsed="0.033501"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.730761" elapsed="0.033545"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:23.764337" 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="PASS" start="2026-10-11T01:04:23.624978" elapsed="0.139481"/>
</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-10-11T01:04:21.564633" elapsed="2.199879"/>
</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-10-11T01:04:23.780030" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:23.779708" elapsed="0.000348"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:23.780722" 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-10-11T01:04:23.780549" elapsed="0.000232">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-10-11T01:04:23.780879" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:23.780214" elapsed="0.000687"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.781385" 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-10-11T01:04:23.781077" elapsed="0.000347"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:23.781703" 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-10-11T01:04:23.781828" 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-10-11T01:04:23.781594" elapsed="0.000259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.782265" 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-10-11T01:04:23.782049" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.783216" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:23.782988" elapsed="0.000269"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.783696" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:23.783448" elapsed="0.000272"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.784500" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:23.784049" elapsed="0.000475"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:23.785799" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:23.785129" elapsed="0.000761"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:23.785970" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:04:23.786184" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:23.784692" 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-10-11T01:04:23.786375" elapsed="0.000323"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/effective-rib-in</var>
<status status="PASS" start="2026-10-11T01:04:23.783917" elapsed="0.002819"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.787436" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:23.786981" elapsed="0.000481"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:23.788652" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:23.788079" elapsed="0.000662"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:23.788836" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:04:23.789046" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:23.787640" 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-10-11T01:04:23.789236" elapsed="0.000373"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:23.786849" elapsed="0.002799"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:23.783762" elapsed="0.005917"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:23.789716" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:23.789858" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:23.782634" elapsed="0.007248"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:23.782367" elapsed="0.007544"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.790083" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:23.789933" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.782350" elapsed="0.007802"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.790883" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-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-10-11T01:04:23.790310" elapsed="0.000601"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:23.790955" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:23.779189" elapsed="0.011865"/>
</kw>
<msg time="2026-10-11T01:04:23.791101" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:23.774892" elapsed="0.016253"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:23.795372" 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/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-10-11T01:04:23.799472" 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/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-10-11T01:04:23.803534" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.803715" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.803910" 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-10-11T01:04:23.804246" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:23.804099" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:23.804085" 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-10-11T01:04:23.804522" 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-10-11T01:04:23.804705" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.804881" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:23.804060" elapsed="0.000869"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:23.803975" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.805104" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:23.805169" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:23.805279" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv4:mvpn-ro...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:04:23.774272" elapsed="0.031032"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:23.806417" 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-10-11T01:04:23.806218" elapsed="0.000261">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-10-11T01:04:23.806562" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:23.805893" elapsed="0.000692"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.806883" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:23.806648" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.807385" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:23.807124" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:23.806958" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.806631" elapsed="0.000846"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.807989" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:23.807639" elapsed="0.000374"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:23.808057" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:23.808180" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:23.805581" elapsed="0.002622"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:23.809470" 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-10-11T01:04:23.809267" elapsed="0.000264">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-10-11T01:04:23.809615" 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-10-11T01:04:23.808771" elapsed="0.000866"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:04:23.809810" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:04:23.809701" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.809683" elapsed="0.000205"/>
</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-10-11T01:04:23.810042" elapsed="0.000020"/>
</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-10-11T01:04:23.810217" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:04:23.810276" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:04:23.810449" 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-10-11T01:04:23.808467" elapsed="0.002006"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.811692" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:23.811467" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.812156" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:23.811937" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:23.817326" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:23.817456" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:23.817544" 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-10-11T01:04:23.812499" elapsed="0.005069"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:23.812257" elapsed="0.005350"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.817784" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:23.817630" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.812240" elapsed="0.005640"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.819146" 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-10-11T01:04:23.818818" elapsed="0.000374"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:23.818566" elapsed="0.000657"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.818549" elapsed="0.000697"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.819842" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:23.819559" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:23.819296" elapsed="0.000619"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.819281" elapsed="0.000769"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.820579" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:23.820225" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.820898" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:23.820666" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.821394" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:23.821134" elapsed="0.000299"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:23.820972" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.820649" elapsed="0.000837"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.822003" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:23.821661" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.822297" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:23.822090" elapsed="0.000258"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.822818" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:23.822547" elapsed="0.000296"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:23.822369" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.822074" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:23.823072" elapsed="0.000294"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:23.823762" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:23.823542" elapsed="0.000259"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:23.823957" elapsed="0.000210"/>
</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-10-11T01:04:23.818197" elapsed="0.006024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:23.824366" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:23.824284" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.824267" elapsed="0.000175"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:23.825208" 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-10-11T01:04:23.824583" elapsed="0.000652"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:23.825282" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:23.825421" 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-10-11T01:04:23.810749" elapsed="0.014699"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:23.825503" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:04:23.825623" 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-10-11T01:04:23.767033" elapsed="0.058614"/>
</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-10-11T01:04:23.836239" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:23.835940" elapsed="0.000325"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:23.836988" 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-10-11T01:04:23.836757" elapsed="0.000348">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-10-11T01:04:23.837266" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:23.836439" elapsed="0.000850"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.837805" 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-10-11T01:04:23.837486" elapsed="0.000345"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:23.838105" 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-10-11T01:04:23.838221" 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-10-11T01:04:23.837998" elapsed="0.000247"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.838681" 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-10-11T01:04:23.838454" 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-10-11T01:04:23.839129" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:23.838834" elapsed="0.000349"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.839829" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:23.839354" elapsed="0.000501"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:23.839205" elapsed="0.000683"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.838816" elapsed="0.001091"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.840471" 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-10-11T01:04:23.840070" elapsed="0.000428"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:23.840543" 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/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-10-11T01:04:23.835417" elapsed="0.005226"/>
</kw>
<msg time="2026-10-11T01:04:23.840694" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:23.831032" elapsed="0.009706"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:23.844995" 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/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-10-11T01:04:23.849075" 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/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-10-11T01:04:23.853203" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.853435" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.853626" 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-10-11T01:04:23.854003" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:23.853853" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:23.853838" 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-10-11T01:04:23.854236" 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-10-11T01:04:23.854431" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.854601" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:23.853809" elapsed="0.000840"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:23.853697" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.854889" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:23.854959" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:04:23.855099" 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-10-11T01:04:23.830310" elapsed="0.024816"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:23.855296" elapsed="0.000375"/>
</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-10-11T01:04:23.856836" 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-10-11T01:04:23.856346" elapsed="0.000519"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:23.857465" 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-10-11T01:04:23.857018" 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-10-11T01:04:23.857677" elapsed="0.000300"/>
</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-10-11T01:04:23.855969" elapsed="0.002064"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:23.855741" elapsed="0.002322"/>
</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-10-11T01:04:23.858263" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:23.858086" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.855724" elapsed="0.002609"/>
</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-10-11T01:04:23.826751" elapsed="0.031626"/>
</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-10-11T01:04:23.825934" elapsed="0.032527"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:23.825719" elapsed="0.032784"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.825704" elapsed="0.032821"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:23.858556" 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-10-11T01:04:23.766384" elapsed="0.092280"/>
</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-10-11T01:04:23.764703" elapsed="0.094015"/>
</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-10-11T01:04:23.874675" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:23.874353" elapsed="0.000348"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:23.875393" 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-10-11T01:04:23.875194" elapsed="0.000281">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-10-11T01:04:23.875591" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:23.874873" elapsed="0.000741"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.876111" 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-10-11T01:04:23.875799" elapsed="0.000337"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:23.876427" 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-10-11T01:04:23.876561" 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-10-11T01:04:23.876302" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.877013" 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-10-11T01:04:23.876780" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.877975" 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-10-11T01:04:23.877728" elapsed="0.000288"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.878456" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:23.878192" elapsed="0.000289"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.879243" 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-10-11T01:04:23.878806" elapsed="0.000461"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:23.880434" 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-10-11T01:04:23.879901" elapsed="0.000624"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:23.880607" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:04:23.880835" 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-10-11T01:04:23.879460" 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-10-11T01:04:23.881025" elapsed="0.000315"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:04:23.878663" elapsed="0.002714"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.882081" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:23.881627" elapsed="0.000478"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:23.883251" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:23.882734" elapsed="0.000609"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:23.883443" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:04:23.883657" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:23.882274" elapsed="0.001407"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:23.883859" elapsed="0.000436"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:23.881496" elapsed="0.002837"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:23.878524" elapsed="0.005840"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:23.884404" elapsed="0.000138"/>
</return>
<msg time="2026-10-11T01:04:23.884648" 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-10-11T01:04:23.877369" elapsed="0.007303"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:23.877117" elapsed="0.007583"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.884883" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:23.884722" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.877100" elapsed="0.007853"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.885635" 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-10-11T01:04:23.885112" elapsed="0.000550"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:23.885706" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:23.873846" elapsed="0.011972"/>
</kw>
<msg time="2026-10-11T01:04:23.885899" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:23.869519" elapsed="0.016427"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:23.890058" 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/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-10-11T01:04:23.894146" 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/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-10-11T01:04:23.898230" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.898425" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.898610" 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-10-11T01:04:23.899003" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:23.898856" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:23.898842" 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-10-11T01:04:23.899231" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.899426" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.899605" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:23.898816" elapsed="0.000837"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:23.898675" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.899840" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:23.899907" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:23.900014" 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-10-11T01:04:23.868902" elapsed="0.031136"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:23.901150" 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-10-11T01:04:23.900965" elapsed="0.000245">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-10-11T01:04:23.901294" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:23.900623" elapsed="0.000694"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.901649" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:23.901426" elapsed="0.000275"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.902178" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:23.901915" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:23.901723" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.901393" elapsed="0.000860"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.902809" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:23.902460" elapsed="0.000374"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:23.902879" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:23.903004" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:23.900304" elapsed="0.002723"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:23.904117" 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-10-11T01:04:23.903934" elapsed="0.000241">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-10-11T01:04:23.904260" 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-10-11T01:04:23.903594" elapsed="0.000688"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:04:23.904461" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:04:23.904345" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.904328" elapsed="0.000211"/>
</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-10-11T01:04:23.904695" elapsed="0.000019"/>
</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-10-11T01:04:23.904884" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:04:23.904944" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:04:23.905067" 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-10-11T01:04:23.903276" elapsed="0.001814"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.907559" 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-10-11T01:04:23.907309" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.908037" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:23.907813" elapsed="0.000266"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:23.912707" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:23.912862" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:04:23.912960" 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-10-11T01:04:23.908371" elapsed="0.004614"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:23.908141" elapsed="0.004883"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.913202" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:23.913048" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.908124" elapsed="0.005157"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.914620" 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-10-11T01:04:23.914258" elapsed="0.000409"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:23.914016" elapsed="0.000683"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.913999" elapsed="0.000723"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.915297" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:23.915028" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:23.914773" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.914758" elapsed="0.000635"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.915953" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:23.915591" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.916256" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:23.916043" elapsed="0.000265"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.916773" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:23.916509" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:23.916330" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.916026" elapsed="0.000835"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.917370" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:23.917036" elapsed="0.000360"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.917685" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:23.917474" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.918196" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:23.917934" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:23.917758" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.917457" elapsed="0.000815"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:23.918430" elapsed="0.000289"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:23.919115" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:23.918893" elapsed="0.000246"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:23.919293" elapsed="0.000226"/>
</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-10-11T01:04:23.913662" elapsed="0.005913"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:23.919718" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:23.919637" elapsed="0.000121"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.919620" elapsed="0.000158"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:23.920574" 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-10-11T01:04:23.919933" elapsed="0.000668"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:23.920648" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:23.920775" 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-10-11T01:04:23.905367" elapsed="0.015445"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:23.920867" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:04:23.920987" 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-10-11T01:04:23.861234" elapsed="0.059806"/>
</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-10-11T01:04:23.931645" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:23.931325" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:23.932387" 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-10-11T01:04:23.932164" elapsed="0.000363">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-10-11T01:04:23.932692" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:23.931845" elapsed="0.000870"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.933210" 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-10-11T01:04:23.932904" elapsed="0.000331"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:23.933537" 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-10-11T01:04:23.933656" 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-10-11T01:04:23.933402" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.934110" 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-10-11T01:04:23.933893" elapsed="0.000264"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:23.934530" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:23.934216" elapsed="0.000368"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.935216" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:23.934755" elapsed="0.000486"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:23.934607" elapsed="0.000667"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.934199" elapsed="0.001095"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.935878" 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-10-11T01:04:23.935475" elapsed="0.000430"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:23.935948" 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/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-10-11T01:04:23.930822" elapsed="0.005227"/>
</kw>
<msg time="2026-10-11T01:04:23.936100" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:23.926422" elapsed="0.009722"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:23.940255" 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/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-10-11T01:04:23.944413" 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/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-10-11T01:04:23.948644" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.948842" 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-10-11T01:04:23.949029" 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-10-11T01:04:23.949374" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:23.949226" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:23.949212" 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-10-11T01:04:23.949620" 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-10-11T01:04:23.949813" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.949983" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:23.949186" elapsed="0.000845"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:23.949096" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.950209" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:23.950276" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:23.950399" 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-10-11T01:04:23.925690" elapsed="0.024750"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:23.950609" elapsed="0.000331"/>
</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-10-11T01:04:23.952040" 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-10-11T01:04:23.951591" elapsed="0.000478"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:23.952671" 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-10-11T01:04:23.952221" elapsed="0.000476"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:04:23.952895" elapsed="0.000312"/>
</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-10-11T01:04:23.951209" elapsed="0.002054"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:23.951011" elapsed="0.002283"/>
</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-10-11T01:04:23.953511" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:23.953316" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.950994" elapsed="0.002588"/>
</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-10-11T01:04:23.922000" elapsed="0.031625"/>
</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-10-11T01:04:23.921321" elapsed="0.032369"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:23.921115" elapsed="0.032615"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.921099" elapsed="0.032653"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:23.953781" elapsed="0.000038"/>
</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-10-11T01:04:23.860608" elapsed="0.093285"/>
</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-10-11T01:04:23.858920" elapsed="0.095025"/>
</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-10-11T01:04:23.954097" elapsed="0.002621"/>
</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-10-11T01:04:23.972345" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:23.972038" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:23.973063" 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-10-11T01:04:23.972884" elapsed="0.000240">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-10-11T01:04:23.973207" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:23.972549" elapsed="0.000680"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.973734" 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-10-11T01:04:23.973418" elapsed="0.000342"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:23.974049" 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-10-11T01:04:23.974171" 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-10-11T01:04:23.973941" elapsed="0.000254"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.974628" 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-10-11T01:04:23.974388" 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-10-11T01:04:23.975577" 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-10-11T01:04:23.975330" elapsed="0.000289"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.976063" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:23.975813" elapsed="0.000273"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.976859" 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-10-11T01:04:23.976395" elapsed="0.000489"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:23.978014" 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-10-11T01:04:23.977501" elapsed="0.000647"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:23.978234" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:04:23.978465" 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-10-11T01:04:23.977055" elapsed="0.001439"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:23.978666" elapsed="0.000319"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:04:23.976265" elapsed="0.002760"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.979711" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:23.979255" elapsed="0.000480"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:23.980886" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:23.980341" elapsed="0.000636"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:23.981058" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:04:23.981267" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:23.979917" 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-10-11T01:04:23.981476" elapsed="0.000302"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:23.979124" elapsed="0.002709"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:23.976129" elapsed="0.005736"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:23.981902" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:23.982030" 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-10-11T01:04:23.974993" elapsed="0.007060"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:23.974731" elapsed="0.007351"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.982253" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:23.982104" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.974713" elapsed="0.007609"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.983053" 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-10-11T01:04:23.982553" elapsed="0.000526"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:23.983122" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:23.971512" elapsed="0.011710"/>
</kw>
<msg time="2026-10-11T01:04:23.983341" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:23.967054" elapsed="0.016332"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:23.987722" 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/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-10-11T01:04:23.991828" 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/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-10-11T01:04:23.995914" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.996131" 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-10-11T01:04:23.996315" 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-10-11T01:04:23.996682" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:23.996535" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:23.996521" 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-10-11T01:04:23.996925" 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-10-11T01:04:23.997108" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.997272" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:23.996489" elapsed="0.000831"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:23.996381" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.997511" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:23.997578" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:23.997685" 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-10-11T01:04:23.966447" elapsed="0.031262"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:23.998826" 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-10-11T01:04:23.998626" elapsed="0.000260">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-10-11T01:04:23.998968" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:23.998286" elapsed="0.000705"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:23.999273" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:23.999054" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:23.999811" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:23.999537" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:23.999346" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:23.999037" elapsed="0.000851"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:24.000380" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:24.000047" elapsed="0.000371"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:24.000465" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:24.000590" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:23.997986" elapsed="0.002627"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:24.001658" 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-10-11T01:04:24.001508" elapsed="0.000198"/>
</kw>
<msg time="2026-10-11T01:04:24.001781" 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-10-11T01:04:24.001174" elapsed="0.000641"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:04:24.001978" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:24.001880" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:24.001862" elapsed="0.000211"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:24.002355" 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-10-11T01:04:24.002490" 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-10-11T01:04:24.002231" elapsed="0.000282"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:04:24.002873" 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-10-11T01:04:24.002675" elapsed="0.000221"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:04:24.002938" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:04:24.003062" 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-10-11T01:04:24.000876" elapsed="0.002208"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:24.004307" 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-10-11T01:04:24.004084" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:24.004775" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:24.004560" elapsed="0.000267"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:24.009694" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:24.009828" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:04:24.009917" 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-10-11T01:04:24.005113" elapsed="0.004828"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:24.004887" elapsed="0.005093"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:24.010156" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:24.010003" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:24.004870" elapsed="0.005362"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:24.011519" 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-10-11T01:04:24.011171" elapsed="0.000394"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:24.010930" elapsed="0.000667"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:24.010912" elapsed="0.000707"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:24.012189" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:24.011923" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:24.011670" elapsed="0.000591"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:24.011654" elapsed="0.000629"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:24.012840" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:24.012477" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:24.013139" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:24.012928" elapsed="0.000263"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:24.013655" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:24.013376" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:24.013212" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:24.012912" elapsed="0.000851"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:24.014295" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:24.013956" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:24.014612" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:24.014383" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:24.015126" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:24.014863" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:24.014686" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:24.014366" elapsed="0.000837"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:24.015348" elapsed="0.000309"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:24.016051" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:24.015831" elapsed="0.000244"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:24.016229" elapsed="0.000222"/>
</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-10-11T01:04:24.010574" elapsed="0.005933"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:24.016650" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:24.016569" elapsed="0.000121"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:24.016552" elapsed="0.000157"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:24.017550" 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-10-11T01:04:24.016862" elapsed="0.000716"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:24.017624" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:24.017750" 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-10-11T01:04:24.003362" elapsed="0.014412"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:24.017842" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:04:24.017963" 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-10-11T01:04:23.959227" elapsed="0.058760"/>
</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-10-11T01:04:24.028634" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:24.028317" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:24.029364" 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-10-11T01:04:24.029146" elapsed="0.000357">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-10-11T01:04:24.029667" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:24.028828" elapsed="0.000862"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:24.030184" 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-10-11T01:04:24.029875" elapsed="0.000334"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:24.030543" 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-10-11T01:04:24.030658" 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-10-11T01:04:24.030423" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:24.031111" 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-10-11T01:04:24.030892" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:24.031529" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:24.031213" elapsed="0.000370"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:24.032212" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:24.031752" elapsed="0.000485"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:24.031605" elapsed="0.000665"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:24.031196" elapsed="0.001094"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:24.032869" 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-10-11T01:04:24.032473" elapsed="0.000423"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:24.032940" 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/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-10-11T01:04:24.027819" elapsed="0.005221"/>
</kw>
<msg time="2026-10-11T01:04:24.033087" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:24.023466" elapsed="0.009665"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:24.037281" 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/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-10-11T01:04:24.041336" 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/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-10-11T01:04:24.045534" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:24.045718" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:24.045915" 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-10-11T01:04:24.046255" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:24.046109" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:24.046095" 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-10-11T01:04:24.046544" 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-10-11T01:04:24.046732" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:24.046908" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:24.046071" elapsed="0.000885"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:24.045982" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:24.047129" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:24.047195" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:24.047298" 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-10-11T01:04:24.022732" elapsed="0.024591"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:24.047503" elapsed="0.000323"/>
</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-10-11T01:04:24.048705" 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-10-11T01:04:24.048471" elapsed="0.000260"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:24.049473" 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-10-11T01:04:24.048894" elapsed="0.000606"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:04:24.049962" 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-10-11T01:04:24.050153" 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-10-11T01:04:24.049682" elapsed="0.000537">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-10-11T01:04:24.048095" elapsed="0.002274">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-10-11T01:04:24.047895" elapsed="0.002603">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-10-11T01:04:24.050717" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:24.050538" elapsed="0.000230"/>
</branch>
<status status="FAIL" start="2026-10-11T01:04:24.047879" elapsed="0.002921">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-10-11T01:04:24.019051" elapsed="0.031878">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-10-11T01:04:24.018351" elapsed="0.032720">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-10-11T01:04:24.018060" elapsed="0.033097">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-10-11T01:04:24.018044" elapsed="0.033147">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-10-11T01:04:24.051236" elapsed="0.000015"/>
</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-10-11T01:04:23.958602" elapsed="0.092756">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-10-11T01:04:26.086482" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:26.085726" elapsed="0.000823"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:26.088151" 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-10-11T01:04:26.087685" elapsed="0.000611">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-10-11T01:04:26.088525" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:26.086936" elapsed="0.001642"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.089717" 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-10-11T01:04:26.088989" elapsed="0.000784"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:26.090452" 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-10-11T01:04:26.090824" 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-10-11T01:04:26.090174" elapsed="0.000707"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.091866" 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-10-11T01:04:26.091317" elapsed="0.000645"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.094057" 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-10-11T01:04:26.093519" elapsed="0.000630"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.095157" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:26.094573" elapsed="0.000638"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.097051" 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-10-11T01:04:26.095972" elapsed="0.001135"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:26.099071" 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-10-11T01:04:26.098313" elapsed="0.000880"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:26.099308" elapsed="0.000047"/>
</return>
<msg time="2026-10-11T01:04:26.099637" 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-10-11T01:04:26.097533" elapsed="0.002139"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:26.099923" elapsed="0.000437"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:04:26.095655" elapsed="0.004785"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.101380" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:26.100766" elapsed="0.000674"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:26.103087" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:26.102283" elapsed="0.000927"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:26.103322" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T01:04:26.103668" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:26.101678" elapsed="0.002024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:26.103951" elapsed="0.000637"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:26.100584" elapsed="0.004059"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:26.095311" elapsed="0.009376"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:26.104741" elapsed="0.000054"/>
</return>
<msg time="2026-10-11T01:04:26.104941" 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-10-11T01:04:26.092711" elapsed="0.012262"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:26.092108" elapsed="0.012961"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:26.105318" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:26.105104" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:26.092063" elapsed="0.013387"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.106451" 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-10-11T01:04:26.105688" elapsed="0.000801"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:26.106550" 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-10-11T01:04:26.084545" elapsed="0.022144"/>
</kw>
<msg time="2026-10-11T01:04:26.106757" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:26.074612" elapsed="0.032224"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:26.112631" 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/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-10-11T01:04:26.118459" 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-10-11T01:04:26.124140" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:26.124393" elapsed="0.000046"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:26.124668" 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-10-11T01:04:26.125154" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:26.124951" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:26.124933" elapsed="0.000320"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:26.125493" 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-10-11T01:04:26.125747" 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-10-11T01:04:26.125994" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:26.124896" elapsed="0.001165"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:26.124759" elapsed="0.001334"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:26.126301" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:26.126393" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T01:04:26.126563" 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-10-11T01:04:26.073167" elapsed="0.053471"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:26.128208" 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-10-11T01:04:26.127948" elapsed="0.000343">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-10-11T01:04:26.128427" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:26.127478" elapsed="0.000983"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:26.128874" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:26.128550" elapsed="0.000397"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.129615" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:26.129227" elapsed="0.000422"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:26.128978" elapsed="0.000715"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:26.128526" elapsed="0.001195"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.130451" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:26.129965" elapsed="0.000521"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:26.130548" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T01:04:26.130720" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:26.127037" elapsed="0.003714"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:26.132223" 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-10-11T01:04:26.132025" elapsed="0.000266"/>
</kw>
<msg time="2026-10-11T01:04:26.132395" 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-10-11T01:04:26.131556" elapsed="0.000890"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:04:26.132681" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:26.132546" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:26.132523" elapsed="0.000241"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:26.133174" 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-10-11T01:04:26.133335" 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-10-11T01:04:26.133001" elapsed="0.000366"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:04:26.133889" 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-10-11T01:04:26.133616" elapsed="0.000306"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:04:26.133980" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T01:04:26.134150" 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-10-11T01:04:26.131120" elapsed="0.003062"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.136156" 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-10-11T01:04:26.135592" elapsed="0.000625"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.136825" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:26.136505" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:26.143141" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:26.143376" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:04:26.143542" 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-10-11T01:04:26.137284" elapsed="0.006302"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:26.136965" elapsed="0.006682"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:26.143935" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:26.143683" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:26.136941" elapsed="0.007104"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.145906" 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-10-11T01:04:26.145396" elapsed="0.000573"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:26.145049" elapsed="0.000964"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:26.145025" elapsed="0.001020"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.146867" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:26.146472" elapsed="0.000454"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:26.146116" elapsed="0.000854"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:26.146095" elapsed="0.000906"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.147770" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:26.147259" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:26.148222" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:26.147921" elapsed="0.000376"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.148994" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:26.148582" elapsed="0.000448"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:26.148329" elapsed="0.000747"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:26.147898" elapsed="0.001205"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.149861" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:26.149351" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:26.150281" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:26.149985" elapsed="0.000368"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.151027" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:26.150642" elapsed="0.000419"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:26.150385" elapsed="0.000721"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:26.149962" elapsed="0.001172"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:26.151339" elapsed="0.000431"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:26.152329" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:26.152013" 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-10-11T01:04:26.152605" elapsed="0.000352"/>
</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-10-11T01:04:26.144541" elapsed="0.008514"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:26.153284" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:26.153163" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:26.153134" elapsed="0.000237"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:26.154296" 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-10-11T01:04:26.153591" elapsed="0.000783"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:26.154464" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T01:04:26.154651" 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-10-11T01:04:26.134587" elapsed="0.020098"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:26.154763" elapsed="0.000051"/>
</return>
<msg time="2026-10-11T01:04:26.154956" 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-10-11T01:04:26.056494" elapsed="0.098495"/>
</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-10-11T01:04:26.166966" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:26.166653" elapsed="0.000339"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:26.167725" 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-10-11T01:04:26.167482" elapsed="0.000387">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-10-11T01:04:26.168031" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:26.167151" elapsed="0.000904"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.168558" 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-10-11T01:04:26.168230" elapsed="0.000354"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:26.168871" 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-10-11T01:04:26.169001" 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-10-11T01:04:26.168750" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.169455" 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-10-11T01:04:26.169220" elapsed="0.000280"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:26.169878" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:26.169564" elapsed="0.000368"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.170568" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:26.170102" elapsed="0.000491"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:26.169954" elapsed="0.000671"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:26.169547" elapsed="0.001098"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.171206" 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-10-11T01:04:26.170822" elapsed="0.000411"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:26.171276" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:26.166137" elapsed="0.005238"/>
</kw>
<msg time="2026-10-11T01:04:26.171480" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:26.161698" elapsed="0.009837"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:26.175683" 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/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-10-11T01:04:26.179776" 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-10-11T01:04:26.185158" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:26.185346" 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-10-11T01:04:26.185546" 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-10-11T01:04:26.185913" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:26.185751" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:26.185737" 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-10-11T01:04:26.186145" 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-10-11T01:04:26.186325" 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-10-11T01:04:26.186507" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:26.185710" elapsed="0.000845"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:26.185617" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:26.186732" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:26.186855" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:04:26.186962" 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-10-11T01:04:26.160978" elapsed="0.026010"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:26.187157" elapsed="0.000330"/>
</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-10-11T01:04:26.188385" 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-10-11T01:04:26.188142" elapsed="0.000313"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:26.188861" 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-10-11T01:04:26.188611" elapsed="0.000277"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:04:26.189071" elapsed="0.000280"/>
</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-10-11T01:04:26.187759" elapsed="0.001662"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:26.187558" elapsed="0.001895"/>
</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-10-11T01:04:26.189655" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:26.189477" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:26.187541" elapsed="0.002184"/>
</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-10-11T01:04:26.156326" elapsed="0.033442"/>
</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-10-11T01:04:26.155381" elapsed="0.034469"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:26.155091" elapsed="0.034803"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:26.155069" elapsed="0.034846"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:26.189945" 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-10-11T01:04:26.054921" elapsed="0.135125"/>
</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-10-11T01:04:23.956921" elapsed="2.233177"/>
</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-10-11T01:04:26.190296" elapsed="0.002798"/>
</kw>
<arg>intra_source_as_4</arg>
<arg>${MVPN_DIR}</arg>
<status status="PASS" start="2026-10-11T01:04:21.556549" elapsed="4.636599"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:21.472002" elapsed="4.721251"/>
</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-10-11T01:04:26.194624" elapsed="0.000222"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:04:26.194352" 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-10-11T01:04:26.195819" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:26.195717" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:26.195699" elapsed="0.000184"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:26.198030" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:26.197945" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:26.197927" elapsed="0.000167"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.199022" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:26.198678" elapsed="0.000370"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.199488" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:04:26.199206" elapsed="0.000306"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:04:26.199554" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:26.199682" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:04:26.198303" elapsed="0.001403"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:26.202226" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:26.202141" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:26.202124" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:26.203348" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:26.203265" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:26.203248" elapsed="0.000212"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:26.203797" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:04:26.203616" elapsed="0.000206"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:26.204133" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:26.203990" elapsed="0.000167"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:04:26.237691" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:04:26.204672" elapsed="0.033131"/>
</kw>
<msg time="2026-10-11T01:04:26.237962" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:04:26.238006" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:26.204316" elapsed="0.033726"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:04:26.270320" 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-10-11T01:04:26.238586" elapsed="0.031850"/>
</kw>
<msg time="2026-10-11T01:04:26.270587" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:04:26.270628" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:26.238215" elapsed="0.032449"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:26.270962" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:26.270733" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:26.270715" elapsed="0.000320"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.271462" 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-10-11T01:04:26.271218" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:26.271803" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:26.271587" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:26.271570" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:04:26.271905" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:26.274329" elapsed="0.000261"/>
</kw>
<msg time="2026-10-11T01:04:26.274648" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:26.273266" elapsed="0.001528"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:26.275103" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:26.275460" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:04:26.272677" elapsed="0.002967"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:04:26.272189" 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-10-11T01:04:26.203009" elapsed="0.072766"/>
</kw>
<msg time="2026-10-11T01:04:26.275872" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:26.275912" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:26.202457" elapsed="0.073491"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:04:26.276100" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-11T01:04:26.276015" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:26.275998" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:26.276522" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:26.276877" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:04:26.276942" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T01:04:26.201854" elapsed="0.075173"/>
</kw>
<msg time="2026-10-11T01:04:26.277109" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:26.277149" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:26.200050" elapsed="0.077133"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:26.277548" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:26.277250" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:26.277234" elapsed="0.000387"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:04:26.199907" elapsed="0.077735"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:04:26.199753" elapsed="0.077916"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:04:26.197635" elapsed="0.080081"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:04:26.195465" elapsed="0.082300"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:26.195049" elapsed="0.082771"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:04:26.194008" elapsed="0.083858"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.278978" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:26.278532" elapsed="0.000473"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.279587" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:26.279188" elapsed="0.000425"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.280143" 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-10-11T01:04:26.279809" elapsed="0.000359"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:26.280491" 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-10-11T01:04:26.280628" 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-10-11T01:04:26.280333" elapsed="0.000320"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:26.280964" 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-10-11T01:04:26.281080" 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-10-11T01:04:26.280828" elapsed="0.000276"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:04:26.281247" elapsed="0.002472"/>
</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-10-11T01:04:26.283879" elapsed="0.002356"/>
</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-10-11T01:04:26.302035" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:26.301699" elapsed="0.000371"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:26.302800" 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-10-11T01:04:26.302591" elapsed="0.000278">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-10-11T01:04:26.302994" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:26.302250" elapsed="0.000767"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.303518" 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-10-11T01:04:26.303192" elapsed="0.000352"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:26.303836" 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-10-11T01:04:26.303959" 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-10-11T01:04:26.303711" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.304394" 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-10-11T01:04:26.304176" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.305363" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:26.305134" elapsed="0.000286"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.305861" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:26.305599" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.306658" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:26.306202" elapsed="0.000481"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:26.307830" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:26.307298" elapsed="0.000619"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:26.307996" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:04:26.308208" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:26.306872" elapsed="0.001360"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:26.308399" elapsed="0.000332"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:04:26.306069" elapsed="0.002700"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.309466" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:26.309013" elapsed="0.000477"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:26.310609" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:26.310092" elapsed="0.000604"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:26.310776" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T01:04:26.310999" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:26.309660" elapsed="0.001362"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:26.311188" elapsed="0.000367"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:26.308881" elapsed="0.002712"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:26.305929" elapsed="0.005695"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:26.311662" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:26.311801" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:26.304769" elapsed="0.007057"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:26.304515" elapsed="0.007340"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:26.312029" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:26.311877" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:26.304497" elapsed="0.007602"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.313036" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-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-10-11T01:04:26.312262" elapsed="0.000801"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:26.313140" 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/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-10-11T01:04:26.301178" elapsed="0.012064"/>
</kw>
<msg time="2026-10-11T01:04:26.313291" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:26.296850" elapsed="0.016485"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:26.317503" 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/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-10-11T01:04:26.321617" 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/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-10-11T01:04:26.325793" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:26.326004" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:26.326187" 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-10-11T01:04:26.326538" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:26.326377" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:26.326364" 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-10-11T01:04:26.326766" 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-10-11T01:04:26.327092" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:26.327256" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:26.326338" elapsed="0.000965"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:26.326252" elapsed="0.001075"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:26.327492" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:26.327559" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:26.327669" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-i...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:04:26.296221" elapsed="0.031473"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:26.328882" 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-10-11T01:04:26.328675" elapsed="0.000266">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-10-11T01:04:26.329025" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:26.328332" elapsed="0.000716"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:26.329330" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:26.329111" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.329865" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:26.329587" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:26.329418" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:26.329094" elapsed="0.000847"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.330454" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:26.330103" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:26.330523" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:26.330648" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:26.328028" elapsed="0.002642"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:26.331752" 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-10-11T01:04:26.331563" elapsed="0.000261">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-10-11T01:04:26.331913" 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-10-11T01:04:26.331229" elapsed="0.000706"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:04:26.332095" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:04:26.331998" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:26.331982" elapsed="0.000189"/>
</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-10-11T01:04:26.332325" elapsed="0.000019"/>
</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-10-11T01:04:26.332516" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:04:26.332574" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:26.332698" 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-10-11T01:04:26.330931" elapsed="0.001790"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.333956" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:26.333722" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:26.334594" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:26.334188" elapsed="0.000448"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:26.340055" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:26.340181" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:26.340282" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:26.334940" elapsed="0.005742">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:26.334697" elapsed="0.006062">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:26.340961" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:26.340805" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-10-11T01:04:26.334680" elapsed="0.006362">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:26.341385" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:26.341523" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:26.341490" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:26.341474" elapsed="0.000107"/>
</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-10-11T01:04:26.341722" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:04:26.341810" 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-10-11T01:04:26.333013" elapsed="0.008918">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:26.341995" 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-10-11T01:04:26.288807" elapsed="0.053277">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:26.342329" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:26.342166" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:26.342150" elapsed="0.000278"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:26.342460" 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-10-11T01:04:26.288163" elapsed="0.054386">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:28.377603" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:28.376869" elapsed="0.000799"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:28.379440" 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-10-11T01:04:28.378972" elapsed="0.000622">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-10-11T01:04:28.379806" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:28.378092" elapsed="0.001766"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.381132" 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-10-11T01:04:28.380357" elapsed="0.000833"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:28.381880" 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-10-11T01:04:28.382165" 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-10-11T01:04:28.381599" elapsed="0.000621"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.383210" 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-10-11T01:04:28.382686" elapsed="0.000621"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.385953" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:28.385368" elapsed="0.000681"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.387074" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:28.386477" elapsed="0.000652"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.389049" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:28.387914" elapsed="0.001192"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:28.391826" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:28.390578" elapsed="0.001449"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:28.392218" elapsed="0.000075"/>
</return>
<msg time="2026-10-11T01:04:28.392758" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:28.389530" elapsed="0.003306"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:28.393213" elapsed="0.000765"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:04:28.387587" elapsed="0.006477"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.395831" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:28.394707" elapsed="0.001182"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:28.398583" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:28.397326" elapsed="0.001513"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:28.399031" elapsed="0.000066"/>
</return>
<msg time="2026-10-11T01:04:28.399566" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:28.396273" elapsed="0.003347"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:28.400015" elapsed="0.000719"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:28.394293" elapsed="0.006556"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:28.387230" elapsed="0.013693"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:28.401008" elapsed="0.000059"/>
</return>
<msg time="2026-10-11T01:04:28.401301" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:28.384559" elapsed="0.016797"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.383492" elapsed="0.018018"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.401950" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.401564" elapsed="0.000471"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.383447" elapsed="0.018616"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.403040" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-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-10-11T01:04:28.402285" elapsed="0.000794"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:28.403141" 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_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-10-11T01:04:28.375667" elapsed="0.027615"/>
</kw>
<msg time="2026-10-11T01:04:28.403396" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:28.365642" elapsed="0.037880"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:28.409284" 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-10-11T01:04:28.415065" 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_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-10-11T01:04:28.421104" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.421362" 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-10-11T01:04:28.421637" 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-10-11T01:04:28.422127" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.421923" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:28.421903" elapsed="0.000324"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.422463" 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-10-11T01:04:28.422719" 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-10-11T01:04:28.422964" elapsed="0.000027"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:28.421867" elapsed="0.001164"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:28.421727" elapsed="0.001336"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.423272" elapsed="0.000025"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:28.423363" elapsed="0.000021"/>
</return>
<msg time="2026-10-11T01:04:28.423542" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-routes-i...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:04:28.364212" elapsed="0.059365"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:28.425149" 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-10-11T01:04:28.424887" elapsed="0.000347">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-10-11T01:04:28.425349" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:28.424395" elapsed="0.000985"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.425966" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.425533" elapsed="0.000553"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.426949" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:28.426475" elapsed="0.000518"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.426136" elapsed="0.000914"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.425506" elapsed="0.001579"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.427667" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:28.427295" elapsed="0.000397"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:28.427739" elapsed="0.000103"/>
</return>
<msg time="2026-10-11T01:04:28.427949" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:28.423974" elapsed="0.003999"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:28.429107" 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-10-11T01:04:28.428898" elapsed="0.000273">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-10-11T01:04:28.429255" 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-10-11T01:04:28.428561" elapsed="0.000718"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:04:28.429458" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:04:28.429343" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.429326" elapsed="0.000219"/>
</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-10-11T01:04:28.429701" elapsed="0.000020"/>
</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-10-11T01:04:28.429900" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:04:28.429961" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:28.430085" 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-10-11T01:04:28.428233" elapsed="0.001876"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.431398" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:28.431171" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.431881" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:28.431646" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:28.437540" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:28.437682" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:28.437784" 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-10-11T01:04:28.432209" elapsed="0.005602"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.431983" elapsed="0.005869"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.438125" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.437883" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.431966" elapsed="0.006267"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.440321" 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-10-11T01:04:28.439856" elapsed="0.000527"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.439501" elapsed="0.000948"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.439477" elapsed="0.001006"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.441278" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:28.440904" elapsed="0.000432"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.440553" elapsed="0.000828"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.440532" elapsed="0.000900"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.442191" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:28.441690" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.442633" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.442314" elapsed="0.000393"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.443350" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:28.442984" elapsed="0.000401"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.442738" elapsed="0.000714"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.442291" elapsed="0.001189"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.444206" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:28.443724" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.444641" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.444329" elapsed="0.000385"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.445352" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:28.444984" elapsed="0.000403"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.444744" elapsed="0.000709"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.444305" elapsed="0.001177"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:28.445683" elapsed="0.000426"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:28.446673" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:28.446333" 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-10-11T01:04:28.446938" elapsed="0.000295"/>
</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-10-11T01:04:28.439005" elapsed="0.008306"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:28.447544" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:28.447398" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.447375" elapsed="0.000252"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:28.448654" 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-10-11T01:04:28.447838" elapsed="0.000854"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:28.448757" elapsed="0.000050"/>
</return>
<msg time="2026-10-11T01:04:28.448947" 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-10-11T01:04:28.430391" elapsed="0.018590"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:28.449058" elapsed="0.000033"/>
</return>
<msg time="2026-10-11T01:04:28.449226" 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-10-11T01:04:28.347854" elapsed="0.101405"/>
</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-10-11T01:04:28.462833" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:28.462513" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:28.463576" 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-10-11T01:04:28.463335" elapsed="0.000361">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-10-11T01:04:28.463872" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:28.463019" elapsed="0.000877"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.464378" 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-10-11T01:04:28.464071" elapsed="0.000332"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:28.464699" 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-10-11T01:04:28.464857" 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-10-11T01:04:28.464590" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.465295" 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-10-11T01:04:28.465079" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:28.465722" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.465400" elapsed="0.000388"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.466403" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:28.465959" elapsed="0.000487"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.465811" elapsed="0.000667"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.465383" elapsed="0.001115"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.467063" 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-10-11T01:04:28.466659" elapsed="0.000430"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:28.467132" 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/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-10-11T01:04:28.461993" elapsed="0.005239"/>
</kw>
<msg time="2026-10-11T01:04:28.467283" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:28.456857" elapsed="0.010471"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:28.471474" 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/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-10-11T01:04:28.475618" 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/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-10-11T01:04:28.479828" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.480012" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.480194" 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-10-11T01:04:28.480557" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.480395" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:28.480382" 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-10-11T01:04:28.480795" 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-10-11T01:04:28.480978" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.481143" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:28.480355" elapsed="0.000836"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:28.480263" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.481367" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:28.481448" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:04:28.481570" 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-10-11T01:04:28.455841" elapsed="0.025754"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:28.481763" elapsed="0.000327"/>
</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-10-11T01:04:28.483088" 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-10-11T01:04:28.482737" elapsed="0.000378"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:28.483609" 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-10-11T01:04:28.483266" elapsed="0.000368"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:04:28.483833" elapsed="0.000362"/>
</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-10-11T01:04:28.482361" elapsed="0.001889"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.482159" 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-10-11T01:04:28.484500" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.484302" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.482143" elapsed="0.002460"/>
</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-10-11T01:04:28.450663" elapsed="0.033983"/>
</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-10-11T01:04:28.449717" elapsed="0.034995"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.449405" elapsed="0.035347"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.449381" elapsed="0.035407"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:28.484819" elapsed="0.000026"/>
</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-10-11T01:04:28.346247" elapsed="0.138674"/>
</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-10-11T01:04:26.286449" elapsed="2.198528"/>
</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-10-11T01:04:28.500469" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:28.500151" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:28.501157" 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-10-11T01:04:28.500987" elapsed="0.000229">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-10-11T01:04:28.501299" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:28.500653" elapsed="0.000669"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.501842" 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-10-11T01:04:28.501520" elapsed="0.000347"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:28.502139" 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-10-11T01:04:28.502253" 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-10-11T01:04:28.502032" elapsed="0.000245"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.502704" 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-10-11T01:04:28.502487" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.503661" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:28.503429" elapsed="0.000274"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.504146" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:28.503892" elapsed="0.000277"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.504967" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:28.504499" elapsed="0.000492"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:28.506136" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:28.505606" elapsed="0.000620"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:28.506308" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:04:28.506544" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:28.505163" 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-10-11T01:04:28.506768" elapsed="0.000326"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/effective-rib-in</var>
<status status="PASS" start="2026-10-11T01:04:28.504352" elapsed="0.002780"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.507836" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:28.507364" elapsed="0.000496"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:28.509010" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:28.508486" elapsed="0.000611"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:28.509178" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:04:28.509386" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:28.508031" 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-10-11T01:04:28.509595" elapsed="0.000315"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:28.507232" elapsed="0.002716"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:28.504213" elapsed="0.005766"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:28.510017" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:28.510144" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:28.503073" elapsed="0.007094"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.502819" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.510367" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.510218" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.502802" elapsed="0.007714"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.511186" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-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-10-11T01:04:28.510677" elapsed="0.000535"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:28.511255" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:28.499640" elapsed="0.011713"/>
</kw>
<msg time="2026-10-11T01:04:28.511401" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:28.495232" elapsed="0.016285"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:28.516836" 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/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-10-11T01:04:28.520924" 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/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-10-11T01:04:28.525003" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.525216" 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-10-11T01:04:28.525397" 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-10-11T01:04:28.525763" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.525613" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:28.525599" 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-10-11T01:04:28.526005" 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-10-11T01:04:28.526185" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.526348" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:28.525574" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:28.525478" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.526586" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:28.526651" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:28.526760" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-mvpn%3Amcast-vpn-subsequent-address-family/bgp-mvpn-ipv6:mvpn-ro...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:04:28.494630" elapsed="0.032168"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:28.527902" 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-10-11T01:04:28.527704" elapsed="0.000257">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-10-11T01:04:28.528044" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:28.527365" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.528347" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.528129" elapsed="0.000269"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.528880" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:28.528605" elapsed="0.000299"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.528437" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.528112" elapsed="0.000843"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.529464" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:28.529116" elapsed="0.000373"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:28.529533" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:28.529655" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:28.527064" elapsed="0.002614"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:28.530757" 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-10-11T01:04:28.530573" elapsed="0.000256">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-10-11T01:04:28.530917" 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-10-11T01:04:28.530237" elapsed="0.000703"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:04:28.531101" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:04:28.531003" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.530986" elapsed="0.000223"/>
</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-10-11T01:04:28.531365" elapsed="0.000019"/>
</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-10-11T01:04:28.531556" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:04:28.531618" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:04:28.531741" 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-10-11T01:04:28.529939" elapsed="0.001825"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.532995" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:28.532760" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.533461" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:28.533229" elapsed="0.000272"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:28.538830" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:28.538941" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:28.539038" 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-10-11T01:04:28.533831" elapsed="0.005231"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.533561" elapsed="0.005540"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.539277" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.539124" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.533544" elapsed="0.005810"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.540643" 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-10-11T01:04:28.540288" elapsed="0.000400"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.540047" elapsed="0.000672"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.540030" elapsed="0.000712"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.541312" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:28.541046" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.540808" elapsed="0.000577"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.540792" elapsed="0.000629"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.541953" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:28.541601" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.542251" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.542041" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.542765" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:28.542502" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.542324" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.542024" elapsed="0.000830"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.543362" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:28.543029" elapsed="0.000358"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.543675" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.543466" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.544222" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:28.543963" elapsed="0.000283"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.543791" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.543449" elapsed="0.000849"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:28.544456" elapsed="0.000290"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:28.545140" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:28.544922" elapsed="0.000242"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:28.545322" elapsed="0.000232"/>
</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-10-11T01:04:28.539696" elapsed="0.005913"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:28.545752" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:28.545670" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.545653" elapsed="0.000169"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:28.546520" 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-10-11T01:04:28.545963" elapsed="0.000585"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:28.546594" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:28.546719" 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-10-11T01:04:28.532051" elapsed="0.014692"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:28.546811" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:04:28.546930" 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-10-11T01:04:28.487459" elapsed="0.059495"/>
</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-10-11T01:04:28.557757" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:28.557454" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:28.558511" 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-10-11T01:04:28.558272" elapsed="0.000358">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-10-11T01:04:28.558802" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:28.557955" elapsed="0.000872"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.559307" 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-10-11T01:04:28.559001" elapsed="0.000331"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:28.559633" 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-10-11T01:04:28.559753" 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-10-11T01:04:28.559523" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.560237" 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-10-11T01:04:28.560017" elapsed="0.000266"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:28.560661" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.560343" elapsed="0.000374"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.561343" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:28.560898" elapsed="0.000471"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.560739" elapsed="0.000663"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.560326" elapsed="0.001118"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.562015" 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-10-11T01:04:28.561613" elapsed="0.000429"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:28.562086" 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/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-10-11T01:04:28.556933" elapsed="0.005254"/>
</kw>
<msg time="2026-10-11T01:04:28.562238" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:28.552312" elapsed="0.009970"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:28.566440" 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/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-10-11T01:04:28.570556" 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/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-10-11T01:04:28.574790" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.574977" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.575159" 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-10-11T01:04:28.575514" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.575354" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:28.575340" 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-10-11T01:04:28.575745" elapsed="0.000060"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.575975" 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-10-11T01:04:28.576141" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:28.575315" elapsed="0.000873"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:28.575225" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.576364" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:28.576445" elapsed="0.000017"/>
</return>
<msg time="2026-10-11T01:04:28.576568" 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-10-11T01:04:28.551602" elapsed="0.024991"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:28.576761" elapsed="0.000332"/>
</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-10-11T01:04:28.578095" 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-10-11T01:04:28.577743" elapsed="0.000379"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:28.578615" 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-10-11T01:04:28.578272" elapsed="0.000370"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:04:28.578859" elapsed="0.000278"/>
</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-10-11T01:04:28.577363" elapsed="0.001829"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.577163" elapsed="0.002059"/>
</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-10-11T01:04:28.579433" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.579244" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.577147" 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-10-11T01:04:28.547897" elapsed="0.031651"/>
</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-10-11T01:04:28.547226" elapsed="0.032386"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.547025" elapsed="0.032627"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.547009" elapsed="0.032663"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:28.579702" elapsed="0.000026"/>
</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-10-11T01:04:28.486830" elapsed="0.092983"/>
</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-10-11T01:04:28.485166" elapsed="0.094699"/>
</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-10-11T01:04:28.595500" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:28.595182" elapsed="0.000375"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:28.596230" 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-10-11T01:04:28.596058" elapsed="0.000232">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-10-11T01:04:28.596374" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:28.595721" elapsed="0.000676"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.596911" 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-10-11T01:04:28.596589" elapsed="0.000348"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:28.597212" 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-10-11T01:04:28.597326" 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-10-11T01:04:28.597104" elapsed="0.000246"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.597792" 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-10-11T01:04:28.597563" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.598741" 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-10-11T01:04:28.598511" elapsed="0.000288"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.599224" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:28.598976" elapsed="0.000271"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.600027" 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-10-11T01:04:28.599580" elapsed="0.000472"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:28.601201" 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-10-11T01:04:28.600670" elapsed="0.000618"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:28.601368" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:04:28.601604" 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-10-11T01:04:28.600222" 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-10-11T01:04:28.601812" elapsed="0.000303"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:04:28.599446" elapsed="0.002706"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.602845" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:28.602382" elapsed="0.000487"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:28.604016" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:28.603501" elapsed="0.000602"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:28.604183" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:04:28.604391" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:28.603040" 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-10-11T01:04:28.604600" elapsed="0.000316"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:28.602251" elapsed="0.002704"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:28.599290" elapsed="0.005696"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:28.605023" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:28.605150" 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-10-11T01:04:28.598153" elapsed="0.007020"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.597903" elapsed="0.007299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.605374" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.605224" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.597885" elapsed="0.007670"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.606254" 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-10-11T01:04:28.605716" elapsed="0.000564"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:28.606324" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:28.594664" elapsed="0.011775"/>
</kw>
<msg time="2026-10-11T01:04:28.606488" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:28.590224" elapsed="0.016309"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:28.610819" 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/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-10-11T01:04:28.614916" 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/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-10-11T01:04:28.619024" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.619208" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.619389" 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-10-11T01:04:28.619742" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.619597" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:28.619583" 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-10-11T01:04:28.619985" 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-10-11T01:04:28.620166" 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-10-11T01:04:28.620332" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:28.619558" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:28.619469" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.620571" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:28.620637" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:28.620744" 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-10-11T01:04:28.589617" elapsed="0.031151"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:28.621935" 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-10-11T01:04:28.621726" elapsed="0.000268">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-10-11T01:04:28.622078" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:28.621378" elapsed="0.000723"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.622386" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.622164" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.622918" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:28.622644" elapsed="0.000298"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.622476" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.622148" elapsed="0.000846"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.623516" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:28.623165" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:28.623585" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:28.623709" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:28.621077" elapsed="0.002655"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:28.624830" 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-10-11T01:04:28.624633" elapsed="0.000256">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-10-11T01:04:28.624972" 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-10-11T01:04:28.624294" elapsed="0.000701"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:04:28.625157" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:04:28.625059" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.625041" elapsed="0.000192"/>
</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-10-11T01:04:28.625389" elapsed="0.000034"/>
</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-10-11T01:04:28.625581" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:04:28.625639" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:28.625761" 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-10-11T01:04:28.623991" elapsed="0.001805"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.627017" 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-10-11T01:04:28.626791" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.627503" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:28.627273" elapsed="0.000270"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:28.632703" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:28.632827" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:04:28.632914" 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-10-11T01:04:28.627840" elapsed="0.005100"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.627602" elapsed="0.005410"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.633190" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.633037" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.627585" elapsed="0.005682"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.634814" 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-10-11T01:04:28.634398" elapsed="0.000466"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.634074" elapsed="0.000829"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.634047" elapsed="0.000880"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.635509" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:28.635220" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.634979" elapsed="0.000605"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.634963" elapsed="0.000643"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.636168" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:28.635812" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.636510" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.636259" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.637030" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:28.636752" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.636585" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.636241" elapsed="0.000868"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.637639" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:28.637288" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.637955" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.637727" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.638472" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:28.638193" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.638029" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.637711" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:28.638696" elapsed="0.000307"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:28.639397" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:28.639164" elapsed="0.000272"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:28.639592" elapsed="0.000267"/>
</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-10-11T01:04:28.633605" elapsed="0.006313"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:28.640067" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:28.639981" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.639964" elapsed="0.000165"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:28.640931" 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-10-11T01:04:28.640270" elapsed="0.000688"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:28.641006" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:04:28.641139" 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-10-11T01:04:28.626072" elapsed="0.015091"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:28.641264" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:28.641391" 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-10-11T01:04:28.582319" elapsed="0.059112"/>
</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-10-11T01:04:28.652131" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:28.651830" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:28.652919" 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-10-11T01:04:28.652665" elapsed="0.000383">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-10-11T01:04:28.653214" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:28.652317" elapsed="0.000921"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.653743" 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-10-11T01:04:28.653431" elapsed="0.000337"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:28.654056" 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-10-11T01:04:28.654192" 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-10-11T01:04:28.653947" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.654654" 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-10-11T01:04:28.654426" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:28.655076" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.654761" elapsed="0.000370"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.655783" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:28.655300" elapsed="0.000509"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.655153" elapsed="0.000689"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.654744" elapsed="0.001117"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.656429" 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-10-11T01:04:28.656024" elapsed="0.000433"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:28.656501" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:28.651300" elapsed="0.005302"/>
</kw>
<msg time="2026-10-11T01:04:28.656654" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:28.646946" elapsed="0.009753"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:28.660828" 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/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-10-11T01:04:28.664906" 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/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-10-11T01:04:28.669086" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.669269" 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-10-11T01:04:28.669466" 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-10-11T01:04:28.669829" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.669670" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:28.669656" 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-10-11T01:04:28.670057" 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-10-11T01:04:28.670236" 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-10-11T01:04:28.670399" elapsed="0.000033"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:28.669630" elapsed="0.000833"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:28.669535" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.670639" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:28.670705" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:28.670837" 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-10-11T01:04:28.646222" elapsed="0.024640"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:28.671029" elapsed="0.000314"/>
</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-10-11T01:04:28.672335" 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-10-11T01:04:28.671999" elapsed="0.000362"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:28.672898" 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-10-11T01:04:28.672526" elapsed="0.000399"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:04:28.673107" elapsed="0.000277"/>
</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-10-11T01:04:28.671627" elapsed="0.001827"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.671426" 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-10-11T01:04:28.673682" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.673507" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.671395" elapsed="0.002355"/>
</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-10-11T01:04:28.642430" elapsed="0.031375"/>
</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-10-11T01:04:28.641733" elapsed="0.032140"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.641519" elapsed="0.032395"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.641495" elapsed="0.032441"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:28.673966" elapsed="0.000026"/>
</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-10-11T01:04:28.581704" elapsed="0.092362"/>
</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-10-11T01:04:28.580052" elapsed="0.094068"/>
</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-10-11T01:04:28.674271" elapsed="0.003074"/>
</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-10-11T01:04:28.693005" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:28.692657" elapsed="0.000375"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:28.693710" 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-10-11T01:04:28.693521" elapsed="0.000260">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-10-11T01:04:28.693868" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:28.693190" elapsed="0.000701"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.694369" 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-10-11T01:04:28.694063" elapsed="0.000331"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:28.694688" 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-10-11T01:04:28.694827" 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-10-11T01:04:28.694580" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.695260" 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-10-11T01:04:28.695044" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.696213" 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-10-11T01:04:28.695987" elapsed="0.000268"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.696696" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:28.696444" elapsed="0.000276"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.697548" 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-10-11T01:04:28.697089" elapsed="0.000484"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:28.698719" 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-10-11T01:04:28.698188" elapsed="0.000633"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:28.698902" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:04:28.699113" 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-10-11T01:04:28.697745" elapsed="0.001391"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:28.699303" elapsed="0.000330"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:04:28.696957" elapsed="0.002714"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.700347" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:28.699912" elapsed="0.000460"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:28.701532" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:28.701009" elapsed="0.000613"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:28.701702" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:04:28.701994" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:28.700569" elapsed="0.001451"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:28.702185" elapsed="0.000375"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:28.699781" elapsed="0.002818"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:28.696814" elapsed="0.005816"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:28.702667" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:04:28.702807" 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-10-11T01:04:28.695633" elapsed="0.007198"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.695363" elapsed="0.007497"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.703031" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.702883" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.695345" elapsed="0.007754"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.703819" 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-10-11T01:04:28.703256" elapsed="0.000590"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:28.703888" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:28.692140" elapsed="0.011848"/>
</kw>
<msg time="2026-10-11T01:04:28.704035" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:28.687700" elapsed="0.016378"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:28.708366" 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/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-10-11T01:04:28.712485" 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/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-10-11T01:04:28.716603" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.716795" 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-10-11T01:04:28.716977" 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-10-11T01:04:28.717317" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.717166" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:28.717152" 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-10-11T01:04:28.717562" 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-10-11T01:04:28.717744" 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-10-11T01:04:28.717920" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:28.717127" elapsed="0.000841"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:28.717041" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.718141" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:28.718207" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:28.718313" 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-10-11T01:04:28.687094" elapsed="0.031243"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:28.719463" 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-10-11T01:04:28.719256" elapsed="0.000276">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-10-11T01:04:28.719615" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:28.718931" elapsed="0.000706"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.719934" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.719700" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.720449" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:28.720174" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.720008" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.719683" elapsed="0.000843"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.721033" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:28.720685" elapsed="0.000372"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:28.721101" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:28.721224" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:28.718618" elapsed="0.002629"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:28.722276" 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-10-11T01:04:28.722135" elapsed="0.000219"/>
</kw>
<msg time="2026-10-11T01:04:28.722446" 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-10-11T01:04:28.721818" elapsed="0.000652"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:04:28.722632" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:28.722535" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.722518" elapsed="0.000174"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:28.722995" 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-10-11T01:04:28.723113" 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-10-11T01:04:28.722871" elapsed="0.000265"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:04:28.723497" 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-10-11T01:04:28.723297" elapsed="0.000224"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:04:28.723562" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:28.723685" 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-10-11T01:04:28.721509" elapsed="0.002199"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.724940" 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-10-11T01:04:28.724704" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.725386" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:28.725171" elapsed="0.000270"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:28.730233" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:28.730347" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:04:28.730454" 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-10-11T01:04:28.725728" elapsed="0.004752"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.725502" elapsed="0.005016"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.730701" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.730548" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.725485" elapsed="0.005306"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.732052" 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-10-11T01:04:28.731705" elapsed="0.000392"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.731464" elapsed="0.000664"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.731446" elapsed="0.000705"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.732728" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:28.732456" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.732201" elapsed="0.000614"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.732186" elapsed="0.000651"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.733352" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:28.733011" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.733664" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.733454" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.734210" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:28.733947" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.733768" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.733437" elapsed="0.000850"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.734823" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:28.734476" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.735118" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.734910" elapsed="0.000259"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.735628" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:28.735351" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.735191" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.734893" elapsed="0.000811"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:28.735893" elapsed="0.000292"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:28.736579" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:28.736346" elapsed="0.000257"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:28.736756" elapsed="0.000224"/>
</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-10-11T01:04:28.731114" elapsed="0.005920"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:28.737176" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:28.737095" elapsed="0.000121"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.737078" elapsed="0.000158"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:28.737994" 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-10-11T01:04:28.737376" elapsed="0.000646"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:28.738068" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:28.738194" 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-10-11T01:04:28.723999" elapsed="0.014220"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:28.738274" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:04:28.738393" 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-10-11T01:04:28.679884" elapsed="0.058549"/>
</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-10-11T01:04:28.750030" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:28.749692" elapsed="0.000365"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:28.750790" 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-10-11T01:04:28.750552" elapsed="0.000359">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-10-11T01:04:28.751075" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:28.750217" elapsed="0.000882"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.751640" 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-10-11T01:04:28.751305" elapsed="0.000361"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:28.751957" 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-10-11T01:04:28.752107" 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-10-11T01:04:28.751847" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.752574" 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-10-11T01:04:28.752327" 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-10-11T01:04:28.752992" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.752679" elapsed="0.000368"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.753693" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:28.753219" elapsed="0.000500"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:28.753070" elapsed="0.000682"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:28.752661" elapsed="0.001122"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.754329" 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-10-11T01:04:28.753949" elapsed="0.000407"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:28.754400" 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/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-10-11T01:04:28.749166" elapsed="0.005376"/>
</kw>
<msg time="2026-10-11T01:04:28.754590" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:28.744694" elapsed="0.009941"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:28.758760" 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/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-10-11T01:04:28.762856" 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/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-10-11T01:04:28.767125" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.767310" 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-10-11T01:04:28.767510" 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-10-11T01:04:28.767905" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.767739" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:28.767725" 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-10-11T01:04:28.768137" 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-10-11T01:04:28.768322" 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-10-11T01:04:28.768505" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:28.767699" elapsed="0.000856"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:28.767607" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:28.768732" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:28.768812" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:28.768919" 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-10-11T01:04:28.743971" elapsed="0.024973"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:28.769111" elapsed="0.000333"/>
</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-10-11T01:04:28.770333" 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-10-11T01:04:28.770093" elapsed="0.000267"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:28.771029" 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-10-11T01:04:28.770527" elapsed="0.000530"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:04:28.771531" 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-10-11T01:04:28.771693" 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-10-11T01:04:28.771242" elapsed="0.000513">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-10-11T01:04:28.769717" elapsed="0.002178">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-10-11T01:04:28.769516" elapsed="0.002477">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-10-11T01:04:28.772206" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:28.772027" elapsed="0.000229"/>
</branch>
<status status="FAIL" start="2026-10-11T01:04:28.769499" elapsed="0.002779">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-10-11T01:04:28.739374" elapsed="0.033010">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-10-11T01:04:28.738708" elapsed="0.033818">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-10-11T01:04:28.738506" elapsed="0.034095">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-10-11T01:04:28.738491" elapsed="0.034141">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-10-11T01:04:28.772675" elapsed="0.000014"/>
</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-10-11T01:04:28.679245" elapsed="0.093548">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-10-11T01:04:30.808519" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:30.807759" elapsed="0.000826"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:30.810189" 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-10-11T01:04:30.809726" elapsed="0.000744">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-10-11T01:04:30.810676" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:30.808976" elapsed="0.001753"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:30.812003" 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-10-11T01:04:30.811212" elapsed="0.000858"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:30.812746" 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-10-11T01:04:30.813058" 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-10-11T01:04:30.812490" elapsed="0.000622"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:30.814129" 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-10-11T01:04:30.813579" elapsed="0.000647"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:30.816461" 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-10-11T01:04:30.815910" elapsed="0.000655"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:30.817585" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:30.816990" elapsed="0.000650"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:30.818908" 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-10-11T01:04:30.818229" elapsed="0.000713"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:30.820857" 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-10-11T01:04:30.819844" elapsed="0.001163"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:30.821167" elapsed="0.000058"/>
</return>
<msg time="2026-10-11T01:04:30.821550" 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-10-11T01:04:30.819181" elapsed="0.002403"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:30.821836" elapsed="0.000441"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:04:30.818044" elapsed="0.004286"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:30.823512" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:30.822712" elapsed="0.000844"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:30.825284" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:30.824567" elapsed="0.000837"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:30.825558" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T01:04:30.825917" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:30.823861" elapsed="0.002089"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:30.826182" elapsed="0.000442"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:30.822516" elapsed="0.004161"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:30.817741" elapsed="0.008979"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:30.826794" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T01:04:30.826978" 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-10-11T01:04:30.815042" elapsed="0.011969"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:30.814373" elapsed="0.012679"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:30.827292" elapsed="0.000270"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:30.827084" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:30.814330" elapsed="0.013309"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:30.828661" 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-10-11T01:04:30.827882" elapsed="0.000816"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:30.828825" 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/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-10-11T01:04:30.806555" elapsed="0.022414"/>
</kw>
<msg time="2026-10-11T01:04:30.829037" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:30.796591" elapsed="0.032508"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:30.834939" 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/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-10-11T01:04:30.840667" 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/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-10-11T01:04:30.845690" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:30.845890" 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-10-11T01:04:30.846074" 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-10-11T01:04:30.846426" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:30.846265" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:30.846251" 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-10-11T01:04:30.846657" 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-10-11T01:04:30.846851" 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-10-11T01:04:30.847018" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:30.846226" elapsed="0.000841"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:30.846139" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:30.847246" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:30.847312" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:30.847434" 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-10-11T01:04:30.795106" elapsed="0.052354"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:30.848648" 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-10-11T01:04:30.848449" elapsed="0.000262">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-10-11T01:04:30.848809" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:30.848103" elapsed="0.000731"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:30.849119" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:30.848898" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:30.849659" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:30.849379" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:30.849194" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:30.848881" elapsed="0.000855"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:30.850259" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:30.849912" elapsed="0.000371"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:30.850328" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:30.850468" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:30.847798" elapsed="0.002694"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:30.851561" 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-10-11T01:04:30.851383" elapsed="0.000227"/>
</kw>
<msg time="2026-10-11T01:04:30.851687" 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-10-11T01:04:30.851060" elapsed="0.000649"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:04:30.851893" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:30.851792" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:30.851758" elapsed="0.000196"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:30.852231" 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-10-11T01:04:30.852424" 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-10-11T01:04:30.852107" elapsed="0.000342"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:04:30.852827" 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-10-11T01:04:30.852623" elapsed="0.000228"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:04:30.852892" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:30.853022" 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-10-11T01:04:30.850745" elapsed="0.002300"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:30.854270" 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-10-11T01:04:30.854048" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:30.854906" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:30.854517" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:30.861051" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:30.861230" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:04:30.861438" 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-10-11T01:04:30.855243" elapsed="0.006233"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:30.855010" elapsed="0.006522"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:30.861809" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:30.861573" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:30.854993" elapsed="0.006929"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:30.863723" 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-10-11T01:04:30.863239" elapsed="0.000561"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:30.862897" elapsed="0.000950"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:30.862872" elapsed="0.001007"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:30.864689" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:30.864287" elapsed="0.000460"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:30.863951" elapsed="0.000855"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:30.863929" elapsed="0.000910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:30.865595" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:30.865090" elapsed="0.000540"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:30.866037" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:30.865719" elapsed="0.000392"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:30.866784" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:30.866371" elapsed="0.000449"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:30.866142" elapsed="0.000724"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:30.865696" elapsed="0.001197"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:30.867631" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:30.867138" elapsed="0.000528"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:30.868068" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:30.867754" elapsed="0.000387"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:30.868804" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:30.868400" elapsed="0.000440"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:30.868171" elapsed="0.000714"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:30.867731" elapsed="0.001182"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:30.869116" elapsed="0.000434"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:30.870154" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:30.869793" 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-10-11T01:04:30.870433" elapsed="0.000298"/>
</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-10-11T01:04:30.862382" elapsed="0.008445"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:30.871032" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:30.870915" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:30.870891" elapsed="0.000226"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:30.871996" 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-10-11T01:04:30.871324" elapsed="0.000709"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:30.872099" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T01:04:30.872277" 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-10-11T01:04:30.853327" elapsed="0.018985"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:30.872457" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T01:04:30.872635" 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-10-11T01:04:30.778249" elapsed="0.094421"/>
</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-10-11T01:04:30.886870" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:30.886550" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:30.887618" 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-10-11T01:04:30.887378" elapsed="0.000361">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-10-11T01:04:30.887915" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:30.887058" elapsed="0.000881"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:30.888456" 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-10-11T01:04:30.888124" elapsed="0.000358"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:30.888758" 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-10-11T01:04:30.888918" 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-10-11T01:04:30.888651" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:30.889353" 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-10-11T01:04:30.889135" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:30.889786" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:30.889473" elapsed="0.000369"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:30.890478" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:30.890012" elapsed="0.000491"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:30.889864" elapsed="0.000672"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:30.889455" elapsed="0.001100"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:30.891110" 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-10-11T01:04:30.890717" elapsed="0.000419"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:30.891180" 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/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-10-11T01:04:30.886027" elapsed="0.005253"/>
</kw>
<msg time="2026-10-11T01:04:30.891327" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:30.880342" elapsed="0.011030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:30.895525" 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/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-10-11T01:04:30.899643" 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/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-10-11T01:04:30.903890" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:30.904075" 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-10-11T01:04:30.904260" 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-10-11T01:04:30.904618" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:30.904472" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:30.904458" 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-10-11T01:04:30.904858" 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-10-11T01:04:30.905039" 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-10-11T01:04:30.905203" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:30.904430" elapsed="0.000821"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:30.904326" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:30.905439" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:30.905507" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:30.905611" 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-10-11T01:04:30.879313" elapsed="0.026324"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:30.905827" elapsed="0.000317"/>
</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-10-11T01:04:30.907046" 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-10-11T01:04:30.906803" elapsed="0.000270"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:30.907465" 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-10-11T01:04:30.907221" elapsed="0.000270"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:04:30.907675" elapsed="0.000290"/>
</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-10-11T01:04:30.906425" elapsed="0.001627"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:30.906213" elapsed="0.001869"/>
</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-10-11T01:04:30.908280" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:30.908105" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:30.906197" elapsed="0.002151"/>
</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-10-11T01:04:30.874042" elapsed="0.034349"/>
</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-10-11T01:04:30.873082" elapsed="0.035390"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:30.872790" elapsed="0.035721"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:30.872752" elapsed="0.035780"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:30.908562" elapsed="0.000026"/>
</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-10-11T01:04:30.776674" elapsed="0.131988"/>
</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-10-11T01:04:28.677551" elapsed="2.231163"/>
</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-10-11T01:04:30.908926" elapsed="0.003073"/>
</kw>
<arg>intra_ipv6</arg>
<arg>${MVPN_DIR}</arg>
<arg>ipv6</arg>
<status status="PASS" start="2026-10-11T01:04:26.278087" elapsed="4.633967"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:26.193582" elapsed="4.718584"/>
</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-10-11T01:04:30.913566" elapsed="0.000220"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:04:30.913298" 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-10-11T01:04:30.914752" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:30.914664" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:30.914646" elapsed="0.000186"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:30.916974" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:30.916890" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:30.916872" elapsed="0.000166"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:30.917954" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:30.917620" elapsed="0.000359"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:04:30.918396" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:04:30.918134" elapsed="0.000301"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:04:30.918476" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:30.918603" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:04:30.917245" elapsed="0.001381"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:30.921244" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:30.921160" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:30.921143" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:30.922381" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:30.922277" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:30.922259" elapsed="0.000221"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:30.922833" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:04:30.922639" elapsed="0.000219"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:30.923169" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:30.923027" elapsed="0.000166"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:04:30.958196" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:04:30.923817" elapsed="0.034473"/>
</kw>
<msg time="2026-10-11T01:04:30.958463" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:04:30.958506" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:30.923440" elapsed="0.035104"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:04:30.992546" 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-10-11T01:04:30.959069" elapsed="0.033575"/>
</kw>
<msg time="2026-10-11T01:04:30.992803" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:04:30.992844" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:30.958715" elapsed="0.034164"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:30.993153" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:30.992947" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:30.992929" elapsed="0.000296"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:30.993658" 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-10-11T01:04:30.993428" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:30.993993" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:30.993791" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:30.993774" elapsed="0.000291"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:04:30.994095" 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-10-11T01:04:30.996777" elapsed="0.000119"/>
</kw>
<msg time="2026-10-11T01:04:30.996954" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:30.995534" 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-10-11T01:04:30.997394" elapsed="0.000092"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:30.997752" 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-10-11T01:04:30.994923" 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-10-11T01:04:30.994432" elapsed="0.003587"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:04:30.922012" elapsed="0.076083"/>
</kw>
<msg time="2026-10-11T01:04:30.998178" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:30.998217" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:30.921474" elapsed="0.076780"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:04:30.998435" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T01:04:30.998322" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:30.998304" 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-10-11T01:04:30.998857" 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-10-11T01:04:30.999166" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:04:30.999231" 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-10-11T01:04:30.920873" elapsed="0.078444"/>
</kw>
<msg time="2026-10-11T01:04:30.999458" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:30.999500" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:30.918971" elapsed="0.080565"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:30.999839" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:30.999605" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:30.999588" elapsed="0.000324"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:04:30.918827" elapsed="0.081107"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:04:30.918673" elapsed="0.081290"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:04:30.916564" elapsed="0.083449"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:04:30.914388" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:30.913995" elapsed="0.086112"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:04:30.912955" elapsed="0.087201"/>
</kw>
<kw name="Kill_BGP_Speaker" owner="BGPSpeaker">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.001398" 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-10-11T01:04:31.001103" elapsed="0.000337"/>
</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-10-11T01:04:31.001593" elapsed="0.000204"/>
</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-10-11T01:04:31.000821" elapsed="0.001032"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:04:31.023938" level="INFO">^C
[?2004h[jenkins@releng-26932-423-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-10-11T01:04:31.002349" elapsed="0.021646"/>
</kw>
<msg time="2026-10-11T01:04:31.024079" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:31.024116" level="INFO">${message} = ^C
[?2004h[jenkins@releng-26932-423-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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:31.002016" elapsed="0.022123"/>
</kw>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:04:31.024740" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-10-11T01:04:31.037566" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:04:31.037653" level="INFO">${output_log} = 2026-10-11 01:03:06,345 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 01:03:06,345 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 01:03:06,345 DEBUG BGP-Threa...</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-10-11T01:04:31.024629" elapsed="0.013049"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.038113" level="INFO">2026-10-11 01:03:06,345 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 01:03:06,345 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 01:03:06,345 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 01:03:06,345 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 01:03:06,345 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 01:03:06,347 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 01:03:06,349 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 01:03:06,350 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00d90104fbf000b4c0000202bc02ba41040000fbf0060002000104000100010104000100040104000100850104000200040104000100810104000100840104000200810104000200800104000100860104000200860104000200850104000200050104000100800104000100050104400400470104001900460104000200014046003c00010500000286000001810040044700000204000002800000020500000281000001010000018500000184000001860000194600000201000002850000010400000180004700
2026-10-11 01:03:06,350 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 01:03:06,350 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-10-11 01:03:06,350 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-10-11 01:03:06,350 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 01:03:06,350 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 01:03:06,350 INFO BGP-Thread-1 (job):   My BGP Identifier: 169782023
2026-10-11 01:03:06,350 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 01:03:06,350 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 01:03:06,350 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 01:03:06,350 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 01:03:06,350 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 01:03:06,350 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 01:03:06,351 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-10-11 01:03:06,351 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-10-11 01:03:06,351 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 01:03:06,351 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 01:03:06,351 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 01:03:06,351 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 01:03:06,351 DEBUG BGP-Thread-1 (job):   Length=61 (0x003d)
2026-10-11 01:03:06,351 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 01:03:06,351 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 01:03:06,351 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-10-11 01:03:06,351 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 01:03:06,351 DEBUG BGP-Thread-1 (job):   BGP Identifier=169782023 (0x0a1eab07)
2026-10-11 01:03:06,351 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=32 (0x20)
2026-10-11 01:03:06,351 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x020601040001000102060104000100050206010400020005020641040000fbf0
2026-10-11 01:03:06,351 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff003d0104fbf000b40a1eab0720020601040001000102060104000100050206010400020005020641040000fbf0'
2026-10-11 01:03:06,352 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff003d0104fbf000b40a1eab0720020601040001000102060104000100050206010400020005020641040000fbf0
2026-10-11 01:03:06,353 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 01:03:06,353 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 01:03:06,354 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 01:03:06,354 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 01:03:06,354 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 01:03:06,354 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 01:03:06,354 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 01:03:06,354 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 01:03:06,354 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 01:03:06,354 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 01:03:06,354 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 01:03:06,354 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:06,354 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:06,354 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:06,369 INFO BGP-Thread-1 (job): ... idle for 0.014s
2026-10-11 01:03:06,369 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.014s
2026-10-11 01:03:06,369 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000205
2026-10-11 01:03:06,369 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:06,369 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:06,369 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:03:06,369 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:06,369 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:06,369 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:06,369 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:06,369 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 01:03:06,369 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:06,370 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:06,370 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 01:03:06,370 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:06,370 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:06,370 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:06,370 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:06,370 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000105
2026-10-11 01:03:06,370 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:06,370 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:06,370 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:03:06,370 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:06,370 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:06,370 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:06,370 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:06,371 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:06,371 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:06,371 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:07,372 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:07,372 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.015s
2026-10-11 01:03:07,372 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:07,372 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:07,372 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:08,373 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:08,374 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 2.016s
2026-10-11 01:03:08,374 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:08,374 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:08,374 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:09,375 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:09,375 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 3.017s
2026-10-11 01:03:09,375 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:09,375 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:09,375 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:10,376 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:10,377 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 4.018s
2026-10-11 01:03:10,377 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:10,377 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:10,377 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:11,378 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:11,378 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 5.019s
2026-10-11 01:03:11,378 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:11,378 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:11,378 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:12] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:12,380 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:12,380 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.020s
2026-10-11 01:03:12,380 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:12,380 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:12,380 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:12] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:12,434 INFO BGP-Thread-1 (job): ... idle for 0.054s
2026-10-11 01:03:12,434 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.075s
2026-10-11 01:03:12,435 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0a
2026-10-11 01:03:12,435 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:12,435 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:12,435 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-10-11 01:03:12,435 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:12,435 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:12,435 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:12,435 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:12,435 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:12,435 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:12,435 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:13,437 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:13,437 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 7.076s
2026-10-11 01:03:13,437 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:13,437 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:13,437 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:14] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:14] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:14,438 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:14,438 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.077s
2026-10-11 01:03:14,438 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:14,438 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:14,439 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:14,516 INFO BGP-Thread-1 (job): ... idle for 0.078s
2026-10-11 01:03:14,517 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.155s
2026-10-11 01:03:14,517 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a
2026-10-11 01:03:14,517 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:14,517 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:14,517 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0040' (64)
2026-10-11 01:03:14,517 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:14,517 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:14,517 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:14,517 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:14,517 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:14,517 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:14,517 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:14] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:14] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:14] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:15,519 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:15,519 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 9.156s
2026-10-11 01:03:15,521 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0a
2026-10-11 01:03:15,521 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:15,521 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:15,521 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:16,522 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:16,522 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.157s
2026-10-11 01:03:16,522 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:16,523 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:16,523 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:17] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:17,523 INFO BGP-Thread-1 (job): ... idle for 1.000s
2026-10-11 01:03:17,523 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 11.157s
2026-10-11 01:03:17,523 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a
2026-10-11 01:03:17,523 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:17,523 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:17,523 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:18,525 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:18,525 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 12.158s
2026-10-11 01:03:18,525 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:18,525 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:18,525 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:19] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:19] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:19,526 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:19,526 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 13.159s
2026-10-11 01:03:19,526 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a
2026-10-11 01:03:19,527 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:19,527 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:19,527 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:19] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:19,540 INFO BGP-Thread-1 (job): ... idle for 0.013s
2026-10-11 01:03:19,540 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 13.172s
2026-10-11 01:03:19,540 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800e17000105047f01010100020c00010102030401020000fbf0
2026-10-11 01:03:19,540 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:19,540 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:19,540 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-10-11 01:03:19,541 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:19,541 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:19,541 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:19,541 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:19,541 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:19,541 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:19,541 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:20,542 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:20,542 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 14.173s
2026-10-11 01:03:20,544 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:20,544 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:20,544 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:21] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:21,545 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:21,545 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 15.174s
2026-10-11 01:03:21,546 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:21,546 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:21,546 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:21] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:21,644 INFO BGP-Thread-1 (job): ... idle for 0.099s
2026-10-11 01:03:21,644 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 15.273s
2026-10-11 01:03:21,645 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105020c00010102030401020000fbf0
2026-10-11 01:03:21,645 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:21,645 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:21,645 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0040' (64)
2026-10-11 01:03:21,645 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:21,645 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:21,645 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:21,645 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:21,645 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:21,645 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:21,645 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:21] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:21] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:21] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:22,647 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:22,647 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 16.274s
2026-10-11 01:03:22,647 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800e17000105047f01010100020c00010102030401020000fbf0
2026-10-11 01:03:22,647 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:22,647 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:22,647 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:23,648 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:23,649 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 17.275s
2026-10-11 01:03:23,649 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:23,649 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:23,649 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:24] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:24,650 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:24,650 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 18.276s
2026-10-11 01:03:24,650 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105020c00010102030401020000fbf0
2026-10-11 01:03:24,650 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:24,650 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:24,651 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:25,652 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:25,652 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 19.277s
2026-10-11 01:03:25,654 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:25,654 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:25,654 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:26] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:26] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:26] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:26,651 INFO BGP-Thread-1 (job): ... idle for 0.997s
2026-10-11 01:03:26,651 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.274s
2026-10-11 01:03:26,651 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105020c00010102030401020000fbf0
2026-10-11 01:03:26,651 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f0101010003160001010203040102200a00000a200c00000c01000001
2026-10-11 01:03:26,651 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:26,652 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:26,652 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0050' (80)
2026-10-11 01:03:26,652 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:26,652 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:26,652 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:26,652 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:26,652 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:26,652 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:26,652 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:27,653 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:27,654 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 21.275s
2026-10-11 01:03:27,654 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:27,654 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:27,654 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:28] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:28,655 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:28,655 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 22.276s
2026-10-11 01:03:28,655 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:28,655 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:28,655 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:28] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:28,735 INFO BGP-Thread-1 (job): ... idle for 0.080s
2026-10-11 01:03:28,736 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 22.357s
2026-10-11 01:03:28,736 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b00010503160001010203040102200a00000a200c00000c01000001
2026-10-11 01:03:28,736 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:28,736 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:28,736 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-10-11 01:03:28,736 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:28,736 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:28,736 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:28,736 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:28,736 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:28,736 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:28,736 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:28] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:28] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:28] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:29,738 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:29,738 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 23.358s
2026-10-11 01:03:29,738 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f0101010003160001010203040102200a00000a200c00000c01000001
2026-10-11 01:03:29,738 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:29,738 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:29,738 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:30,739 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:30,740 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 24.359s
2026-10-11 01:03:30,742 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:30,742 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:30,742 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:31] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:31,743 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:31,743 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 25.360s
2026-10-11 01:03:31,743 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b00010503160001010203040102200a00000a200c00000c01000001
2026-10-11 01:03:31,743 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:31,743 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:31,744 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:32,745 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:32,745 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 26.361s
2026-10-11 01:03:32,745 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:32,745 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:32,745 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:33] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:33] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:33] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:33,740 INFO BGP-Thread-1 (job): ... idle for 0.995s
2026-10-11 01:03:33,740 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 27.356s
2026-10-11 01:03:33,740 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b00010503160001010203040102200a00000a200c00000c01000001
2026-10-11 01:03:33,741 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004c0200000035400101014002008004040000000040050400000064800e1d000105047f010101000412020c00010102030401020000000101000001
2026-10-11 01:03:33,741 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:33,741 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:33,741 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004c' (76)
2026-10-11 01:03:33,741 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:33,741 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:33,741 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:33,741 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:33,741 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:33,741 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:33,741 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:34,743 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:34,743 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 28.357s
2026-10-11 01:03:34,743 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:34,743 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:34,743 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:35] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:35,744 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:35,746 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 29.358s
2026-10-11 01:03:35,747 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:35,747 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:35,747 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:35] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:35,837 INFO BGP-Thread-1 (job): ... idle for 0.090s
2026-10-11 01:03:35,838 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 29.448s
2026-10-11 01:03:35,838 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050412020c00010102030401020000000101000001
2026-10-11 01:03:35,838 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:35,838 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:35,838 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-10-11 01:03:35,838 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:35,838 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:35,838 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:35,838 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:35,839 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:35,839 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:35,839 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:35] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:35] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:36] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:36,840 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:36,841 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 30.450s
2026-10-11 01:03:36,841 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004c0200000035400101014002008004040000000040050400000064800e1d000105047f010101000412020c00010102030401020000000101000001
2026-10-11 01:03:36,841 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:36,841 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:36,841 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:37,842 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:37,843 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 31.451s
2026-10-11 01:03:37,843 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:37,843 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:37,843 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:38] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:38,844 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:38,845 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 32.452s
2026-10-11 01:03:38,845 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050412020c00010102030401020000000101000001
2026-10-11 01:03:38,845 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:38,845 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:38,846 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:39,847 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:39,847 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 33.453s
2026-10-11 01:03:39,847 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:39,847 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:39,847 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:40] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:40,807 INFO BGP-Thread-1 (job): ... idle for 0.959s
2026-10-11 01:03:40,807 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 34.412s
10.30.170.34 - - [11/Oct/2026 01:03:40] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:40,808 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050412020c00010102030401020000000101000001
2026-10-11 01:03:40,809 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004c0200000035400101014002008004040000000040050400000064800e1d000105047f010101000512000101020304010220010000012002000002
2026-10-11 01:03:40,809 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:40,809 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:40,809 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004c' (76)
2026-10-11 01:03:40,809 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:40,809 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:40,809 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:40,809 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:40,809 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:40,809 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:40,809 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:41,811 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:41,811 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 35.413s
2026-10-11 01:03:41,811 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:41,811 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:41,811 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:42,812 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:42,813 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 36.415s
2026-10-11 01:03:42,813 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:42,813 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:42,813 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:42] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:42] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:42,905 INFO BGP-Thread-1 (job): ... idle for 0.092s
2026-10-11 01:03:42,905 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 36.506s
2026-10-11 01:03:42,905 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050512000101020304010220010000012002000002
2026-10-11 01:03:42,905 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:42,905 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:42,905 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-10-11 01:03:42,905 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:42,905 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:42,905 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:42,905 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:42,905 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:42,906 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:42,906 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:42] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:43] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:43] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:43,907 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:43,907 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 37.507s
2026-10-11 01:03:43,907 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004c0200000035400101014002008004040000000040050400000064800e1d000105047f010101000512000101020304010220010000012002000002
2026-10-11 01:03:43,907 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:43,907 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:43,907 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:44,909 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:44,909 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 38.508s
2026-10-11 01:03:44,909 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:44,909 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:44,909 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:45] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:45,910 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:45,910 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 39.510s
2026-10-11 01:03:45,914 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050512000101020304010220010000012002000002
2026-10-11 01:03:45,914 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:45,914 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:45,914 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:46,915 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:46,915 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 40.510s
2026-10-11 01:03:46,915 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:46,915 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:46,915 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:47] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:47] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:47] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:47,894 INFO BGP-Thread-1 (job): ... idle for 0.979s
2026-10-11 01:03:47,894 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 41.489s
2026-10-11 01:03:47,894 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050512000101020304010220010000012002000002
2026-10-11 01:03:47,894 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f01010100061600010102030401020000001020010000012002000002
2026-10-11 01:03:47,895 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:47,895 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:47,895 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0050' (80)
2026-10-11 01:03:47,895 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:47,895 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:47,895 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:47,895 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:47,895 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:47,895 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:47,895 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:48,896 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:48,897 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 42.490s
2026-10-11 01:03:48,897 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:48,897 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:48,897 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:49] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:49,898 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:49,898 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 43.491s
2026-10-11 01:03:49,898 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:49,898 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:49,898 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:49] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:49,989 INFO BGP-Thread-1 (job): ... idle for 0.091s
2026-10-11 01:03:49,989 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 43.582s
2026-10-11 01:03:49,989 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105061600010102030401020000001020010000012002000002
2026-10-11 01:03:49,989 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:49,990 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:49,990 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-10-11 01:03:49,990 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:49,990 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:49,990 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:49,990 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:49,990 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:49,990 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:49,990 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:49] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:50] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:50] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:50,991 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:50,991 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 44.583s
2026-10-11 01:03:50,993 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f01010100061600010102030401020000001020010000012002000002
2026-10-11 01:03:50,993 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:50,994 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:50,994 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:51,995 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:51,995 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 45.584s
2026-10-11 01:03:51,995 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:51,995 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:51,995 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:52] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:52,996 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:52,997 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 46.585s
2026-10-11 01:03:52,997 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105061600010102030401020000001020010000012002000002
2026-10-11 01:03:52,997 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:52,997 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:52,997 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:53,998 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:53,998 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 47.586s
2026-10-11 01:03:53,998 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:53,999 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:53,999 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:54] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:54] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:55,000 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:55,000 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 48.587s
2026-10-11 01:03:55,000 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105061600010102030401020000001020010000012002000002
2026-10-11 01:03:55,000 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:55,000 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:55,000 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:55,021 INFO BGP-Thread-1 (job): ... idle for 0.021s
2026-10-11 01:03:55,021 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 48.608s
2026-10-11 01:03:55,022 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f01010100071600010102030401020000000a20010000012002000002
2026-10-11 01:03:55,022 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:55,022 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:55,022 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0050' (80)
2026-10-11 01:03:55,022 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:55,022 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:55,022 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:55,022 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:55,022 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:55] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:55,023 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:55,023 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:55] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:55,081 INFO BGP-Thread-1 (job): ... idle for 0.058s
2026-10-11 01:03:55,081 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 48.666s
2026-10-11 01:03:55,082 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105071600010102030401020000000a20010000012002000002
2026-10-11 01:03:55,082 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:55,082 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:55,082 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-10-11 01:03:55,082 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:55,082 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:55,082 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:55,082 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:55,082 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:55,082 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:55,082 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:55] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:55] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:55] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:56,084 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:56,084 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 49.667s
2026-10-11 01:03:56,088 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f01010100071600010102030401020000000a20010000012002000002
2026-10-11 01:03:56,088 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:56,088 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:56,088 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:57,089 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:57,090 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 50.668s
2026-10-11 01:03:57,090 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:57,090 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:57,090 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:57] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:58,091 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:58,091 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 51.669s
2026-10-11 01:03:58,091 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105071600010102030401020000000a20010000012002000002
2026-10-11 01:03:58,092 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:58,092 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:58,092 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:59,093 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:59,093 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 52.670s
2026-10-11 01:03:59,093 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:59,093 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:59,093 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:59] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:59] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:00] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:00,082 INFO BGP-Thread-1 (job): ... idle for 0.988s
2026-10-11 01:04:00,082 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 53.659s
2026-10-11 01:04:00,082 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105071600010102030401020000000a20010000012002000002
2026-10-11 01:04:00,082 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00570200000040c01b0e0a0a0a0104e3800a0a140204e3c0400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0a
2026-10-11 01:04:00,082 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:00,082 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:00,082 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0057' (87)
2026-10-11 01:04:00,082 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:00,082 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:00,082 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:04:00,082 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:04:00,083 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:00,083 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:00,083 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:01,084 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:01,084 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 54.660s
2026-10-11 01:04:01,085 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:01,085 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:01,085 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:02] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:02,087 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:02,087 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 55.661s
2026-10-11 01:04:02,087 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:02,087 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:02,087 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:02] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:02,180 INFO BGP-Thread-1 (job): ... idle for 0.093s
2026-10-11 01:04:02,180 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 55.753s
2026-10-11 01:04:02,180 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003ac01b0e0a0a0a0104e3800a0a140204e3c0400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a
2026-10-11 01:04:02,180 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:02,180 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:02,180 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-10-11 01:04:02,180 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:02,180 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:02,180 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:04:02,180 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:04:02,180 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:02,181 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:02,181 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:02] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:02] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:02] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:03,182 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:03,182 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 56.754s
2026-10-11 01:04:03,182 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00570200000040c01b0e0a0a0a0104e3800a0a140204e3c0400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0a
2026-10-11 01:04:03,182 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:03,182 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:03,182 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:04,184 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:04,184 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 57.755s
2026-10-11 01:04:04,184 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:04,184 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:04,184 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:04] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:05,185 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:05,185 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 58.757s
2026-10-11 01:04:05,185 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003ac01b0e0a0a0a0104e3800a0a140204e3c0400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a
2026-10-11 01:04:05,186 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:05,186 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:05,186 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:06,187 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:06,187 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 59.758s
2026-10-11 01:04:06,190 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:06,190 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:06,190 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:06] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:07] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:07] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:07,175 INFO BGP-Thread-1 (job): ... idle for 0.986s
2026-10-11 01:04:07,176 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 60.743s
2026-10-11 01:04:07,176 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003ac01b0e0a0a0a0104e3800a0a140204e3c0400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a
2026-10-11 01:04:07,176 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003a400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac01008010b0a0000013130
2026-10-11 01:04:07,176 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:07,176 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:07,176 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-10-11 01:04:07,176 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:07,176 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:07,176 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:04:07,176 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:04:07,176 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:07,177 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:07,177 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:08,178 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:08,178 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 61.744s
2026-10-11 01:04:08,178 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:08,178 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:08,178 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:09] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:09,179 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:09,179 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 62.745s
2026-10-11 01:04:09,180 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:09,180 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:09,180 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:09] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:09,273 INFO BGP-Thread-1 (job): ... idle for 0.094s
2026-10-11 01:04:09,273 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 62.839s
2026-10-11 01:04:09,274 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac01008010b0a0000013130
2026-10-11 01:04:09,274 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:09,274 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:09,274 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-10-11 01:04:09,274 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:09,274 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:09,274 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:04:09,274 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:04:09,274 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:09,274 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:09,274 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:09] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:10,276 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:10,276 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 63.840s
2026-10-11 01:04:10,276 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac01008010b0a0000013130
2026-10-11 01:04:10,276 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:10,276 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:10,276 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:11,277 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:11,277 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 64.841s
2026-10-11 01:04:11,281 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:11,281 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:11,281 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:11] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:12,282 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:12,282 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 65.842s
2026-10-11 01:04:12,282 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac01008010b0a0000013130
2026-10-11 01:04:12,282 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:12,282 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:12,283 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:13,284 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:13,284 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 66.843s
2026-10-11 01:04:13,284 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:13,284 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:13,284 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:14] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:14] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:14,285 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:14,285 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 67.844s
2026-10-11 01:04:14,286 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac01008010b0a0000013130
2026-10-11 01:04:14,286 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003a400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac010080009004100000000
2026-10-11 01:04:14,286 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:14,286 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:14,286 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-10-11 01:04:14,286 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:14,286 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:14,286 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:04:14,286 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:04:14,286 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:14,286 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:14,287 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:14] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:14] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:14,345 INFO BGP-Thread-1 (job): ... idle for 0.058s
2026-10-11 01:04:14,345 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 67.903s
2026-10-11 01:04:14,345 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac010080009004100000000
2026-10-11 01:04:14,345 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:14,345 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:14,346 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-10-11 01:04:14,346 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:14,346 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:14,346 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:04:14,346 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:04:14,346 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:14,346 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:14,346 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:14] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:14] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:14] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:15,347 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:15,347 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 68.904s
2026-10-11 01:04:15,347 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac010080009004100000000
2026-10-11 01:04:15,348 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:15,348 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:15,348 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:16,349 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:16,349 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 69.905s
2026-10-11 01:04:16,350 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:16,350 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:16,350 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:16] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:17,351 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:17,352 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 70.906s
2026-10-11 01:04:17,352 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac010080009004100000000
2026-10-11 01:04:17,352 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:17,352 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:17,352 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:18,353 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:18,353 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 71.907s
2026-10-11 01:04:18,353 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:18,354 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:18,354 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:19] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:19] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:19] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:19,307 INFO BGP-Thread-1 (job): ... idle for 0.954s
2026-10-11 01:04:19,307 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 72.861s
2026-10-11 01:04:19,308 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac010080009004100000000
2026-10-11 01:04:19,308 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003a400101004002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac0100802d10000fbf00000
2026-10-11 01:04:19,308 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:19,308 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:19,308 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-10-11 01:04:19,308 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:19,308 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:19,308 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:04:19,308 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:04:19,308 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:19,308 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:19,309 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:20,310 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:20,310 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 73.862s
2026-10-11 01:04:20,310 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:20,310 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:20,310 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:21,311 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:21,311 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 74.863s
2026-10-11 01:04:21,312 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:21,312 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:21,312 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:21] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:21] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:21,403 INFO BGP-Thread-1 (job): ... idle for 0.092s
2026-10-11 01:04:21,404 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 74.955s
2026-10-11 01:04:21,406 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b0200000034400101004002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac0100802d10000fbf00000
2026-10-11 01:04:21,406 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:21,406 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:21,406 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-10-11 01:04:21,406 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:21,407 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:21,407 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:04:21,407 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:04:21,407 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:21,407 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:21,407 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:21] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:21] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:21] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:22,408 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:22,408 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 75.956s
2026-10-11 01:04:22,408 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a400101004002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac0100802d10000fbf00000
2026-10-11 01:04:22,409 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:22,409 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:22,409 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:23,410 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:23,410 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 76.957s
2026-10-11 01:04:23,410 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:23,410 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:23,410 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:23] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:24,411 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:24,412 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 77.958s
2026-10-11 01:04:24,412 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004b0200000034400101004002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac0100802d10000fbf00000
2026-10-11 01:04:24,412 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:24,412 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:24,412 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:25,413 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:25,413 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 78.959s
2026-10-11 01:04:25,414 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:25,414 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:25,414 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:26] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:26] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:26] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:26,415 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:26,415 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 79.960s
2026-10-11 01:04:26,416 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004b0200000034400101004002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac0100802d10000fbf00000
2026-10-11 01:04:26,416 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004b02000000344001010040020040050400000064800e230002051020010db800010000000000000000000600010c0001ac10002c0065c0a86401
2026-10-11 01:04:26,416 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:26,416 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:26,416 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:27,418 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:27,418 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 80.961s
2026-10-11 01:04:27,418 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:27,418 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:27,418 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:28,419 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:28,420 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 81.962s
2026-10-11 01:04:28,420 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:28,420 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:28,420 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:28] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:29,421 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:29,421 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 82.963s
2026-10-11 01:04:29,421 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003902000000224001010040020040050400000064800f11000205010c0001ac10002c0065c0a86401
2026-10-11 01:04:29,421 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:29,422 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:29,422 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:30,423 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:30,423 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 83.965s
2026-10-11 01:04:30,423 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:30,423 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:30,423 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:30] "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-10-11T01:04:31.037887" elapsed="0.001087"/>
</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-10-11T01:04:31.024310" elapsed="0.014721"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<status status="PASS" start="2026-10-11T01:04:31.039176" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T01:04:31.039087" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:31.039070" elapsed="0.000181"/>
</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-10-11T01:04:31.039452" elapsed="0.000020"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was not seen within timeout period.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:31.039621" elapsed="0.000018"/>
</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-10-11T01:04:31.000507" elapsed="0.039183"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:04:31.042977" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-10-11T01:04:31.088855" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:04:31.088979" level="INFO">${output_log} = 2026-10-11 01:03:06,345 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 01:03:06,345 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 01:03:06,345 DEBUG BGP-Threa...</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-10-11T01:04:31.042868" elapsed="0.046144"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.089634" level="INFO">2026-10-11 01:03:06,345 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 01:03:06,345 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 01:03:06,345 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 01:03:06,345 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 01:03:06,345 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 01:03:06,347 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 01:03:06,349 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 01:03:06,350 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00d90104fbf000b4c0000202bc02ba41040000fbf0060002000104000100010104000100040104000100850104000200040104000100810104000100840104000200810104000200800104000100860104000200860104000200850104000200050104000100800104000100050104400400470104001900460104000200014046003c00010500000286000001810040044700000204000002800000020500000281000001010000018500000184000001860000194600000201000002850000010400000180004700
2026-10-11 01:03:06,350 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 01:03:06,350 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-10-11 01:03:06,350 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-10-11 01:03:06,350 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 01:03:06,350 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 01:03:06,350 INFO BGP-Thread-1 (job):   My BGP Identifier: 169782023
2026-10-11 01:03:06,350 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 01:03:06,350 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 01:03:06,350 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 01:03:06,350 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 01:03:06,350 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 01:03:06,350 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 01:03:06,351 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-10-11 01:03:06,351 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-10-11 01:03:06,351 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 01:03:06,351 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 01:03:06,351 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 01:03:06,351 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 01:03:06,351 DEBUG BGP-Thread-1 (job):   Length=61 (0x003d)
2026-10-11 01:03:06,351 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 01:03:06,351 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 01:03:06,351 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-10-11 01:03:06,351 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 01:03:06,351 DEBUG BGP-Thread-1 (job):   BGP Identifier=169782023 (0x0a1eab07)
2026-10-11 01:03:06,351 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=32 (0x20)
2026-10-11 01:03:06,351 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x020601040001000102060104000100050206010400020005020641040000fbf0
2026-10-11 01:03:06,351 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff003d0104fbf000b40a1eab0720020601040001000102060104000100050206010400020005020641040000fbf0'
2026-10-11 01:03:06,352 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff003d0104fbf000b40a1eab0720020601040001000102060104000100050206010400020005020641040000fbf0
2026-10-11 01:03:06,353 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 01:03:06,353 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 01:03:06,354 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 01:03:06,354 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 01:03:06,354 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 01:03:06,354 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 01:03:06,354 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 01:03:06,354 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 01:03:06,354 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 01:03:06,354 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 01:03:06,354 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 01:03:06,354 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:06,354 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:06,354 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:06,369 INFO BGP-Thread-1 (job): ... idle for 0.014s
2026-10-11 01:03:06,369 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.014s
2026-10-11 01:03:06,369 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000205
2026-10-11 01:03:06,369 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:06,369 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:06,369 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:03:06,369 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:06,369 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:06,369 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:06,369 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:06,369 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 01:03:06,369 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:06,370 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:06,370 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 01:03:06,370 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:06,370 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:06,370 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:06,370 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:06,370 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000105
2026-10-11 01:03:06,370 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:06,370 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:06,370 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:03:06,370 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:06,370 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:06,370 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:06,370 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:06,371 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:06,371 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:06,371 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:07,372 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:07,372 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.015s
2026-10-11 01:03:07,372 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:07,372 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:07,372 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:08,373 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:08,374 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 2.016s
2026-10-11 01:03:08,374 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:08,374 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:08,374 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:09,375 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:09,375 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 3.017s
2026-10-11 01:03:09,375 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:09,375 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:09,375 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:10,376 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:10,377 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 4.018s
2026-10-11 01:03:10,377 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:10,377 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:10,377 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:11,378 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:11,378 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 5.019s
2026-10-11 01:03:11,378 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:11,378 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:11,378 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:12] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:12,380 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:12,380 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.020s
2026-10-11 01:03:12,380 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:12,380 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:12,380 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:12] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:12,434 INFO BGP-Thread-1 (job): ... idle for 0.054s
2026-10-11 01:03:12,434 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.075s
2026-10-11 01:03:12,435 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0a
2026-10-11 01:03:12,435 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:12,435 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:12,435 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-10-11 01:03:12,435 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:12,435 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:12,435 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:12,435 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:12,435 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:12,435 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:12,435 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:13,437 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:13,437 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 7.076s
2026-10-11 01:03:13,437 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:13,437 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:13,437 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:14] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:14] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:14,438 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:14,438 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.077s
2026-10-11 01:03:14,438 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:14,438 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:14,439 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:14,516 INFO BGP-Thread-1 (job): ... idle for 0.078s
2026-10-11 01:03:14,517 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.155s
2026-10-11 01:03:14,517 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a
2026-10-11 01:03:14,517 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:14,517 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:14,517 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0040' (64)
2026-10-11 01:03:14,517 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:14,517 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:14,517 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:14,517 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:14,517 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:14,517 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:14,517 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:14] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:14] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:14] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:15,519 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:15,519 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 9.156s
2026-10-11 01:03:15,521 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0a
2026-10-11 01:03:15,521 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:15,521 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:15,521 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:16,522 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:16,522 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.157s
2026-10-11 01:03:16,522 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:16,523 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:16,523 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:17] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:17,523 INFO BGP-Thread-1 (job): ... idle for 1.000s
2026-10-11 01:03:17,523 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 11.157s
2026-10-11 01:03:17,523 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a
2026-10-11 01:03:17,523 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:17,523 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:17,523 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:18,525 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:18,525 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 12.158s
2026-10-11 01:03:18,525 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:18,525 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:18,525 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:19] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:19] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:19,526 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:19,526 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 13.159s
2026-10-11 01:03:19,526 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a
2026-10-11 01:03:19,527 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:19,527 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:19,527 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:19] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:19,540 INFO BGP-Thread-1 (job): ... idle for 0.013s
2026-10-11 01:03:19,540 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 13.172s
2026-10-11 01:03:19,540 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800e17000105047f01010100020c00010102030401020000fbf0
2026-10-11 01:03:19,540 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:19,540 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:19,540 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-10-11 01:03:19,541 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:19,541 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:19,541 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:19,541 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:19,541 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:19,541 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:19,541 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:20,542 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:20,542 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 14.173s
2026-10-11 01:03:20,544 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:20,544 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:20,544 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:21] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:21,545 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:21,545 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 15.174s
2026-10-11 01:03:21,546 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:21,546 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:21,546 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:21] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:21,644 INFO BGP-Thread-1 (job): ... idle for 0.099s
2026-10-11 01:03:21,644 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 15.273s
2026-10-11 01:03:21,645 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105020c00010102030401020000fbf0
2026-10-11 01:03:21,645 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:21,645 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:21,645 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0040' (64)
2026-10-11 01:03:21,645 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:21,645 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:21,645 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:21,645 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:21,645 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:21,645 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:21,645 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:21] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:21] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:21] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:22,647 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:22,647 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 16.274s
2026-10-11 01:03:22,647 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800e17000105047f01010100020c00010102030401020000fbf0
2026-10-11 01:03:22,647 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:22,647 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:22,647 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:23,648 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:23,649 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 17.275s
2026-10-11 01:03:23,649 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:23,649 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:23,649 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:24] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:24,650 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:24,650 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 18.276s
2026-10-11 01:03:24,650 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105020c00010102030401020000fbf0
2026-10-11 01:03:24,650 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:24,650 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:24,651 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:25,652 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:25,652 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 19.277s
2026-10-11 01:03:25,654 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:25,654 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:25,654 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:26] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:26] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:26] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:26,651 INFO BGP-Thread-1 (job): ... idle for 0.997s
2026-10-11 01:03:26,651 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.274s
2026-10-11 01:03:26,651 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00400200000029400101014002008004040000000040050400000064800f11000105020c00010102030401020000fbf0
2026-10-11 01:03:26,651 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f0101010003160001010203040102200a00000a200c00000c01000001
2026-10-11 01:03:26,651 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:26,652 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:26,652 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0050' (80)
2026-10-11 01:03:26,652 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:26,652 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:26,652 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:26,652 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:26,652 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:26,652 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:26,652 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:27,653 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:27,654 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 21.275s
2026-10-11 01:03:27,654 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:27,654 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:27,654 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:28] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:28,655 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:28,655 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 22.276s
2026-10-11 01:03:28,655 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:28,655 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:28,655 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:28] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:28,735 INFO BGP-Thread-1 (job): ... idle for 0.080s
2026-10-11 01:03:28,736 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 22.357s
2026-10-11 01:03:28,736 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b00010503160001010203040102200a00000a200c00000c01000001
2026-10-11 01:03:28,736 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:28,736 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:28,736 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-10-11 01:03:28,736 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:28,736 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:28,736 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:28,736 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:28,736 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:28,736 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:28,736 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:28] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:28] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:28] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:29,738 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:29,738 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 23.358s
2026-10-11 01:03:29,738 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f0101010003160001010203040102200a00000a200c00000c01000001
2026-10-11 01:03:29,738 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:29,738 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:29,738 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:30,739 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:30,740 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 24.359s
2026-10-11 01:03:30,742 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:30,742 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:30,742 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:31] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:31,743 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:31,743 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 25.360s
2026-10-11 01:03:31,743 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b00010503160001010203040102200a00000a200c00000c01000001
2026-10-11 01:03:31,743 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:31,743 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:31,744 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:32,745 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:32,745 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 26.361s
2026-10-11 01:03:32,745 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:32,745 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:32,745 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:33] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:33] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:33] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:33,740 INFO BGP-Thread-1 (job): ... idle for 0.995s
2026-10-11 01:03:33,740 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 27.356s
2026-10-11 01:03:33,740 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b00010503160001010203040102200a00000a200c00000c01000001
2026-10-11 01:03:33,741 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004c0200000035400101014002008004040000000040050400000064800e1d000105047f010101000412020c00010102030401020000000101000001
2026-10-11 01:03:33,741 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:33,741 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:33,741 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004c' (76)
2026-10-11 01:03:33,741 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:33,741 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:33,741 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:33,741 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:33,741 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:33,741 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:33,741 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:34,743 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:34,743 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 28.357s
2026-10-11 01:03:34,743 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:34,743 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:34,743 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:35] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:35,744 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:35,746 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 29.358s
2026-10-11 01:03:35,747 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:35,747 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:35,747 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:35] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:35,837 INFO BGP-Thread-1 (job): ... idle for 0.090s
2026-10-11 01:03:35,838 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 29.448s
2026-10-11 01:03:35,838 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050412020c00010102030401020000000101000001
2026-10-11 01:03:35,838 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:35,838 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:35,838 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-10-11 01:03:35,838 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:35,838 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:35,838 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:35,838 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:35,839 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:35,839 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:35,839 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:35] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:35] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:36] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:36,840 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:36,841 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 30.450s
2026-10-11 01:03:36,841 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004c0200000035400101014002008004040000000040050400000064800e1d000105047f010101000412020c00010102030401020000000101000001
2026-10-11 01:03:36,841 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:36,841 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:36,841 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:37,842 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:37,843 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 31.451s
2026-10-11 01:03:37,843 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:37,843 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:37,843 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:38] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:38,844 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:38,845 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 32.452s
2026-10-11 01:03:38,845 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050412020c00010102030401020000000101000001
2026-10-11 01:03:38,845 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:38,845 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:38,846 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:39,847 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:39,847 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 33.453s
2026-10-11 01:03:39,847 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:39,847 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:39,847 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:40] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:40] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:40,807 INFO BGP-Thread-1 (job): ... idle for 0.959s
2026-10-11 01:03:40,807 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 34.412s
10.30.170.34 - - [11/Oct/2026 01:03:40] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:40,808 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050412020c00010102030401020000000101000001
2026-10-11 01:03:40,809 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004c0200000035400101014002008004040000000040050400000064800e1d000105047f010101000512000101020304010220010000012002000002
2026-10-11 01:03:40,809 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:40,809 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:40,809 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004c' (76)
2026-10-11 01:03:40,809 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:40,809 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:40,809 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:40,809 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:40,809 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:40,809 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:40,809 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:41,811 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:41,811 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 35.413s
2026-10-11 01:03:41,811 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:41,811 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:41,811 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:42,812 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:42,813 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 36.415s
2026-10-11 01:03:42,813 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:42,813 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:42,813 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:42] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:42] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:42,905 INFO BGP-Thread-1 (job): ... idle for 0.092s
2026-10-11 01:03:42,905 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 36.506s
2026-10-11 01:03:42,905 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050512000101020304010220010000012002000002
2026-10-11 01:03:42,905 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:42,905 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:42,905 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0046' (70)
2026-10-11 01:03:42,905 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:42,905 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:42,905 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:42,905 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:42,905 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:42,906 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:42,906 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:42] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:43] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:43] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:43,907 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:43,907 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 37.507s
2026-10-11 01:03:43,907 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004c0200000035400101014002008004040000000040050400000064800e1d000105047f010101000512000101020304010220010000012002000002
2026-10-11 01:03:43,907 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:43,907 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:43,907 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:44,909 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:44,909 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 38.508s
2026-10-11 01:03:44,909 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:44,909 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:44,909 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:45] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:45,910 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:45,910 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 39.510s
2026-10-11 01:03:45,914 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050512000101020304010220010000012002000002
2026-10-11 01:03:45,914 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:45,914 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:45,914 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:46,915 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:46,915 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 40.510s
2026-10-11 01:03:46,915 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:46,915 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:46,915 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:47] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:47] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:47] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:47,894 INFO BGP-Thread-1 (job): ... idle for 0.979s
2026-10-11 01:03:47,894 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 41.489s
2026-10-11 01:03:47,894 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0046020000002f400101014002008004040000000040050400000064800f170001050512000101020304010220010000012002000002
2026-10-11 01:03:47,894 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f01010100061600010102030401020000001020010000012002000002
2026-10-11 01:03:47,895 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:47,895 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:47,895 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0050' (80)
2026-10-11 01:03:47,895 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:47,895 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:47,895 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:47,895 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:47,895 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:47,895 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:47,895 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:48,896 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:48,897 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 42.490s
2026-10-11 01:03:48,897 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:48,897 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:48,897 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:49] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:49,898 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:49,898 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 43.491s
2026-10-11 01:03:49,898 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:49,898 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:49,898 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:49] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:49,989 INFO BGP-Thread-1 (job): ... idle for 0.091s
2026-10-11 01:03:49,989 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 43.582s
2026-10-11 01:03:49,989 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105061600010102030401020000001020010000012002000002
2026-10-11 01:03:49,989 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:49,990 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:49,990 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-10-11 01:03:49,990 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:49,990 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:49,990 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:49,990 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:49,990 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:49,990 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:49,990 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:49] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:50] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:50] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:50,991 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:50,991 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 44.583s
2026-10-11 01:03:50,993 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f01010100061600010102030401020000001020010000012002000002
2026-10-11 01:03:50,993 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:50,994 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:50,994 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:51,995 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:51,995 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 45.584s
2026-10-11 01:03:51,995 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:51,995 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:51,995 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:52] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:52,996 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:52,997 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 46.585s
2026-10-11 01:03:52,997 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105061600010102030401020000001020010000012002000002
2026-10-11 01:03:52,997 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:52,997 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:52,997 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:53,998 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:53,998 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 47.586s
2026-10-11 01:03:53,998 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:53,999 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:53,999 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:54] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:54] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:55,000 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:55,000 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 48.587s
2026-10-11 01:03:55,000 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105061600010102030401020000001020010000012002000002
2026-10-11 01:03:55,000 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:55,000 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:55,000 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:55,021 INFO BGP-Thread-1 (job): ... idle for 0.021s
2026-10-11 01:03:55,021 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 48.608s
2026-10-11 01:03:55,022 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f01010100071600010102030401020000000a20010000012002000002
2026-10-11 01:03:55,022 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:55,022 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:55,022 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0050' (80)
2026-10-11 01:03:55,022 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:55,022 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:55,022 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:55,022 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:55,022 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:55] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:55,023 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:55,023 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:55] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:55,081 INFO BGP-Thread-1 (job): ... idle for 0.058s
2026-10-11 01:03:55,081 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 48.666s
2026-10-11 01:03:55,082 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105071600010102030401020000000a20010000012002000002
2026-10-11 01:03:55,082 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:03:55,082 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:03:55,082 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004a' (74)
2026-10-11 01:03:55,082 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:03:55,082 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:03:55,082 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:03:55,082 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:03:55,082 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:55,082 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:55,082 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:55] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:55] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:55] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:56,084 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:56,084 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 49.667s
2026-10-11 01:03:56,088 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00500200000039400101014002008004040000000040050400000064800e21000105047f01010100071600010102030401020000000a20010000012002000002
2026-10-11 01:03:56,088 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:56,088 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:56,088 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:57,089 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:57,090 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 50.668s
2026-10-11 01:03:57,090 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:57,090 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:57,090 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:57] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:03:58,091 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:58,091 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 51.669s
2026-10-11 01:03:58,091 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105071600010102030401020000000a20010000012002000002
2026-10-11 01:03:58,092 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:58,092 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:58,092 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:03:59,093 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:03:59,093 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 52.670s
2026-10-11 01:03:59,093 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:03:59,093 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:03:59,093 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:03:59] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:03:59] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:00] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:00,082 INFO BGP-Thread-1 (job): ... idle for 0.988s
2026-10-11 01:04:00,082 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 53.659s
2026-10-11 01:04:00,082 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004a0200000033400101014002008004040000000040050400000064800f1b000105071600010102030401020000000a20010000012002000002
2026-10-11 01:04:00,082 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00570200000040c01b0e0a0a0a0104e3800a0a140204e3c0400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0a
2026-10-11 01:04:00,082 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:00,082 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:00,082 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0057' (87)
2026-10-11 01:04:00,082 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:00,082 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:00,082 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:04:00,082 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:04:00,083 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:00,083 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:00,083 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:01,084 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:01,084 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 54.660s
2026-10-11 01:04:01,085 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:01,085 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:01,085 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:02] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:02,087 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:02,087 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 55.661s
2026-10-11 01:04:02,087 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:02,087 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:02,087 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:02] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:02,180 INFO BGP-Thread-1 (job): ... idle for 0.093s
2026-10-11 01:04:02,180 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 55.753s
2026-10-11 01:04:02,180 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003ac01b0e0a0a0a0104e3800a0a140204e3c0400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a
2026-10-11 01:04:02,180 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:02,180 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:02,180 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-10-11 01:04:02,180 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:02,180 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:02,180 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:04:02,180 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:04:02,180 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:02,181 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:02,181 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:02] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:02] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:02] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:03,182 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:03,182 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 56.754s
2026-10-11 01:04:03,182 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff00570200000040c01b0e0a0a0a0104e3800a0a140204e3c0400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0a
2026-10-11 01:04:03,182 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:03,182 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:03,182 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:04,184 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:04,184 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 57.755s
2026-10-11 01:04:04,184 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:04,184 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:04,184 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:04] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:05,185 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:05,185 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 58.757s
2026-10-11 01:04:05,185 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003ac01b0e0a0a0a0104e3800a0a140204e3c0400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a
2026-10-11 01:04:05,186 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:05,186 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:05,186 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:06,187 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:06,187 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 59.758s
2026-10-11 01:04:06,190 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:06,190 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:06,190 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:06] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:07] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:07] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:07,175 INFO BGP-Thread-1 (job): ... idle for 0.986s
2026-10-11 01:04:07,176 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 60.743s
2026-10-11 01:04:07,176 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003ac01b0e0a0a0a0104e3800a0a140204e3c0400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0a
2026-10-11 01:04:07,176 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003a400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac01008010b0a0000013130
2026-10-11 01:04:07,176 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:07,176 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:07,176 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-10-11 01:04:07,176 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:07,176 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:07,176 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:04:07,176 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:04:07,176 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:07,177 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:07,177 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:08,178 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:08,178 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 61.744s
2026-10-11 01:04:08,178 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:08,178 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:08,178 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:09] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:09,179 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:09,179 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 62.745s
2026-10-11 01:04:09,180 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:09,180 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:09,180 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:09] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:09,273 INFO BGP-Thread-1 (job): ... idle for 0.094s
2026-10-11 01:04:09,273 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 62.839s
2026-10-11 01:04:09,274 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac01008010b0a0000013130
2026-10-11 01:04:09,274 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:09,274 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:09,274 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-10-11 01:04:09,274 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:09,274 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:09,274 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:04:09,274 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:04:09,274 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:09,274 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:09,274 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:09] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:10,276 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:10,276 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 63.840s
2026-10-11 01:04:10,276 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac01008010b0a0000013130
2026-10-11 01:04:10,276 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:10,276 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:10,276 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:11,277 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:11,277 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 64.841s
2026-10-11 01:04:11,281 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:11,281 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:11,281 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:11] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:12,282 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:12,282 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 65.842s
2026-10-11 01:04:12,282 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac01008010b0a0000013130
2026-10-11 01:04:12,282 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:12,282 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:12,283 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:13,284 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:13,284 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 66.843s
2026-10-11 01:04:13,284 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:13,284 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:13,284 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:14] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:14] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:14,285 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:14,285 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 67.844s
2026-10-11 01:04:14,286 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac01008010b0a0000013130
2026-10-11 01:04:14,286 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003a400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac010080009004100000000
2026-10-11 01:04:14,286 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:14,286 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:14,286 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-10-11 01:04:14,286 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:14,286 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:14,286 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:04:14,286 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:04:14,286 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:14,286 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:14,287 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:14] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:14] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:14,345 INFO BGP-Thread-1 (job): ... idle for 0.058s
2026-10-11 01:04:14,345 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 67.903s
2026-10-11 01:04:14,345 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac010080009004100000000
2026-10-11 01:04:14,345 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:14,345 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:14,346 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-10-11 01:04:14,346 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:14,346 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:14,346 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:04:14,346 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:04:14,346 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:14,346 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:14,346 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:14] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:14] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:14] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:15,347 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:15,347 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 68.904s
2026-10-11 01:04:15,347 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a400101014002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac010080009004100000000
2026-10-11 01:04:15,348 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:15,348 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:15,348 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:16,349 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:16,349 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 69.905s
2026-10-11 01:04:16,350 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:16,350 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:16,350 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:16] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:17,351 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:17,352 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 70.906s
2026-10-11 01:04:17,352 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac010080009004100000000
2026-10-11 01:04:17,352 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:17,352 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:17,352 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:18,353 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:18,353 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 71.907s
2026-10-11 01:04:18,353 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:18,354 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:18,354 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:19] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:19] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:19] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:19,307 INFO BGP-Thread-1 (job): ... idle for 0.954s
2026-10-11 01:04:19,307 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 72.861s
2026-10-11 01:04:19,308 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004b0200000034400101014002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac010080009004100000000
2026-10-11 01:04:19,308 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0051020000003a400101004002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac0100802d10000fbf00000
2026-10-11 01:04:19,308 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:19,308 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:19,308 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0051' (81)
2026-10-11 01:04:19,308 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:19,308 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:19,308 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:04:19,308 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:04:19,308 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:19,308 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:19,309 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:20,310 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:20,310 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 73.862s
2026-10-11 01:04:20,310 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:20,310 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:20,310 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:21,311 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:21,311 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 74.863s
2026-10-11 01:04:21,312 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:21,312 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:21,312 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:21] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:21] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:21,403 INFO BGP-Thread-1 (job): ... idle for 0.092s
2026-10-11 01:04:21,404 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 74.955s
2026-10-11 01:04:21,406 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004b0200000034400101004002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac0100802d10000fbf00000
2026-10-11 01:04:21,406 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:21,406 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:21,406 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004b' (75)
2026-10-11 01:04:21,406 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:21,407 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:21,407 DEBUG BGP-Thread-1 (job): Mvpn True
2026-10-11 01:04:21,407 DEBUG BGP-Thread-1 (job): Skipping update decoding due to mvpn data expected
2026-10-11 01:04:21,407 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:21,407 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:21,407 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:21] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:21] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:21] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:22,408 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:22,408 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 75.956s
2026-10-11 01:04:22,408 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0051020000003a400101004002008004040000000040050400000064800e17000105047f01010100010c00010102030401020a0a0a0ac0100802d10000fbf00000
2026-10-11 01:04:22,409 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:22,409 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:22,409 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:23,410 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:23,410 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 76.957s
2026-10-11 01:04:23,410 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:23,410 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:23,410 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:23] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:24,411 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:24,412 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 77.958s
2026-10-11 01:04:24,412 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004b0200000034400101004002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac0100802d10000fbf00000
2026-10-11 01:04:24,412 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:24,412 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:24,412 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:25,413 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:25,413 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 78.959s
2026-10-11 01:04:25,414 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:25,414 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:25,414 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:26] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:26] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:26] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:26,415 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:26,415 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 79.960s
2026-10-11 01:04:26,416 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004b0200000034400101004002008004040000000040050400000064800f11000105010c00010102030401020a0a0a0ac0100802d10000fbf00000
2026-10-11 01:04:26,416 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004b02000000344001010040020040050400000064800e230002051020010db800010000000000000000000600010c0001ac10002c0065c0a86401
2026-10-11 01:04:26,416 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:26,416 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:26,416 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:27,418 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:27,418 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 80.961s
2026-10-11 01:04:27,418 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:27,418 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:27,418 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:28,419 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:28,420 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 81.962s
2026-10-11 01:04:28,420 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:28,420 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:28,420 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:28] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:29,421 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:29,421 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 82.963s
2026-10-11 01:04:29,421 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003902000000224001010040020040050400000064800f11000205010c0001ac10002c0065c0a86401
2026-10-11 01:04:29,421 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:29,422 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:29,422 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:30,423 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:30,423 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 83.965s
2026-10-11 01:04:30,423 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:30,423 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:30,423 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:30] "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-10-11T01:04:31.089288" elapsed="0.001548"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:31.091656" 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-10-11T01:04:31.091103" elapsed="0.000626"/>
</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-10-11T01:04:31.042513" elapsed="0.049306"/>
</kw>
<doc>Abort the Python speaker</doc>
<status status="PASS" start="2026-10-11T01:04:30.912497" elapsed="0.179459"/>
</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-10-11T01:04:31.093911" elapsed="0.000275"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:04:31.093551" elapsed="0.000704"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:31.095885" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:31.095745" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:31.095720" 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-10-11T01:04:31.098729" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:31.098616" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:31.098592" elapsed="0.000239"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.100101" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:31.099634" elapsed="0.000502"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.100733" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:04:31.100349" elapsed="0.000434"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:04:31.100842" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T01:04:31.101018" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:04:31.099117" elapsed="0.001932"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:31.104580" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:31.104462" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:31.104437" 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-10-11T01:04:31.106131" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:31.106015" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:31.105991" elapsed="0.000226"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:31.106678" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:04:31.106442" elapsed="0.000270"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:31.107148" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:31.106957" elapsed="0.000223"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:04:31.140654" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:04:31.107905" elapsed="0.032888"/>
</kw>
<msg time="2026-10-11T01:04:31.140981" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:04:31.141023" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:31.107401" elapsed="0.033657"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:04:31.176972" 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-10-11T01:04:31.141652" elapsed="0.035420"/>
</kw>
<msg time="2026-10-11T01:04:31.177221" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:04:31.177261" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:31.141255" elapsed="0.036042"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:31.177676" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:31.177373" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:31.177350" elapsed="0.000404"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.178196" 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-10-11T01:04:31.177961" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:31.178539" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:31.178321" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:31.178305" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:04:31.178645" 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-10-11T01:04:31.181387" elapsed="0.000135"/>
</kw>
<msg time="2026-10-11T01:04:31.181582" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:31.180295" 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-10-11T01:04:31.182047" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:31.182383" 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-10-11T01:04:31.179686" elapsed="0.002900"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:04:31.179000" elapsed="0.003646"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:04:31.105647" elapsed="0.077073"/>
</kw>
<msg time="2026-10-11T01:04:31.182818" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:31.182859" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:31.104892" elapsed="0.078003"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:04:31.183051" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:04:31.182964" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:31.182947" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:31.183490" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:31.183810" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:04:31.183875" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T01:04:31.104046" elapsed="0.079913"/>
</kw>
<msg time="2026-10-11T01:04:31.184044" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:31.184084" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:31.101531" elapsed="0.082588"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:31.184427" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:31.184187" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:31.184171" elapsed="0.000329"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:04:31.101312" elapsed="0.083210"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:04:31.101117" elapsed="0.083434"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:04:31.098193" elapsed="0.086408"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:04:31.095366" elapsed="0.089287"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:31.094481" elapsed="0.090214"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:04:31.093054" elapsed="0.091691"/>
</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-10-11T01:04:31.198138" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:31.197836" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:31.198878" 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-10-11T01:04:31.198658" elapsed="0.000291">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-10-11T01:04:31.199033" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:31.198323" elapsed="0.000733"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.199559" 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-10-11T01:04:31.199235" elapsed="0.000349"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:31.199879" 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-10-11T01:04:31.200018" 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-10-11T01:04:31.199751" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.200470" 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-10-11T01:04:31.200237" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.201604" level="INFO">mapping: {'IP': '10.30.171.7', '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-10-11T01:04:31.201354" elapsed="0.000293"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.202117" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:31.201856" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.203333" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:31.202487" elapsed="0.000873"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:31.204074" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:31.203878" elapsed="0.000221"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:31.204144" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:31.204269" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:31.203548" elapsed="0.000745"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:31.204474" elapsed="0.000183"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T01:04:31.202335" elapsed="0.002359"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.205209" 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-10-11T01:04:31.204942" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:31.205923" 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-10-11T01:04:31.205724" elapsed="0.000223"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:31.205990" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:31.206113" 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-10-11T01:04:31.205402" elapsed="0.000733"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:31.206300" elapsed="0.000183"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T01:04:31.204810" elapsed="0.001710"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.207035" 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-10-11T01:04:31.206748" elapsed="0.000310"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:31.207784" 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-10-11T01:04:31.207593" elapsed="0.000216"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:31.207853" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:31.207977" 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-10-11T01:04:31.207230" 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-10-11T01:04:31.208165" elapsed="0.000166"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T01:04:31.206618" elapsed="0.001750"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.208904" 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-10-11T01:04:31.208613" elapsed="0.000315"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:31.209593" 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-10-11T01:04:31.209402" elapsed="0.000215"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:31.209660" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:31.209804" 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-10-11T01:04:31.209096" elapsed="0.000732"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:31.209992" elapsed="0.000164"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T01:04:31.208482" elapsed="0.001709"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.210698" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:31.210432" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:31.211402" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:31.211220" elapsed="0.000222"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:31.211487" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:31.212936" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:31.210911" elapsed="0.002049"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:31.213129" elapsed="0.000169"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:31.210288" elapsed="0.003048"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.213874" 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-10-11T01:04:31.213584" elapsed="0.000314"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:31.214576" 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-10-11T01:04:31.214382" elapsed="0.000218"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:31.214645" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:31.214787" 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-10-11T01:04:31.214071" elapsed="0.000741"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:31.214977" elapsed="0.000165"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T01:04:31.213451" elapsed="0.001728"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:31.202185" elapsed="0.013025"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:31.215248" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:04:31.215378" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', '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-10-11T01:04:31.200839" elapsed="0.014563"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:31.200572" elapsed="0.014876"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:31.215622" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:31.215471" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:31.200554" elapsed="0.015138"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.216468" 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-10-11T01:04:31.215869" elapsed="0.000626"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:31.216539" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:31.197300" elapsed="0.019339"/>
</kw>
<msg time="2026-10-11T01:04:31.216721" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:31.192949" elapsed="0.023831"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:31.220931" 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/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-10-11T01:04:31.225018" 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/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-10-11T01:04:31.229103" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:31.229285" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:31.229481" 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-10-11T01:04:31.229865" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:31.229673" elapsed="0.000244"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:31.229660" 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-10-11T01:04:31.230095" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:31.230274" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:31.230452" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:31.229635" elapsed="0.000866"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:31.229548" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:31.230674" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:31.230740" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:31.230867" 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-10-11T01:04:31.192304" elapsed="0.038588"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.231904" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:31.231664" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:31.238940" level="INFO">DELETE Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:31.238992" level="INFO">DELETE Response : url=http://10.30.170.173: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.171.7 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:31.239084" 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-10-11T01:04:31.232270" elapsed="0.006839"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:31.232042" elapsed="0.007103"/>
</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-10-11T01:04:31.239318" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:31.239169" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:31.232025" elapsed="0.007368"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.240598" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:31.240310" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:31.240075" elapsed="0.000595"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:31.240058" elapsed="0.000634"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.241259" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:31.240995" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:31.240741" elapsed="0.000591"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:31.240726" elapsed="0.000627"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.241911" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:31.241552" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:31.242215" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:31.242001" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.242909" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:31.242469" elapsed="0.000465"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:31.242288" elapsed="0.000680"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:31.241982" elapsed="0.001005"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.243518" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:31.243163" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:31.243832" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:31.243606" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.244328" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:31.244068" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:31.243906" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:31.243589" elapsed="0.000814"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:31.244563" elapsed="0.000309"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:31.245255" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:31.245033" elapsed="0.000246"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:31.245447" elapsed="0.000212"/>
</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-10-11T01:04:31.239732" elapsed="0.005983"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:04:31.245755" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T01:04:31.245943" 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-10-11T01:04:31.231129" elapsed="0.014838"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:31.246044" elapsed="0.000025"/>
</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-10-11T01:04:31.185006" elapsed="0.061135"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-10-11T01:04:31.092306" elapsed="0.153936"/>
</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-10-11T01:04:31.247531" elapsed="0.000198"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:04:31.247267" 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-10-11T01:04:31.248701" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:31.248616" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:31.248598" elapsed="0.000183"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:31.250749" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:31.250666" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:31.250649" elapsed="0.000179"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.251729" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:31.251392" elapsed="0.000362"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.252186" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:04:31.251925" elapsed="0.000285"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:04:31.252250" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:31.252376" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:04:31.251037" elapsed="0.001363"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:31.255058" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:31.254968" elapsed="0.000133"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:31.254950" elapsed="0.000171"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:31.256181" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:31.256096" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:31.256079" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:31.256584" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:04:31.256392" elapsed="0.000217"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:31.256926" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:31.256789" elapsed="0.000161"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:04:31.290711" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:04:31.257455" elapsed="0.033359"/>
</kw>
<msg time="2026-10-11T01:04:31.290980" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:04:31.291020" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:31.257108" elapsed="0.033947"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:04:31.338254" 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-10-11T01:04:31.291581" elapsed="0.046799"/>
</kw>
<msg time="2026-10-11T01:04:31.338571" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:04:31.338615" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:31.291222" elapsed="0.047428"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:31.338989" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:31.338730" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:31.338707" elapsed="0.000410"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.339592" 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-10-11T01:04:31.339301" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:31.339936" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:31.339719" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:31.339702" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:04:31.340047" 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-10-11T01:04:31.342541" elapsed="0.000117"/>
</kw>
<msg time="2026-10-11T01:04:31.342717" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:31.341510" elapsed="0.001359"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:31.343179" elapsed="0.000072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:31.343612" 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-10-11T01:04:31.340889" elapsed="0.002931"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:04:31.340362" elapsed="0.003520"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:04:31.255841" elapsed="0.088116"/>
</kw>
<msg time="2026-10-11T01:04:31.344042" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:31.344081" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:31.255273" elapsed="0.088844"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:04:31.344272" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:04:31.344187" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:31.344170" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:31.344793" 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-10-11T01:04:31.345249" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:04:31.345314" 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-10-11T01:04:31.254667" elapsed="0.090750"/>
</kw>
<msg time="2026-10-11T01:04:31.345507" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:31.345548" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:31.252746" elapsed="0.092840"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:31.345891" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:31.345655" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:31.345638" elapsed="0.000326"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:04:31.252603" elapsed="0.093383"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:04:31.252462" elapsed="0.093554"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:04:31.250363" elapsed="0.095705"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:04:31.248350" elapsed="0.097770"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:31.247954" elapsed="0.098209"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:04:31.246928" elapsed="0.099284"/>
</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-10-11T01:04:31.359756" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:31.359452" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:31.360501" 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-10-11T01:04:31.360280" elapsed="0.000293">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-10-11T01:04:31.360659" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:31.359959" elapsed="0.000723"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.361191" 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-10-11T01:04:31.360879" elapsed="0.000337"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:31.361512" 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-10-11T01:04:31.361653" 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-10-11T01:04:31.361385" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.362111" 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-10-11T01:04:31.361889" elapsed="0.000265"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.363073" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:04:31.362840" elapsed="0.000275"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.363561" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:31.363293" elapsed="0.000292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.364185" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:31.363919" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:31.364912" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:31.364708" elapsed="0.000228"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:31.364980" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:04:31.365104" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:31.364381" elapsed="0.000746"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:31.365293" elapsed="0.000196"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:04:31.363784" elapsed="0.001743"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.366038" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:31.365757" elapsed="0.000305"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:31.366741" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:31.366562" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:31.366825" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:31.366949" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:31.366231" elapsed="0.000740"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:31.367135" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:31.365626" elapsed="0.001710"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:31.363629" elapsed="0.003738"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:31.367404" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T01:04:31.367549" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:31.362484" elapsed="0.005087"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:31.362215" elapsed="0.005416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:31.367824" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:31.367656" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:31.362198" elapsed="0.005697"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.368747" 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-10-11T01:04:31.368057" elapsed="0.000733"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:31.368836" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:31.358933" elapsed="0.010003"/>
</kw>
<msg time="2026-10-11T01:04:31.368986" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:31.354545" elapsed="0.014484"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>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-10-11T01:04:31.373144" 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/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-10-11T01:04:31.377244" 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/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-10-11T01:04:31.381338" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:31.381532" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:31.381714" 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-10-11T01:04:31.382070" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:31.381923" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:31.381910" 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-10-11T01:04:31.382304" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:31.382498" 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-10-11T01:04:31.382664" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:31.381884" elapsed="0.000827"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:31.381796" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:31.382904" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:31.382971" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:31.383081" 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-10-11T01:04:31.353913" elapsed="0.029222"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.384150" 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.173</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:31.383927" elapsed="0.000267"/>
</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-10-11T01:04:31.397048" level="INFO">DELETE Request : url=http://10.30.170.173: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.173 
 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.173 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0kem5zbmrvb9j1jcd87io1afbv22.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:31.397094" level="INFO">DELETE Response : url=http://10.30.170.173: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.173 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:31.397175" 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-10-11T01:04:31.384497" elapsed="0.012702"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:31.384255" elapsed="0.012981"/>
</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-10-11T01:04:31.397428" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:31.397259" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:31.384238" elapsed="0.013267"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.398702" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:31.398428" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:31.398174" elapsed="0.000615"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:31.398157" elapsed="0.000656"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.399366" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:31.399100" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:31.398863" elapsed="0.000592"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:31.398848" elapsed="0.000629"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.400028" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:31.399661" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:31.400329" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:31.400116" elapsed="0.000265"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.400860" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:31.400583" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:31.400417" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:31.400100" elapsed="0.000836"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.401459" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:31.401111" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:31.401753" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:31.401546" elapsed="0.000272"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.402260" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:31.402001" elapsed="0.000283"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:31.401840" elapsed="0.000476"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:31.401529" elapsed="0.000806"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:31.402492" elapsed="0.000305"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:31.403226" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:31.402999" elapsed="0.000251"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:31.403404" elapsed="0.000231"/>
</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-10-11T01:04:31.397843" elapsed="0.005847"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:04:31.403730" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:31.403918" 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-10-11T01:04:31.383373" elapsed="0.020569"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:31.403988" elapsed="0.000025"/>
</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-10-11T01:04:31.346447" elapsed="0.057636"/>
</kw>
<doc>Revert the BGP configuration to the original state: without application peer</doc>
<status status="PASS" start="2026-10-11T01:04:31.246447" elapsed="0.157735"/>
</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-10-11T01:04:31.405077" elapsed="0.000406"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:31.405696" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects </doc>
<status status="PASS" start="2026-10-11T01:04:31.405629" elapsed="0.000149"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-10-11T01:04:31.404696" elapsed="0.001131"/>
</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-10-11T01:03:04.018765" elapsed="87.387089"/>
</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-10-11T01:04:31.433801" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:04:31.432203" elapsed="0.001642"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-10-11T01:04:31.431966" elapsed="0.001937"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.436168" 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-10-11T01:04:31.434877" elapsed="0.001317"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-10-11T01:04:31.436346" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:31.436264" elapsed="0.000119"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:31.436246" elapsed="0.000158"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.436931" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:04:31.436598" elapsed="0.000372"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.437419" 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-10-11T01:04:31.437131" elapsed="0.000313"/>
</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-10-11T01:04:31.437960" elapsed="0.000246"/>
</kw>
<msg time="2026-10-11T01:04:31.438293" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:31.438334" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:31.437610" elapsed="0.000745"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.438868" 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-10-11T01:04:31.438545" elapsed="0.000347"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.439744" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:04:31.439499" elapsed="0.000281"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.440160" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:04:31.439924" elapsed="0.000260"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.440640" 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-10-11T01:04:31.440359" elapsed="0.000305"/>
</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-10-11T01:04:31.441594" elapsed="0.000158"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.442205" level="INFO">${member_ip} = 10.30.170.173</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:31.441923" elapsed="0.000307"/>
</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-10-11T01:04:31.442396" elapsed="0.000182"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.443292" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:31.443031" elapsed="0.000285"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-11T01:04:31.443357" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:04:31.443626" 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-10-11T01:04:31.442755" elapsed="0.000895"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:31.444147" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7434455cf890&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-10-11T01:04:31.443834" elapsed="0.000427"/>
</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-10-11T01:04:31.444437" elapsed="0.000152"/>
</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-10-11T01:04:31.441135" elapsed="0.003507"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:04:31.440962" elapsed="0.003719"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-10-11T01:04:31.440753" elapsed="0.003956"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.445372" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:04:31.444910" elapsed="0.000516"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.446145" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.173'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:04:31.445610" elapsed="0.000577"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.446729" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:04:31.446374" elapsed="0.000407"/>
</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-10-11T01:04:31.439113" elapsed="0.007720"/>
</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-10-11T01:04:31.434554" elapsed="0.012329"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:31.447028" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:31.446940" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:31.446923" elapsed="0.000165"/>
</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-10-11T01:04:31.448272" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:31.447956" elapsed="0.000341"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.448729" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:04:31.448465" elapsed="0.000288"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:04:31.448805" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:31.448930" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:04:31.447640" elapsed="0.001313"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:31.449820" level="INFO">${member_ip} = 10.30.170.173</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-10-11T01:04:31.449597" elapsed="0.000248"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:31.450577" 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-10-11T01:04:31.450705" 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-10-11T01:04:31.450430" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:31.453573" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:31.453028" elapsed="0.000626"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:31.453010" elapsed="0.000681"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:31.454366" 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-10-11T01:04:31.454606" 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-10-11T01:04:31.453946" elapsed="0.000709"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.455546" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.173" 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-10-11T01:04:31.454969" elapsed="0.000697"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:31.456948" 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-10-11T01:04:31.455969" elapsed="0.001030"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:04:31.458805" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T01:04:31.458973" 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-10-11T01:04:31.458283" elapsed="0.000730"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:31.459340" elapsed="0.000437"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T01:04:31.460868" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T01:04:32.069747" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 01:04:31 UTC 2026

  System load:  0.09               Processes:             122
  Usage of /:   14.2% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.173
  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.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 01:03:04 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T01:04:31.460610" elapsed="0.609294"/>
</kw>
<msg time="2026-10-11T01:04:32.069985" 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-10-11T01:04:31.460122" elapsed="0.610018"/>
</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-10-11T01:04:31.457436" elapsed="0.612841"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:04:32.071170" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-10-11T01:04:32.083893" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-10-11T01:04:32.084051" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T01:04:32.084148" 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-10-11T01:04:32.070696" elapsed="0.013499"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:04:32.084513" elapsed="0.000506"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:32.086780" 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-10-11T01:04:32.085995" elapsed="0.000953"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T01:04:32.087541" elapsed="0.000094"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:32.087175" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:32.087141" elapsed="0.000674"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T01:04:32.088190" elapsed="0.000107"/>
</return>
<status status="PASS" start="2026-10-11T01:04:32.087922" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:32.087900" elapsed="0.000649"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T01:04:32.088632" elapsed="0.000021"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:32.090313" elapsed="0.000661"/>
</kw>
<kw name="Open 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-10-11T01:04:32.091565" elapsed="0.000397"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:04:32.092335" elapsed="0.000314"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:04:32.089279" elapsed="0.003460"/>
</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-10-11T01:04:31.452349" elapsed="0.640558"/>
</kw>
<msg time="2026-10-11T01:04:32.092974" 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-10-11T01:04:31.451785" elapsed="0.641257"/>
</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-10-11T01:04:31.451363" elapsed="0.641784"/>
</kw>
<msg time="2026-10-11T01:04:32.093199" 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-10-11T01:04:31.450905" elapsed="0.642352"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:32.094218" elapsed="0.000405"/>
</kw>
<kw name="Open 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-10-11T01:04:32.094895" elapsed="0.000187"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:04:32.095282" elapsed="0.000197"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:04:32.093727" elapsed="0.001822"/>
</kw>
<msg time="2026-10-11T01:04:32.095663" 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-10-11T01:04:31.450050" elapsed="0.645645"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:32.096324" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:32.096013" elapsed="0.000364"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-11T01:04:32.096454" elapsed="0.000039"/>
</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-10-11T01:04:31.449257" elapsed="0.647337"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:04:31.449096" elapsed="0.647543"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:04:31.448998" elapsed="0.647685"/>
</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-10-11T01:04:31.447287" elapsed="0.649463"/>
</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-10-11T01:04:32.096979" elapsed="0.000278"/>
</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-10-11T01:04:32.105860" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:32.105722" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:32.105696" elapsed="0.000254"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:32.106390" 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-10-11T01:04:32.106541" 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-10-11T01:04:32.106225" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:32.107187" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:32.106862" elapsed="0.000381"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:32.107849" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:32.107528" elapsed="0.000377"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:32.108895" 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-10-11T01:04:32.108635" elapsed="0.000398">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-10-11T01:04:32.109212" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T01:04:32.109269" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:32.108125" elapsed="0.001173"/>
</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-10-11T01:04:32.109718" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:32.109392" elapsed="0.000438"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:32.109368" elapsed="0.000494"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:32.110798" level="INFO">${ip_address} = 10.30.170.173</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-10-11T01:04:32.110483" elapsed="0.000349"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-10-11T01:04:32.110891" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T01:04:32.111062" level="INFO">${odl_ip} = 10.30.170.173</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-10-11T01:04:32.110120" elapsed="0.000981"/>
</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-10-11T01:04:32.111346" elapsed="0.000479"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:32.112253" level="INFO">index=4
host=10.30.170.173
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-10-11T01:04:32.112377" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.173
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-10-11T01:04:32.112119" elapsed="0.000310"/>
</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-10-11T01:04:32.112659" elapsed="0.000343"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-10-11T01:04:32.113560" level="INFO">Logging into '10.30.170.173:8101' as 'karaf'.</msg>
<msg time="2026-10-11T01:04:32.286466" 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-10-11T01:04:32.113269" elapsed="0.173326"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:32.289726" elapsed="0.000290"/>
</kw>
<kw name="Open 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-10-11T01:04:32.290206" elapsed="0.000147"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:04:32.290513" elapsed="0.000093"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:04:32.289348" elapsed="0.001307"/>
</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-10-11T01:04:32.287016" elapsed="0.003683"/>
</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-10-11T01:04:32.105380" elapsed="0.185367"/>
</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-10-11T01:04:32.098983" elapsed="0.191822"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:32.097704" elapsed="0.193149"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:04:32.097506" elapsed="0.193384"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-10-11T01:04:32.097326" elapsed="0.193595"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-10-11T01:04:31.434160" elapsed="0.856814"/>
</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-10-11T01:04:32.291888" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:32.291796" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:32.291775" elapsed="0.000180"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:32.293880" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:32.293796" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:32.293779" elapsed="0.000164"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:32.294817" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:32.294471" elapsed="0.000372"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:04:32.295262" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:04:32.294997" elapsed="0.000289"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:04:32.295326" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T01:04:32.295477" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:04:32.294150" elapsed="0.001350"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:32.297926" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:32.297843" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:32.297826" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:32.299016" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:32.298933" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:32.298916" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:32.299514" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:04:32.299225" elapsed="0.000314"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:32.299908" 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-10-11T01:04:32.299704" elapsed="0.000228"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:04:32.334682" 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-10-11T01:04:32.300611" elapsed="0.034210"/>
</kw>
<msg time="2026-10-11T01:04:32.334950" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:04:32.334996" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:32.300091" elapsed="0.034941"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:04:32.384756" 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-10-11T01:04:32.335736" elapsed="0.049220"/>
</kw>
<msg time="2026-10-11T01:04:32.385112" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:04:32.385154" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:32.335201" elapsed="0.049990"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:32.385670" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:32.385275" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:32.385251" elapsed="0.000612"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:32.386484" 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-10-11T01:04:32.386057" elapsed="0.000512"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:32.436817" elapsed="0.000102"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:32.386631" elapsed="0.050461"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:32.386614" elapsed="0.050511"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:04:32.437165" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:32.439342" elapsed="0.000483"/>
</kw>
<kw name="Open 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-10-11T01:04:32.440198" elapsed="0.000338"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:04:32.440881" elapsed="0.000233"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:04:32.438569" elapsed="0.002631"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:04:32.437552" elapsed="0.003779"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:04:32.298719" elapsed="0.142714"/>
</kw>
<msg time="2026-10-11T01:04:32.441540" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:32.441583" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:32.298139" elapsed="0.143481"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:04:32.441805" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-10-11T01:04:32.441698" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:32.441678" 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-10-11T01:04:32.442227" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:32.442692" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:04:32.442775" 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-10-11T01:04:32.297600" elapsed="0.145267"/>
</kw>
<msg time="2026-10-11T01:04:32.442953" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:32.442993" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:32.295850" elapsed="0.147178"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:32.443322" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:32.443097" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:32.443081" elapsed="0.000312"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:04:32.295691" elapsed="0.147746"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:04:32.295549" elapsed="0.147924"/>
</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-10-11T01:04:32.293553" elapsed="0.149973"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-10-11T01:04:32.291606" elapsed="0.151968"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:32.291129" elapsed="0.152482"/>
</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-10-11T01:04:31.431685" elapsed="1.011972"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:32.444141" 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-10-11T01:04:32.443848" elapsed="0.000317"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:32.444662" level="INFO">${mininet_conn_id} = 7</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:04:32.444355" elapsed="0.000347"/>
</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-10-11T01:04:32.446211" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T01:04:32.446280" 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-10-11T01:04:32.445962" elapsed="0.000339"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:32.446467" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T01:04:32.447569" level="INFO">Logging into '10.30.171.7:22' as 'jenkins'.</msg>
<msg time="2026-10-11T01:04:33.025097" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Sun Oct 11 01:04:32 UTC 2026

  System load:  0.03               Processes:             105
  Usage of /:   19.9% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.7
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 01:03:05 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T01:04:32.447326" elapsed="0.577940"/>
</kw>
<msg time="2026-10-11T01:04:33.025364" 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-10-11T01:04:32.446962" elapsed="0.578527"/>
</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-10-11T01:04:32.445580" elapsed="0.580040"/>
</kw>
<msg time="2026-10-11T01:04:33.025686" 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-10-11T01:04:32.445212" elapsed="0.580532"/>
</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-10-11T01:04:32.444898" elapsed="0.580957"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:33.026545" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7434454c3350&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-10-11T01:04:33.026167" elapsed="0.000583"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T01:04:33.033982" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-10-11T01:04:33.050585" 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-10-11T01:04:33.027028" elapsed="0.023642"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:04:33.052499" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-10-11T01:04:33.084860" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:04:33.085093" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T01:04:33.085183" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T01:04:33.085264" 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-10-11T01:04:33.052240" elapsed="0.033070"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.087174" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T01:04:33.086604" elapsed="0.000664"/>
</kw>
<msg time="2026-10-11T01:04:33.087487" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T01:04:33.087579" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:33.085793" elapsed="0.001833"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.088889" 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-10-11T01:04:33.088037" elapsed="0.000907"/>
</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-10-11T01:04:33.089726" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:33.089113" elapsed="0.000766"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.089067" elapsed="0.000866"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-10-11T01:04:33.090208" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-10-11T01:04:33.090044" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.090012" elapsed="0.000371"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-10-11T01:04:33.090596" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:33.090528" elapsed="0.000148"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:33.090495" elapsed="0.000224"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.091076" elapsed="0.000044"/>
</kw>
<msg time="2026-10-11T01:04:33.091345" 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-10-11T01:04:33.051721" elapsed="0.039676"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-10-11T01:04:33.091834" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-10-11T01:04:33.091654" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.091617" elapsed="0.000374"/>
</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-10-11T01:04:33.092365" elapsed="0.000071"/>
</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-10-11T01:04:33.051078" elapsed="0.041543"/>
</kw>
<doc>Initialize SetupUtils. Suite setup keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:31.431427" elapsed="1.661307"/>
</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-10-11T01:04:33.095698" elapsed="0.000499"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:04:33.094972" elapsed="0.001340"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:33.098861" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:33.098639" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.098601" elapsed="0.000401"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:33.103629" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:33.103401" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.103362" elapsed="0.000464"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.105910" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:33.105135" elapsed="0.000834"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.106709" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:04:33.106295" elapsed="0.000448"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:04:33.106813" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T01:04:33.106990" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:04:33.104291" elapsed="0.002731"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:33.110526" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:33.110387" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.110363" 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-10-11T01:04:33.112208" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:33.112091" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.112067" elapsed="0.000228"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:33.112824" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:04:33.112553" elapsed="0.000306"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:33.113284" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:33.113091" elapsed="0.000226"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:04:33.148592" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:04:33.114052" elapsed="0.034651"/>
</kw>
<msg time="2026-10-11T01:04:33.148871" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:04:33.148912" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:33.113574" elapsed="0.035374"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:04:33.184552" 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-10-11T01:04:33.149520" elapsed="0.035134"/>
</kw>
<msg time="2026-10-11T01:04:33.184817" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:04:33.184860" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:33.149138" elapsed="0.035758"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.185205" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:33.184998" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.184979" elapsed="0.000297"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.185733" 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-10-11T01:04:33.185498" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.186084" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:33.185878" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.185861" elapsed="0.000293"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:04:33.186184" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:33.189467" elapsed="0.000121"/>
</kw>
<msg time="2026-10-11T01:04:33.189648" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:33.188314" 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-10-11T01:04:33.190109" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.190484" 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-10-11T01:04:33.187705" 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-10-11T01:04:33.186509" elapsed="0.004293"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:04:33.111712" elapsed="0.079166"/>
</kw>
<msg time="2026-10-11T01:04:33.190960" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:33.191000" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:33.110839" elapsed="0.080196"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:04:33.191191" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:04:33.191105" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.191087" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.191648" 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-10-11T01:04:33.191964" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:04:33.192028" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T01:04:33.109990" elapsed="0.082132"/>
</kw>
<msg time="2026-10-11T01:04:33.192205" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:33.192245" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:33.107509" elapsed="0.084771"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.192604" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:33.192347" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.192331" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:04:33.107289" elapsed="0.085408"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:04:33.107090" elapsed="0.085634"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:04:33.102696" elapsed="0.090094"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:04:33.098036" elapsed="0.094804"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:33.096703" elapsed="0.096177"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:04:33.094097" elapsed="0.098830"/>
</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-10-11T01:04:33.203593" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:33.203270" elapsed="0.000350"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:33.204333" 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-10-11T01:04:33.204119" elapsed="0.000304">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-10-11T01:04:33.204510" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:33.203795" elapsed="0.000738"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.205028" 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-10-11T01:04:33.204707" elapsed="0.000346"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:33.205331" 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-10-11T01:04:33.205484" 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-10-11T01:04:33.205220" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.205934" 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-10-11T01:04:33.205705" elapsed="0.000271"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.206890" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:04:33.206645" elapsed="0.000287"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.207367" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:33.207112" elapsed="0.000279"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.207997" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:33.207718" elapsed="0.000303"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:33.208704" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:33.208517" elapsed="0.000212"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:33.208786" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:04:33.208913" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:33.208191" elapsed="0.000745"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:33.209103" elapsed="0.000171"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:04:33.207586" elapsed="0.001725"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.209921" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:33.209615" elapsed="0.000334"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:33.210720" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:33.210526" elapsed="0.000220"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:33.210808" elapsed="0.000034"/>
</return>
<msg time="2026-10-11T01:04:33.210942" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:33.210137" 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-10-11T01:04:33.211138" elapsed="0.000197"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:33.209428" elapsed="0.001946"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:33.207448" elapsed="0.003994"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:33.211490" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:33.211672" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:33.206288" elapsed="0.005408"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:33.206036" elapsed="0.005689"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.211920" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:33.211750" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.206019" elapsed="0.005971"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.212793" 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-10-11T01:04:33.212197" elapsed="0.000624"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:33.212865" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:33.202737" elapsed="0.010229"/>
</kw>
<msg time="2026-10-11T01:04:33.213017" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:33.198226" elapsed="0.014839"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:33.217378" 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/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-10-11T01:04:33.221518" 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/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-10-11T01:04:33.225632" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.225828" 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-10-11T01:04:33.226013" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.226364" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:33.226215" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:33.226200" 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-10-11T01:04:33.226611" 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-10-11T01:04:33.226806" 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-10-11T01:04:33.226971" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:33.226172" elapsed="0.000847"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:33.226080" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.227196" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:33.227293" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:04:33.227424" 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-10-11T01:04:33.197627" elapsed="0.029824"/>
</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-10-11T01:04:33.236418" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:33.236101" elapsed="0.000346"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:33.237131" 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-10-11T01:04:33.236938" elapsed="0.000263">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-10-11T01:04:33.237286" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:33.236606" elapsed="0.000702"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.237822" 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-10-11T01:04:33.237497" elapsed="0.000350"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:33.238128" 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-10-11T01:04:33.238270" 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-10-11T01:04:33.238015" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.238728" 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-10-11T01:04:33.238507" elapsed="0.000280"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:33.239106" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:33.238850" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.239608" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', '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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:33.239329" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:33.239181" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.238833" elapsed="0.000852"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.240347" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.173&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-10-11T01:04:33.239860" elapsed="0.000515"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:33.240435" 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-10-11T01:04:33.235581" elapsed="0.004956"/>
</kw>
<msg time="2026-10-11T01:04:33.240585" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:33.231244" elapsed="0.009385"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:33.244922" 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/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-10-11T01:04:33.249010" 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/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-10-11T01:04:33.253096" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.253284" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.253480" 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-10-11T01:04:33.253829" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:33.253670" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:33.253657" 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-10-11T01:04:33.254059" 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-10-11T01:04:33.254239" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.254417" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:33.253632" elapsed="0.000835"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:33.253546" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.254642" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:33.254708" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:33.254827" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.173&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-10-11T01:04:33.230525" elapsed="0.024329"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:33.255984" 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-10-11T01:04:33.255788" elapsed="0.000257">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-10-11T01:04:33.256129" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:33.255446" elapsed="0.000705"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.256450" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:33.256214" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.257024" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:33.256746" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:33.256560" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.256197" elapsed="0.000904"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.257615" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:33.257263" elapsed="0.000376"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:33.257685" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:33.257823" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:33.255131" elapsed="0.002716"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.259115" 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.173</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:33.258853" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.259692" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.173&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-10-11T01:04:33.259436" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.260223" 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-10-11T01:04:33.259997" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.260705" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:33.260482" elapsed="0.000264"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:33.261498" 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-10-11T01:04:33.261301" elapsed="0.000223"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:04:33.261841" 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-10-11T01:04:33.261680" elapsed="0.000185"/>
</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-10-11T01:04:33.262028" elapsed="0.000154"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.262616" 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-10-11T01:04:33.262377" elapsed="0.000280"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:04:33.262694" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:33.262836" 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-10-11T01:04:33.260943" elapsed="0.001917"/>
</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-10-11T01:04:33.275338" level="INFO">PUT Request : url=http://10.30.170.173: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.173 
 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.173 
 headers={'User-Agent': 'python-requests/2.34.2', '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.173&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-10-11T01:04:33.275394" level="INFO">PUT Response : url=http://10.30.170.173: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.173 
 status=201, reason=Created 
 headers={'Set-Cookie': 'JSESSIONID=node011peadqcdwn7ieyx6aexk11xu23.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Sat, 10-Oct-2026 01:04:33 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:33.275612" 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-10-11T01:04:33.263156" elapsed="0.012483"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:33.262923" elapsed="0.012757"/>
</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-10-11T01:04:33.275877" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:33.275704" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.262906" elapsed="0.013051"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.277233" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:33.276946" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:33.276652" elapsed="0.000655"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.276634" elapsed="0.000696"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.277953" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:33.277656" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:33.277382" elapsed="0.000645"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.277365" elapsed="0.000686"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.278622" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:33.278233" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.278952" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:33.278716" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.279499" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:33.279201" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:33.279034" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.278699" elapsed="0.000880"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.280131" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:33.279770" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.280461" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:33.280223" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.280992" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:33.280706" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:33.280540" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.280206" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:33.281217" elapsed="0.000314"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:33.281943" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:33.281696" elapsed="0.000272"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:33.282129" elapsed="0.000220"/>
</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-10-11T01:04:33.276276" elapsed="0.006144"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:04:33.282567" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:04:33.282484" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.282465" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.282806" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:04:33.282868" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:33.283030" 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-10-11T01:04:33.258145" elapsed="0.024911"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:33.283111" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:04:33.283235" 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-10-11T01:04:33.193907" elapsed="0.089351"/>
</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-10-11T01:04:33.283584" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:33.283348" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.283330" elapsed="0.000343"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:33.283801" elapsed="0.000031"/>
</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-10-11T01:04:33.193195" elapsed="0.090720"/>
</kw>
<doc>Configures bgp application peer.</doc>
<status status="PASS" start="2026-10-11T01:04:33.092886" elapsed="0.191138"/>
</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-10-11T01:04:33.285625" elapsed="0.000234"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:04:33.285340" 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-10-11T01:04:33.287007" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:33.286918" elapsed="0.000133"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.286900" elapsed="0.000171"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:33.289266" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:33.289182" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.289164" elapsed="0.000165"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.290253" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:33.289927" elapsed="0.000352"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.290714" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:04:33.290449" elapsed="0.000290"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:04:33.290793" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:33.290922" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:04:33.289552" elapsed="0.001393"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:33.293447" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:33.293347" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.293330" elapsed="0.000180"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:33.294608" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:33.294520" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.294501" elapsed="0.000172"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:33.295014" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:04:33.294838" elapsed="0.000203"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:33.295358" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:33.295215" elapsed="0.000167"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:04:33.329457" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:04:33.295928" elapsed="0.033628"/>
</kw>
<msg time="2026-10-11T01:04:33.329722" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:04:33.329786" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:33.295570" elapsed="0.034254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:04:33.374318" 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-10-11T01:04:33.330342" elapsed="0.044111"/>
</kw>
<msg time="2026-10-11T01:04:33.374614" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:04:33.374655" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:33.329995" elapsed="0.044695"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.374992" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:33.374776" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.374743" elapsed="0.000358"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.375552" 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-10-11T01:04:33.375288" elapsed="0.000339"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.375911" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:33.375688" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.375671" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:04:33.376014" 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-10-11T01:04:33.378703" elapsed="0.000217"/>
</kw>
<msg time="2026-10-11T01:04:33.378982" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:33.377461" 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-10-11T01:04:33.379464" elapsed="0.000101"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.379873" 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-10-11T01:04:33.376833" 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-10-11T01:04:33.376301" 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-10-11T01:04:33.294226" elapsed="0.085978"/>
</kw>
<msg time="2026-10-11T01:04:33.380287" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:33.380328" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:33.293661" elapsed="0.086702"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:04:33.380555" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T01:04:33.380464" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.380439" elapsed="0.000195"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.380979" 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-10-11T01:04:33.381283" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:04:33.381349" 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-10-11T01:04:33.293060" elapsed="0.088500"/>
</kw>
<msg time="2026-10-11T01:04:33.381648" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:33.381688" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:33.291273" elapsed="0.090450"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.382034" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:33.381808" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.381791" elapsed="0.000318"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:04:33.291132" elapsed="0.090998"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:04:33.290991" elapsed="0.091165"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:04:33.288883" elapsed="0.093323"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:04:33.286640" elapsed="0.095615"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:33.286127" elapsed="0.096170"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:04:33.284969" elapsed="0.097374"/>
</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-10-11T01:04:33.392874" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:33.392557" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:33.393592" 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-10-11T01:04:33.393377" elapsed="0.000283">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-10-11T01:04:33.393744" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:33.393058" elapsed="0.000723"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.394261" 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-10-11T01:04:33.393954" elapsed="0.000332"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:33.394578" 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-10-11T01:04:33.394718" 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-10-11T01:04:33.394468" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.395171" 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-10-11T01:04:33.394954" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.396304" level="INFO">mapping: {'IP': '10.30.171.7', '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-10-11T01:04:33.395900" elapsed="0.000447"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.396819" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:33.396542" elapsed="0.000302"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.397454" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:33.397168" elapsed="0.000310"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:33.398166" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:33.397978" elapsed="0.000213"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:33.398236" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:33.398360" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:33.397652" elapsed="0.000730"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:33.398562" elapsed="0.000173"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T01:04:33.397034" elapsed="0.001754"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.399289" 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-10-11T01:04:33.399018" elapsed="0.000294"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:33.399994" 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-10-11T01:04:33.399817" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:33.400062" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:33.400184" 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-10-11T01:04:33.399496" elapsed="0.000711"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:33.400368" elapsed="0.000180"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T01:04:33.398887" elapsed="0.001699"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.401094" 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-10-11T01:04:33.400827" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:33.401808" 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-10-11T01:04:33.401614" elapsed="0.000218"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:33.401910" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:04:33.402037" 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-10-11T01:04:33.401288" 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-10-11T01:04:33.402225" elapsed="0.000165"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T01:04:33.400684" elapsed="0.001757"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.402952" 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-10-11T01:04:33.402671" elapsed="0.000305"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:33.403643" 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-10-11T01:04:33.403466" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:33.403711" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:33.403848" 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-10-11T01:04:33.403144" elapsed="0.000727"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:33.404034" elapsed="0.000164"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T01:04:33.402542" elapsed="0.001693"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.404746" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:33.404478" elapsed="0.000304"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:33.405454" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:33.405263" elapsed="0.000216"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:33.405522" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:33.405644" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:33.404951" elapsed="0.000716"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:33.405842" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:33.404334" elapsed="0.001710"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.406703" 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-10-11T01:04:33.406432" elapsed="0.000295"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:33.407389" 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-10-11T01:04:33.407215" elapsed="0.000213"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:33.407472" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:33.407596" 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-10-11T01:04:33.406910" elapsed="0.000708"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:33.407794" elapsed="0.000167"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T01:04:33.406140" elapsed="0.001857"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:33.396888" elapsed="0.011140"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:33.408070" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:33.408199" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', '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-10-11T01:04:33.395542" elapsed="0.012681"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:33.395274" elapsed="0.012978"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.408438" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:33.408273" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.395256" elapsed="0.013252"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.409258" 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-10-11T01:04:33.408669" elapsed="0.000617"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:33.409330" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:33.391971" elapsed="0.017487"/>
</kw>
<msg time="2026-10-11T01:04:33.409542" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:33.387647" elapsed="0.021942"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:33.413715" 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/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-10-11T01:04:33.417897" 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-10-11T01:04:33.422063" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.422257" 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-10-11T01:04:33.422462" 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-10-11T01:04:33.422830" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:33.422668" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:33.422653" 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-10-11T01:04:33.423060" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.423238" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.423401" elapsed="0.000032"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:33.422623" elapsed="0.000839"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:33.422532" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.423638" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:33.423705" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:33.423845" 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-10-11T01:04:33.386969" elapsed="0.036902"/>
</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-10-11T01:04:33.434245" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:33.433932" elapsed="0.000340"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:33.434977" 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-10-11T01:04:33.434778" elapsed="0.000312">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-10-11T01:04:33.435176" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:33.434445" elapsed="0.000754"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.435701" 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-10-11T01:04:33.435373" elapsed="0.000353"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:33.436019" 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-10-11T01:04:33.436164" 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-10-11T01:04:33.435906" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.436622" 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-10-11T01:04:33.436386" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:33.436995" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:33.436728" elapsed="0.000320"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.437496" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', '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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:33.437217" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:33.437070" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.436711" elapsed="0.000862"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.438327" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:33.437733" elapsed="0.000623"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:33.438399" 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_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-10-11T01:04:33.433393" elapsed="0.005125"/>
</kw>
<msg time="2026-10-11T01:04:33.438567" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:33.427653" elapsed="0.010983"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:33.442733" 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/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-10-11T01:04:33.446899" 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/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-10-11T01:04:33.450948" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.451174" 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-10-11T01:04:33.451356" 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-10-11T01:04:33.451709" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:33.451560" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:33.451547" 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-10-11T01:04:33.451952" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.452139" elapsed="0.000017"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.452302" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:33.451522" elapsed="0.000827"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:33.451434" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.452537" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:33.452604" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:33.452714" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-...</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-10-11T01:04:33.426920" elapsed="0.025821"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:33.453877" 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-10-11T01:04:33.453665" elapsed="0.000272">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-10-11T01:04:33.454020" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:33.453324" elapsed="0.000723"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.454368" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:33.454123" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.454923" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:33.454642" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:33.454461" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.454095" elapsed="0.000905"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.455515" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:33.455166" elapsed="0.000373"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:33.455583" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:33.455707" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:33.453024" elapsed="0.002706"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.457131" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:33.456728" elapsed="0.000447"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.457627" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T01:04:33.457366" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.458112" 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-10-11T01:04:33.457889" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.458617" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:33.458381" elapsed="0.000277"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:33.459505" 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-10-11T01:04:33.459292" elapsed="0.000243"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:04:33.459925" 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-10-11T01:04:33.459726" elapsed="0.000225"/>
</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-10-11T01:04:33.460118" elapsed="0.000169"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.460735" 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-10-11T01:04:33.460507" elapsed="0.000287"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:04:33.460834" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:33.460962" 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-10-11T01:04:33.458862" 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-10-11T01:04:33.470952" level="INFO">PUT Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node011peadqcdwn7ieyx6aexk11xu23.node0', 'Content-Length': '293', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T01:04:33.471007" level="INFO">PUT Response : url=http://10.30.170.173: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.171.7 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:33.471103" 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-10-11T01:04:33.461276" elapsed="0.009851"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:33.461048" elapsed="0.010124"/>
</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-10-11T01:04:33.471366" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:33.471205" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.461032" elapsed="0.010444"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.472664" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:33.472370" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:33.472129" elapsed="0.000607"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.472111" elapsed="0.000660"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.473342" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:33.473062" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:33.472822" elapsed="0.000617"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.472808" elapsed="0.000657"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.474027" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:33.473649" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.474334" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:33.474123" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.474861" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:33.474588" elapsed="0.000298"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:33.474422" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.474107" elapsed="0.000830"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.475483" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:33.475122" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.475808" elapsed="0.000095"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:33.475574" elapsed="0.000370"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.476423" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:33.476140" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:33.475968" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.475556" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:33.476657" elapsed="0.000307"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:33.477354" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:33.477126" elapsed="0.000252"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:33.477548" elapsed="0.000225"/>
</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-10-11T01:04:33.471836" elapsed="0.005994"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:04:33.477979" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:04:33.477890" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.477873" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.478198" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:04:33.478258" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:04:33.478428" 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-10-11T01:04:33.456042" elapsed="0.022412"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:33.478510" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:04:33.478631" 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-10-11T01:04:33.383216" elapsed="0.095437"/>
</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-10-11T01:04:33.478954" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:33.478739" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.478723" elapsed="0.000313"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:33.479066" elapsed="0.000023"/>
</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-10-11T01:04:33.382607" elapsed="0.096552"/>
</kw>
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="PASS" start="2026-10-11T01:04:33.284380" elapsed="0.194888"/>
</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-10-11T01:04:33.481306" elapsed="0.000325"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:04:33.480800" elapsed="0.000896"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:33.482661" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:33.482573" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.482554" elapsed="0.000170"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:33.484793" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:33.484696" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.484679" elapsed="0.000178"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.485779" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:33.485440" elapsed="0.000366"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.486224" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:04:33.485959" elapsed="0.000289"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:04:33.486326" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:04:33.486474" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:04:33.485065" elapsed="0.001433"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:33.489038" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:33.488955" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.488937" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:33.490169" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:33.490086" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.490069" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:33.490587" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:04:33.490378" elapsed="0.000235"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:33.490939" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:33.490793" elapsed="0.000170"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:04:33.524273" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:04:33.491482" elapsed="0.032892"/>
</kw>
<msg time="2026-10-11T01:04:33.524581" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:04:33.524627" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:33.491123" elapsed="0.033546"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:04:33.558858" 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-10-11T01:04:33.525225" elapsed="0.033741"/>
</kw>
<msg time="2026-10-11T01:04:33.559115" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:04:33.559156" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:33.524859" elapsed="0.034333"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.559506" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:33.559261" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.559243" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.560021" 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-10-11T01:04:33.559790" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.560518" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:33.560150" elapsed="0.000421"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.560129" elapsed="0.000465"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:04:33.560626" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:33.563221" elapsed="0.000119"/>
</kw>
<msg time="2026-10-11T01:04:33.563399" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:33.562084" elapsed="0.001480"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.563895" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.564235" 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-10-11T01:04:33.561465" 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-10-11T01:04:33.560956" 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-10-11T01:04:33.489830" elapsed="0.074845"/>
</kw>
<msg time="2026-10-11T01:04:33.564783" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:33.564827" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:33.489251" elapsed="0.075612"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:04:33.565021" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:04:33.564933" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.564915" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.565500" 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-10-11T01:04:33.565833" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:04:33.565899" 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-10-11T01:04:33.488654" elapsed="0.077332"/>
</kw>
<msg time="2026-10-11T01:04:33.566072" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:33.566115" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:33.486841" elapsed="0.079309"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:33.566533" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:33.566218" elapsed="0.000370"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:33.566202" elapsed="0.000408"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:04:33.486686" elapsed="0.079947"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:04:33.486546" elapsed="0.080114"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:04:33.484372" elapsed="0.082338"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:04:33.482276" elapsed="0.084508"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:33.481871" elapsed="0.084956"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:04:33.480384" elapsed="0.086491"/>
</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-10-11T01:04:33.568485" level="INFO">${command} = python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:33.568187" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:33.568946" level="INFO">python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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-10-11T01:04:33.568711" elapsed="0.000278"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:04:33.572694" level="INFO">python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --peerport=1790 --debug --l3vpn_mcast --wfr 1 &amp;&gt; play.py.out</msg>
<msg time="2026-10-11T01:04:33.572801" level="INFO">${output} =  python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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-10-11T01:04:33.569146" elapsed="0.003683"/>
</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-10-11T01:04:33.567819" elapsed="0.005068"/>
</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-10-11T01:04:39.574765" 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-10-11T01:04:33.574478" elapsed="6.000971">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-10-11T01:04:39.575805" elapsed="0.000033"/>
</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-10-11T01:04:33.574185" elapsed="6.001762">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-10-11T01:04:33.573817" elapsed="6.002337"/>
</kw>
<msg time="2026-10-11T01:04:39.576261" 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-10-11T01:04:33.573423" elapsed="6.002863"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-10-11T01:04:39.576462" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-10-11T01:04:39.576375" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:39.576349" elapsed="0.000197"/>
</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-10-11T01:04:39.576783" elapsed="0.000026"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:39.576964" 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-10-11T01:04:33.573131" elapsed="6.003909"/>
</kw>
<doc>Starts bgp peer and verifies that the peer runs.</doc>
<status status="PASS" start="2026-10-11T01:04:33.567488" elapsed="6.009599"/>
</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-10-11T01:04:33.567064" elapsed="6.010065"/>
</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-10-11T01:04:33.479620" elapsed="6.097619"/>
</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-10-11T01:04:39.579083" elapsed="0.000240"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:04:39.578826" 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-10-11T01:04:39.580372" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:39.580274" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:39.580256" 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-10-11T01:04:39.582518" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:39.582433" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:39.582416" elapsed="0.000165"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:39.583542" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:39.583192" elapsed="0.000375"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:04:39.584008" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:04:39.583723" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:04:39.584072" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:39.584200" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:04:39.582807" elapsed="0.001416"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:39.586766" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:39.586664" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:39.586647" elapsed="0.000183"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:39.587917" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:39.587834" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:39.587816" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:39.588357" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:04:39.588128" elapsed="0.000254"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:39.588706" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:39.588566" elapsed="0.000163"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:04:39.626062" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:04:39.589366" elapsed="0.036795"/>
</kw>
<msg time="2026-10-11T01:04:39.626314" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:04:39.626356" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:39.588906" elapsed="0.037538"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:04:39.667775" 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-10-11T01:04:39.626982" elapsed="0.040897"/>
</kw>
<msg time="2026-10-11T01:04:39.668027" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:04:39.668068" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:39.626619" elapsed="0.041484"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:39.668382" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:39.668172" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:39.668154" elapsed="0.000325"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:39.668914" 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-10-11T01:04:39.668663" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:39.669244" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:39.669042" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:39.669026" elapsed="0.000289"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:04:39.669345" 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-10-11T01:04:39.671829" elapsed="0.000116"/>
</kw>
<msg time="2026-10-11T01:04:39.672002" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:39.670753" elapsed="0.001379"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:39.672455" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:39.672813" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:04:39.670136" 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-10-11T01:04:39.669658" 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-10-11T01:04:39.587558" elapsed="0.085569"/>
</kw>
<msg time="2026-10-11T01:04:39.673210" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:39.673250" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:39.586982" elapsed="0.086303"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:04:39.673464" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:04:39.673353" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:39.673335" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:39.673884" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:39.674180" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:04:39.674244" 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-10-11T01:04:39.586364" elapsed="0.087964"/>
</kw>
<msg time="2026-10-11T01:04:39.674434" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:39.674477" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:39.584577" elapsed="0.089935"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:39.674816" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:39.674579" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:39.674563" elapsed="0.000356"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:04:39.584431" elapsed="0.090510"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:04:39.584271" elapsed="0.090698"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:04:39.582126" elapsed="0.092892"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:04:39.580006" elapsed="0.095060"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:39.579549" elapsed="0.095556"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:04:39.578426" elapsed="0.096725"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:39.676024" 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-10-11T01:04:39.676200" 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-10-11T01:04:39.675873" elapsed="0.000353"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:04:39.676589" 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-10-11T01:04:39.676389" elapsed="0.000225"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:39.676932" 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-10-11T01:04:39.677052" 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-10-11T01:04:39.676796" elapsed="0.000280"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:04:39.677424" 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-10-11T01:04:39.677242" elapsed="0.000208"/>
</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-10-11T01:04:39.677700" elapsed="0.002941"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:39.677514" elapsed="0.003160"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:39.677497" elapsed="0.003209"/>
</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-10-11T01:04:39.691518" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:39.691198" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:39.692288" 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-10-11T01:04:39.692035" elapsed="0.000317">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-10-11T01:04:39.692455" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:39.691704" elapsed="0.000774"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:39.692977" 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-10-11T01:04:39.692653" elapsed="0.000349"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:39.693276" 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-10-11T01:04:39.693395" 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-10-11T01:04:39.693169" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:39.693896" 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-10-11T01:04:39.693662" elapsed="0.000277"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:39.694858" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:04:39.694613" elapsed="0.000287"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:39.695332" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:39.695078" elapsed="0.000278"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:39.695970" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:39.695686" elapsed="0.000308"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:39.696872" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:39.696489" elapsed="0.000408"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:39.696942" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:04:39.697069" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:39.696164" elapsed="0.000928"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:39.697263" elapsed="0.000201"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:04:39.695553" elapsed="0.001949"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:39.698017" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:39.697732" elapsed="0.000310"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:39.698917" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:39.698538" elapsed="0.000404"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:39.698987" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:04:39.699112" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:39.698212" elapsed="0.000923"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:39.699302" elapsed="0.000191"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:39.697600" elapsed="0.001931"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:39.695399" elapsed="0.004163"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:39.699600" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:39.699727" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:39.694254" elapsed="0.005514"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:39.694000" elapsed="0.005796"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:39.699970" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:39.699818" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:39.693983" elapsed="0.006056"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:39.700931" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:39.700207" elapsed="0.000751"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:39.701003" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:39.690680" elapsed="0.010424"/>
</kw>
<msg time="2026-10-11T01:04:39.701153" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:39.686318" elapsed="0.014879"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:39.705333" 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/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-10-11T01:04:39.709468" 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/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-10-11T01:04:39.713542" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:39.713724" elapsed="0.000048"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:39.713939" 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-10-11T01:04:39.714278" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:39.714131" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:39.714118" 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-10-11T01:04:39.714526" 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-10-11T01:04:39.714709" 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-10-11T01:04:39.714889" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:39.714093" elapsed="0.000843"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:39.714005" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:39.715112" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:39.715178" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:39.715287" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:39.685711" elapsed="0.029601"/>
</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-10-11T01:04:39.724225" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:39.723925" elapsed="0.000327"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:39.724925" 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-10-11T01:04:39.724753" elapsed="0.000231">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-10-11T01:04:39.725068" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:39.724425" elapsed="0.000666"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:39.725588" 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-10-11T01:04:39.725265" elapsed="0.000348"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:39.725955" 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-10-11T01:04:39.726076" 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-10-11T01:04:39.725812" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:39.726538" 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-10-11T01:04:39.726300" 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-10-11T01:04:39.726919" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:39.726655" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:39.727420" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', '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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:39.727142" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:39.726995" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:39.726638" elapsed="0.000860"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:39.728060" 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-10-11T01:04:39.727660" elapsed="0.000428"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:39.728132" 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/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-10-11T01:04:39.723399" elapsed="0.004833"/>
</kw>
<msg time="2026-10-11T01:04:39.728284" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:39.719082" elapsed="0.009245"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:39.732602" 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/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-10-11T01:04:39.736713" 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/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-10-11T01:04:39.740842" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:39.741057" 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-10-11T01:04:39.741242" 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-10-11T01:04:39.741599" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:39.741451" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:39.741437" 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-10-11T01:04:39.741844" 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-10-11T01:04:39.742026" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:39.742192" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:39.741394" elapsed="0.000846"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:39.741306" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:39.742430" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:39.742498" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:39.742618" 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-10-11T01:04:39.718370" elapsed="0.024275"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:39.743800" 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-10-11T01:04:39.743583" elapsed="0.000284">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-10-11T01:04:39.743952" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:39.743241" elapsed="0.000734"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:39.744261" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:39.744038" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:39.744797" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:39.744517" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:39.744334" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:39.744020" elapsed="0.000854"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:39.745373" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:39.745038" elapsed="0.000359"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:39.745458" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:39.745584" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:39.742937" elapsed="0.002670"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:39.746934" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:39.746701" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:39.747382" 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-10-11T01:04:39.747168" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:39.747918" 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-10-11T01:04:39.747684" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:39.748364" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:39.748149" elapsed="0.000268"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:39.749138" 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-10-11T01:04:39.748975" elapsed="0.000187"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:04:39.749478" 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-10-11T01:04:39.749318" elapsed="0.000185"/>
</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-10-11T01:04:39.749666" elapsed="0.000184"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:39.750270" 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-10-11T01:04:39.750048" elapsed="0.000262"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:04:39.750349" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:39.750494" 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-10-11T01:04:39.748603" elapsed="0.001914"/>
</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-10-11T01:04:39.761704" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node011peadqcdwn7ieyx6aexk11xu23.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-10-11T01:04:39.761784" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:39.761867" 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-10-11T01:04:39.750825" elapsed="0.011066"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:39.750580" elapsed="0.011353"/>
</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-10-11T01:04:39.762110" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:39.761957" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:39.750564" elapsed="0.011629"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:39.763450" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:39.763154" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:39.762914" elapsed="0.000610"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:39.762897" elapsed="0.000650"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:39.764116" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:39.763848" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:39.763596" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:39.763581" elapsed="0.000630"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:39.764771" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:39.764389" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:39.765072" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:39.764860" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:39.765626" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:39.765343" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:39.765177" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:39.764843" elapsed="0.000859"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:39.766247" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:39.765894" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:39.766579" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:39.766353" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:39.767089" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:39.766828" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:39.766653" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:39.766335" elapsed="0.000831"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:39.767309" elapsed="0.000309"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:39.768016" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:39.767792" elapsed="0.000248"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:39.768195" elapsed="0.000210"/>
</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-10-11T01:04:39.762540" elapsed="0.005939"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:04:39.768626" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:04:39.768544" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:39.768527" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:39.768865" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:04:39.768924" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:39.769082" 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-10-11T01:04:39.745913" elapsed="0.023193"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:39.769166" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:39.769287" 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-10-11T01:04:39.681654" elapsed="0.087656"/>
</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-10-11T01:04:39.769617" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:39.769400" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:39.769384" elapsed="0.000315"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:39.769728" elapsed="0.000036"/>
</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-10-11T01:04:39.680944" elapsed="0.088893"/>
</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-10-11T01:04:39.773089" level="INFO">${update} = </msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:04:39.770730" elapsed="0.002386"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:04:39.773672" level="FAIL"> == </msg>
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="FAIL" start="2026-10-11T01:04:39.773305" elapsed="0.000424"> == </status>
</kw>
<return>
<value>${update}</value>
<status status="NOT RUN" start="2026-10-11T01:04:39.773828" elapsed="0.000018"/>
</return>
<doc>Returns hex update message.</doc>
<status status="FAIL" start="2026-10-11T01:04:39.770469" elapsed="0.003458"> == </status>
</kw>
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:04:41.779353" level="INFO">${update} = ffffffffffffffffffffffffffffffff004d02000000364001010040020040050400000064800e1a000181047f10002c00200001ac10002c0065180a022200000000c01008010b0a0000013130</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:04:41.775305" elapsed="0.004158"/>
</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-10-11T01:04:41.779904" elapsed="0.000745"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:04:41.780769" elapsed="0.000072"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:04:41.774608" elapsed="0.006401"/>
</kw>
<msg time="2026-10-11T01:04:41.781163" 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-10-11T01:04:39.770020" elapsed="2.011196"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:04:41.783586" level="INFO">Length is 154.</msg>
<msg time="2026-10-11T01:04:41.783766" 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-10-11T01:04:41.782988" elapsed="0.000830"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:04:41.784753" level="INFO">Length is 154.</msg>
<msg time="2026-10-11T01:04:41.784909" 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-10-11T01:04:41.784177" elapsed="0.000781"/>
</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-10-11T01:04:41.785378" elapsed="0.000648"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:04:41.786758" 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-10-11T01:04:41.786361" elapsed="0.000451"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:04:41.787496" 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-10-11T01:04:41.787133" elapsed="0.000416"/>
</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-10-11T01:04:41.787971" elapsed="0.000617"/>
</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-10-11T01:04:41.781703" elapsed="0.007009"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:04:41.789043" elapsed="0.002787"/>
</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-10-11T01:04:41.823239" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:41.822539" elapsed="0.000759"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:41.824711" 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-10-11T01:04:41.824438" elapsed="0.000382">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-10-11T01:04:41.824940" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:41.823682" elapsed="0.001290"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:41.825676" 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-10-11T01:04:41.825216" elapsed="0.000497"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:41.826130" 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-10-11T01:04:41.826308" 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-10-11T01:04:41.825975" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:41.826960" 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-10-11T01:04:41.826634" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:41.828551" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:04:41.828193" elapsed="0.000418"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:41.829434" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:41.828881" elapsed="0.000589"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:41.830565" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:41.829944" elapsed="0.000655"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:41.832096" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:41.831455" elapsed="0.000750"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:41.832390" elapsed="0.000072"/>
</return>
<msg time="2026-10-11T01:04:41.832657" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:41.830863" elapsed="0.001828"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:41.832940" elapsed="0.000424"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:04:41.829755" elapsed="0.003695"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:41.834358" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:41.833795" elapsed="0.000597"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:41.835952" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:41.835243" elapsed="0.000814"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:41.836234" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T01:04:41.836510" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:41.834665" elapsed="0.001878"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:41.836788" elapsed="0.000414"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:41.833595" elapsed="0.003660"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:41.829536" elapsed="0.007764"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:41.837352" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T01:04:41.837564" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:41.827491" elapsed="0.010107"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:41.827109" elapsed="0.010530"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:41.837892" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:41.837670" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:41.827083" elapsed="0.010907"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:41.838975" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:41.838210" elapsed="0.000802"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:41.839072" 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/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-10-11T01:04:41.821335" elapsed="0.017875"/>
</kw>
<msg time="2026-10-11T01:04:41.839277" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:41.811593" elapsed="0.027747"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:41.845311" 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_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-10-11T01:04:41.851081" 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/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-10-11T01:04:41.855154" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:41.855334" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:41.855528" 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-10-11T01:04:41.855880" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:41.855720" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:41.855706" 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-10-11T01:04:41.856107" 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-10-11T01:04:41.856290" 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-10-11T01:04:41.856469" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:41.855681" elapsed="0.000837"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:41.855596" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:41.856692" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:41.856769" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:04:41.856878" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:41.810143" elapsed="0.046760"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:41.857915" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:41.857678" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:41.864920" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node011peadqcdwn7ieyx6aexk11xu23.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:41.864965" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:41.865046" 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-10-11T01:04:41.858246" elapsed="0.006824"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:41.858018" elapsed="0.007088"/>
</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-10-11T01:04:41.865280" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:41.865131" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:41.858001" elapsed="0.007384"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:41.867955" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:41.867664" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:41.867418" elapsed="0.000610"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:41.867386" elapsed="0.000665"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:41.868633" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:41.868341" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:41.868102" elapsed="0.000605"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:41.868087" elapsed="0.000656"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:41.869281" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:41.868930" elapsed="0.000377"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:41.869600" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:41.869371" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:41.870116" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:41.869850" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:41.869676" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:41.869354" elapsed="0.000840"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:41.870722" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:41.870369" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:41.871036" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:41.870824" elapsed="0.000263"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:41.871555" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:41.871272" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:41.871110" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:41.870807" elapsed="0.000825"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:41.871789" elapsed="0.000295"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:41.872488" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:41.872249" elapsed="0.000264"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:41.872668" elapsed="0.000227"/>
</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-10-11T01:04:41.867064" elapsed="0.005887"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:04:41.872993" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:41.873167" 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-10-11T01:04:41.857137" elapsed="0.016055"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:41.873239" elapsed="0.000025"/>
</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-10-11T01:04:41.793997" elapsed="0.079337"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:41.793057" elapsed="0.080324"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:04:41.792236" elapsed="0.081215"/>
</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-10-11T01:04:41.876600" level="INFO">${update} = ffffffffffffffffffffffffffffffff004702000000304001010040020040050400000064800f14000181200001ac10002c0065180a022200000000c01008010b0a0000013130</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:04:41.874336" elapsed="0.002292"/>
</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-10-11T01:04:41.876801" elapsed="0.000325"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:04:41.877170" elapsed="0.000031"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:04:41.874077" elapsed="0.003242"/>
</kw>
<msg time="2026-10-11T01:04:41.877463" 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-10-11T01:04:41.873629" elapsed="0.003919"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:04:41.878668" level="INFO">Length is 142.</msg>
<msg time="2026-10-11T01:04:41.878782" 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-10-11T01:04:41.878303" elapsed="0.000512"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:04:41.879361" level="INFO">Length is 142.</msg>
<msg time="2026-10-11T01:04:41.879489" 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-10-11T01:04:41.879034" 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-10-11T01:04:41.879790" elapsed="0.000372"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:04:41.880602" 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-10-11T01:04:41.880368" elapsed="0.000267"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:04:41.881070" 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-10-11T01:04:41.880863" elapsed="0.000240"/>
</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-10-11T01:04:41.881351" elapsed="0.000406"/>
</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-10-11T01:04:41.877836" elapsed="0.003999"/>
</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-10-11T01:04:41.898610" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:41.898290" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:41.899322" 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-10-11T01:04:41.899128" elapsed="0.000255">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-10-11T01:04:41.899483" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:41.898807" elapsed="0.000699"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:41.900003" 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-10-11T01:04:41.899680" elapsed="0.000348"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:41.900307" 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-10-11T01:04:41.900442" 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-10-11T01:04:41.900198" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:41.900892" 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-10-11T01:04:41.900662" elapsed="0.000272"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:41.901869" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:04:41.901625" elapsed="0.000286"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:41.902338" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:41.902088" elapsed="0.000274"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:41.903168" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:41.902696" elapsed="0.000496"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:41.904247" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:41.903808" elapsed="0.000479"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:41.904398" elapsed="0.000047"/>
</return>
<msg time="2026-10-11T01:04:41.904596" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:41.903364" elapsed="0.001298"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:41.904844" elapsed="0.000280"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:04:41.902563" elapsed="0.002599"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:41.905883" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:41.905392" elapsed="0.000515"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:41.906959" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:41.906513" elapsed="0.000485"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:41.907108" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:04:41.907285" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:41.906079" elapsed="0.001230"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:41.907498" elapsed="0.000283"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:41.905260" elapsed="0.002560"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:41.902421" elapsed="0.005430"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:41.907889" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:41.908017" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:41.901245" elapsed="0.006795"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:41.900996" elapsed="0.007072"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:41.908242" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:41.908091" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:41.900978" elapsed="0.007332"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:41.909199" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:41.908533" elapsed="0.000694"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:41.909271" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:41.897756" elapsed="0.011614"/>
</kw>
<msg time="2026-10-11T01:04:41.909488" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:41.893360" elapsed="0.016187"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:41.913740" 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/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-10-11T01:04:41.917851" 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/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-10-11T01:04:41.921955" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:41.922173" 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-10-11T01:04:41.922358" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:41.922715" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:41.922566" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:41.922553" 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-10-11T01:04:41.922957" 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-10-11T01:04:41.923138" 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-10-11T01:04:41.923305" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:41.922526" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:41.922437" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:41.923546" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:41.923614" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:41.923722" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:41.892709" elapsed="0.031050"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:41.924787" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:41.924552" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:41.930021" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node011peadqcdwn7ieyx6aexk11xu23.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:41.930319" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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+xml', 'Content-Length': '602'} 
 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-path xmlns:a="urn:opendaylight:params:xml:ns:yang:bgp-rib" xmlns:b="urn:opendaylight:params:xml:ns:yang:bgp-types" xmlns:c="urn:opendaylight:params:xml:ns:yang:bgp:l3vpn:mcast"&gt;/a:application-rib[a:id='10.30.170.173']/a:tables[a:afi='b:ipv4-address-family'][a:safi='c:mcast-mpls-labeled-vpn-subsequent-address-family']/c:l3vpn-mcast-routes-ipv4&lt;/error-path&gt;&lt;error-message&gt;Data does not exist&lt;/error-message&gt;&lt;error-tag&gt;data-missing&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-10-11T01:04:41.930472" level="INFO">${response} = None</msg>
<msg time="2026-10-11T01:04:41.930512" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:41.925115" elapsed="0.005763">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:41.924890" elapsed="0.006062">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:41.931137" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:41.930984" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-10-11T01:04:41.924874" elapsed="0.006340">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:41.932501" 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-10-11T01:04:41.932206" elapsed="0.000326">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:04:41.931963" elapsed="0.000626">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:04:41.931946" elapsed="0.000672">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-10-11T01:04:41.933196" 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-10-11T01:04:41.932932" elapsed="0.000294">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:04:41.932680" elapsed="0.000601">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:04:41.932665" elapsed="0.000643">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:41.934036" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:41.933528" elapsed="0.000534"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:41.934343" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:41.934127" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:41.934883" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:41.934602" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:41.934435" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:41.934110" elapsed="0.000851"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:41.935499" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:41.935142" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:41.935815" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:41.935589" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:41.936316" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:41.936055" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:41.935890" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:41.935571" elapsed="0.000821"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:41.936554" elapsed="0.000320"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:41.937255" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:41.937036" elapsed="0.000244"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-10-11T01:04:41.937612" 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-10-11T01:04:41.937448" elapsed="0.000193">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-10-11T01:04:41.931593" elapsed="0.006182">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-10-11T01:04:41.937829" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:41.938079" level="INFO">${response_text} = None</msg>
<msg time="2026-10-11T01:04:41.938106" 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-10-11T01:04:41.923990" elapsed="0.014142">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-10-11T01:04:41.938220" elapsed="0.000025"/>
</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-10-11T01:04:41.883167" elapsed="0.055194">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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:41.882616" elapsed="0.055816"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:04:41.882109" elapsed="0.056377"/>
</kw>
<arg>l3vpn_mcast</arg>
<arg>${L3VPN_MCAST_DIR}</arg>
<status status="PASS" start="2026-10-11T01:04:39.675400" elapsed="2.263130"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:39.577629" elapsed="2.361002"/>
</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-10-11T01:04:41.939975" elapsed="0.000199"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:04:41.939714" elapsed="0.000509"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:41.941132" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:41.941044" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:41.941027" elapsed="0.000167"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:41.943310" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:41.943221" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:41.943205" elapsed="0.000168"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:41.944285" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:41.943966" elapsed="0.000345"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:04:41.944756" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:04:41.944483" elapsed="0.000298"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:04:41.944821" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:41.944947" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:04:41.943596" elapsed="0.001374"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:41.947491" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:41.947372" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:41.947354" 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-10-11T01:04:41.948610" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:41.948526" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:41.948508" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:41.949002" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:04:41.948833" elapsed="0.000194"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:41.949329" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:41.949192" elapsed="0.000160"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:04:41.982795" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:04:41.949870" elapsed="0.033018"/>
</kw>
<msg time="2026-10-11T01:04:41.983037" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:04:41.983078" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:41.949529" elapsed="0.033602"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:04:42.021358" 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-10-11T01:04:41.983666" elapsed="0.037814"/>
</kw>
<msg time="2026-10-11T01:04:42.021628" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:04:42.021669" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:41.983300" elapsed="0.038404"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:42.022034" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:42.021822" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:42.021803" elapsed="0.000303"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:42.022538" 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-10-11T01:04:42.022287" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:42.022881" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:42.022667" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:42.022650" elapsed="0.000303"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:04:42.022983" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:42.025531" elapsed="0.000115"/>
</kw>
<msg time="2026-10-11T01:04:42.025705" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:42.024340" elapsed="0.001509"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:42.026152" elapsed="0.000071"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:42.026502" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:04:42.023762" 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-10-11T01:04:42.023262" elapsed="0.003494"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:04:41.948245" elapsed="0.078586"/>
</kw>
<msg time="2026-10-11T01:04:42.026913" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:42.026953" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:41.947704" elapsed="0.079283"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:04:42.027140" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:04:42.027056" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:42.027038" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:42.027562" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:42.027876" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:04:42.027940" 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-10-11T01:04:41.947088" elapsed="0.080937"/>
</kw>
<msg time="2026-10-11T01:04:42.028106" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:42.028146" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:41.945295" elapsed="0.082885"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:42.028545" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:42.028246" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:42.028230" elapsed="0.000387"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:04:41.945151" elapsed="0.083487"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:04:41.945015" elapsed="0.083649"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:04:41.942929" elapsed="0.085783"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:04:41.940793" elapsed="0.087981"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:41.940372" elapsed="0.088441"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:04:41.939355" elapsed="0.089539"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:42.029951" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:42.029538" elapsed="0.000440"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:42.030563" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:42.030160" elapsed="0.000429"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:42.031116" 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-10-11T01:04:42.030781" elapsed="0.000360"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:42.031460" 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-10-11T01:04:42.031584" 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-10-11T01:04:42.031307" elapsed="0.000301"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:42.031920" 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-10-11T01:04:42.032031" 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-10-11T01:04:42.031783" elapsed="0.000273"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:04:42.032197" elapsed="0.002251"/>
</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-10-11T01:04:42.034597" elapsed="0.002311"/>
</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-10-11T01:04:42.052524" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:42.052202" elapsed="0.000348"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:42.053222" 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-10-11T01:04:42.053036" elapsed="0.000248">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-10-11T01:04:42.053368" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:42.052707" elapsed="0.000683"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:42.053902" 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-10-11T01:04:42.053582" elapsed="0.000345"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:42.054200" 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-10-11T01:04:42.054319" 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-10-11T01:04:42.054093" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:42.054783" 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-10-11T01:04:42.054553" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:42.055737" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:42.055495" elapsed="0.000285"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:42.056237" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:42.055988" elapsed="0.000274"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:42.057033" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:42.056589" elapsed="0.000469"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:42.058188" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:42.057676" elapsed="0.000604"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:42.058359" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:04:42.058588" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:42.057229" 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-10-11T01:04:42.058790" elapsed="0.000301"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:04:42.056458" elapsed="0.002671"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:42.059823" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:42.059358" elapsed="0.000489"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:42.060972" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:42.060467" elapsed="0.000591"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:42.061137" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:04:42.061355" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:42.060015" elapsed="0.001364"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:42.061566" elapsed="0.000310"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:42.059228" elapsed="0.002686"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:42.056305" elapsed="0.005640"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:42.061983" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:04:42.062109" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:42.055136" elapsed="0.006997"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:42.054887" elapsed="0.007275"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:42.062333" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:42.062184" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:42.054869" elapsed="0.007533"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:42.063346" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3v...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:42.062679" elapsed="0.000693"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:42.063433" 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/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-10-11T01:04:42.051687" elapsed="0.011848"/>
</kw>
<msg time="2026-10-11T01:04:42.063584" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:42.047390" elapsed="0.016238"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:42.067712" 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/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-10-11T01:04:42.071787" 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/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-10-11T01:04:42.075918" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:42.076100" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:42.076280" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:42.076634" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:42.076488" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:42.076474" 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-10-11T01:04:42.076873" 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-10-11T01:04:42.077054" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:42.077216" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:42.076448" elapsed="0.000819"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:42.076344" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:42.077456" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:42.077523" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:42.077632" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3v...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:04:42.046799" elapsed="0.030858"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:42.078779" 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-10-11T01:04:42.078574" elapsed="0.000266">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-10-11T01:04:42.078922" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:42.078234" elapsed="0.000710"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:42.079226" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:42.079007" elapsed="0.000269"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:42.079757" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:42.079480" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:42.079299" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:42.078990" elapsed="0.000843"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:42.080328" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:42.079993" elapsed="0.000360"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:42.080396" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T01:04:42.080568" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:42.077935" elapsed="0.002656"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:42.081703" 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-10-11T01:04:42.081510" elapsed="0.000264">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-10-11T01:04:42.081857" 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-10-11T01:04:42.081168" elapsed="0.000712"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:04:42.082039" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:04:42.081942" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:42.081925" elapsed="0.000190"/>
</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-10-11T01:04:42.082269" elapsed="0.000020"/>
</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-10-11T01:04:42.082460" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:04:42.082520" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:04:42.082642" 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-10-11T01:04:42.080861" elapsed="0.001804"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:42.083893" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:42.083658" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:42.084525" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:42.084127" elapsed="0.000439"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:42.089742" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node011peadqcdwn7ieyx6aexk11xu23.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:42.089863" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:42.089951" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:42.084870" elapsed="0.005406">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:42.084628" elapsed="0.005722">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:42.090558" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:42.090380" elapsed="0.000237"/>
</branch>
<status status="FAIL" start="2026-10-11T01:04:42.084611" elapsed="0.006027">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:42.090987" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:42.091137" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:42.091104" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:42.091087" elapsed="0.000107"/>
</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-10-11T01:04:42.091336" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:04:42.091398" elapsed="0.000029"/>
</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-10-11T01:04:42.082952" elapsed="0.008557">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:42.091575" elapsed="0.000014"/>
</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-10-11T01:04:42.039447" elapsed="0.052211">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:42.091914" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:42.091751" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:42.091723" elapsed="0.000277"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:42.092030" elapsed="0.000013"/>
</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-10-11T01:04:42.038813" elapsed="0.053303">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:44.128089" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:44.127322" elapsed="0.000838"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:44.129854" 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-10-11T01:04:44.129319" elapsed="0.000694">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-10-11T01:04:44.130202" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:44.128570" elapsed="0.001682"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.131394" 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-10-11T01:04:44.130675" elapsed="0.000806"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:44.132154" 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-10-11T01:04:44.132576" 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-10-11T01:04:44.131896" elapsed="0.000736"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.133618" 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-10-11T01:04:44.133092" elapsed="0.000620"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.135993" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:44.135445" elapsed="0.000642"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.137103" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:44.136509" elapsed="0.000647"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.139037" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:44.137949" elapsed="0.001143"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:44.141787" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:44.140547" elapsed="0.001441"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:44.142176" elapsed="0.000078"/>
</return>
<msg time="2026-10-11T01:04:44.142702" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:44.139517" elapsed="0.003260"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:44.143156" elapsed="0.000781"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:04:44.137623" elapsed="0.006401"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.145679" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:44.144597" elapsed="0.001167"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:44.147734" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:44.146974" elapsed="0.000886"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:44.147972" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T01:04:44.148267" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:44.146190" elapsed="0.002111"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:44.148564" elapsed="0.000447"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:44.144246" elapsed="0.004818"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:44.137262" elapsed="0.011846"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:44.149163" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T01:04:44.149341" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:44.134619" elapsed="0.014756"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.133892" elapsed="0.015551"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.149690" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.149478" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.133840" elapsed="0.015962"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.150909" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3v...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:44.150030" elapsed="0.000929"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:44.151042" 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/rib.vanadium/${file_name} 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-10-11T01:04:44.126090" elapsed="0.025122"/>
</kw>
<msg time="2026-10-11T01:04:44.151291" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:44.115527" elapsed="0.035843"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:44.157736" 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_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-10-11T01:04:44.163525" 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/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-10-11T01:04:44.169236" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.169514" 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-10-11T01:04:44.169792" 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-10-11T01:04:44.170268" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.170062" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:44.170043" elapsed="0.000331"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.170620" 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-10-11T01:04:44.171003" 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-10-11T01:04:44.171358" elapsed="0.000044"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:44.170008" elapsed="0.001487"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:44.169887" elapsed="0.001653"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.171765" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:44.171855" elapsed="0.000022"/>
</return>
<msg time="2026-10-11T01:04:44.171976" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3v...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:04:44.114094" elapsed="0.057907"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:44.173161" 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-10-11T01:04:44.172975" elapsed="0.000247">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-10-11T01:04:44.173321" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:44.172626" elapsed="0.000726"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.173782" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.173458" elapsed="0.000400"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.174449" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:44.174122" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.173890" elapsed="0.000620"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.173434" elapsed="0.001101"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.175076" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:44.174708" elapsed="0.000392"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:44.175176" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:44.175303" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:44.172298" elapsed="0.003029"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:44.176440" 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-10-11T01:04:44.176239" elapsed="0.000260">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-10-11T01:04:44.176584" 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-10-11T01:04:44.175916" elapsed="0.000691"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:04:44.176786" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:04:44.176671" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.176653" elapsed="0.000211"/>
</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-10-11T01:04:44.177020" elapsed="0.000020"/>
</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-10-11T01:04:44.177197" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:04:44.177255" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:44.177382" 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-10-11T01:04:44.175597" elapsed="0.001823"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.178659" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:44.178433" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.179129" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:44.178911" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:44.186969" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node011peadqcdwn7ieyx6aexk11xu23.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:44.187153" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:44.187246" 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-10-11T01:04:44.179475" elapsed="0.007798"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.179229" elapsed="0.008101"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.187646" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.187372" elapsed="0.000373"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.179212" elapsed="0.008561"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.189560" 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-10-11T01:04:44.189072" elapsed="0.000553"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.188733" elapsed="0.000937"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.188695" elapsed="0.001006"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.190523" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:44.190126" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.189789" elapsed="0.000879"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.189767" elapsed="0.000931"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.191481" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:44.190963" elapsed="0.000555"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.191921" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.191606" elapsed="0.000389"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.192646" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:44.192253" elapsed="0.000429"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.192025" elapsed="0.000718"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.191583" elapsed="0.001194"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.193514" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:44.193023" elapsed="0.000526"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.193948" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.193636" elapsed="0.000385"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.194663" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:44.194276" elapsed="0.000422"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.194051" elapsed="0.000710"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.193613" elapsed="0.001178"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:44.194992" elapsed="0.000404"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:44.196018" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:44.195666" elapsed="0.000386"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:44.196268" elapsed="0.000321"/>
</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-10-11T01:04:44.188228" elapsed="0.008439"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:44.196891" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:44.196775" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.196748" elapsed="0.000226"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:44.198119" 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-10-11T01:04:44.197170" elapsed="0.000988"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:44.198222" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T01:04:44.198399" 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-10-11T01:04:44.177708" elapsed="0.020747"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:44.198533" elapsed="0.000034"/>
</return>
<msg time="2026-10-11T01:04:44.198702" 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-10-11T01:04:44.097634" elapsed="0.101117"/>
</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-10-11T01:04:44.213941" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:44.213624" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:44.214763" 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-10-11T01:04:44.214525" elapsed="0.000360">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-10-11T01:04:44.215046" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:44.214185" elapsed="0.000885"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.215584" 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-10-11T01:04:44.215245" elapsed="0.000364"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:44.215900" 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-10-11T01:04:44.216029" 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-10-11T01:04:44.215791" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.216488" 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-10-11T01:04:44.216252" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:44.216918" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.216599" elapsed="0.000373"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.217617" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:44.217142" elapsed="0.000499"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.216995" elapsed="0.000679"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.216581" elapsed="0.001113"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.218261" 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-10-11T01:04:44.217871" elapsed="0.000417"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:44.218333" 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/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-10-11T01:04:44.213103" elapsed="0.005360"/>
</kw>
<msg time="2026-10-11T01:04:44.218528" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:44.208687" elapsed="0.009886"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:44.222744" 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/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-10-11T01:04:44.226943" 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/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-10-11T01:04:44.231448" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.231636" 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-10-11T01:04:44.231841" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.232246" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.232070" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:44.232056" 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-10-11T01:04:44.232498" 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-10-11T01:04:44.232677" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.232857" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:44.232026" elapsed="0.000879"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:44.231917" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.233079" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:44.233145" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:44.233274" 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-10-11T01:04:44.207462" elapsed="0.025837"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:44.233484" elapsed="0.000371"/>
</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-10-11T01:04:44.235040" 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-10-11T01:04:44.234554" elapsed="0.000514"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:44.235658" 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-10-11T01:04:44.235221" 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-10-11T01:04:44.235909" elapsed="0.000285"/>
</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-10-11T01:04:44.234137" elapsed="0.002118"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.233926" 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-10-11T01:04:44.236508" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.236314" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.233909" elapsed="0.002714"/>
</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-10-11T01:04:44.200098" elapsed="0.036571"/>
</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-10-11T01:04:44.199141" elapsed="0.037605"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.198853" elapsed="0.037934"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.198832" elapsed="0.037981"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:44.236848" 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="PASS" start="2026-10-11T01:04:44.095945" elapsed="0.141010"/>
</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-10-11T01:04:42.037095" elapsed="2.199916"/>
</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-10-11T01:04:44.253374" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:44.253032" elapsed="0.000393"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:44.254099" 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-10-11T01:04:44.253927" elapsed="0.000232">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-10-11T01:04:44.254242" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:44.253591" elapsed="0.000673"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.254802" 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-10-11T01:04:44.254453" elapsed="0.000375"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:44.255104" 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-10-11T01:04:44.255228" 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-10-11T01:04:44.254995" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.255681" 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-10-11T01:04:44.255461" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.256680" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:44.256424" elapsed="0.000309"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.257198" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:44.256913" elapsed="0.000308"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.258012" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:44.257561" elapsed="0.000475"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:44.259344" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:44.258819" elapsed="0.000640"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:44.259542" elapsed="0.000032"/>
</return>
<msg time="2026-10-11T01:04:44.259774" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:44.258224" 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-10-11T01:04:44.260011" elapsed="0.000312"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/effective-rib-in</var>
<status status="PASS" start="2026-10-11T01:04:44.257419" elapsed="0.002944"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.261115" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:44.260655" elapsed="0.000485"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:44.262315" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:44.261809" elapsed="0.000595"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:44.262518" elapsed="0.000032"/>
</return>
<msg time="2026-10-11T01:04:44.262766" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:44.261311" elapsed="0.001489"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:44.263016" elapsed="0.000308"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:44.260494" elapsed="0.002870"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:44.257265" elapsed="0.006131"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:44.263510" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:44.263643" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:44.256048" elapsed="0.007619"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.255796" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.263906" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.263729" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.255778" elapsed="0.008202"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.264740" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/b...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:44.264141" elapsed="0.000627"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:44.264812" 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/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-10-11T01:04:44.252513" elapsed="0.012401"/>
</kw>
<msg time="2026-10-11T01:04:44.264963" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:44.247866" elapsed="0.017141"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:44.269522" 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/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-10-11T01:04:44.273656" 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/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-10-11T01:04:44.277827" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.278046" 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-10-11T01:04:44.278228" 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-10-11T01:04:44.278586" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.278437" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:44.278423" 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-10-11T01:04:44.278828" 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-10-11T01:04:44.279009" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.279172" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:44.278384" elapsed="0.000835"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:44.278294" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.279393" elapsed="0.000036"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:44.279478" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:04:44.279589" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/b...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:04:44.247241" elapsed="0.032373"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:44.280737" 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-10-11T01:04:44.280539" elapsed="0.000259">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-10-11T01:04:44.280881" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:44.280192" elapsed="0.000712"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.281187" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.280967" elapsed="0.000271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.281714" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:44.281450" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.281260" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.280950" elapsed="0.000852"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.282300" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:44.281964" elapsed="0.000360"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:44.282369" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:44.282516" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:44.279890" elapsed="0.002649"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:44.283626" 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-10-11T01:04:44.283439" elapsed="0.000246">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-10-11T01:04:44.283782" 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-10-11T01:04:44.283103" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:04:44.283967" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:04:44.283869" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.283852" elapsed="0.000225"/>
</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-10-11T01:04:44.284233" elapsed="0.000020"/>
</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-10-11T01:04:44.284424" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:04:44.284484" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:44.284609" 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-10-11T01:04:44.282802" elapsed="0.001830"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.285870" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:44.285630" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.286319" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:44.286103" elapsed="0.000256"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:44.291463" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node011peadqcdwn7ieyx6aexk11xu23.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:44.291583" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:44.291684" 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-10-11T01:04:44.286663" elapsed="0.005046"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.286434" elapsed="0.005326"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.291939" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.291785" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.286416" elapsed="0.005600"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.293320" 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-10-11T01:04:44.292985" elapsed="0.000381"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.292706" elapsed="0.000691"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.292688" elapsed="0.000750"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.294012" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:44.293742" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.293489" elapsed="0.000594"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.293474" elapsed="0.000631"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.294644" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:44.294284" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.294958" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.294746" elapsed="0.000263"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.295475" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:44.295196" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.295031" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.294716" elapsed="0.000835"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.296074" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:44.295739" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.296424" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.296197" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.296942" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:44.296663" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.296499" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.296180" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:44.297162" elapsed="0.000310"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:44.297867" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:44.297633" elapsed="0.000259"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:44.298044" elapsed="0.000208"/>
</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-10-11T01:04:44.292343" elapsed="0.005964"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:44.298469" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:44.298369" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.298353" elapsed="0.000200"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:44.299330" 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-10-11T01:04:44.298708" elapsed="0.000649"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:44.299404" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T01:04:44.299548" 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-10-11T01:04:44.284918" elapsed="0.014654"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:44.299627" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:04:44.299759" 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-10-11T01:04:44.239597" elapsed="0.060187"/>
</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-10-11T01:04:44.310513" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:44.310192" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:44.311249" 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-10-11T01:04:44.311031" elapsed="0.000335">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-10-11T01:04:44.311552" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:44.310699" elapsed="0.000877"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.312075" 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-10-11T01:04:44.311766" elapsed="0.000334"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:44.312429" 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-10-11T01:04:44.312581" 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-10-11T01:04:44.312298" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.313034" 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-10-11T01:04:44.312814" elapsed="0.000269"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:44.313467" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.313144" elapsed="0.000378"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.314150" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:44.313693" elapsed="0.000482"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.313544" elapsed="0.000665"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.313126" elapsed="0.001102"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.314821" 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-10-11T01:04:44.314391" elapsed="0.000456"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:44.314891" 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/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-10-11T01:04:44.309649" elapsed="0.005343"/>
</kw>
<msg time="2026-10-11T01:04:44.315045" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:44.305198" elapsed="0.009890"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:44.319319" 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/rib.vanadium/${file_name} 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-10-11T01:04:44.323501" 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/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-10-11T01:04:44.327778" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.328016" 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-10-11T01:04:44.328202" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.328563" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.328398" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:44.328384" 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-10-11T01:04:44.328806" 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-10-11T01:04:44.328985" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.329149" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:44.328358" elapsed="0.000839"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:44.328267" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.329371" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:44.329453" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:04:44.329584" 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-10-11T01:04:44.304485" elapsed="0.025124"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:44.329789" elapsed="0.000343"/>
</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-10-11T01:04:44.331248" 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-10-11T01:04:44.330821" elapsed="0.000454"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:44.331878" 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-10-11T01:04:44.331450" elapsed="0.000454"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:04:44.332089" elapsed="0.000279"/>
</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-10-11T01:04:44.330436" elapsed="0.002003"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.330204" 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-10-11T01:04:44.332670" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.332493" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.330187" elapsed="0.002566"/>
</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-10-11T01:04:44.300743" elapsed="0.032054"/>
</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-10-11T01:04:44.300062" elapsed="0.032800"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.299858" elapsed="0.033044"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.299842" elapsed="0.033081"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:44.332954" elapsed="0.000031"/>
</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-10-11T01:04:44.238962" elapsed="0.094116"/>
</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-10-11T01:04:44.237226" elapsed="0.095950"/>
</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-10-11T01:04:44.349204" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:44.348902" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:44.349916" 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-10-11T01:04:44.349743" elapsed="0.000232">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-10-11T01:04:44.350058" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:44.349392" elapsed="0.000688"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.350578" 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-10-11T01:04:44.350255" elapsed="0.000348"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:44.350897" 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-10-11T01:04:44.351012" 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-10-11T01:04:44.350787" elapsed="0.000249"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.351469" 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-10-11T01:04:44.351232" elapsed="0.000279"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.352429" 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-10-11T01:04:44.352184" elapsed="0.000288"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.352918" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:44.352649" elapsed="0.000293"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.353714" 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-10-11T01:04:44.353258" elapsed="0.000495"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:44.354880" 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-10-11T01:04:44.354348" elapsed="0.000622"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:44.355049" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:04:44.355258" 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-10-11T01:04:44.353925" 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-10-11T01:04:44.355470" elapsed="0.000319"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:04:44.353125" elapsed="0.002702"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.356511" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:44.356060" elapsed="0.000476"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:44.357668" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:44.357149" elapsed="0.000620"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:44.357850" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:04:44.358057" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:44.356706" 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-10-11T01:04:44.358245" elapsed="0.000378"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:44.355926" elapsed="0.002736"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:44.352987" elapsed="0.005756"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:44.358783" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:44.358913" 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-10-11T01:04:44.351841" elapsed="0.007096"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.351572" elapsed="0.007393"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.359138" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.358988" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.351554" elapsed="0.007652"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.359924" 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-10-11T01:04:44.359365" elapsed="0.000585"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:44.359994" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:44.348363" elapsed="0.011732"/>
</kw>
<msg time="2026-10-11T01:04:44.360144" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:44.343808" elapsed="0.016380"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:44.364533" 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/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-10-11T01:04:44.368672" 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/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-10-11T01:04:44.372749" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.372933" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.373117" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.373467" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.373307" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:44.373294" 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-10-11T01:04:44.373695" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.373889" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.374052" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:44.373269" elapsed="0.000829"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:44.373181" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.374309" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:44.374377" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:44.374500" 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-10-11T01:04:44.343182" elapsed="0.031343"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:44.375637" 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-10-11T01:04:44.375449" elapsed="0.000248">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-10-11T01:04:44.375797" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:44.375106" elapsed="0.000714"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.376104" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.375884" elapsed="0.000272"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.376628" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:44.376346" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.376178" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.375867" elapsed="0.000838"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.377216" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:44.376880" elapsed="0.000360"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:44.377285" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:44.377422" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:44.374805" elapsed="0.002642"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:44.378530" 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-10-11T01:04:44.378331" elapsed="0.000258">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-10-11T01:04:44.378672" 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-10-11T01:04:44.378013" elapsed="0.000681"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:04:44.378870" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:04:44.378772" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.378755" elapsed="0.000190"/>
</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-10-11T01:04:44.379105" 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-10-11T01:04:44.379286" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:04:44.379344" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:44.379485" 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-10-11T01:04:44.377695" elapsed="0.001814"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.380744" 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-10-11T01:04:44.380507" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.381194" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:44.380978" elapsed="0.000256"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:44.387206" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node011peadqcdwn7ieyx6aexk11xu23.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:44.387324" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:04:44.387436" 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-10-11T01:04:44.381576" elapsed="0.005886"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.381327" elapsed="0.006174"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.387679" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.387525" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.381309" elapsed="0.006462"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.389030" 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-10-11T01:04:44.388685" elapsed="0.000391"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.388443" elapsed="0.000665"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.388425" elapsed="0.000705"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.389782" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:44.389470" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.389179" elapsed="0.000676"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.389164" elapsed="0.000713"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.390441" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:44.390054" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.390757" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.390532" elapsed="0.000277"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.391264" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:44.391001" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.390832" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.390515" elapsed="0.000825"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.391880" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:44.391535" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.392176" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.391967" elapsed="0.000261"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.392687" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:44.392426" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.392249" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.391951" elapsed="0.000825"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:44.392920" elapsed="0.000287"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:44.393602" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:44.393368" elapsed="0.000258"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:44.393789" elapsed="0.000242"/>
</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-10-11T01:04:44.388091" elapsed="0.005997"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:44.394230" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:44.394149" elapsed="0.000120"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.394133" elapsed="0.000155"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:44.395068" 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-10-11T01:04:44.394450" elapsed="0.000645"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:44.395142" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:44.395268" 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-10-11T01:04:44.379797" elapsed="0.015495"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:44.395346" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:04:44.395483" 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-10-11T01:04:44.335746" elapsed="0.059761"/>
</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-10-11T01:04:44.406172" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:44.405869" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:44.406930" 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-10-11T01:04:44.406695" elapsed="0.000353">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-10-11T01:04:44.407208" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:44.406358" elapsed="0.000874"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.407752" 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-10-11T01:04:44.407429" elapsed="0.000349"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:44.408056" 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-10-11T01:04:44.408175" 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-10-11T01:04:44.407947" elapsed="0.000252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.408635" 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-10-11T01:04:44.408397" 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-10-11T01:04:44.409090" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.408793" elapsed="0.000351"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.409802" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:44.409315" elapsed="0.000512"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.409167" elapsed="0.000693"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.408774" elapsed="0.001106"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.410463" 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-10-11T01:04:44.410045" elapsed="0.000445"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:44.410535" 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/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-10-11T01:04:44.405337" elapsed="0.005298"/>
</kw>
<msg time="2026-10-11T01:04:44.410689" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:44.400899" elapsed="0.009849"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:44.415002" 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-10-11T01:04:44.419101" 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/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-10-11T01:04:44.423320" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.423518" 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-10-11T01:04:44.423703" 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-10-11T01:04:44.424054" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.423908" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:44.423895" 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-10-11T01:04:44.424281" 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-10-11T01:04:44.424476" 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-10-11T01:04:44.424642" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:44.423870" elapsed="0.000819"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:44.423782" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.424911" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:44.424979" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:44.425107" 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-10-11T01:04:44.400169" elapsed="0.024963"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:44.425300" elapsed="0.000339"/>
</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-10-11T01:04:44.426739" 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-10-11T01:04:44.426289" elapsed="0.000478"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:44.427329" 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-10-11T01:04:44.426921" 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-10-11T01:04:44.427563" elapsed="0.000294"/>
</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-10-11T01:04:44.425924" elapsed="0.001987"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.425708" elapsed="0.002233"/>
</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-10-11T01:04:44.428140" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.427964" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.425692" elapsed="0.002517"/>
</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-10-11T01:04:44.396462" elapsed="0.031789"/>
</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-10-11T01:04:44.395797" elapsed="0.032518"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.395581" elapsed="0.032774"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.395565" elapsed="0.032810"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:44.428405" elapsed="0.000043"/>
</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-10-11T01:04:44.335073" elapsed="0.093450"/>
</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-10-11T01:04:44.333369" elapsed="0.095206"/>
</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-10-11T01:04:44.428741" elapsed="0.003006"/>
</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-10-11T01:04:44.449103" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:44.448792" elapsed="0.000338"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:44.449848" 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-10-11T01:04:44.449634" elapsed="0.000278">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-10-11T01:04:44.450042" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:44.449290" elapsed="0.000776"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.450564" 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-10-11T01:04:44.450239" elapsed="0.000350"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:44.450879" 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-10-11T01:04:44.451053" 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-10-11T01:04:44.450769" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.451511" 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-10-11T01:04:44.451274" elapsed="0.000280"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.452471" 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-10-11T01:04:44.452222" elapsed="0.000291"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.452956" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:44.452690" elapsed="0.000290"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.453770" 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-10-11T01:04:44.453294" elapsed="0.000501"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:44.454937" 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-10-11T01:04:44.454394" elapsed="0.000633"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:44.455109" elapsed="0.000032"/>
</return>
<msg time="2026-10-11T01:04:44.455322" 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-10-11T01:04:44.453967" 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-10-11T01:04:44.455538" elapsed="0.000323"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:04:44.453162" elapsed="0.002738"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.456588" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:44.456133" elapsed="0.000479"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:44.457766" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:44.457225" elapsed="0.000631"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:44.457937" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:04:44.458148" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:44.456799" 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-10-11T01:04:44.458336" elapsed="0.000399"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:44.456000" elapsed="0.002776"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:44.453024" elapsed="0.005783"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:44.458845" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:44.458974" 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-10-11T01:04:44.451882" elapsed="0.007115"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.451616" elapsed="0.007410"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.459197" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.459048" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.451598" elapsed="0.007668"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.460001" 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-10-11T01:04:44.459489" elapsed="0.000538"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:44.460071" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:44.448252" elapsed="0.011918"/>
</kw>
<msg time="2026-10-11T01:04:44.460252" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:44.442763" elapsed="0.017535"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:44.464980" 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/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-10-11T01:04:44.469131" 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/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-10-11T01:04:44.473220" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.473421" 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-10-11T01:04:44.473609" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.473964" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.473817" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:44.473803" 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-10-11T01:04:44.474195" 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-10-11T01:04:44.474377" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.474558" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:44.473777" elapsed="0.000829"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:44.473674" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.474796" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:44.474864" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:44.474974" 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-10-11T01:04:44.442020" elapsed="0.032978"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:44.476121" 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-10-11T01:04:44.475924" elapsed="0.000258">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-10-11T01:04:44.476265" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:44.475584" elapsed="0.000737"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.476632" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.476388" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.477161" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:44.476898" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.476706" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.476371" elapsed="0.000866"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.477765" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:44.477397" elapsed="0.000392"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:44.477834" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:44.477958" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:44.475266" elapsed="0.002715"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:44.479026" 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-10-11T01:04:44.478881" elapsed="0.000194"/>
</kw>
<msg time="2026-10-11T01:04:44.479150" 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-10-11T01:04:44.478546" elapsed="0.000626"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:04:44.479332" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:44.479236" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.479219" elapsed="0.000174"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:44.479688" 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-10-11T01:04:44.479824" 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-10-11T01:04:44.479563" elapsed="0.000285"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:04:44.480196" 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-10-11T01:04:44.480009" elapsed="0.000210"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:04:44.480261" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:44.480386" 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-10-11T01:04:44.478230" elapsed="0.002194"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.481659" 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-10-11T01:04:44.481434" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.482121" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:44.481907" elapsed="0.000254"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:44.488342" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node011peadqcdwn7ieyx6aexk11xu23.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:44.488505" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:04:44.488623" 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-10-11T01:04:44.482471" elapsed="0.006218"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.482220" elapsed="0.006529"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.488974" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.488775" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.482203" elapsed="0.006851"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.490398" 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-10-11T01:04:44.490062" elapsed="0.000400"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.489821" elapsed="0.000673"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.489804" elapsed="0.000713"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.491086" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:44.490818" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.490567" elapsed="0.000591"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.490552" elapsed="0.000628"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.491737" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:44.491360" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.492038" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.491826" elapsed="0.000265"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.492562" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:44.492277" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.492113" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.491809" elapsed="0.000831"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.493165" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:44.492831" elapsed="0.000360"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.493478" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.493253" elapsed="0.000277"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.493986" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:44.493714" elapsed="0.000296"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.493552" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.493236" elapsed="0.000828"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:44.494208" elapsed="0.000305"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:44.494909" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:44.494673" elapsed="0.000260"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:44.495086" elapsed="0.000211"/>
</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-10-11T01:04:44.489453" elapsed="0.005901"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:44.495515" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:44.495431" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.495399" elapsed="0.000176"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:44.496458" 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-10-11T01:04:44.495731" elapsed="0.000757"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:44.496534" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:44.496662" 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-10-11T01:04:44.480705" elapsed="0.016024"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:44.496788" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:04:44.496913" 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-10-11T01:04:44.434282" elapsed="0.062655"/>
</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-10-11T01:04:44.507657" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:44.507335" elapsed="0.000349"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:44.508398" 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-10-11T01:04:44.508176" elapsed="0.000366">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-10-11T01:04:44.508708" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:44.507859" elapsed="0.000887"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.509230" 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-10-11T01:04:44.508922" elapsed="0.000333"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:44.509549" 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-10-11T01:04:44.509669" 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-10-11T01:04:44.509438" elapsed="0.000256"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.510123" 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-10-11T01:04:44.509904" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:44.510546" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.510225" elapsed="0.000375"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.511240" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:44.510785" elapsed="0.000480"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:44.510623" elapsed="0.000677"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:44.510207" elapsed="0.001112"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.511906" 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-10-11T01:04:44.511503" elapsed="0.000429"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:44.511980" 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/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-10-11T01:04:44.506829" elapsed="0.005257"/>
</kw>
<msg time="2026-10-11T01:04:44.512134" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:44.502394" elapsed="0.009784"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:44.516397" 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/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-10-11T01:04:44.520559" 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/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-10-11T01:04:44.524854" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.525037" 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-10-11T01:04:44.525218" 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-10-11T01:04:44.525580" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.525433" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:44.525418" 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-10-11T01:04:44.525823" 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-10-11T01:04:44.526006" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.526171" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:44.525378" elapsed="0.000841"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:44.525285" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:44.526394" elapsed="0.000032"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:44.526476" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:44.526582" 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-10-11T01:04:44.501675" elapsed="0.024932"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:44.526791" elapsed="0.000315"/>
</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-10-11T01:04:44.528025" 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-10-11T01:04:44.527778" elapsed="0.000274"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:44.528788" 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-10-11T01:04:44.528201" elapsed="0.000644"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:04:44.529307" 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-10-11T01:04:44.529522" 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-10-11T01:04:44.529034" elapsed="0.000555">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-10-11T01:04:44.527381" elapsed="0.002381">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-10-11T01:04:44.527177" elapsed="0.002667">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-10-11T01:04:44.530058" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:44.529879" elapsed="0.000230"/>
</branch>
<status status="FAIL" start="2026-10-11T01:04:44.527160" elapsed="0.002970">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-10-11T01:04:44.497907" elapsed="0.032353">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-10-11T01:04:44.497215" elapsed="0.033243">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-10-11T01:04:44.497010" elapsed="0.033540">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-10-11T01:04:44.496994" elapsed="0.033590">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-10-11T01:04:44.530629" 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-10-11T01:04:44.433660" elapsed="0.097111">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-10-11T01:04:46.566149" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:46.565389" elapsed="0.000827"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:46.567856" 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-10-11T01:04:46.567368" elapsed="0.000635">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-10-11T01:04:46.568285" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:46.566617" elapsed="0.001721"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.569512" 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-10-11T01:04:46.568780" elapsed="0.000791"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:46.570221" 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-10-11T01:04:46.570535" 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-10-11T01:04:46.569970" elapsed="0.000620"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.571572" 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-10-11T01:04:46.571045" elapsed="0.000623"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.573816" 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-10-11T01:04:46.573243" elapsed="0.000666"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.574928" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:46.574302" elapsed="0.000680"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.576822" 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-10-11T01:04:46.575750" elapsed="0.001127"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:46.579533" 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-10-11T01:04:46.578276" elapsed="0.001471"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:46.579937" elapsed="0.000076"/>
</return>
<msg time="2026-10-11T01:04:46.580461" 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-10-11T01:04:46.577261" elapsed="0.003255"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:46.580915" elapsed="0.000714"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:04:46.575403" elapsed="0.006279"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.582649" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:46.582019" elapsed="0.000665"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:46.584275" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:46.583563" elapsed="0.000836"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:46.584599" elapsed="0.000044"/>
</return>
<msg time="2026-10-11T01:04:46.584905" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:46.582937" elapsed="0.002001"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:46.585168" elapsed="0.000467"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:46.581837" elapsed="0.003851"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:46.575088" elapsed="0.010660"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:46.585805" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T01:04:46.585987" 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-10-11T01:04:46.572448" elapsed="0.013571"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:46.571842" elapsed="0.014217"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:46.586299" elapsed="0.000271"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:46.586091" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:46.571793" elapsed="0.014850"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.587701" 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-10-11T01:04:46.586895" elapsed="0.000859"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:46.587817" 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_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-10-11T01:04:46.564209" elapsed="0.023753"/>
</kw>
<msg time="2026-10-11T01:04:46.588081" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:46.554205" elapsed="0.033942"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:46.593964" 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_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-10-11T01:04:46.599685" 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/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-10-11T01:04:46.605418" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:46.605675" 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-10-11T01:04:46.605949" 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-10-11T01:04:46.606467" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:46.606218" elapsed="0.000338"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:46.606198" elapsed="0.000394"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:46.606819" 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-10-11T01:04:46.607001" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:46.607166" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:46.606163" elapsed="0.001050"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:46.606041" elapsed="0.001195"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:46.607388" elapsed="0.000032"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:46.607470" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:46.607578" 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-10-11T01:04:46.552663" elapsed="0.054939"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:46.608728" 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-10-11T01:04:46.608530" elapsed="0.000260">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-10-11T01:04:46.608874" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:46.608189" elapsed="0.000736"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:46.609237" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:46.609012" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.609793" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:46.609513" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:46.609312" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:46.608988" elapsed="0.000891"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.610383" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:46.610045" elapsed="0.000380"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:46.610473" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:46.610597" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:46.607886" elapsed="0.002734"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:46.611662" 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-10-11T01:04:46.611518" elapsed="0.000202"/>
</kw>
<msg time="2026-10-11T01:04:46.611797" 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-10-11T01:04:46.611183" elapsed="0.000637"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:04:46.611980" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:46.611884" elapsed="0.000135"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:46.611867" elapsed="0.000173"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:46.612313" 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-10-11T01:04:46.612444" 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-10-11T01:04:46.612191" elapsed="0.000277"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:04:46.612832" 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-10-11T01:04:46.612631" elapsed="0.000224"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:04:46.612897" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:46.613021" 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-10-11T01:04:46.610883" elapsed="0.002161"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.614275" 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-10-11T01:04:46.614051" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.614909" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:46.614523" 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-10-11T01:04:46.621825" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node011peadqcdwn7ieyx6aexk11xu23.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:46.621970" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:04:46.622057" 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-10-11T01:04:46.615250" elapsed="0.006831"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:46.615012" elapsed="0.007109"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:46.622298" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:46.622145" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:46.614995" elapsed="0.007432"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.623690" 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-10-11T01:04:46.623345" elapsed="0.000403"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:46.623107" elapsed="0.000673"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:46.623090" elapsed="0.000712"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.624359" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:46.624090" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:46.623852" elapsed="0.000596"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:46.623837" elapsed="0.000634"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.625017" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:46.624648" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:46.625321" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:46.625105" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.625856" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:46.625576" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:46.625395" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:46.625089" elapsed="0.000844"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.626462" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:46.626108" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:46.626775" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:46.626551" elapsed="0.000276"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.627272" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:46.627011" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:46.626849" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:46.626535" elapsed="0.000813"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:46.627510" elapsed="0.000303"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:46.628200" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:46.627975" elapsed="0.000249"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:46.628377" elapsed="0.000229"/>
</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-10-11T01:04:46.622773" elapsed="0.005890"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:46.628820" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:46.628736" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:46.628718" elapsed="0.000162"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:46.629506" 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-10-11T01:04:46.629020" elapsed="0.000513"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:46.629578" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:46.629704" 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-10-11T01:04:46.613325" elapsed="0.016414"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:46.629795" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:04:46.629917" 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-10-11T01:04:46.535963" elapsed="0.094008"/>
</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-10-11T01:04:46.640638" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:46.640313" elapsed="0.000352"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:46.641379" 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-10-11T01:04:46.641160" elapsed="0.000364">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-10-11T01:04:46.641688" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:46.640840" elapsed="0.000886"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.642213" 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-10-11T01:04:46.641903" elapsed="0.000335"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:46.642532" 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-10-11T01:04:46.642648" 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-10-11T01:04:46.642421" elapsed="0.000252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.643105" 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-10-11T01:04:46.642886" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:46.643525" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:46.643207" elapsed="0.000373"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.644208" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:46.643761" elapsed="0.000471"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:46.643603" elapsed="0.000662"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:46.643190" elapsed="0.001094"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.644867" 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-10-11T01:04:46.644467" elapsed="0.000426"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:46.644937" 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/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-10-11T01:04:46.639809" elapsed="0.005228"/>
</kw>
<msg time="2026-10-11T01:04:46.645084" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:46.635419" elapsed="0.009709"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:46.649252" 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/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-10-11T01:04:46.653358" 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/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-10-11T01:04:46.657587" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:46.657783" 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-10-11T01:04:46.657971" 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-10-11T01:04:46.658309" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:46.658164" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:46.658150" 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-10-11T01:04:46.658558" 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-10-11T01:04:46.658889" 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-10-11T01:04:46.659058" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:46.658125" elapsed="0.000980"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:46.658037" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:46.659280" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:46.659345" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:46.659469" 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-10-11T01:04:46.634689" elapsed="0.024805"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:46.659662" elapsed="0.000330"/>
</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-10-11T01:04:46.660898" 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-10-11T01:04:46.660644" elapsed="0.000281"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:46.661311" 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-10-11T01:04:46.661078" elapsed="0.000260"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:04:46.661544" elapsed="0.000297"/>
</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-10-11T01:04:46.660263" elapsed="0.001635"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:46.660062" elapsed="0.001865"/>
</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-10-11T01:04:46.662124" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:46.661949" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:46.660045" elapsed="0.002188"/>
</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-10-11T01:04:46.630949" elapsed="0.031328"/>
</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-10-11T01:04:46.630259" elapsed="0.032084"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:46.630048" elapsed="0.032334"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:46.630032" elapsed="0.032387"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:46.662451" 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-10-11T01:04:46.534369" elapsed="0.128183"/>
</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-10-11T01:04:44.431948" elapsed="2.230656"/>
</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-10-11T01:04:46.662820" elapsed="0.002859"/>
</kw>
<arg>l3vpn_mcast</arg>
<arg>${L3VPN_MCAST_DIR}</arg>
<status status="PASS" start="2026-10-11T01:04:42.029115" elapsed="4.636641"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:41.938939" elapsed="4.726939"/>
</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-10-11T01:04:46.667333" elapsed="0.000273"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:04:46.667082" elapsed="0.000579"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:46.668588" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:46.668500" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:46.668482" elapsed="0.000169"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:46.670803" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:46.670706" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:46.670689" elapsed="0.000177"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.671779" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:46.671445" elapsed="0.000360"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.672217" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:04:46.671958" elapsed="0.000283"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:04:46.672281" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:46.672421" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:04:46.671074" elapsed="0.001372"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:46.674957" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:46.674874" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:46.674856" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:46.676064" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:46.675980" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:46.675963" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:46.676472" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:04:46.676276" elapsed="0.000220"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:46.676821" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:46.676663" elapsed="0.000182"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:04:46.714106" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:04:46.677334" elapsed="0.036872"/>
</kw>
<msg time="2026-10-11T01:04:46.714395" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:04:46.714465" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:46.677002" elapsed="0.037500"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:04:46.758684" 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-10-11T01:04:46.715035" elapsed="0.043771"/>
</kw>
<msg time="2026-10-11T01:04:46.758970" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:04:46.759010" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:46.714672" elapsed="0.044374"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:46.759324" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:46.759114" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:46.759096" elapsed="0.000298"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.759839" 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-10-11T01:04:46.759598" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:46.760166" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:46.759967" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:46.759951" elapsed="0.000285"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:04:46.760265" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:46.762903" elapsed="0.000117"/>
</kw>
<msg time="2026-10-11T01:04:46.763076" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:46.761650" 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-10-11T01:04:46.763543" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:46.763892" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:04:46.761044" elapsed="0.003030"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:04:46.760558" elapsed="0.003574"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:04:46.675723" elapsed="0.088482"/>
</kw>
<msg time="2026-10-11T01:04:46.764286" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:46.764326" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:46.675170" elapsed="0.089191"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:04:46.764542" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:04:46.764455" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:46.764437" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:46.764958" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:46.765259" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:04:46.765321" 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-10-11T01:04:46.674580" elapsed="0.090847"/>
</kw>
<msg time="2026-10-11T01:04:46.765519" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:46.765559" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:46.672787" elapsed="0.092807"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:46.765930" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:46.765692" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:46.765675" elapsed="0.000325"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:04:46.672633" elapsed="0.093389"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:04:46.672494" elapsed="0.093554"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:04:46.670387" elapsed="0.095708"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:04:46.668223" elapsed="0.097921"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:46.667829" elapsed="0.098356"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:04:46.666737" elapsed="0.099495"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:46.767083" 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-10-11T01:04:46.767208" 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-10-11T01:04:46.766943" elapsed="0.000290"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:04:46.767613" 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-10-11T01:04:46.767396" elapsed="0.000241"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:46.767948" 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-10-11T01:04:46.768065" 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-10-11T01:04:46.767813" elapsed="0.000277"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:04:46.768428" 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-10-11T01:04:46.768247" elapsed="0.000207"/>
</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-10-11T01:04:46.768705" elapsed="0.002125"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:46.768519" elapsed="0.002350"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:46.768500" elapsed="0.002397"/>
</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-10-11T01:04:46.782583" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:46.782265" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:46.783294" 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-10-11T01:04:46.783107" elapsed="0.000249">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-10-11T01:04:46.783455" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:46.782786" elapsed="0.000693"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.783985" 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-10-11T01:04:46.783654" elapsed="0.000357"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:46.784308" 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-10-11T01:04:46.784475" 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-10-11T01:04:46.784198" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.784932" 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-10-11T01:04:46.784696" elapsed="0.000277"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.785890" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:04:46.785641" elapsed="0.000290"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.786360" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:46.786109" elapsed="0.000275"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.786998" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:46.786728" elapsed="0.000294"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:46.787897" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:46.787524" elapsed="0.000398"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:46.787967" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:04:46.788093" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:46.787193" elapsed="0.000922"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:46.788280" elapsed="0.000196"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:04:46.786582" elapsed="0.001932"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.789041" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:46.788761" elapsed="0.000304"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:46.789930" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:46.789560" elapsed="0.000396"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:46.790000" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:46.790124" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:46.789233" elapsed="0.000913"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:46.790311" elapsed="0.000196"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:46.788614" elapsed="0.001930"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:46.786444" elapsed="0.004132"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:46.790614" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:04:46.790755" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:46.785283" elapsed="0.005496"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:46.785033" elapsed="0.005775"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:46.790980" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:46.790831" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:46.785016" elapsed="0.006032"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.791739" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:46.791206" elapsed="0.000561"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:46.791811" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:46.781746" elapsed="0.010163"/>
</kw>
<msg time="2026-10-11T01:04:46.791958" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:46.776310" elapsed="0.015691"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:46.796362" 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/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-10-11T01:04:46.800560" 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/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-10-11T01:04:46.804648" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:46.804873" 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-10-11T01:04:46.805079" 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-10-11T01:04:46.805469" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:46.805283" elapsed="0.000253"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:46.805266" 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-10-11T01:04:46.805784" 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-10-11T01:04:46.806017" 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-10-11T01:04:46.806230" elapsed="0.000024"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:46.805241" elapsed="0.001048"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:46.805152" elapsed="0.001166"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:46.806511" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:46.806587" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:46.806704" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:46.775722" elapsed="0.031022"/>
</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-10-11T01:04:46.815696" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:46.815377" elapsed="0.000359"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:46.816389" 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-10-11T01:04:46.816217" elapsed="0.000248">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-10-11T01:04:46.816584" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:46.815898" elapsed="0.000709"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.817106" 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-10-11T01:04:46.816796" elapsed="0.000335"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:46.817425" 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-10-11T01:04:46.817549" 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-10-11T01:04:46.817301" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.818009" 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-10-11T01:04:46.817784" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:46.818374" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:46.818126" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.818905" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', '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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:46.818625" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:46.818471" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:46.818109" elapsed="0.000873"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.819549" 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-10-11T01:04:46.819147" elapsed="0.000430"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:46.819620" 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/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-10-11T01:04:46.814872" elapsed="0.004862"/>
</kw>
<msg time="2026-10-11T01:04:46.819788" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:46.810535" elapsed="0.009297"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:46.824079" 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/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-10-11T01:04:46.828198" 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/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-10-11T01:04:46.832327" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:46.832529" 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-10-11T01:04:46.832726" 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-10-11T01:04:46.833068" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:46.832922" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:46.832907" 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-10-11T01:04:46.833295" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:46.833489" 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-10-11T01:04:46.833655" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:46.832883" elapsed="0.000819"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:46.832792" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:46.833892" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:46.833958" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:46.834079" 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-10-11T01:04:46.809829" elapsed="0.024277"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:46.835231" 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-10-11T01:04:46.835038" elapsed="0.000252">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-10-11T01:04:46.835374" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:46.834697" elapsed="0.000700"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:46.835701" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:46.835477" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.836222" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:46.835960" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:46.835791" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:46.835460" elapsed="0.000837"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.836834" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:46.836477" elapsed="0.000381"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:46.836902" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:46.837025" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:46.834376" elapsed="0.002672"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.838372" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:46.838151" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.838893" 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-10-11T01:04:46.838662" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.839379" 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-10-11T01:04:46.839163" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.839856" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:46.839625" elapsed="0.000270"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:46.840612" 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-10-11T01:04:46.840450" elapsed="0.000187"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:04:46.840953" 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-10-11T01:04:46.840808" elapsed="0.000169"/>
</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-10-11T01:04:46.841140" elapsed="0.000154"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.841738" 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-10-11T01:04:46.841505" elapsed="0.000274"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:04:46.841822" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:46.841949" 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-10-11T01:04:46.840076" elapsed="0.001897"/>
</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-10-11T01:04:46.855799" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node011peadqcdwn7ieyx6aexk11xu23.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-10-11T01:04:46.855866" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:46.855959" 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-10-11T01:04:46.842271" elapsed="0.013713"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:46.842034" elapsed="0.013991"/>
</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-10-11T01:04:46.856204" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:46.856049" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:46.842018" elapsed="0.014292"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.857586" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:46.857280" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:46.857038" elapsed="0.000620"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:46.857021" elapsed="0.000659"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.858252" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:46.857987" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:46.857746" elapsed="0.000578"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:46.857730" elapsed="0.000617"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.858911" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:46.858554" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:46.859209" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:46.858998" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.859743" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:46.859468" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:46.859282" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:46.858982" elapsed="0.000838"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.860330" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:46.859996" elapsed="0.000359"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:46.860643" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:46.860431" elapsed="0.000263"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.861154" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:46.860895" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:46.860729" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:46.860400" elapsed="0.000830"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:46.861374" elapsed="0.000312"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:46.862081" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:46.861859" elapsed="0.000247"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:46.862260" elapsed="0.000245"/>
</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-10-11T01:04:46.856662" elapsed="0.005899"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:04:46.862720" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T01:04:46.862626" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:46.862609" elapsed="0.000314"/>
</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-10-11T01:04:46.863075" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:04:46.863136" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:46.863298" 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-10-11T01:04:46.837343" elapsed="0.025980"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:46.863384" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T01:04:46.863527" 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-10-11T01:04:46.771831" elapsed="0.091718"/>
</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-10-11T01:04:46.863860" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:46.863640" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:46.863625" elapsed="0.000354"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:46.864010" elapsed="0.000024"/>
</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-10-11T01:04:46.771148" elapsed="0.092960"/>
</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-10-11T01:04:46.867309" level="INFO">${update} = </msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:04:46.865029" elapsed="0.002307"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:04:46.867878" level="FAIL"> == </msg>
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="FAIL" start="2026-10-11T01:04:46.867517" elapsed="0.000418"> == </status>
</kw>
<return>
<value>${update}</value>
<status status="NOT RUN" start="2026-10-11T01:04:46.867986" elapsed="0.000016"/>
</return>
<doc>Returns hex update message.</doc>
<status status="FAIL" start="2026-10-11T01:04:46.864765" elapsed="0.003324"> == </status>
</kw>
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:04:48.873250" level="INFO">${update} = ffffffffffffffffffffffffffffffff005902000000424001010040020040050400000064800e260002811020010db800010000000000000000000700800001ac10002c00651820010d00000000c01008010b0a0000013130</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:04:48.869855" elapsed="0.003470"/>
</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-10-11T01:04:48.873850" elapsed="0.000819"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:04:48.874817" elapsed="0.000081"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:04:48.868956" elapsed="0.006133"/>
</kw>
<msg time="2026-10-11T01:04:48.875260" 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-10-11T01:04:46.864296" elapsed="2.011022"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:04:48.877963" level="INFO">Length is 178.</msg>
<msg time="2026-10-11T01:04:48.878138" 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-10-11T01:04:48.877286" elapsed="0.000906"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:04:48.879232" level="INFO">Length is 178.</msg>
<msg time="2026-10-11T01:04:48.879402" 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-10-11T01:04:48.878624" elapsed="0.000869"/>
</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-10-11T01:04:48.879983" elapsed="0.000695"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:04:48.881502" 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-10-11T01:04:48.881072" elapsed="0.000489"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:04:48.882333" 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-10-11T01:04:48.881946" elapsed="0.000445"/>
</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-10-11T01:04:48.882894" elapsed="0.000689"/>
</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-10-11T01:04:48.875872" elapsed="0.007872"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:04:48.884096" elapsed="0.002847"/>
</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-10-11T01:04:48.919397" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:48.918725" elapsed="0.000761"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:48.920512" 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-10-11T01:04:48.920210" elapsed="0.000395">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-10-11T01:04:48.920739" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:48.919761" elapsed="0.001010"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:48.921474" 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-10-11T01:04:48.921017" elapsed="0.000558"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:48.921991" 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-10-11T01:04:48.922172" 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-10-11T01:04:48.921832" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:48.922828" 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-10-11T01:04:48.922500" 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-10-11T01:04:48.924181" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:04:48.923857" elapsed="0.000382"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:48.925064" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:48.924510" elapsed="0.000588"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:48.926200" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:48.925587" elapsed="0.000647"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:48.927761" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:48.927095" elapsed="0.000774"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:48.928048" elapsed="0.000044"/>
</return>
<msg time="2026-10-11T01:04:48.928286" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:48.926508" elapsed="0.001810"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:48.928585" elapsed="0.000445"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:04:48.925374" elapsed="0.003710"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:48.930021" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:48.929443" elapsed="0.000612"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:48.931540" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:48.930896" elapsed="0.000752"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:48.931845" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T01:04:48.932077" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:48.930292" elapsed="0.001817"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:48.932338" elapsed="0.000518"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:48.929227" elapsed="0.003682"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:48.925167" elapsed="0.007787"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:48.933007" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T01:04:48.933185" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:48.923343" elapsed="0.009874"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:48.922979" elapsed="0.010278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:48.933585" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:48.933289" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:48.922952" elapsed="0.010733"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:48.934685" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:48.933926" elapsed="0.000812"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:48.934799" 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/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-10-11T01:04:48.917522" elapsed="0.017417"/>
</kw>
<msg time="2026-10-11T01:04:48.935053" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:48.907639" elapsed="0.027478"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:48.940966" 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_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-10-11T01:04:48.946515" 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/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-10-11T01:04:48.950614" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:48.950810" 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-10-11T01:04:48.950993" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:48.951331" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:48.951184" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:48.951170" 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-10-11T01:04:48.951578" 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-10-11T01:04:48.951772" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:48.951937" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:48.951145" elapsed="0.000838"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:48.951058" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:48.952159" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:48.952225" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:48.952332" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:48.906185" elapsed="0.046172"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:48.953370" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:48.953148" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:48.967368" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node011peadqcdwn7ieyx6aexk11xu23.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:48.967502" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:48.967619" 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-10-11T01:04:48.953742" elapsed="0.013910"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:48.953494" elapsed="0.014231"/>
</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-10-11T01:04:48.967970" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:48.967760" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:48.953475" elapsed="0.014599"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:48.970053" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:48.969640" elapsed="0.000472"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:48.969284" elapsed="0.000872"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:48.969260" elapsed="0.000928"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:48.971000" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:48.970608" elapsed="0.000451"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:48.970257" elapsed="0.000844"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:48.970235" elapsed="0.000897"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:48.971908" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:48.971393" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:48.972328" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:48.972031" elapsed="0.000368"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:48.973169" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:48.972796" elapsed="0.000407"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:48.972460" elapsed="0.000789"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:48.972008" elapsed="0.001268"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:48.974030" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:48.973547" elapsed="0.000518"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:48.974465" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:48.974151" elapsed="0.000387"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:48.975173" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:48.974809" elapsed="0.000397"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:48.974568" elapsed="0.000683"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:48.974127" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:48.975500" elapsed="0.000420"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:48.976474" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:48.976144" elapsed="0.000365"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:48.976734" elapsed="0.000296"/>
</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-10-11T01:04:48.968814" elapsed="0.008294"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:04:48.977165" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T01:04:48.977433" 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-10-11T01:04:48.952609" elapsed="0.024862"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:48.977537" elapsed="0.000035"/>
</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-10-11T01:04:48.889302" elapsed="0.088369"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:48.888290" elapsed="0.089465"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:04:48.887398" elapsed="0.090430"/>
</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-10-11T01:04:48.981775" level="INFO">${update} = ffffffffffffffffffffffffffffffff004702000000304001010040020040050400000064800f14000281800001ac10002c00651820010d00000000c01008010b0a0000013130</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:04:48.979197" 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-10-11T01:04:48.982046" elapsed="0.000472"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:04:48.982579" elapsed="0.000038"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:04:48.978791" elapsed="0.003945"/>
</kw>
<msg time="2026-10-11T01:04:48.982830" 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-10-11T01:04:48.978146" elapsed="0.004717"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:04:48.983965" level="INFO">Length is 142.</msg>
<msg time="2026-10-11T01:04:48.984061" 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-10-11T01:04:48.983617" elapsed="0.000475"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:04:48.984670" level="INFO">Length is 142.</msg>
<msg time="2026-10-11T01:04:48.985277" 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-10-11T01:04:48.984310" elapsed="0.001029"/>
</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-10-11T01:04:48.985685" elapsed="0.000429"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:04:48.986568" 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-10-11T01:04:48.986320" elapsed="0.000281"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:04:48.987028" 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-10-11T01:04:48.986820" elapsed="0.000240"/>
</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-10-11T01:04:48.987310" elapsed="0.000403"/>
</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-10-11T01:04:48.983126" elapsed="0.004665"/>
</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-10-11T01:04:49.006657" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:49.006331" elapsed="0.000352"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:49.007364" 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-10-11T01:04:49.007176" elapsed="0.000263">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-10-11T01:04:49.007524" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:49.006857" elapsed="0.000689"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:49.008081" 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-10-11T01:04:49.007733" elapsed="0.000373"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:49.008382" 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-10-11T01:04:49.008516" 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-10-11T01:04:49.008274" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:49.008971" 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-10-11T01:04:49.008753" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:49.009947" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:04:49.009718" elapsed="0.000271"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:49.010426" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:49.010165" elapsed="0.000286"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:49.011298" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:49.010843" elapsed="0.000480"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:49.012378" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:49.011940" elapsed="0.000496"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:49.012549" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:04:49.012741" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:49.011516" elapsed="0.001250"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:49.012940" elapsed="0.000271"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:04:49.010709" elapsed="0.002540"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:49.013971" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:49.013501" elapsed="0.000495"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:49.015046" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:49.014608" elapsed="0.000477"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:49.015192" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:04:49.015366" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:49.014164" elapsed="0.001226"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:49.015581" elapsed="0.000285"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:49.013348" elapsed="0.002557"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:49.010557" elapsed="0.005379"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:49.015975" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:04:49.016102" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:49.009322" elapsed="0.006804"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:49.009073" elapsed="0.007081"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:49.016325" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:49.016176" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:49.009055" elapsed="0.007339"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:49.017279" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:49.016617" elapsed="0.000689"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:49.017351" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:49.005799" elapsed="0.011720"/>
</kw>
<msg time="2026-10-11T01:04:49.017569" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:49.000838" elapsed="0.016785"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:49.021776" 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/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-10-11T01:04:49.025866" 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/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-10-11T01:04:49.029990" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:49.030172" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:49.030353" 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-10-11T01:04:49.030715" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:49.030559" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:49.030545" 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-10-11T01:04:49.030951" 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-10-11T01:04:49.031133" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:49.031301" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:49.030519" elapsed="0.000829"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:49.030431" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:49.031537" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:49.031604" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:49.031723" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:48.999901" elapsed="0.031847"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:49.032782" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:49.032544" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:49.039021" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node011peadqcdwn7ieyx6aexk11xu23.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:49.039318" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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+xml', 'Content-Length': '602'} 
 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-path xmlns:a="urn:opendaylight:params:xml:ns:yang:bgp-rib" xmlns:b="urn:opendaylight:params:xml:ns:yang:bgp-types" xmlns:c="urn:opendaylight:params:xml:ns:yang:bgp:l3vpn:mcast"&gt;/a:application-rib[a:id='10.30.170.173']/a:tables[a:afi='b:ipv6-address-family'][a:safi='c:mcast-mpls-labeled-vpn-subsequent-address-family']/c:l3vpn-mcast-routes-ipv6&lt;/error-path&gt;&lt;error-message&gt;Data does not exist&lt;/error-message&gt;&lt;error-tag&gt;data-missing&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-10-11T01:04:49.039470" level="INFO">${response} = None</msg>
<msg time="2026-10-11T01:04:49.039509" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:49.033109" elapsed="0.006787">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:49.032884" elapsed="0.007121">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:49.040191" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:49.040038" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-11T01:04:49.032867" elapsed="0.007401">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:04:49.041660" 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-10-11T01:04:49.041371" elapsed="0.000320">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:04:49.041131" elapsed="0.000702">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:04:49.041114" elapsed="0.000753">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-10-11T01:04:49.042448" 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-10-11T01:04:49.042169" elapsed="0.000309">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:04:49.041929" elapsed="0.000605">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:04:49.041914" elapsed="0.000648">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:49.043270" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:49.042768" elapsed="0.000528"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:49.043594" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:49.043361" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:49.044121" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:49.043851" elapsed="0.000295"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:49.043671" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:49.043344" elapsed="0.000855"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:49.044750" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:49.044376" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:49.045052" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:49.044840" elapsed="0.000265"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:49.045606" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:49.045327" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:49.045127" elapsed="0.000584"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:49.044823" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:49.045878" elapsed="0.000364"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:49.046639" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:49.046402" elapsed="0.000260"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-10-11T01:04:49.046997" 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-10-11T01:04:49.046833" elapsed="0.000193">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-10-11T01:04:49.040772" elapsed="0.006377">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-10-11T01:04:49.047234" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:49.047505" level="INFO">${response_text} = None</msg>
<msg time="2026-10-11T01:04:49.047532" 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-10-11T01:04:49.031981" elapsed="0.015577">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-10-11T01:04:49.047615" elapsed="0.000024"/>
</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-10-11T01:04:48.989167" elapsed="0.058599">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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:48.988605" elapsed="0.059217"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:04:48.988091" elapsed="0.059784"/>
</kw>
<arg>l3vpn_mcast_ipv6</arg>
<arg>${L3VPN_MCAST_DIR}</arg>
<status status="PASS" start="2026-10-11T01:04:46.766570" elapsed="2.281349"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:46.666287" elapsed="2.381737"/>
</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-10-11T01:04:49.049398" elapsed="0.000215"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:04:49.049143" elapsed="0.000519"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:49.050569" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:49.050483" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:49.050466" elapsed="0.000164"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:49.052747" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:49.052652" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:49.052635" elapsed="0.000173"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:49.053719" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:49.053370" elapsed="0.000375"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:04:49.054156" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:04:49.053898" elapsed="0.000282"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:04:49.054219" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:49.054345" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:04:49.053015" elapsed="0.001352"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:49.056865" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:49.056781" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:49.056763" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:49.057975" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:49.057892" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:49.057874" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:49.058353" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:04:49.058185" elapsed="0.000192"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:49.058720" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:49.058567" elapsed="0.000177"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:04:49.095869" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:04:49.059235" elapsed="0.036734"/>
</kw>
<msg time="2026-10-11T01:04:49.096123" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:04:49.096164" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:49.058907" elapsed="0.037292"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:04:49.142634" 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-10-11T01:04:49.096740" elapsed="0.046046"/>
</kw>
<msg time="2026-10-11T01:04:49.142935" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:04:49.142976" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:49.096367" elapsed="0.046645"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:49.143291" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:49.143079" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:49.143062" elapsed="0.000301"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:49.143808" 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-10-11T01:04:49.143569" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:49.144139" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:49.143939" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:49.143922" elapsed="0.000288"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:04:49.144239" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:49.146809" elapsed="0.000117"/>
</kw>
<msg time="2026-10-11T01:04:49.146983" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:49.145620" 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-10-11T01:04:49.147438" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:49.147786" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:04:49.145015" 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-10-11T01:04:49.144536" elapsed="0.003493"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:04:49.057620" elapsed="0.090481"/>
</kw>
<msg time="2026-10-11T01:04:49.148182" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:49.148222" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:49.057078" elapsed="0.091179"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:04:49.148436" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:04:49.148324" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:49.148307" 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-10-11T01:04:49.148845" 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-10-11T01:04:49.149144" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:04:49.149207" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T01:04:49.056483" elapsed="0.092807"/>
</kw>
<msg time="2026-10-11T01:04:49.149371" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:49.149435" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:49.054722" elapsed="0.094751"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:49.149771" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:49.149540" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:49.149523" elapsed="0.000318"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:04:49.054567" elapsed="0.095296"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:04:49.054427" elapsed="0.095493"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:04:49.052347" elapsed="0.097624"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:04:49.050216" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:49.049824" elapsed="0.100235"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:04:49.048798" elapsed="0.101307"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:49.151219" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:49.150819" elapsed="0.000427"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:49.151839" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:49.151443" elapsed="0.000421"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:49.152376" 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-10-11T01:04:49.152045" elapsed="0.000356"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:49.152737" 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-10-11T01:04:49.152862" 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-10-11T01:04:49.152584" elapsed="0.000302"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:49.153183" 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-10-11T01:04:49.153294" 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-10-11T01:04:49.153049" elapsed="0.000269"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:04:49.153475" elapsed="0.002450"/>
</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-10-11T01:04:49.156084" elapsed="0.002256"/>
</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-10-11T01:04:49.175167" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:49.174864" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:49.175900" 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-10-11T01:04:49.175688" elapsed="0.000278">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-10-11T01:04:49.176051" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:49.175352" elapsed="0.000721"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:49.176570" 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-10-11T01:04:49.176245" elapsed="0.000350"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:49.176884" 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-10-11T01:04:49.177071" 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-10-11T01:04:49.176774" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:49.177573" 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-10-11T01:04:49.177326" 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-10-11T01:04:49.178529" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:49.178282" elapsed="0.000289"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:49.179004" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:49.178758" elapsed="0.000270"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:49.179811" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:49.179339" elapsed="0.000497"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:49.180968" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:49.180447" elapsed="0.000609"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:49.181135" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:04:49.181346" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:49.180007" elapsed="0.001362"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:49.181559" elapsed="0.000324"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:04:49.179208" elapsed="0.002714"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:49.182606" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:49.182153" elapsed="0.000478"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:49.183768" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:49.183237" elapsed="0.000620"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:49.183938" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:04:49.184149" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:49.182811" elapsed="0.001362"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:49.184337" elapsed="0.000312"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:49.182021" elapsed="0.002666"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:49.179070" elapsed="0.005661"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:49.184769" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:49.184895" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:49.177943" elapsed="0.006976"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:49.177677" elapsed="0.007271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:49.185119" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:49.184970" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:49.177659" elapsed="0.007528"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:49.186026" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3v...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:49.185346" elapsed="0.000708"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:49.186098" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:49.174329" elapsed="0.011868"/>
</kw>
<msg time="2026-10-11T01:04:49.186245" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:49.170031" elapsed="0.016257"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:49.190510" 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/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-10-11T01:04:49.194600" 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/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-10-11T01:04:49.198658" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:49.198854" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:49.199036" 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-10-11T01:04:49.199372" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:49.199226" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:49.199212" 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-10-11T01:04:49.199616" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:49.199807" 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-10-11T01:04:49.199973" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:49.199187" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:49.199101" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:49.200195" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:49.200259" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:49.200369" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3v...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:04:49.169402" elapsed="0.030991"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:49.201518" 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-10-11T01:04:49.201308" elapsed="0.000270">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-10-11T01:04:49.201660" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:49.200985" elapsed="0.000697"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:49.201977" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:49.201757" elapsed="0.000271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:49.202534" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:49.202249" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:49.202078" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:49.201740" elapsed="0.000870"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:49.203118" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:49.202783" elapsed="0.000359"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:49.203186" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:49.203308" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:49.200672" elapsed="0.002659"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:49.204434" 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-10-11T01:04:49.204230" elapsed="0.000264">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-10-11T01:04:49.204578" 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-10-11T01:04:49.203912" elapsed="0.000688"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:04:49.204772" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:04:49.204662" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:49.204645" elapsed="0.000203"/>
</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-10-11T01:04:49.205002" elapsed="0.000019"/>
</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-10-11T01:04:49.205177" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:04:49.205235" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:49.205357" 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-10-11T01:04:49.203602" elapsed="0.001778"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:49.206618" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:49.206382" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:49.207080" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:49.206864" elapsed="0.000256"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:49.213870" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node011peadqcdwn7ieyx6aexk11xu23.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:49.213994" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:49.214091" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:49.207585" elapsed="0.006865">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:49.207180" elapsed="0.007345">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:49.214721" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:49.214555" elapsed="0.000253"/>
</branch>
<status status="FAIL" start="2026-10-11T01:04:49.207163" elapsed="0.007668">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:49.215160" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:49.215278" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:49.215246" elapsed="0.000069"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:49.215230" elapsed="0.000104"/>
</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-10-11T01:04:49.215488" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:04:49.215551" 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-10-11T01:04:49.205683" elapsed="0.009961">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:49.215718" 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-10-11T01:04:49.160930" elapsed="0.054874">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:49.216045" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:49.215884" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:49.215868" elapsed="0.000261"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:49.216158" elapsed="0.000013"/>
</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-10-11T01:04:49.160285" elapsed="0.055958">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:51.251265" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:51.250368" elapsed="0.000966"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:51.253024" 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-10-11T01:04:51.252567" elapsed="0.000607">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-10-11T01:04:51.253364" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:51.251789" elapsed="0.001657"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.254652" 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-10-11T01:04:51.253865" elapsed="0.000876"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:51.255369" 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-10-11T01:04:51.255828" 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-10-11T01:04:51.255117" elapsed="0.000767"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.256871" 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-10-11T01:04:51.256322" elapsed="0.000647"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.259508" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:51.258951" elapsed="0.000653"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.260651" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:51.260023" elapsed="0.000716"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.262643" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:51.261516" elapsed="0.001217"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:51.265341" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:51.264149" elapsed="0.001455"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:51.265842" elapsed="0.000088"/>
</return>
<msg time="2026-10-11T01:04:51.266337" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:51.263133" elapsed="0.003258"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:51.266831" elapsed="0.000762"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:04:51.261177" elapsed="0.006536"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.269331" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:51.268244" elapsed="0.001143"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:51.272224" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:51.271022" elapsed="0.001450"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:51.272660" elapsed="0.000087"/>
</return>
<msg time="2026-10-11T01:04:51.273150" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:51.269959" elapsed="0.003244"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:51.273611" elapsed="0.000692"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:51.267952" elapsed="0.006438"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:51.260850" elapsed="0.013687"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:51.274637" elapsed="0.000073"/>
</return>
<msg time="2026-10-11T01:04:51.274860" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:51.257744" elapsed="0.017151"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.257119" elapsed="0.017816"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.275175" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.274967" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.257075" elapsed="0.018198"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.276258" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3v...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:51.275524" elapsed="0.000773"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:51.276357" 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/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-10-11T01:04:51.249151" elapsed="0.027422"/>
</kw>
<msg time="2026-10-11T01:04:51.276644" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:51.239243" elapsed="0.037484"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:51.282542" 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-10-11T01:04:51.288536" 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/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-10-11T01:04:51.294484" elapsed="0.000042"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.294763" 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-10-11T01:04:51.295022" 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-10-11T01:04:51.295520" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.295291" elapsed="0.000309"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:51.295273" elapsed="0.000357"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.295864" 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-10-11T01:04:51.296116" 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-10-11T01:04:51.296345" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:51.295236" elapsed="0.001193"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:51.295114" elapsed="0.001351"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.296677" elapsed="0.000039"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:51.296784" elapsed="0.000021"/>
</return>
<msg time="2026-10-11T01:04:51.296936" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/bgp-l3v...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:04:51.237849" elapsed="0.059122"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:51.298534" 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-10-11T01:04:51.298253" elapsed="0.000369">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-10-11T01:04:51.298752" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:51.297799" elapsed="0.000986"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.299181" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.298874" elapsed="0.000421"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.299988" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:51.299600" elapsed="0.000422"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.299326" elapsed="0.000741"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.298850" elapsed="0.001245"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.300833" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:51.300321" elapsed="0.000546"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:51.300930" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T01:04:51.301104" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:51.297343" elapsed="0.003793"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:51.302669" 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-10-11T01:04:51.302389" elapsed="0.000377">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-10-11T01:04:51.302884" 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-10-11T01:04:51.301942" elapsed="0.000974"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:04:51.303143" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-10-11T01:04:51.303005" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.302981" 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-10-11T01:04:51.303488" elapsed="0.000028"/>
</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-10-11T01:04:51.303747" elapsed="0.000027"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:04:51.303829" elapsed="0.000019"/>
</return>
<msg time="2026-10-11T01:04:51.304001" 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-10-11T01:04:51.301506" elapsed="0.002527"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.305778" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:51.305451" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.306488" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:51.306107" elapsed="0.000448"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:51.315215" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node011peadqcdwn7ieyx6aexk11xu23.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:51.315405" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:51.315572" 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-10-11T01:04:51.306986" elapsed="0.008623"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.306642" elapsed="0.009021"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.315930" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.315716" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.306618" elapsed="0.009422"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.318200" 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-10-11T01:04:51.317730" elapsed="0.000534"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.317360" elapsed="0.000948"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.317336" elapsed="0.001004"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.319164" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:51.318788" elapsed="0.000433"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.318431" elapsed="0.000834"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.318390" elapsed="0.000906"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.320100" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:51.319587" elapsed="0.000548"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.320543" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.320224" elapsed="0.000398"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.321268" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:51.320900" elapsed="0.000402"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.320653" elapsed="0.000695"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.320201" elapsed="0.001174"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.322129" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:51.321644" elapsed="0.000520"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.322568" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.322251" elapsed="0.000391"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.323277" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:51.322913" elapsed="0.000398"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.322672" elapsed="0.000683"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.322228" elapsed="0.001154"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:51.323612" elapsed="0.000424"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:51.324600" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:51.324261" 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-10-11T01:04:51.324864" elapsed="0.000294"/>
</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-10-11T01:04:51.316877" elapsed="0.008360"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:51.325461" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:51.325324" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.325301" elapsed="0.000246"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:51.326673" 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-10-11T01:04:51.325757" elapsed="0.000970"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:51.326793" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T01:04:51.326975" 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-10-11T01:04:51.304443" elapsed="0.022567"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:51.327088" elapsed="0.000033"/>
</return>
<msg time="2026-10-11T01:04:51.327255" 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-10-11T01:04:51.221564" elapsed="0.105765"/>
</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-10-11T01:04:51.339632" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:51.339309" elapsed="0.000350"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:51.340392" 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-10-11T01:04:51.340151" elapsed="0.000388">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-10-11T01:04:51.340716" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:51.339832" elapsed="0.000909"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.341227" 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-10-11T01:04:51.340918" elapsed="0.000334"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:51.341556" 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-10-11T01:04:51.341711" 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-10-11T01:04:51.341435" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.342152" 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-10-11T01:04:51.341936" elapsed="0.000265"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:51.342580" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.342262" elapsed="0.000373"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.343261" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:51.342817" elapsed="0.000469"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.342657" elapsed="0.000662"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.342244" elapsed="0.001094"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.343932" 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-10-11T01:04:51.343522" elapsed="0.000437"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:51.344003" 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/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-10-11T01:04:51.338805" elapsed="0.005299"/>
</kw>
<msg time="2026-10-11T01:04:51.344160" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:51.334378" elapsed="0.009828"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:51.348357" 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/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-10-11T01:04:51.352426" 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/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-10-11T01:04:51.356713" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.356898" 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-10-11T01:04:51.357082" 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-10-11T01:04:51.357446" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.357284" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:51.357271" 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-10-11T01:04:51.357677" 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-10-11T01:04:51.357871" 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-10-11T01:04:51.358036" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:51.357244" elapsed="0.000839"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:51.357151" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.358263" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:51.358329" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:51.358474" 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-10-11T01:04:51.333667" elapsed="0.024832"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:51.358667" elapsed="0.000331"/>
</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-10-11T01:04:51.360083" 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-10-11T01:04:51.359647" elapsed="0.000463"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:51.360738" 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-10-11T01:04:51.360262" elapsed="0.000504"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:04:51.360952" elapsed="0.000279"/>
</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-10-11T01:04:51.359269" elapsed="0.002018"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.359068" elapsed="0.002248"/>
</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-10-11T01:04:51.361530" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.361339" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.359052" elapsed="0.002549"/>
</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-10-11T01:04:51.328720" elapsed="0.032924"/>
</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-10-11T01:04:51.327766" elapsed="0.033954"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.327457" elapsed="0.034304"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.327433" elapsed="0.034350"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:51.361813" elapsed="0.000026"/>
</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-10-11T01:04:51.219935" elapsed="0.141978"/>
</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-10-11T01:04:49.158557" elapsed="2.203410"/>
</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-10-11T01:04:51.377525" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:51.377207" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:51.378212" 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-10-11T01:04:51.378041" elapsed="0.000231">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-10-11T01:04:51.378354" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:51.377721" elapsed="0.000656"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.378885" 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-10-11T01:04:51.378567" elapsed="0.000343"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:51.379184" 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-10-11T01:04:51.379298" 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-10-11T01:04:51.379077" elapsed="0.000245"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.379760" 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-10-11T01:04:51.379532" elapsed="0.000270"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.380705" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:51.380465" elapsed="0.000283"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.381180" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:51.380925" elapsed="0.000279"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.382025" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:04:51.381579" elapsed="0.000471"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:51.383187" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:51.382672" elapsed="0.000603"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:51.383354" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:04:51.383586" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:51.382224" 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-10-11T01:04:51.383792" elapsed="0.000308"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/effective-rib-in</var>
<status status="PASS" start="2026-10-11T01:04:51.381440" elapsed="0.002698"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.384833" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:51.384367" elapsed="0.000490"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:51.385991" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:51.385482" elapsed="0.000596"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:51.386158" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:04:51.386366" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:51.385028" elapsed="0.001362"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:51.386574" elapsed="0.000326"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:51.384238" elapsed="0.002700"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:51.381280" elapsed="0.005689"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:51.387006" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:51.387136" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:51.380114" elapsed="0.007045"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.379864" elapsed="0.007324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.387359" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.387210" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.379846" elapsed="0.007656"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.388172" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/b...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:51.387664" elapsed="0.000535"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:51.388242" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:51.376701" elapsed="0.011640"/>
</kw>
<msg time="2026-10-11T01:04:51.388389" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:51.372261" elapsed="0.016247"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:51.392853" 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/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-10-11T01:04:51.396917" 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/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-10-11T01:04:51.401004" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.401188" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.401378" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.401744" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.401587" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:51.401572" 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-10-11T01:04:51.401972" 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-10-11T01:04:51.402150" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.402313" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:51.401547" elapsed="0.000813"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:51.401461" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.402562" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:51.402628" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:51.402748" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv6-address-family,bgp-l3vpn-mcast%3Amcast-mpls-labeled-vpn-subsequent-address-family/b...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:04:51.371657" elapsed="0.031116"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:51.403895" 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-10-11T01:04:51.403707" elapsed="0.000247">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-10-11T01:04:51.404037" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:51.403340" elapsed="0.000719"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.404348" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.404122" elapsed="0.000277"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.404885" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:51.404607" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.404437" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.404105" elapsed="0.000856"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.405483" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:51.405132" elapsed="0.000374"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:51.405551" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:51.405673" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:51.403037" elapsed="0.002669"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:51.406797" 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-10-11T01:04:51.406600" elapsed="0.000292">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-10-11T01:04:51.406978" 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-10-11T01:04:51.406257" elapsed="0.000743"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:04:51.407161" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:04:51.407063" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.407046" elapsed="0.000190"/>
</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-10-11T01:04:51.407397" 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-10-11T01:04:51.407591" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:04:51.407649" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:04:51.407783" 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-10-11T01:04:51.405956" elapsed="0.001850"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.409022" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:51.408801" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.409508" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:51.409275" 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-10-11T01:04:51.415806" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node011peadqcdwn7ieyx6aexk11xu23.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:51.415919" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:04:51.416006" 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-10-11T01:04:51.409858" elapsed="0.006172"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.409615" elapsed="0.006454"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.416250" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.416093" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.409598" elapsed="0.006730"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.417626" 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-10-11T01:04:51.417272" elapsed="0.000400"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.417015" elapsed="0.000703"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.416998" elapsed="0.000744"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.418318" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:51.418051" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.417792" elapsed="0.000597"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.417777" elapsed="0.000650"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.418974" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:51.418620" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.419273" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.419062" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.419844" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:51.419568" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.419379" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.419045" elapsed="0.000875"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.420452" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:51.420103" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.420763" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.420540" elapsed="0.000276"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.421259" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:51.420999" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.420838" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.420524" elapsed="0.000812"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:51.421494" elapsed="0.000303"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:51.422178" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:51.421959" elapsed="0.000242"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:51.422356" elapsed="0.000224"/>
</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-10-11T01:04:51.416668" elapsed="0.005967"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:51.422788" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:51.422706" elapsed="0.000121"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.422679" elapsed="0.000168"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:51.423605" 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-10-11T01:04:51.422989" elapsed="0.000643"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:51.423678" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T01:04:51.423817" 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-10-11T01:04:51.408082" elapsed="0.015759"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:51.423895" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:04:51.424014" 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-10-11T01:04:51.364471" elapsed="0.059566"/>
</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-10-11T01:04:51.434675" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:51.434350" elapsed="0.000365"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:51.435425" 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-10-11T01:04:51.435190" elapsed="0.000354">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-10-11T01:04:51.435718" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:51.434876" elapsed="0.000896"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.436265" 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-10-11T01:04:51.435957" elapsed="0.000333"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:51.436596" 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-10-11T01:04:51.436727" 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-10-11T01:04:51.436478" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.437166" 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-10-11T01:04:51.436949" elapsed="0.000265"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:51.437616" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.437276" elapsed="0.000408"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.438306" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:51.437868" elapsed="0.000463"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.437722" elapsed="0.000642"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.437258" elapsed="0.001125"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.438965" 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-10-11T01:04:51.438567" elapsed="0.000424"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:51.439035" 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/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-10-11T01:04:51.433846" elapsed="0.005289"/>
</kw>
<msg time="2026-10-11T01:04:51.439188" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:51.429454" elapsed="0.009779"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:51.443359" 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/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-10-11T01:04:51.447464" 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/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-10-11T01:04:51.452540" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.452737" 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-10-11T01:04:51.452920" 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-10-11T01:04:51.453259" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.453113" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:51.453099" 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-10-11T01:04:51.453501" 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-10-11T01:04:51.453682" 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-10-11T01:04:51.453857" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:51.453075" elapsed="0.000830"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:51.452985" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.454079" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:51.454144" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:51.454273" 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-10-11T01:04:51.428741" elapsed="0.025558"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:51.454480" elapsed="0.000332"/>
</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-10-11T01:04:51.455903" 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-10-11T01:04:51.455464" elapsed="0.000467"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:51.456513" 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-10-11T01:04:51.456084" 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-10-11T01:04:51.456749" elapsed="0.000280"/>
</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-10-11T01:04:51.455084" elapsed="0.002001"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.454883" elapsed="0.002232"/>
</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-10-11T01:04:51.457326" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.457137" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.454866" elapsed="0.002530"/>
</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-10-11T01:04:51.424991" elapsed="0.032465"/>
</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-10-11T01:04:51.424310" elapsed="0.033211"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.424109" elapsed="0.033487"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.424094" elapsed="0.033525"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:51.457649" elapsed="0.000027"/>
</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-10-11T01:04:51.363842" elapsed="0.093918"/>
</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-10-11T01:04:51.362157" elapsed="0.095655"/>
</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-10-11T01:04:51.473485" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:51.473166" elapsed="0.000346"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:51.474176" 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-10-11T01:04:51.474005" elapsed="0.000230">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-10-11T01:04:51.474319" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:51.473673" elapsed="0.000668"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.474856" 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-10-11T01:04:51.474530" elapsed="0.000351"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:51.475155" 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-10-11T01:04:51.475270" 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-10-11T01:04:51.475048" elapsed="0.000246"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.475737" 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-10-11T01:04:51.475506" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.476679" 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-10-11T01:04:51.476446" elapsed="0.000286"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.477159" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:51.476910" elapsed="0.000272"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.477949" 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-10-11T01:04:51.477506" elapsed="0.000468"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:51.479098" 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-10-11T01:04:51.478589" elapsed="0.000596"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:51.479266" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:04:51.479495" 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-10-11T01:04:51.478145" elapsed="0.001379"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:51.479700" elapsed="0.000302"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:04:51.477360" elapsed="0.002680"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.480732" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:51.480269" elapsed="0.000488"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:51.481892" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:51.481355" elapsed="0.000654"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:51.482092" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:04:51.482303" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:51.480927" 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-10-11T01:04:51.482512" elapsed="0.000311"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:51.480139" elapsed="0.002724"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:51.477225" elapsed="0.005670"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:51.482933" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:51.483062" 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-10-11T01:04:51.476091" elapsed="0.006995"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.475842" elapsed="0.007273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.483288" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.483137" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.475824" elapsed="0.007533"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.484138" 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-10-11T01:04:51.483628" elapsed="0.000537"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:51.484209" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:51.472650" elapsed="0.011658"/>
</kw>
<msg time="2026-10-11T01:04:51.484356" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:51.468195" elapsed="0.016205"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:51.488715" 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/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-10-11T01:04:51.492838" 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/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-10-11T01:04:51.496940" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.497123" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.497305" elapsed="0.000089"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.497750" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.497592" elapsed="0.000241"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:51.497579" 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-10-11T01:04:51.498017" 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-10-11T01:04:51.498199" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.498364" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:51.497553" elapsed="0.000873"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:51.497456" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.498605" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:51.498672" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:51.498790" 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-10-11T01:04:51.467587" elapsed="0.031228"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:51.499916" 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-10-11T01:04:51.499729" elapsed="0.000246">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-10-11T01:04:51.500058" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:51.499378" elapsed="0.000703"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.500362" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.500143" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.500897" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:51.500621" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.500453" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.500127" elapsed="0.000847"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.501489" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:51.501135" elapsed="0.000379"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:51.501562" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:51.501686" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:51.499077" elapsed="0.002642"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:51.502809" 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-10-11T01:04:51.502610" elapsed="0.000258">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-10-11T01:04:51.502952" 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-10-11T01:04:51.502273" elapsed="0.000701"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:04:51.503134" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:04:51.503036" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.503020" elapsed="0.000190"/>
</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-10-11T01:04:51.503366" elapsed="0.000019"/>
</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-10-11T01:04:51.503559" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:04:51.503617" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:04:51.503790" 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-10-11T01:04:51.501970" elapsed="0.001845"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.505037" 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-10-11T01:04:51.504812" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.505505" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:51.505273" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:51.510626" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node011peadqcdwn7ieyx6aexk11xu23.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:51.510752" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:04:51.510850" 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-10-11T01:04:51.505845" elapsed="0.005030"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.505606" elapsed="0.005309"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.511091" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.510939" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.505589" elapsed="0.005578"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.512445" 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-10-11T01:04:51.512097" elapsed="0.000395"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.511858" elapsed="0.000666"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.511841" elapsed="0.000706"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.513116" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:51.512847" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.512596" elapsed="0.000592"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.512581" elapsed="0.000630"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.513756" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:51.513387" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.514064" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.513846" elapsed="0.000272"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.514667" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:51.514343" elapsed="0.000363"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.514141" elapsed="0.000601"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.513828" elapsed="0.000934"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.515289" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:51.514941" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.515607" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.515378" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.516120" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:51.515859" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.515682" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.515362" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:51.516399" elapsed="0.000332"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:51.517125" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:51.516893" elapsed="0.000256"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:51.517303" elapsed="0.000233"/>
</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-10-11T01:04:51.511504" elapsed="0.006094"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:51.517759" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:51.517662" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.517645" elapsed="0.000177"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:51.518624" 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-10-11T01:04:51.517964" elapsed="0.000687"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:51.518709" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:04:51.518843" 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-10-11T01:04:51.504090" elapsed="0.014779"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:51.518924" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:04:51.519046" 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-10-11T01:04:51.460272" elapsed="0.058798"/>
</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-10-11T01:04:51.529808" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:51.529495" elapsed="0.000339"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:51.530574" 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-10-11T01:04:51.530312" elapsed="0.000398">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-10-11T01:04:51.530874" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:51.529993" elapsed="0.000905"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.531379" 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-10-11T01:04:51.531072" elapsed="0.000347"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:51.531714" 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-10-11T01:04:51.531852" 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-10-11T01:04:51.531593" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.532291" 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-10-11T01:04:51.532071" 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-10-11T01:04:51.532767" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.532454" elapsed="0.000368"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.533459" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:51.532994" elapsed="0.000495"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.532846" elapsed="0.000682"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.532436" elapsed="0.001112"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.534114" 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-10-11T01:04:51.533723" elapsed="0.000417"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:51.534185" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:51.528975" elapsed="0.005310"/>
</kw>
<msg time="2026-10-11T01:04:51.534340" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:51.524564" elapsed="0.009822"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:51.538549" 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/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-10-11T01:04:51.542636" 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/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-10-11T01:04:51.546870" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.547055" 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-10-11T01:04:51.547238" 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-10-11T01:04:51.547604" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.547457" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:51.547444" 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-10-11T01:04:51.547842" 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-10-11T01:04:51.548021" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.548185" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:51.547415" elapsed="0.000817"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:51.547307" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.548458" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:51.548528" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:51.548657" 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-10-11T01:04:51.523841" elapsed="0.024842"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:51.548863" elapsed="0.000315"/>
</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-10-11T01:04:51.550257" 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-10-11T01:04:51.549839" elapsed="0.000445"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:51.550876" 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-10-11T01:04:51.550454" 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-10-11T01:04:51.551087" elapsed="0.000280"/>
</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-10-11T01:04:51.549463" elapsed="0.001975"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.549248" elapsed="0.002221"/>
</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-10-11T01:04:51.551676" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.551494" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.549232" elapsed="0.002527"/>
</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-10-11T01:04:51.520054" elapsed="0.031748"/>
</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-10-11T01:04:51.519356" elapsed="0.032510"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.519144" elapsed="0.032762"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.519128" elapsed="0.032799"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:51.551957" elapsed="0.000026"/>
</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-10-11T01:04:51.459657" elapsed="0.092401"/>
</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-10-11T01:04:51.458001" elapsed="0.094111"/>
</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-10-11T01:04:51.552265" elapsed="0.002764"/>
</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-10-11T01:04:51.570768" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:51.570451" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:51.571469" 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-10-11T01:04:51.571271" elapsed="0.000259">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-10-11T01:04:51.571648" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:51.570954" elapsed="0.000718"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.572170" 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-10-11T01:04:51.571860" elapsed="0.000335"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:51.572487" 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-10-11T01:04:51.572610" 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-10-11T01:04:51.572362" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.573057" 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-10-11T01:04:51.572839" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.574007" 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-10-11T01:04:51.573777" elapsed="0.000272"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.574494" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:51.574226" elapsed="0.000292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.575272" 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-10-11T01:04:51.574845" elapsed="0.000451"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:51.576442" 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-10-11T01:04:51.575928" elapsed="0.000604"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:51.576613" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:04:51.576835" 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-10-11T01:04:51.575490" elapsed="0.001368"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:51.577025" elapsed="0.000301"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:04:51.574714" elapsed="0.002649"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.578055" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:51.577613" elapsed="0.000467"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:51.579223" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:51.578720" elapsed="0.000590"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:51.579389" elapsed="0.000049"/>
</return>
<msg time="2026-10-11T01:04:51.579624" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:51.578248" 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-10-11T01:04:51.579824" elapsed="0.000300"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:51.577482" elapsed="0.002680"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:51.574563" elapsed="0.005631"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:51.580232" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:51.580360" 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-10-11T01:04:51.573425" elapsed="0.006958"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.573160" elapsed="0.007332"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.580674" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.580517" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.573143" elapsed="0.007612"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.581474" 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-10-11T01:04:51.580914" elapsed="0.000589"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:51.581547" 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-10-11T01:04:51.569932" elapsed="0.011749"/>
</kw>
<msg time="2026-10-11T01:04:51.581742" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:51.565420" elapsed="0.016368"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:51.586065" 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/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-10-11T01:04:51.590159" 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/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-10-11T01:04:51.594230" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.594426" 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-10-11T01:04:51.594609" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.594961" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.594814" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:51.594801" 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-10-11T01:04:51.595189" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.595369" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.595548" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:51.594774" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:51.594673" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.595779" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:51.595847" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:51.595954" 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-10-11T01:04:51.564813" elapsed="0.031166"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:51.597133" 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-10-11T01:04:51.596938" elapsed="0.000254">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-10-11T01:04:51.597275" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:51.596596" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.597598" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.597361" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.598112" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:51.597850" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.597672" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.597344" elapsed="0.000845"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.598719" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:51.598350" elapsed="0.000394"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:51.598789" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:51.598913" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:51.596278" elapsed="0.002657"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:51.599982" 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-10-11T01:04:51.599832" elapsed="0.000199"/>
</kw>
<msg time="2026-10-11T01:04:51.600106" 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-10-11T01:04:51.599501" elapsed="0.000627"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:04:51.600288" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:51.600191" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.600175" elapsed="0.000173"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:51.600644" 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-10-11T01:04:51.600780" 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-10-11T01:04:51.600520" elapsed="0.000284"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:04:51.601148" 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-10-11T01:04:51.600965" elapsed="0.000207"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:04:51.601213" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:51.601337" 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-10-11T01:04:51.599185" elapsed="0.002174"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.602604" 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-10-11T01:04:51.602367" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.603062" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:51.602848" elapsed="0.000253"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:51.608517" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node011peadqcdwn7ieyx6aexk11xu23.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:51.608806" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:04:51.609006" 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-10-11T01:04:51.603388" elapsed="0.005643"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.603161" elapsed="0.005909"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.609248" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.609094" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.603144" elapsed="0.006180"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.610597" 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-10-11T01:04:51.610247" elapsed="0.000397"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.610007" elapsed="0.000669"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.609989" elapsed="0.000721"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.611267" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:51.611000" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.610761" elapsed="0.000578"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.610746" elapsed="0.000615"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.611906" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:51.611554" elapsed="0.000377"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.612204" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.611994" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.612733" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:51.612457" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.612278" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.611978" elapsed="0.000832"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.613319" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:51.612986" elapsed="0.000357"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.613634" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.613421" elapsed="0.000264"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.614142" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:51.613881" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.613718" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.613390" elapsed="0.000828"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:51.614362" elapsed="0.000305"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:51.615060" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:51.614842" elapsed="0.000242"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:51.615238" elapsed="0.000222"/>
</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-10-11T01:04:51.609659" elapsed="0.005859"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:51.615662" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:51.615580" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.615563" elapsed="0.000174"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:51.616586" 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-10-11T01:04:51.615879" elapsed="0.000734"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:51.616660" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:51.616800" 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-10-11T01:04:51.601663" elapsed="0.015189"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:51.616910" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:51.617033" 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-10-11T01:04:51.557555" elapsed="0.059502"/>
</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-10-11T01:04:51.627707" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:51.627380" elapsed="0.000355"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:51.628451" 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-10-11T01:04:51.628214" elapsed="0.000355">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-10-11T01:04:51.628742" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:51.627895" elapsed="0.000871"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.629249" 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-10-11T01:04:51.628941" elapsed="0.000333"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:51.629577" 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-10-11T01:04:51.629707" 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-10-11T01:04:51.629459" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.630146" 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-10-11T01:04:51.629928" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:51.630562" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.630247" elapsed="0.000369"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.631244" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:51.630798" elapsed="0.000471"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:51.630638" elapsed="0.000664"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:51.630230" elapsed="0.001092"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.631897" 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-10-11T01:04:51.631506" elapsed="0.000417"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:51.631967" 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/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-10-11T01:04:51.626875" elapsed="0.005193"/>
</kw>
<msg time="2026-10-11T01:04:51.632115" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:51.622489" elapsed="0.009670"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:51.636308" 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/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-10-11T01:04:51.640394" 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/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-10-11T01:04:51.644607" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.644804" 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-10-11T01:04:51.644986" 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-10-11T01:04:51.645322" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.645178" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:51.645164" 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-10-11T01:04:51.645565" 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-10-11T01:04:51.645757" 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-10-11T01:04:51.645923" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:51.645139" elapsed="0.000831"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:51.645051" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:51.646146" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:51.646211" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:51.646314" 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-10-11T01:04:51.621773" elapsed="0.024567"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:51.646520" elapsed="0.000325"/>
</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-10-11T01:04:51.647742" 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-10-11T01:04:51.647490" elapsed="0.000279"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:51.648472" 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-10-11T01:04:51.647918" elapsed="0.000608"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:04:51.648991" 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-10-11T01:04:51.649182" 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-10-11T01:04:51.648720" elapsed="0.000527">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-10-11T01:04:51.647115" elapsed="0.002283">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-10-11T01:04:51.646915" elapsed="0.002588">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-10-11T01:04:51.649724" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:51.649537" elapsed="0.000238"/>
</branch>
<status status="FAIL" start="2026-10-11T01:04:51.646898" elapsed="0.002898">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-10-11T01:04:51.618026" elapsed="0.031900">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-10-11T01:04:51.617337" elapsed="0.032762">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-10-11T01:04:51.617131" elapsed="0.033057">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-10-11T01:04:51.617115" elapsed="0.033107">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-10-11T01:04:51.650267" elapsed="0.000015"/>
</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-10-11T01:04:51.556924" elapsed="0.093467">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-10-11T01:04:53.686334" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:53.685568" elapsed="0.000830"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:53.688122" 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-10-11T01:04:53.687659" elapsed="0.000609">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-10-11T01:04:53.688618" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:53.686865" elapsed="0.001810"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:53.689890" 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-10-11T01:04:53.689104" elapsed="0.000843"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:53.690606" 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-10-11T01:04:53.690911" 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-10-11T01:04:53.690323" elapsed="0.000642"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:53.691948" 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-10-11T01:04:53.691402" elapsed="0.000640"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:53.694147" 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-10-11T01:04:53.693609" elapsed="0.000630"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:53.695255" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:53.694667" elapsed="0.000642"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:53.696704" 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-10-11T01:04:53.695996" elapsed="0.000745"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:53.698382" 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-10-11T01:04:53.697642" elapsed="0.000908"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:53.698672" elapsed="0.000066"/>
</return>
<msg time="2026-10-11T01:04:53.699008" 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-10-11T01:04:53.696991" elapsed="0.002049"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:53.699279" elapsed="0.000508"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:04:53.695808" elapsed="0.004033"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:53.700811" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:53.700163" elapsed="0.000682"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:53.702580" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:53.701746" elapsed="0.000978"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:53.702842" elapsed="0.000044"/>
</return>
<msg time="2026-10-11T01:04:53.703146" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:53.701083" elapsed="0.002096"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:53.703501" elapsed="0.002329"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:53.699981" elapsed="0.005907"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:53.695448" elapsed="0.010487"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:53.705993" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T01:04:53.706182" 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-10-11T01:04:53.692819" elapsed="0.013398"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:53.692187" elapsed="0.014073"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:53.706570" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:53.706294" elapsed="0.000355"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:53.692143" elapsed="0.014534"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:53.707722" 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-10-11T01:04:53.706925" elapsed="0.000838"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:53.707829" 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/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-10-11T01:04:53.684277" elapsed="0.023696"/>
</kw>
<msg time="2026-10-11T01:04:53.708093" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:53.674083" elapsed="0.034078"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:53.714146" 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/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-10-11T01:04:53.720012" 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/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-10-11T01:04:53.724588" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:53.724796" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:53.724988" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:53.725344" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:53.725192" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:53.725177" 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-10-11T01:04:53.725614" 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-10-11T01:04:53.725821" 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-10-11T01:04:53.725995" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:53.725149" elapsed="0.000898"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:53.725058" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:53.726229" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:53.726299" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:04:53.726428" 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-10-11T01:04:53.672578" elapsed="0.053877"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:53.727588" 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-10-11T01:04:53.727383" elapsed="0.000265">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-10-11T01:04:53.727745" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:53.727054" 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-10-11T01:04:53.728091" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:53.727864" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:53.728629" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:53.728347" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:53.728166" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:53.727847" elapsed="0.000875"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:53.729224" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:53.728886" elapsed="0.000362"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:53.729293" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:53.729432" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:53.726743" elapsed="0.002713"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:53.730507" 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-10-11T01:04:53.730349" elapsed="0.000208"/>
</kw>
<msg time="2026-10-11T01:04:53.730632" 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-10-11T01:04:53.730028" elapsed="0.000626"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:04:53.730831" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:53.730733" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:53.730716" elapsed="0.000176"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:53.731167" 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-10-11T01:04:53.731284" 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-10-11T01:04:53.731043" elapsed="0.000264"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:04:53.731668" 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-10-11T01:04:53.731483" elapsed="0.000221"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:04:53.731745" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:53.731870" 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-10-11T01:04:53.729727" elapsed="0.002166"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:53.733109" 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-10-11T01:04:53.732888" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:53.733569" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:53.733339" elapsed="0.000270"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:53.740213" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node011peadqcdwn7ieyx6aexk11xu23.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:53.740351" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:04:53.740478" 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-10-11T01:04:53.734070" elapsed="0.006436"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:53.733667" elapsed="0.006879"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:53.740746" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:53.740571" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:53.733651" elapsed="0.007206"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:53.742137" 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-10-11T01:04:53.741805" elapsed="0.000377"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:53.741545" elapsed="0.000669"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:53.741528" elapsed="0.000709"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:53.742827" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:53.742544" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:53.742288" elapsed="0.000612"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:53.742272" elapsed="0.000651"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:53.743466" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:53.743102" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:53.743781" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:53.743555" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:53.744285" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:53.744019" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:53.743856" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:53.743538" elapsed="0.000824"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:53.744900" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:53.744552" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:53.745197" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:53.744989" elapsed="0.000260"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:53.745723" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:53.745447" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:53.745270" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:53.744972" elapsed="0.000827"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:53.745944" elapsed="0.000291"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:53.746634" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:53.746393" elapsed="0.000265"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:53.746823" elapsed="0.000213"/>
</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-10-11T01:04:53.741187" elapsed="0.005904"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:53.747235" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:53.747152" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:53.747136" elapsed="0.000158"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:53.747917" 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-10-11T01:04:53.747449" elapsed="0.000495"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:04:53.747990" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:53.748115" 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-10-11T01:04:53.732169" elapsed="0.015971"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:53.748195" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:04:53.748315" 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-10-11T01:04:53.655608" elapsed="0.092760"/>
</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-10-11T01:04:53.759393" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:53.759082" elapsed="0.000353"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:53.760159" 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-10-11T01:04:53.759927" elapsed="0.000352">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-10-11T01:04:53.760471" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:53.759596" elapsed="0.000902"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:53.761000" 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-10-11T01:04:53.760675" elapsed="0.000351"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:53.761305" 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-10-11T01:04:53.761447" 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-10-11T01:04:53.761193" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:53.761903" 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-10-11T01:04:53.761672" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:53.762308" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:53.762005" elapsed="0.000356"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:53.763038" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:53.762565" elapsed="0.000498"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:53.762383" elapsed="0.000714"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:53.761987" elapsed="0.001130"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:53.763729" 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-10-11T01:04:53.763283" elapsed="0.000474"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:53.763801" 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/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-10-11T01:04:53.758535" elapsed="0.005367"/>
</kw>
<msg time="2026-10-11T01:04:53.763949" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:53.753790" elapsed="0.010203"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:53.768152" 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/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-10-11T01:04:53.772294" 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/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-10-11T01:04:53.776582" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:53.776777" 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-10-11T01:04:53.776962" 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-10-11T01:04:53.777305" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:53.777160" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:53.777146" 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-10-11T01:04:53.777548" 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-10-11T01:04:53.777745" 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-10-11T01:04:53.777930" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:53.777119" elapsed="0.000860"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:53.777028" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:53.778165" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:53.778234" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:04:53.778351" 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-10-11T01:04:53.753059" elapsed="0.025320"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:53.778576" elapsed="0.000337"/>
</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-10-11T01:04:53.779819" 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-10-11T01:04:53.779562" elapsed="0.000284"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:04:53.780229" 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-10-11T01:04:53.779996" elapsed="0.000258"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:04:53.780448" elapsed="0.000297"/>
</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-10-11T01:04:53.779184" elapsed="0.001617"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:53.778983" elapsed="0.001847"/>
</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-10-11T01:04:53.781027" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:53.780853" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:53.778966" elapsed="0.002183"/>
</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-10-11T01:04:53.749331" elapsed="0.031866"/>
</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-10-11T01:04:53.748667" elapsed="0.032599"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:53.748460" elapsed="0.032846"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:53.748444" elapsed="0.032885"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:53.781361" 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-10-11T01:04:53.654023" elapsed="0.127467"/>
</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-10-11T01:04:51.555218" elapsed="2.226328"/>
</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-10-11T01:04:53.781755" elapsed="0.002571"/>
</kw>
<arg>l3vpn_mcast_ipv6</arg>
<arg>${L3VPN_MCAST_DIR}</arg>
<arg>ipv6</arg>
<status status="PASS" start="2026-10-11T01:04:49.150325" elapsed="4.634055"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:49.048327" elapsed="4.736193"/>
</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-10-11T01:04:53.786057" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:04:53.785786" 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-10-11T01:04:53.787427" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:53.787285" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:53.787261" 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-10-11T01:04:53.789676" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:53.789590" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:53.789573" elapsed="0.000179"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:53.790672" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:53.790323" elapsed="0.000386"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:04:53.791129" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:04:53.790865" elapsed="0.000289"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:04:53.791194" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:53.791324" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:04:53.789964" elapsed="0.001383"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:53.793917" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:53.793830" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:53.793812" elapsed="0.000170"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:53.795073" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:53.794985" elapsed="0.000133"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:53.794966" elapsed="0.000173"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:53.795509" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:04:53.795289" elapsed="0.000247"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:53.795865" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:53.795719" elapsed="0.000170"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:04:53.832681" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:04:53.796380" elapsed="0.036456"/>
</kw>
<msg time="2026-10-11T01:04:53.833096" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:04:53.833148" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:53.796049" elapsed="0.037140"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:04:53.897652" 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-10-11T01:04:53.833859" elapsed="0.063913"/>
</kw>
<msg time="2026-10-11T01:04:53.897923" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:04:53.897964" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:53.833428" elapsed="0.064572"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:53.898306" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:53.898078" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:53.898054" elapsed="0.000326"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:53.898853" 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-10-11T01:04:53.898600" elapsed="0.000325"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:53.899192" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:53.898987" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:53.898970" elapsed="0.000295"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:04:53.899299" 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-10-11T01:04:53.902128" elapsed="0.000126"/>
</kw>
<msg time="2026-10-11T01:04:53.902314" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:53.900825" elapsed="0.001662"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:53.902824" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:53.903227" 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-10-11T01:04:53.900154" elapsed="0.003303"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:04:53.899652" elapsed="0.003873"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:04:53.794720" elapsed="0.108884"/>
</kw>
<msg time="2026-10-11T01:04:53.903710" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:53.903755" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:53.794140" elapsed="0.109654"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:04:53.903954" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T01:04:53.903865" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:53.903847" elapsed="0.000186"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:53.904363" 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-10-11T01:04:53.904722" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:04:53.904791" 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-10-11T01:04:53.793512" elapsed="0.111370"/>
</kw>
<msg time="2026-10-11T01:04:53.904969" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:53.905012" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:53.791705" elapsed="0.113346"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:53.905384" elapsed="0.000134"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:53.905156" elapsed="0.000402"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:53.905138" elapsed="0.000444"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:04:53.791549" elapsed="0.114057"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:04:53.791393" elapsed="0.114244"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:04:53.789279" elapsed="0.116423"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:04:53.786975" elapsed="0.118784"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:53.786501" elapsed="0.119302"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:04:53.785381" elapsed="0.120472"/>
</kw>
<kw name="Kill_BGP_Speaker" owner="BGPSpeaker">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:53.907055" 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-10-11T01:04:53.906756" elapsed="0.000325"/>
</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-10-11T01:04:53.907235" elapsed="0.000196"/>
</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-10-11T01:04:53.906454" elapsed="0.001032"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:04:53.929671" level="INFO">^C
[?2004h[jenkins@releng-26932-423-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-10-11T01:04:53.908005" elapsed="0.021732"/>
</kw>
<msg time="2026-10-11T01:04:53.929823" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:53.929862" level="INFO">${message} = ^C
[?2004h[jenkins@releng-26932-423-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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:53.907653" elapsed="0.022233"/>
</kw>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:04:53.930509" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-10-11T01:04:53.943188" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:04:53.943297" level="INFO">${output_log} = 2026-10-11 01:04:33,667 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 01:04:33,668 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 01:04:33,668 DEBUG BGP-Threa...</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-10-11T01:04:53.930368" elapsed="0.012961"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:53.943893" level="INFO">2026-10-11 01:04:33,667 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 01:04:33,668 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 01:04:33,668 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 01:04:33,668 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 01:04:33,668 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 01:04:33,669 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 01:04:33,671 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 01:04:33,671 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00d90104fbf000b4c0000202bc02ba41040000fbf0060002000104000100010104000100040104000100850104000200040104000100810104000100840104000200810104000200800104000100860104000200860104000200850104000200050104000100800104000100050104400400470104001900460104000200014046003c00010500000286000001810040044700000204000002800000020500000281000001010000018500000184000001860000194600000201000002850000010400000180004700
2026-10-11 01:04:33,671 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 01:04:33,671 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-10-11 01:04:33,671 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-10-11 01:04:33,671 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 01:04:33,671 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 01:04:33,672 INFO BGP-Thread-1 (job):   My BGP Identifier: 169782023
2026-10-11 01:04:33,672 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 01:04:33,672 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 01:04:33,672 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 01:04:33,672 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 01:04:33,672 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 01:04:33,672 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 01:04:33,672 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-10-11 01:04:33,672 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-10-11 01:04:33,672 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 01:04:33,672 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 01:04:33,672 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 01:04:33,672 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 01:04:33,672 DEBUG BGP-Thread-1 (job):   Length=61 (0x003d)
2026-10-11 01:04:33,672 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 01:04:33,672 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 01:04:33,673 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-10-11 01:04:33,673 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 01:04:33,673 DEBUG BGP-Thread-1 (job):   BGP Identifier=169782023 (0x0a1eab07)
2026-10-11 01:04:33,673 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=32 (0x20)
2026-10-11 01:04:33,673 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x020601040001000102060104000100810206010400020081020641040000fbf0
2026-10-11 01:04:33,673 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff003d0104fbf000b40a1eab0720020601040001000102060104000100810206010400020081020641040000fbf0'
2026-10-11 01:04:33,673 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff003d0104fbf000b40a1eab0720020601040001000102060104000100810206010400020081020641040000fbf0
2026-10-11 01:04:33,674 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 01:04:33,674 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 01:04:33,674 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 01:04:33,675 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 01:04:33,675 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 01:04:33,675 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 01:04:33,675 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 01:04:33,675 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 01:04:33,675 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 01:04:33,675 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 01:04:33,675 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 01:04:33,675 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:33,675 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:33,675 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:33,690 INFO BGP-Thread-1 (job): ... idle for 0.014s
2026-10-11 01:04:33,690 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.014s
2026-10-11 01:04:33,690 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 01:04:33,690 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:33,690 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:33,691 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 01:04:33,691 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:33,691 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:33,691 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:04:33,691 DEBUG BGP-Thread-1 (job): L3vpn-mcast True
2026-10-11 01:04:33,691 DEBUG BGP-Thread-1 (job): Skipping update decoding due to l3vpn_mcast data expected
2026-10-11 01:04:33,691 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000281
2026-10-11 01:04:33,691 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:33,691 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:33,691 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:04:33,691 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:33,691 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:33,691 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:04:33,692 DEBUG BGP-Thread-1 (job): L3vpn-mcast True
2026-10-11 01:04:33,692 DEBUG BGP-Thread-1 (job): Skipping update decoding due to l3vpn_mcast data expected
2026-10-11 01:04:33,692 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000181
2026-10-11 01:04:33,692 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:33,692 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:33,692 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:04:33,692 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:33,692 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:33,692 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:04:33,692 DEBUG BGP-Thread-1 (job): L3vpn-mcast True
2026-10-11 01:04:33,692 DEBUG BGP-Thread-1 (job): Skipping update decoding due to l3vpn_mcast data expected
2026-10-11 01:04:33,692 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:33,693 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:33,693 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:34,694 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:34,694 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.016s
2026-10-11 01:04:34,694 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:34,694 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:34,694 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:35,695 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:35,695 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 2.017s
2026-10-11 01:04:35,696 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:35,696 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:35,696 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:36,711 INFO BGP-Thread-1 (job): ... idle for 1.015s
2026-10-11 01:04:36,711 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 3.032s
2026-10-11 01:04:36,711 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:36,711 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:36,711 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:37,712 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:37,712 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 4.033s
2026-10-11 01:04:37,713 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:37,713 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:37,713 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:38,714 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:38,714 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 5.034s
2026-10-11 01:04:38,714 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:38,714 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:38,714 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:39] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:39,715 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:39,716 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.035s
2026-10-11 01:04:39,716 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:39,716 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:39,716 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:39] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:39,775 INFO BGP-Thread-1 (job): ... idle for 0.059s
2026-10-11 01:04:39,775 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.094s
2026-10-11 01:04:39,776 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004d02000000364001010040020040050400000064800e1a000181047f10002c00200001ac10002c0065180a022200000000c01008010b0a0000013130
2026-10-11 01:04:39,776 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:39,776 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:39,776 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004d' (77)
2026-10-11 01:04:39,776 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:39,776 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:39,776 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:04:39,776 DEBUG BGP-Thread-1 (job): L3vpn-mcast True
2026-10-11 01:04:39,776 DEBUG BGP-Thread-1 (job): Skipping update decoding due to l3vpn_mcast data expected
2026-10-11 01:04:39,776 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:39,776 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:39,777 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:40,778 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:40,778 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 7.095s
2026-10-11 01:04:40,778 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:40,778 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:40,778 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:41,779 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:41,780 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.096s
10.30.170.34 - - [11/Oct/2026 01:04:41] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:41,781 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:41,781 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:41,781 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:41] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:41,872 INFO BGP-Thread-1 (job): ... idle for 0.091s
2026-10-11 01:04:41,872 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.187s
2026-10-11 01:04:41,872 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004702000000304001010040020040050400000064800f14000181200001ac10002c0065180a022200000000c01008010b0a0000013130
2026-10-11 01:04:41,872 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:41,872 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:41,873 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0047' (71)
2026-10-11 01:04:41,873 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:41,873 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:41,873 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:04:41,873 DEBUG BGP-Thread-1 (job): L3vpn-mcast True
2026-10-11 01:04:41,873 DEBUG BGP-Thread-1 (job): Skipping update decoding due to l3vpn_mcast data expected
2026-10-11 01:04:41,873 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:41,873 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:41,873 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:41] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:42] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:42] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:42,874 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:42,875 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 9.188s
2026-10-11 01:04:42,875 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004d02000000364001010040020040050400000064800e1a000181047f10002c00200001ac10002c0065180a022200000000c01008010b0a0000013130
2026-10-11 01:04:42,875 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:42,875 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:42,875 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:43,876 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:43,876 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.189s
2026-10-11 01:04:43,877 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:43,877 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:43,877 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:44] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:44,878 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:44,878 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 11.191s
2026-10-11 01:04:44,878 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004702000000304001010040020040050400000064800f14000181200001ac10002c0065180a022200000000c01008010b0a0000013130
2026-10-11 01:04:44,878 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:44,878 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:44,879 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:45,880 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:45,880 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 12.192s
2026-10-11 01:04:45,880 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:45,880 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:45,880 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:46] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:46] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:46] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:46,870 INFO BGP-Thread-1 (job): ... idle for 0.989s
2026-10-11 01:04:46,872 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 13.181s
2026-10-11 01:04:46,872 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004702000000304001010040020040050400000064800f14000181200001ac10002c0065180a022200000000c01008010b0a0000013130
2026-10-11 01:04:46,872 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005902000000424001010040020040050400000064800e260002811020010db800010000000000000000000700800001ac10002c00651820010d00000000c01008010b0a0000013130
2026-10-11 01:04:46,872 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:46,872 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:46,872 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0059' (89)
2026-10-11 01:04:46,872 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:46,872 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:46,872 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:04:46,872 DEBUG BGP-Thread-1 (job): L3vpn-mcast True
2026-10-11 01:04:46,873 DEBUG BGP-Thread-1 (job): Skipping update decoding due to l3vpn_mcast data expected
2026-10-11 01:04:46,873 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:46,873 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:46,873 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:47,874 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:47,874 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 14.182s
2026-10-11 01:04:47,874 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:47,874 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:47,874 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:48] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:48,875 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:48,875 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 15.182s
2026-10-11 01:04:48,875 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:48,875 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:48,875 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:48] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:48,975 INFO BGP-Thread-1 (job): ... idle for 0.100s
2026-10-11 01:04:48,975 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 15.282s
2026-10-11 01:04:48,976 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004702000000304001010040020040050400000064800f14000281800001ac10002c00651820010d00000000c01008010b0a0000013130
2026-10-11 01:04:48,976 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:48,976 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:48,976 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0047' (71)
2026-10-11 01:04:48,976 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:48,976 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:48,976 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:04:48,976 DEBUG BGP-Thread-1 (job): L3vpn-mcast True
2026-10-11 01:04:48,976 DEBUG BGP-Thread-1 (job): Skipping update decoding due to l3vpn_mcast data expected
2026-10-11 01:04:48,976 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:48,976 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:48,976 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:48] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:49] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:49] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:49,978 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:49,978 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 16.283s
2026-10-11 01:04:49,978 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005902000000424001010040020040050400000064800e260002811020010db800010000000000000000000700800001ac10002c00651820010d00000000c01008010b0a0000013130
2026-10-11 01:04:49,978 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:49,978 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:49,978 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:50,979 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:50,979 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 17.285s
2026-10-11 01:04:50,980 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:50,980 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:50,980 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:51] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:51,981 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:51,981 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 18.286s
2026-10-11 01:04:51,983 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004702000000304001010040020040050400000064800f14000281800001ac10002c00651820010d00000000c01008010b0a0000013130
2026-10-11 01:04:51,983 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:51,983 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:51,983 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:52,984 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:52,985 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 19.287s
2026-10-11 01:04:52,985 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:52,985 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:52,985 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:53] "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-10-11T01:04:53.943629" elapsed="0.000537"/>
</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-10-11T01:04:53.930062" elapsed="0.014157"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<status status="PASS" start="2026-10-11T01:04:53.944368" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-11T01:04:53.944277" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:53.944259" elapsed="0.000202"/>
</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-10-11T01:04:53.944653" elapsed="0.000021"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was not seen within timeout period.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:53.944838" elapsed="0.000018"/>
</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-10-11T01:04:53.906123" elapsed="0.038786"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:04:53.948287" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-10-11T01:04:53.992624" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:04:53.992761" level="INFO">${output_log} = 2026-10-11 01:04:33,667 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 01:04:33,668 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 01:04:33,668 DEBUG BGP-Threa...</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-10-11T01:04:53.948177" elapsed="0.044619"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:53.993387" level="INFO">2026-10-11 01:04:33,667 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 01:04:33,668 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 01:04:33,668 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 01:04:33,668 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 01:04:33,668 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 01:04:33,669 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 01:04:33,671 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 01:04:33,671 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00d90104fbf000b4c0000202bc02ba41040000fbf0060002000104000100010104000100040104000100850104000200040104000100810104000100840104000200810104000200800104000100860104000200860104000200850104000200050104000100800104000100050104400400470104001900460104000200014046003c00010500000286000001810040044700000204000002800000020500000281000001010000018500000184000001860000194600000201000002850000010400000180004700
2026-10-11 01:04:33,671 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 01:04:33,671 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-10-11 01:04:33,671 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-10-11 01:04:33,671 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 01:04:33,671 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 01:04:33,672 INFO BGP-Thread-1 (job):   My BGP Identifier: 169782023
2026-10-11 01:04:33,672 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 01:04:33,672 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 01:04:33,672 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 01:04:33,672 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 01:04:33,672 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 01:04:33,672 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 01:04:33,672 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-10-11 01:04:33,672 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-10-11 01:04:33,672 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 01:04:33,672 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 01:04:33,672 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 01:04:33,672 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 01:04:33,672 DEBUG BGP-Thread-1 (job):   Length=61 (0x003d)
2026-10-11 01:04:33,672 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 01:04:33,672 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 01:04:33,673 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-10-11 01:04:33,673 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 01:04:33,673 DEBUG BGP-Thread-1 (job):   BGP Identifier=169782023 (0x0a1eab07)
2026-10-11 01:04:33,673 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=32 (0x20)
2026-10-11 01:04:33,673 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x020601040001000102060104000100810206010400020081020641040000fbf0
2026-10-11 01:04:33,673 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff003d0104fbf000b40a1eab0720020601040001000102060104000100810206010400020081020641040000fbf0'
2026-10-11 01:04:33,673 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff003d0104fbf000b40a1eab0720020601040001000102060104000100810206010400020081020641040000fbf0
2026-10-11 01:04:33,674 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 01:04:33,674 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 01:04:33,674 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 01:04:33,675 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 01:04:33,675 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 01:04:33,675 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 01:04:33,675 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 01:04:33,675 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 01:04:33,675 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 01:04:33,675 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 01:04:33,675 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 01:04:33,675 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:33,675 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:33,675 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:33,690 INFO BGP-Thread-1 (job): ... idle for 0.014s
2026-10-11 01:04:33,690 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.014s
2026-10-11 01:04:33,690 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 01:04:33,690 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:33,690 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:33,691 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 01:04:33,691 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:33,691 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:33,691 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:04:33,691 DEBUG BGP-Thread-1 (job): L3vpn-mcast True
2026-10-11 01:04:33,691 DEBUG BGP-Thread-1 (job): Skipping update decoding due to l3vpn_mcast data expected
2026-10-11 01:04:33,691 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000281
2026-10-11 01:04:33,691 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:33,691 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:33,691 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:04:33,691 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:33,691 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:33,691 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:04:33,692 DEBUG BGP-Thread-1 (job): L3vpn-mcast True
2026-10-11 01:04:33,692 DEBUG BGP-Thread-1 (job): Skipping update decoding due to l3vpn_mcast data expected
2026-10-11 01:04:33,692 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000181
2026-10-11 01:04:33,692 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:33,692 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:33,692 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:04:33,692 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:33,692 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:33,692 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:04:33,692 DEBUG BGP-Thread-1 (job): L3vpn-mcast True
2026-10-11 01:04:33,692 DEBUG BGP-Thread-1 (job): Skipping update decoding due to l3vpn_mcast data expected
2026-10-11 01:04:33,692 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:33,693 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:33,693 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:34,694 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:34,694 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.016s
2026-10-11 01:04:34,694 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:34,694 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:34,694 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:35,695 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:35,695 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 2.017s
2026-10-11 01:04:35,696 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:35,696 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:35,696 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:36,711 INFO BGP-Thread-1 (job): ... idle for 1.015s
2026-10-11 01:04:36,711 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 3.032s
2026-10-11 01:04:36,711 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:36,711 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:36,711 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:37,712 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:37,712 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 4.033s
2026-10-11 01:04:37,713 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:37,713 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:37,713 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:38,714 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:38,714 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 5.034s
2026-10-11 01:04:38,714 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:38,714 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:38,714 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:39] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:39,715 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:39,716 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.035s
2026-10-11 01:04:39,716 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:39,716 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:39,716 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:39] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:39,775 INFO BGP-Thread-1 (job): ... idle for 0.059s
2026-10-11 01:04:39,775 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.094s
2026-10-11 01:04:39,776 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004d02000000364001010040020040050400000064800e1a000181047f10002c00200001ac10002c0065180a022200000000c01008010b0a0000013130
2026-10-11 01:04:39,776 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:39,776 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:39,776 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'004d' (77)
2026-10-11 01:04:39,776 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:39,776 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:39,776 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:04:39,776 DEBUG BGP-Thread-1 (job): L3vpn-mcast True
2026-10-11 01:04:39,776 DEBUG BGP-Thread-1 (job): Skipping update decoding due to l3vpn_mcast data expected
2026-10-11 01:04:39,776 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:39,776 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:39,777 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:40,778 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:40,778 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 7.095s
2026-10-11 01:04:40,778 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:40,778 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:40,778 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:41,779 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:41,780 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.096s
10.30.170.34 - - [11/Oct/2026 01:04:41] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:41,781 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:41,781 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:41,781 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:41] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:41,872 INFO BGP-Thread-1 (job): ... idle for 0.091s
2026-10-11 01:04:41,872 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.187s
2026-10-11 01:04:41,872 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004702000000304001010040020040050400000064800f14000181200001ac10002c0065180a022200000000c01008010b0a0000013130
2026-10-11 01:04:41,872 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:41,872 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:41,873 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0047' (71)
2026-10-11 01:04:41,873 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:41,873 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:41,873 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:04:41,873 DEBUG BGP-Thread-1 (job): L3vpn-mcast True
2026-10-11 01:04:41,873 DEBUG BGP-Thread-1 (job): Skipping update decoding due to l3vpn_mcast data expected
2026-10-11 01:04:41,873 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:41,873 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:41,873 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:41] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:42] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:42] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:42,874 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:42,875 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 9.188s
2026-10-11 01:04:42,875 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004d02000000364001010040020040050400000064800e1a000181047f10002c00200001ac10002c0065180a022200000000c01008010b0a0000013130
2026-10-11 01:04:42,875 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:42,875 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:42,875 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:43,876 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:43,876 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.189s
2026-10-11 01:04:43,877 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:43,877 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:43,877 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:44] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:44,878 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:44,878 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 11.191s
2026-10-11 01:04:44,878 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004702000000304001010040020040050400000064800f14000181200001ac10002c0065180a022200000000c01008010b0a0000013130
2026-10-11 01:04:44,878 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:44,878 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:44,879 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:45,880 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:45,880 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 12.192s
2026-10-11 01:04:45,880 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:45,880 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:45,880 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:46] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:46] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:46] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:46,870 INFO BGP-Thread-1 (job): ... idle for 0.989s
2026-10-11 01:04:46,872 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 13.181s
2026-10-11 01:04:46,872 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004702000000304001010040020040050400000064800f14000181200001ac10002c0065180a022200000000c01008010b0a0000013130
2026-10-11 01:04:46,872 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff005902000000424001010040020040050400000064800e260002811020010db800010000000000000000000700800001ac10002c00651820010d00000000c01008010b0a0000013130
2026-10-11 01:04:46,872 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:46,872 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:46,872 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0059' (89)
2026-10-11 01:04:46,872 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:46,872 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:46,872 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:04:46,872 DEBUG BGP-Thread-1 (job): L3vpn-mcast True
2026-10-11 01:04:46,873 DEBUG BGP-Thread-1 (job): Skipping update decoding due to l3vpn_mcast data expected
2026-10-11 01:04:46,873 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:46,873 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:46,873 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:47,874 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:47,874 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 14.182s
2026-10-11 01:04:47,874 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:47,874 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:47,874 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:48] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:48,875 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:48,875 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 15.182s
2026-10-11 01:04:48,875 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:48,875 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:48,875 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:48] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:48,975 INFO BGP-Thread-1 (job): ... idle for 0.100s
2026-10-11 01:04:48,975 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 15.282s
2026-10-11 01:04:48,976 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff004702000000304001010040020040050400000064800f14000281800001ac10002c00651820010d00000000c01008010b0a0000013130
2026-10-11 01:04:48,976 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:48,976 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:48,976 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0047' (71)
2026-10-11 01:04:48,976 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:48,976 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:48,976 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:04:48,976 DEBUG BGP-Thread-1 (job): L3vpn-mcast True
2026-10-11 01:04:48,976 DEBUG BGP-Thread-1 (job): Skipping update decoding due to l3vpn_mcast data expected
2026-10-11 01:04:48,976 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:48,976 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:48,976 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:48] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:49] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:04:49] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:49,978 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:49,978 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 16.283s
2026-10-11 01:04:49,978 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff005902000000424001010040020040050400000064800e260002811020010db800010000000000000000000700800001ac10002c00651820010d00000000c01008010b0a0000013130
2026-10-11 01:04:49,978 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:49,978 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:49,978 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:50,979 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:50,979 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 17.285s
2026-10-11 01:04:50,980 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:50,980 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:50,980 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:51] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:04:51,981 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:51,981 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 18.286s
2026-10-11 01:04:51,983 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff004702000000304001010040020040050400000064800f14000281800001ac10002c00651820010d00000000c01008010b0a0000013130
2026-10-11 01:04:51,983 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:51,983 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:51,983 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:52,984 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:52,985 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 19.287s
2026-10-11 01:04:52,985 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:52,985 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:52,985 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:04:53] "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-10-11T01:04:53.993074" elapsed="0.000740"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:53.994552" 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-10-11T01:04:53.994074" elapsed="0.000552"/>
</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-10-11T01:04:53.947828" elapsed="0.046889"/>
</kw>
<doc>Abort the Python speaker</doc>
<status status="PASS" start="2026-10-11T01:04:53.784891" elapsed="0.209961"/>
</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-10-11T01:04:53.996795" elapsed="0.000278"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:04:53.996430" 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-10-11T01:04:53.998782" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:53.998643" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:53.998618" elapsed="0.000252"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:54.001654" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:54.001539" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.001516" elapsed="0.000242"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.003167" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:54.002709" elapsed="0.000494"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.003825" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:04:54.003439" elapsed="0.000421"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:04:54.003918" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T01:04:54.004094" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:04:54.002161" elapsed="0.001966"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:54.007620" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:54.007502" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.007477" 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-10-11T01:04:54.009194" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:54.009078" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.009054" elapsed="0.000228"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:54.009765" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:04:54.009513" elapsed="0.000286"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:54.010225" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:54.010028" elapsed="0.000231"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:04:54.049574" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:04:54.011038" elapsed="0.038640"/>
</kw>
<msg time="2026-10-11T01:04:54.049848" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:04:54.049889" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:54.010535" elapsed="0.039390"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:04:54.096806" 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-10-11T01:04:54.050448" elapsed="0.046465"/>
</kw>
<msg time="2026-10-11T01:04:54.097062" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:04:54.097102" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:54.050093" elapsed="0.047047"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:54.097526" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:54.097277" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.097254" elapsed="0.000350"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.098030" 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-10-11T01:04:54.097800" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:54.098364" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:54.098163" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.098145" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:04:54.098486" 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-10-11T01:04:54.101221" elapsed="0.000116"/>
</kw>
<msg time="2026-10-11T01:04:54.101395" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:54.100133" 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-10-11T01:04:54.101866" elapsed="0.000072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:54.102200" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:04:54.099522" 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-10-11T01:04:54.098823" elapsed="0.003639"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:04:54.008722" elapsed="0.093814"/>
</kw>
<msg time="2026-10-11T01:04:54.102616" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:54.102657" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:54.007933" elapsed="0.094775"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:04:54.102862" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:04:54.102777" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.102760" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:54.103265" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:54.103590" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:04:54.103653" 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-10-11T01:04:54.007080" elapsed="0.096668"/>
</kw>
<msg time="2026-10-11T01:04:54.103831" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:54.103872" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:54.004607" elapsed="0.099301"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:54.104191" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:54.103974" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.103958" elapsed="0.000303"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:04:54.004387" elapsed="0.099896"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:04:54.004193" elapsed="0.100119"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:04:54.001110" elapsed="0.103250"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:04:53.998250" elapsed="0.106219"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:53.997348" elapsed="0.107165"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:04:53.995934" elapsed="0.108662"/>
</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-10-11T01:04:54.117818" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:54.117498" elapsed="0.000346"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:54.118549" 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-10-11T01:04:54.118323" elapsed="0.000301">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-10-11T01:04:54.118723" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:54.118005" elapsed="0.000741"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.119225" 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-10-11T01:04:54.118919" elapsed="0.000331"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:54.119545" 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-10-11T01:04:54.119703" 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-10-11T01:04:54.119432" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.120142" 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-10-11T01:04:54.119924" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.121288" level="INFO">mapping: {'IP': '10.30.171.7', '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-10-11T01:04:54.121045" elapsed="0.000286"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.121808" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:54.121528" elapsed="0.000304"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.122489" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:54.122168" elapsed="0.000357"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:54.123273" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:54.123081" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:54.123343" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:04:54.123485" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:54.122763" elapsed="0.000746"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:54.123676" elapsed="0.000226"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T01:04:54.122032" elapsed="0.001907"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.124455" 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-10-11T01:04:54.124168" elapsed="0.000312"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:54.125155" 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-10-11T01:04:54.124978" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:54.125221" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:54.125342" 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-10-11T01:04:54.124653" elapsed="0.000712"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:54.125543" elapsed="0.000180"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T01:04:54.124038" elapsed="0.001722"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.126274" 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-10-11T01:04:54.125997" elapsed="0.000302"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:54.127026" 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-10-11T01:04:54.126846" elapsed="0.000205"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:54.127094" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:54.127218" 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-10-11T01:04:54.126520" elapsed="0.000720"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:54.127403" elapsed="0.000182"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T01:04:54.125858" elapsed="0.001764"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.128129" 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-10-11T01:04:54.127863" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:54.128835" 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-10-11T01:04:54.128643" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:54.128903" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:54.129025" 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-10-11T01:04:54.128321" elapsed="0.000726"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:54.129210" elapsed="0.000163"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T01:04:54.127732" elapsed="0.001693"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.129932" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:54.129654" elapsed="0.000303"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:54.130639" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:54.130462" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:54.130719" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:54.130841" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:54.130137" elapsed="0.000726"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:54.131024" elapsed="0.000311"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:54.129525" elapsed="0.001847"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.131907" 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-10-11T01:04:54.131623" elapsed="0.000308"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:54.132596" 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-10-11T01:04:54.132403" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:54.132663" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T01:04:54.132800" 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-10-11T01:04:54.132099" elapsed="0.000723"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:54.132985" elapsed="0.000165"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T01:04:54.131487" elapsed="0.001699"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:54.121880" elapsed="0.011337"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:54.133255" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:04:54.133383" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', '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-10-11T01:04:54.120519" elapsed="0.012901"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:54.120245" elapsed="0.013206"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:54.133622" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:54.133473" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.120227" elapsed="0.013480"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.134485" 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-10-11T01:04:54.133867" elapsed="0.000645"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:54.134556" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:54.116979" elapsed="0.017727"/>
</kw>
<msg time="2026-10-11T01:04:54.134757" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:54.112652" elapsed="0.022149"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:54.138908" 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/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-10-11T01:04:54.142986" 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/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-10-11T01:04:54.147057" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:54.147240" 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-10-11T01:04:54.147434" 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-10-11T01:04:54.147788" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:54.147626" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:54.147612" 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-10-11T01:04:54.148015" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:54.148205" elapsed="0.000017"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:54.148366" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:54.147587" elapsed="0.000841"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:54.147501" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:54.148604" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:54.148670" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:54.148793" 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-10-11T01:04:54.112026" elapsed="0.036792"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.149869" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:54.149630" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:54.164638" level="INFO">DELETE Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node011peadqcdwn7ieyx6aexk11xu23.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:54.164696" level="INFO">DELETE Response : url=http://10.30.170.173: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.171.7 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:54.164780" 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-10-11T01:04:54.150200" elapsed="0.014603"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:54.149973" elapsed="0.014867"/>
</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-10-11T01:04:54.165012" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:54.164863" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.149956" elapsed="0.015131"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.166287" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:54.166014" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:54.165772" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.165755" elapsed="0.000627"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.166973" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:54.166704" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:54.166449" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.166433" elapsed="0.000636"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.167612" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:54.167249" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:54.168087" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:54.167714" elapsed="0.000427"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.168618" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:54.168331" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:54.168164" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.167697" elapsed="0.001015"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.169229" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:54.168890" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:54.169545" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:54.169319" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.170068" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:54.169802" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:54.169621" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.169302" elapsed="0.000843"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:54.170291" elapsed="0.000417"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:54.171105" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:54.170878" elapsed="0.000252"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:54.171285" elapsed="0.000231"/>
</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-10-11T01:04:54.165426" elapsed="0.006148"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:04:54.171646" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:04:54.171840" 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-10-11T01:04:54.149055" elapsed="0.022810"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:54.171912" elapsed="0.000025"/>
</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-10-11T01:04:54.104817" elapsed="0.067192"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-10-11T01:04:53.995194" elapsed="0.176916"/>
</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-10-11T01:04:54.173501" elapsed="0.000214"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:04:54.173235" 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-10-11T01:04:54.174778" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:54.174678" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.174661" elapsed="0.000180"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:54.176823" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:54.176741" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.176724" elapsed="0.000160"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.177798" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:54.177459" elapsed="0.000364"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.178237" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:04:54.177976" elapsed="0.000285"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:04:54.178301" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:54.178444" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:04:54.177088" elapsed="0.001380"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:54.181106" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:54.181021" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.181003" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:54.182225" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:54.182142" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.182125" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:54.182625" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:04:54.182455" elapsed="0.000194"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:54.182963" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:54.182826" elapsed="0.000160"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:04:54.220063" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:04:54.183484" elapsed="0.036708"/>
</kw>
<msg time="2026-10-11T01:04:54.220383" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:04:54.220445" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:54.183141" elapsed="0.037340"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:04:54.289470" 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-10-11T01:04:54.221184" elapsed="0.068391"/>
</kw>
<msg time="2026-10-11T01:04:54.289740" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:04:54.289782" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:54.220712" elapsed="0.069105"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:54.290174" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:54.289948" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.289924" elapsed="0.000326"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.290705" 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-10-11T01:04:54.290454" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:54.291032" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:54.290833" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.290817" elapsed="0.000285"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:04:54.291136" 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-10-11T01:04:54.293677" elapsed="0.000133"/>
</kw>
<msg time="2026-10-11T01:04:54.293867" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:54.292593" elapsed="0.001410"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:54.294308" elapsed="0.000072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:54.294662" 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-10-11T01:04:54.291974" 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-10-11T01:04:54.291473" elapsed="0.003451"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:04:54.181885" elapsed="0.113114"/>
</kw>
<msg time="2026-10-11T01:04:54.295083" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:54.295123" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:54.181321" elapsed="0.113838"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:04:54.295310" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:04:54.295227" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.295209" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:54.295760" 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-10-11T01:04:54.296143" elapsed="0.000034"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:04:54.296230" 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-10-11T01:04:54.180729" elapsed="0.115592"/>
</kw>
<msg time="2026-10-11T01:04:54.296427" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:54.296470" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:54.178807" elapsed="0.117702"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:54.296812" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:54.296577" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.296561" elapsed="0.000322"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:04:54.178652" elapsed="0.118253"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:04:54.178514" elapsed="0.118422"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:04:54.176438" elapsed="0.120549"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:04:54.174422" elapsed="0.122618"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:54.173915" elapsed="0.123167"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:04:54.172891" elapsed="0.124272"/>
</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-10-11T01:04:54.312003" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:54.311696" elapsed="0.000333"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:54.312744" 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-10-11T01:04:54.312522" elapsed="0.000295">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-10-11T01:04:54.312902" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:54.312189" elapsed="0.000735"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.313401" 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-10-11T01:04:54.313096" elapsed="0.000346"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:54.313743" 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-10-11T01:04:54.313883" 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-10-11T01:04:54.313617" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.314319" 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-10-11T01:04:54.314103" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.315274" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:04:54.315045" elapsed="0.000270"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.315771" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:54.315504" elapsed="0.000291"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.316385" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:54.316118" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:54.317110" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:54.316924" elapsed="0.000211"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:54.317179" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:54.317305" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:54.316597" elapsed="0.000731"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:54.317508" elapsed="0.000196"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:04:54.315981" elapsed="0.001760"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.318240" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:54.317971" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:54.318952" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:54.318772" elapsed="0.000204"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:54.319019" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:54.319143" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:54.318449" elapsed="0.000717"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:54.319329" elapsed="0.000181"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:54.317841" elapsed="0.001706"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:54.315840" elapsed="0.003738"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:54.319616" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:54.319794" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:54.314707" elapsed="0.005111"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:54.314439" elapsed="0.005407"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:54.320018" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:54.319868" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.314419" elapsed="0.005668"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.320942" 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-10-11T01:04:54.320246" elapsed="0.000723"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:54.321013" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:54.311163" elapsed="0.009950"/>
</kw>
<msg time="2026-10-11T01:04:54.321161" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:54.306834" elapsed="0.014370"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:04:54.325295" 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/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-10-11T01:04:54.329368" 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/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-10-11T01:04:54.333430" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:54.333610" 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-10-11T01:04:54.333801" 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-10-11T01:04:54.334138" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:54.333993" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:54.333979" 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-10-11T01:04:54.334365" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:54.334562" 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-10-11T01:04:54.334743" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:54.333954" elapsed="0.000838"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:54.333867" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:54.334964" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:54.335060" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:04:54.335171" 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-10-11T01:04:54.306156" elapsed="0.029041"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.336318" 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.173</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:54.336084" elapsed="0.000278"/>
</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-10-11T01:04:54.357112" level="INFO">DELETE Request : url=http://10.30.170.173: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.173 
 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.173 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node011peadqcdwn7ieyx6aexk11xu23.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:54.357157" level="INFO">DELETE Response : url=http://10.30.170.173: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.173 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:54.357246" 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-10-11T01:04:54.336668" elapsed="0.020603"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:54.336438" elapsed="0.020869"/>
</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-10-11T01:04:54.357503" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:54.357331" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.336420" elapsed="0.021160"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.358798" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:54.358505" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:54.358251" elapsed="0.000618"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.358234" elapsed="0.000658"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.359462" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:54.359179" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:54.358942" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.358926" elapsed="0.000632"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.360097" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:54.359752" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:54.360396" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:54.360184" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.360927" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:54.360650" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:54.360486" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.360168" elapsed="0.000835"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.361527" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:54.361178" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:54.361839" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:54.361615" elapsed="0.000276"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.362336" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:54.362075" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:54.361913" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.361598" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:54.362607" elapsed="0.000306"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:54.363298" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:54.363074" elapsed="0.000248"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:54.363492" elapsed="0.000223"/>
</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-10-11T01:04:54.357916" elapsed="0.005855"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:04:54.363811" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:54.363983" 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-10-11T01:04:54.335445" elapsed="0.028562"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:54.364054" elapsed="0.000024"/>
</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-10-11T01:04:54.297373" elapsed="0.066776"/>
</kw>
<doc>Revert the BGP configuration to the original state: without application peer</doc>
<status status="PASS" start="2026-10-11T01:04:54.172368" elapsed="0.191882"/>
</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-10-11T01:04:54.364945" elapsed="0.000544"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:54.365717" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects </doc>
<status status="PASS" start="2026-10-11T01:04:54.365637" elapsed="0.000147"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-10-11T01:04:54.364738" elapsed="0.001095"/>
</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-10-11T01:04:31.406559" elapsed="22.959301"/>
</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-10-11T01:04:54.393912" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:04:54.392322" elapsed="0.001635"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-10-11T01:04:54.392087" elapsed="0.001927"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.396280" 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-10-11T01:04:54.394990" elapsed="0.001316"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-10-11T01:04:54.396477" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:54.396379" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.396360" elapsed="0.000178"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.397056" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:04:54.396732" elapsed="0.000363"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.397548" 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-10-11T01:04:54.397259" elapsed="0.000313"/>
</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-10-11T01:04:54.398081" elapsed="0.000244"/>
</kw>
<msg time="2026-10-11T01:04:54.398427" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:54.398470" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:54.397747" elapsed="0.000744"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.398994" 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-10-11T01:04:54.398668" elapsed="0.000350"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.399892" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:04:54.399629" elapsed="0.000288"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.400297" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:04:54.400061" elapsed="0.000261"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.400833" 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-10-11T01:04:54.400553" elapsed="0.000304"/>
</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-10-11T01:04:54.401722" elapsed="0.000158"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.402314" level="INFO">${member_ip} = 10.30.170.173</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:54.402039" elapsed="0.000300"/>
</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-10-11T01:04:54.402532" elapsed="0.000178"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.403556" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:54.403150" elapsed="0.000431"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-11T01:04:54.403622" elapsed="0.000034"/>
</return>
<msg time="2026-10-11T01:04:54.403765" 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-10-11T01:04:54.402888" elapsed="0.000901"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:54.404273" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x743445828690&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-10-11T01:04:54.403963" elapsed="0.000426"/>
</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-10-11T01:04:54.404569" elapsed="0.000162"/>
</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-10-11T01:04:54.401251" elapsed="0.003533"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:04:54.401080" elapsed="0.003743"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-10-11T01:04:54.400902" elapsed="0.003950"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.405386" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:04:54.405036" elapsed="0.000405"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.405986" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.173'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:04:54.405625" elapsed="0.000400"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.406558" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:04:54.406208" elapsed="0.000389"/>
</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-10-11T01:04:54.399239" elapsed="0.007411"/>
</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-10-11T01:04:54.394665" elapsed="0.012049"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:54.406862" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:54.406773" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.406755" elapsed="0.000168"/>
</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-10-11T01:04:54.408110" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:54.407790" elapsed="0.000346"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.408565" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:04:54.408289" elapsed="0.000301"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:04:54.408629" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:54.408774" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:04:54.407478" elapsed="0.001320"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:54.409635" level="INFO">${member_ip} = 10.30.170.173</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-10-11T01:04:54.409427" elapsed="0.000233"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:54.410428" 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-10-11T01:04:54.410523" 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-10-11T01:04:54.410265" elapsed="0.000282"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:54.413364" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:54.412837" elapsed="0.000622"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.412818" elapsed="0.000677"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:54.414166" 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-10-11T01:04:54.414379" 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-10-11T01:04:54.413754" elapsed="0.000695"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.415322" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.173" 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-10-11T01:04:54.414764" elapsed="0.000704"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:54.416761" 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-10-11T01:04:54.415772" elapsed="0.001040"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.418542" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T01:04:54.418723" 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-10-11T01:04:54.418205" elapsed="0.000560"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:54.419091" elapsed="0.000471"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T01:04:54.420619" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T01:04:54.785098" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 01:04:31 UTC 2026

  System load:  0.09               Processes:             122
  Usage of /:   14.2% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.173
  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.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 01:04:32 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T01:04:54.420365" elapsed="0.364854"/>
</kw>
<msg time="2026-10-11T01:04:54.785293" 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-10-11T01:04:54.419912" elapsed="0.365526"/>
</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-10-11T01:04:54.417239" elapsed="0.368334"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:04:54.786423" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-10-11T01:04:54.799743" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-10-11T01:04:54.799957" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T01:04:54.800090" 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-10-11T01:04:54.785969" elapsed="0.014189"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:04:54.800599" elapsed="0.000656"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.802948" 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-10-11T01:04:54.802185" elapsed="0.000928"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T01:04:54.803694" elapsed="0.000099"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:54.803335" elapsed="0.000636"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.803302" elapsed="0.000724"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T01:04:54.804451" elapsed="0.000114"/>
</return>
<status status="PASS" start="2026-10-11T01:04:54.804133" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.804110" elapsed="0.000637"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T01:04:54.804824" elapsed="0.000019"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:54.806659" elapsed="0.000599"/>
</kw>
<kw name="Open 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-10-11T01:04:54.807722" elapsed="0.000373"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:04:54.808518" elapsed="0.000309"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:04:54.805472" elapsed="0.003444"/>
</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-10-11T01:04:54.412163" elapsed="0.396904"/>
</kw>
<msg time="2026-10-11T01:04:54.809134" 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-10-11T01:04:54.411579" elapsed="0.397622"/>
</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-10-11T01:04:54.411176" elapsed="0.398124"/>
</kw>
<msg time="2026-10-11T01:04:54.809350" 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-10-11T01:04:54.410715" elapsed="0.398714"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:54.810289" 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-10-11T01:04:54.811025" elapsed="0.000185"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:04:54.811449" elapsed="0.000131"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:04:54.809829" elapsed="0.001814"/>
</kw>
<msg time="2026-10-11T01:04:54.811773" 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-10-11T01:04:54.409907" elapsed="0.401899"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.812422" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:54.812100" elapsed="0.000377"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-11T01:04:54.812530" elapsed="0.000038"/>
</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-10-11T01:04:54.409103" elapsed="0.403566"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:04:54.408943" elapsed="0.403787"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:04:54.408843" elapsed="0.403931"/>
</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-10-11T01:04:54.407124" elapsed="0.405722"/>
</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-10-11T01:04:54.813061" elapsed="0.000277"/>
</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-10-11T01:04:54.821677" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:54.821554" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.821527" elapsed="0.000253"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:54.822226" 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-10-11T01:04:54.822352" 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-10-11T01:04:54.822058" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.823001" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:54.822671" elapsed="0.000385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:54.823644" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:54.823321" elapsed="0.000398"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:54.824821" 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-10-11T01:04:54.824522" elapsed="0.000457">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-10-11T01:04:54.825084" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T01:04:54.825124" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:54.824007" elapsed="0.001138"/>
</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-10-11T01:04:54.825445" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:54.825213" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:54.825196" elapsed="0.000339"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:54.826180" level="INFO">${ip_address} = 10.30.170.173</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-10-11T01:04:54.825975" elapsed="0.000228"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-10-11T01:04:54.826246" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:54.826367" level="INFO">${odl_ip} = 10.30.170.173</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-10-11T01:04:54.825728" elapsed="0.000662"/>
</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-10-11T01:04:54.826584" elapsed="0.000330"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:54.827222" level="INFO">index=4
host=10.30.170.173
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-10-11T01:04:54.827310" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.173
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-10-11T01:04:54.827125" elapsed="0.000209"/>
</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-10-11T01:04:54.827512" elapsed="0.000249"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-10-11T01:04:54.828143" level="INFO">Logging into '10.30.170.173:8101' as 'karaf'.</msg>
<msg time="2026-10-11T01:04:55.056477" 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-10-11T01:04:54.827948" elapsed="0.228647"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:55.058224" elapsed="0.000293"/>
</kw>
<kw name="Open 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-10-11T01:04:55.058716" elapsed="0.000149"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:04:55.059011" elapsed="0.000091"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:04:55.057866" elapsed="0.001283"/>
</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-10-11T01:04:55.056992" elapsed="0.002199"/>
</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-10-11T01:04:54.821157" elapsed="0.238082"/>
</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-10-11T01:04:54.814311" elapsed="0.244972"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:54.813798" elapsed="0.245533"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:04:54.813588" elapsed="0.245779"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-10-11T01:04:54.813426" elapsed="0.246042"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-10-11T01:04:54.394271" elapsed="0.665258"/>
</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-10-11T01:04:55.060383" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:55.060290" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.060268" 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-10-11T01:04:55.062428" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:55.062331" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.062315" elapsed="0.000176"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.063344" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:55.063015" elapsed="0.000354"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.063814" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:04:55.063540" elapsed="0.000298"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:04:55.063878" elapsed="0.000033"/>
</return>
<msg time="2026-10-11T01:04:55.064009" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:04:55.062708" elapsed="0.001324"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:55.066453" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:55.066355" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.066338" elapsed="0.000177"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:55.067550" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:55.067466" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.067448" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:55.068034" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:04:55.067768" elapsed="0.000290"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:55.068425" 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-10-11T01:04:55.068223" elapsed="0.000226"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:04:55.108811" 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-10-11T01:04:55.069126" elapsed="0.039807"/>
</kw>
<msg time="2026-10-11T01:04:55.109059" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:04:55.109100" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:55.068617" elapsed="0.040519"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:04:55.193596" 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-10-11T01:04:55.109834" elapsed="0.083924"/>
</kw>
<msg time="2026-10-11T01:04:55.193883" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:04:55.193924" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:55.109301" elapsed="0.084658"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.194231" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:55.194026" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.194009" elapsed="0.000386"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.195031" 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-10-11T01:04:55.194663" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.195562" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:55.195212" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.195196" elapsed="0.000553"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:04:55.195781" 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">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:55.197673" elapsed="0.000422"/>
</kw>
<kw name="Open 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-10-11T01:04:55.198494" elapsed="0.000287"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:04:55.199097" elapsed="0.000216"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:04:55.196961" 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-10-11T01:04:55.196061" elapsed="0.003479"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:04:55.067245" elapsed="0.132372"/>
</kw>
<msg time="2026-10-11T01:04:55.199711" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:55.199751" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:55.066667" elapsed="0.133120"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:04:55.199939" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:04:55.199855" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.199838" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.200338" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.200660" elapsed="0.000035"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:04:55.200738" 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-10-11T01:04:55.066126" elapsed="0.134696"/>
</kw>
<msg time="2026-10-11T01:04:55.200904" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:55.200943" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:55.064364" elapsed="0.136613"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.201262" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:55.201043" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.201028" elapsed="0.000305"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:04:55.064221" elapsed="0.137132"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:04:55.064080" elapsed="0.137299"/>
</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-10-11T01:04:55.062105" elapsed="0.139439"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-10-11T01:04:55.060108" elapsed="0.141488"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:55.059699" elapsed="0.141934"/>
</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-10-11T01:04:54.391820" elapsed="0.809875"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:55.202169" 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-10-11T01:04:55.201874" elapsed="0.000319"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.202701" level="INFO">${mininet_conn_id} = 7</msg>
<arg>${mininet_conn_id}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:04:55.202384" elapsed="0.000359"/>
</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-10-11T01:04:55.204238" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T01:04:55.204307" 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-10-11T01:04:55.203981" elapsed="0.000350"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:55.204534" elapsed="0.000295"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T01:04:55.205603" level="INFO">Logging into '10.30.171.7:22' as 'jenkins'.</msg>
<msg time="2026-10-11T01:04:55.576085" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Sun Oct 11 01:04:32 UTC 2026

  System load:  0.03               Processes:             105
  Usage of /:   19.9% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.7
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 01:04:32 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T01:04:55.205359" elapsed="0.370865"/>
</kw>
<msg time="2026-10-11T01:04:55.576302" 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-10-11T01:04:55.204995" elapsed="0.371382"/>
</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-10-11T01:04:55.203599" elapsed="0.372893"/>
</kw>
<msg time="2026-10-11T01:04:55.576548" 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-10-11T01:04:55.203229" elapsed="0.373361"/>
</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-10-11T01:04:55.202926" elapsed="0.373730"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:04:55.577197" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x743444b4be50&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-10-11T01:04:55.576915" elapsed="0.000746"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T01:04:55.587279" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-10-11T01:04:55.599124" 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-10-11T01:04:55.577863" elapsed="0.021336"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:04:55.600990" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-10-11T01:04:55.633344" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:04:55.633506" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T01:04:55.633560" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T01:04:55.633610" 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-10-11T01:04:55.600775" elapsed="0.032865"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.634792" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T01:04:55.634432" elapsed="0.000418"/>
</kw>
<msg time="2026-10-11T01:04:55.634969" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T01:04:55.635024" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:55.633906" elapsed="0.001147"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.635845" 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-10-11T01:04:55.635299" elapsed="0.000581"/>
</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-10-11T01:04:55.636360" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:55.635992" elapsed="0.000468"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.635960" elapsed="0.000537"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-10-11T01:04:55.636674" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-10-11T01:04:55.636568" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.636549" elapsed="0.000259"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-10-11T01:04:55.636917" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:55.636876" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:55.636856" elapsed="0.000136"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.637197" elapsed="0.000026"/>
</kw>
<msg time="2026-10-11T01:04:55.637448" 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-10-11T01:04:55.600231" elapsed="0.037252"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-10-11T01:04:55.637671" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-10-11T01:04:55.637572" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.637550" elapsed="0.000235"/>
</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-10-11T01:04:55.638018" elapsed="0.000027"/>
</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-10-11T01:04:55.599591" elapsed="0.038530"/>
</kw>
<doc>Initialize SetupUtils. Suite setup keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:54.391551" elapsed="1.246635"/>
</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-10-11T01:04:55.639899" elapsed="0.000278"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:04:55.639533" 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-10-11T01:04:55.641527" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:55.641385" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.641361" elapsed="0.000252"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:55.645951" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:55.645832" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.645808" elapsed="0.000232"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.647335" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:55.646877" elapsed="0.000493"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.648000" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:04:55.647610" elapsed="0.000424"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:04:55.648090" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T01:04:55.648269" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:04:55.646334" elapsed="0.001967"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:55.651854" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:55.651734" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.651708" elapsed="0.000235"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:55.653461" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:55.653314" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.653290" elapsed="0.000260"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:55.654013" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:04:55.653773" elapsed="0.000273"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:55.654489" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:55.654274" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:04:55.683569" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:04:55.655219" elapsed="0.028487"/>
</kw>
<msg time="2026-10-11T01:04:55.683881" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:04:55.683923" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:55.654756" elapsed="0.029202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:04:55.713127" 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-10-11T01:04:55.684553" elapsed="0.028675"/>
</kw>
<msg time="2026-10-11T01:04:55.713374" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:04:55.713491" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:55.684153" elapsed="0.029375"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.713844" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:55.713602" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.713581" elapsed="0.000337"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.714332" 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-10-11T01:04:55.714103" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.714686" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:55.714476" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.714458" elapsed="0.000301"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:04:55.714791" 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-10-11T01:04:55.717299" elapsed="0.000297"/>
</kw>
<msg time="2026-10-11T01:04:55.717657" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:55.716210" elapsed="0.001595"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.718115" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.718474" 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-10-11T01:04:55.715605" 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-10-11T01:04:55.715110" elapsed="0.003630"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:04:55.652952" elapsed="0.065863"/>
</kw>
<msg time="2026-10-11T01:04:55.718898" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:55.718938" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:55.652157" elapsed="0.066817"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:04:55.719127" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:04:55.719043" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.719026" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.719577" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.719899" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:04:55.719964" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T01:04:55.651296" elapsed="0.068753"/>
</kw>
<msg time="2026-10-11T01:04:55.720134" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:55.720175" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:55.648811" elapsed="0.071400"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.720519" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:55.720278" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.720262" elapsed="0.000331"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:04:55.648591" elapsed="0.072025"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:04:55.648369" elapsed="0.072277"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:04:55.645373" elapsed="0.075336"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:04:55.641035" elapsed="0.079726"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:55.640475" elapsed="0.080365"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:04:55.639029" elapsed="0.081862"/>
</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-10-11T01:04:55.731310" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:55.731008" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:55.732058" 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-10-11T01:04:55.731845" elapsed="0.000289">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-10-11T01:04:55.732220" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:55.731511" elapsed="0.000732"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.732751" 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-10-11T01:04:55.732432" elapsed="0.000345"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:55.733055" 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-10-11T01:04:55.733243" 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-10-11T01:04:55.732945" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.733710" 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-10-11T01:04:55.733481" elapsed="0.000272"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.734658" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:04:55.734425" elapsed="0.000286"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.735328" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:55.734888" elapsed="0.000464"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.735985" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:55.735710" elapsed="0.000299"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:55.736720" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:55.736515" elapsed="0.000230"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:55.736790" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:55.736914" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:55.736185" elapsed="0.000752"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:55.737105" elapsed="0.000181"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:04:55.735564" elapsed="0.001759"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.737848" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:55.737569" elapsed="0.000303"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:55.738553" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:55.738360" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:55.738622" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:55.738757" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:55.738042" elapsed="0.000739"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:55.738944" elapsed="0.000163"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:55.737437" elapsed="0.001738"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:55.735399" elapsed="0.003808"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:55.739245" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:04:55.739372" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:04:55.734068" elapsed="0.005328"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:55.733814" elapsed="0.005626"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.739613" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:55.739463" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.733797" elapsed="0.005897"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.740371" 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-10-11T01:04:55.739854" elapsed="0.000544"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:55.740457" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:04:55.730491" elapsed="0.010066"/>
</kw>
<msg time="2026-10-11T01:04:55.740605" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:55.726169" elapsed="0.014480"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:04:55.744724" 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/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-10-11T01:04:55.748776" 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/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-10-11T01:04:55.752818" elapsed="0.000023"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.752999" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.753180" 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-10-11T01:04:55.753546" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:55.753370" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:55.753356" 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-10-11T01:04:55.753785" 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-10-11T01:04:55.753967" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.754129" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:55.753332" elapsed="0.000875"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:55.753246" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.754388" elapsed="0.000033"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:55.754471" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:04:55.754582" 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-10-11T01:04:55.725568" elapsed="0.029039"/>
</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-10-11T01:04:55.763709" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:55.763379" elapsed="0.000357"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:55.764381" 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-10-11T01:04:55.764212" elapsed="0.000244">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-10-11T01:04:55.764540" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:55.763895" elapsed="0.000667"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.765063" 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-10-11T01:04:55.764756" elapsed="0.000332"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:55.765360" 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-10-11T01:04:55.765489" 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-10-11T01:04:55.765253" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.765954" 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-10-11T01:04:55.765737" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:55.766305" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:55.766059" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.766821" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', '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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:55.766549" elapsed="0.000296"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:55.766380" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.766042" elapsed="0.000854"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.767556" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.173&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-10-11T01:04:55.767057" elapsed="0.000527"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:55.767627" 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/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-10-11T01:04:55.762879" elapsed="0.004860"/>
</kw>
<msg time="2026-10-11T01:04:55.767817" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:55.758568" elapsed="0.009294"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:04:55.771921" 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/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-10-11T01:04:55.775957" elapsed="0.000023"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${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-10-11T01:04:55.780139" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.780322" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.780520" 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-10-11T01:04:55.780869" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:55.780724" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:55.780710" 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-10-11T01:04:55.781096" 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-10-11T01:04:55.781276" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.781453" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:55.780674" elapsed="0.000827"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:55.780586" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.781690" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:55.781757" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:55.781864" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.173&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-10-11T01:04:55.757845" elapsed="0.024046"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:55.783001" 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-10-11T01:04:55.782816" elapsed="0.000244">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-10-11T01:04:55.783143" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:55.782481" elapsed="0.000714"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.783501" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:55.783261" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.784016" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:55.783754" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:55.783575" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.783244" elapsed="0.000848"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.784604" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:55.784254" elapsed="0.000374"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:55.784672" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T01:04:55.784809" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:55.782166" elapsed="0.002665"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.786052" 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.173</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:55.785833" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.786514" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.173&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-10-11T01:04:55.786287" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.786978" 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-10-11T01:04:55.786762" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.787433" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:55.787205" elapsed="0.000269"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:55.788188" 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-10-11T01:04:55.788027" elapsed="0.000185"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:04:55.788526" 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-10-11T01:04:55.788367" elapsed="0.000182"/>
</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-10-11T01:04:55.788732" elapsed="0.000155"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.789299" 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-10-11T01:04:55.789081" elapsed="0.000259"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:04:55.789377" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T01:04:55.789522" 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-10-11T01:04:55.787656" elapsed="0.001889"/>
</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-10-11T01:04:55.813158" level="INFO">PUT Request : url=http://10.30.170.173: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.173 
 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.173 
 headers={'User-Agent': 'python-requests/2.34.2', '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.173&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-10-11T01:04:55.813213" level="INFO">PUT Response : url=http://10.30.170.173: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.173 
 status=201, reason=Created 
 headers={'Set-Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Sat, 10-Oct-2026 01:04:55 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:55.813307" 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-10-11T01:04:55.789852" elapsed="0.023478"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:55.789607" elapsed="0.023763"/>
</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-10-11T01:04:55.813571" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:55.813394" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.789591" elapsed="0.024107"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.815029" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:55.814755" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:55.814496" elapsed="0.000604"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.814479" elapsed="0.000643"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.815700" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:55.815421" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:55.815171" elapsed="0.000603"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.815156" elapsed="0.000640"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.816322" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:55.815974" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.816643" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:55.816425" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.817150" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:55.816889" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:55.816728" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.816394" elapsed="0.000831"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.817775" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:55.817398" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.818069" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:55.817862" elapsed="0.000258"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.818579" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:55.818302" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:55.818141" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.817845" elapsed="0.000810"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:55.818818" elapsed="0.000288"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:55.819509" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:55.819267" elapsed="0.000266"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:55.819699" elapsed="0.000217"/>
</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-10-11T01:04:55.814181" elapsed="0.005790"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:04:55.820111" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:04:55.820030" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.820013" elapsed="0.000175"/>
</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-10-11T01:04:55.820333" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:04:55.820393" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:55.820569" 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-10-11T01:04:55.785130" elapsed="0.035463"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:55.820648" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:04:55.820784" 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-10-11T01:04:55.721820" elapsed="0.098986"/>
</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-10-11T01:04:55.821097" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:55.820892" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.820876" elapsed="0.000337"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:55.821244" elapsed="0.000024"/>
</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-10-11T01:04:55.721133" elapsed="0.100208"/>
</kw>
<doc>Configures bgp application peer.</doc>
<status status="PASS" start="2026-10-11T01:04:55.638275" elapsed="0.183186"/>
</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-10-11T01:04:55.822857" elapsed="0.000199"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:04:55.822587" elapsed="0.000519"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:55.824012" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:55.823925" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.823908" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:55.826218" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:55.826135" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.826118" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.827198" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:55.826875" elapsed="0.000348"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.827655" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:04:55.827376" elapsed="0.000315"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:04:55.827733" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:55.827859" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:04:55.826504" elapsed="0.001377"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:55.830362" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:55.830279" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.830261" elapsed="0.000180"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:55.831494" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:55.831389" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.831371" elapsed="0.000185"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:55.831883" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:04:55.831713" elapsed="0.000194"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:55.832206" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:55.832069" elapsed="0.000160"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:04:55.868849" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:04:55.832745" elapsed="0.036198"/>
</kw>
<msg time="2026-10-11T01:04:55.869091" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:04:55.869132" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:55.832387" elapsed="0.036780"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:04:55.916836" 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-10-11T01:04:55.869706" elapsed="0.047266"/>
</kw>
<msg time="2026-10-11T01:04:55.917137" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:04:55.917179" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:55.869335" elapsed="0.047879"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.917603" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:55.917339" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.917316" elapsed="0.000382"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.918143" 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-10-11T01:04:55.917884" elapsed="0.000332"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.918491" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:55.918275" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.918259" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:04:55.918597" 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-10-11T01:04:55.921114" elapsed="0.000260"/>
</kw>
<msg time="2026-10-11T01:04:55.921450" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:55.920045" elapsed="0.001544"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.921914" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.922250" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:04:55.919432" elapsed="0.003023"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:04:55.918925" 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-10-11T01:04:55.831132" elapsed="0.091459"/>
</kw>
<msg time="2026-10-11T01:04:55.922673" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:55.922728" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:55.830593" elapsed="0.092174"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:04:55.922922" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:04:55.922837" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.922819" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.923322" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.923699" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:04:55.923765" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T01:04:55.829995" elapsed="0.093855"/>
</kw>
<msg time="2026-10-11T01:04:55.923933" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:55.923974" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:55.828209" elapsed="0.095801"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.924299" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:55.924078" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.924062" elapsed="0.000307"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:04:55.828066" elapsed="0.096325"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:04:55.827928" elapsed="0.096570"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:04:55.825840" elapsed="0.098711"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:04:55.823663" elapsed="0.100940"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:55.823256" elapsed="0.101388"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:04:55.822190" elapsed="0.102550"/>
</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-10-11T01:04:55.935014" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:55.934712" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:55.935765" 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-10-11T01:04:55.935531" elapsed="0.000304">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-10-11T01:04:55.935919" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:55.935200" elapsed="0.000742"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.936437" 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-10-11T01:04:55.936116" elapsed="0.000347"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:55.936757" 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-10-11T01:04:55.936908" 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-10-11T01:04:55.936631" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.937346" 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-10-11T01:04:55.937128" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.938308" level="INFO">mapping: {'IP': '10.30.171.7', '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-10-11T01:04:55.938075" elapsed="0.000276"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.938983" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:04:55.938543" elapsed="0.000465"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.939622" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:55.939333" elapsed="0.000313"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:55.940329" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:55.940142" elapsed="0.000211"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:55.940398" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T01:04:55.940540" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:55.939831" elapsed="0.000732"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:55.940744" elapsed="0.000179"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T01:04:55.939198" elapsed="0.001763"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.941475" 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-10-11T01:04:55.941192" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:55.942211" 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-10-11T01:04:55.942030" elapsed="0.000205"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:55.942279" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:55.942401" 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-10-11T01:04:55.941667" 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-10-11T01:04:55.942606" elapsed="0.000528"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T01:04:55.941060" elapsed="0.002126"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.943790" 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-10-11T01:04:55.943495" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:55.944499" 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-10-11T01:04:55.944307" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:55.944568" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:55.944705" 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-10-11T01:04:55.943990" elapsed="0.000739"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:55.944894" elapsed="0.000165"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T01:04:55.943336" elapsed="0.001759"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.945606" 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-10-11T01:04:55.945323" elapsed="0.000308"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:55.946295" 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-10-11T01:04:55.946119" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:55.946363" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:55.946503" 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-10-11T01:04:55.945811" elapsed="0.000714"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:55.946702" elapsed="0.000165"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T01:04:55.945194" elapsed="0.001710"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.947396" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:04:55.947132" elapsed="0.000303"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:55.948101" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:04:55.947924" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:55.948170" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:55.948293" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:04:55.947603" elapsed="0.000712"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:55.948494" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:04:55.947002" elapsed="0.001705"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.949366" 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-10-11T01:04:55.948936" elapsed="0.000455"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:04:55.950072" 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-10-11T01:04:55.949896" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:04:55.950140" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:55.950262" 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-10-11T01:04:55.949574" elapsed="0.000711"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:04:55.950463" elapsed="0.000165"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T01:04:55.948807" elapsed="0.001857"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:04:55.939052" elapsed="0.011657"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:04:55.950747" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:04:55.950874" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', '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-10-11T01:04:55.937734" elapsed="0.013165"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:55.937466" elapsed="0.013462"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.951100" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:55.950949" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.937448" elapsed="0.013719"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.951940" 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-10-11T01:04:55.951326" elapsed="0.000640"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:55.952041" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:04:55.934181" elapsed="0.017960"/>
</kw>
<msg time="2026-10-11T01:04:55.952190" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:55.929905" elapsed="0.022328"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:04:55.956298" 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/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-10-11T01:04:55.960365" 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/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-10-11T01:04:55.964422" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.964607" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.964803" 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-10-11T01:04:55.965149" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:55.964994" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:55.964981" 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-10-11T01:04:55.965378" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.965575" 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-10-11T01:04:55.965751" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:55.964956" elapsed="0.000844"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:55.964870" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.965974" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:55.966039" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:04:55.966147" 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-10-11T01:04:55.929285" elapsed="0.036886"/>
</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-10-11T01:04:55.975102" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:55.974800" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:55.975814" 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-10-11T01:04:55.975622" elapsed="0.000251">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-10-11T01:04:55.975957" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:55.975286" elapsed="0.000692"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.976472" 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-10-11T01:04:55.976150" elapsed="0.000347"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:04:55.976783" 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-10-11T01:04:55.976898" 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-10-11T01:04:55.976663" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.977337" 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-10-11T01:04:55.977122" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:04:55.977882" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:55.977459" elapsed="0.000479"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.978380" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', '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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:55.978112" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:55.977961" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.977441" elapsed="0.001034"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.979210" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:55.978638" elapsed="0.000600"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:04:55.979282" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:04:55.974266" elapsed="0.005116"/>
</kw>
<msg time="2026-10-11T01:04:55.979446" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:55.969982" elapsed="0.009508"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:04:55.983545" 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/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-10-11T01:04:55.987594" 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/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-10-11T01:04:55.991693" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.991875" 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-10-11T01:04:55.992058" 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-10-11T01:04:55.992394" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:55.992249" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:04:55.992235" 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-10-11T01:04:55.992639" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.992844" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.993008" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:04:55.992210" elapsed="0.000846"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:04:55.992123" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.993228" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:04:55.993294" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:04:55.993402" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&lt;/neighbor-address&gt;
    &lt;config&gt;
        &lt;peer-group&gt;/bgp/neighbors/neighbor/bgp/peer-...</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-10-11T01:04:55.969254" elapsed="0.024191"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:04:55.994559" 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-10-11T01:04:55.994356" elapsed="0.000262">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-10-11T01:04:55.994715" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:04:55.994033" elapsed="0.000706"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:55.995021" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:55.994802" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.995539" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:55.995261" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:55.995093" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:55.994785" elapsed="0.000830"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.996123" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:55.995789" elapsed="0.000357"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:04:55.996190" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:55.996344" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:04:55.993733" elapsed="0.002634"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.997609" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:55.997373" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.998069" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T01:04:55.997855" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.998534" 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-10-11T01:04:55.998300" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:55.998992" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:55.998776" elapsed="0.000255"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:55.999764" 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-10-11T01:04:55.999589" elapsed="0.000200"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:04:56.000233" 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-10-11T01:04:55.999943" elapsed="0.000314"/>
</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-10-11T01:04:56.000439" elapsed="0.000158"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:56.001027" 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-10-11T01:04:56.000803" elapsed="0.000265"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:04:56.001106" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:04:56.001233" 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-10-11T01:04:55.999213" elapsed="0.002043"/>
</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-10-11T01:04:56.011145" level="INFO">PUT Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Content-Length': '293', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.171.7&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-10-11T01:04:56.011199" level="INFO">PUT Response : url=http://10.30.170.173: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.171.7 
 status=201, reason=Created 
 headers={'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T01:04:56.011279" 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-10-11T01:04:56.001566" elapsed="0.009737"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:56.001319" elapsed="0.010025"/>
</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-10-11T01:04:56.011539" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:56.011368" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:56.001303" elapsed="0.010316"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:56.012792" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:56.012507" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:56.012249" elapsed="0.000614"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:56.012232" elapsed="0.000653"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:56.013448" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:04:56.013169" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:56.012934" elapsed="0.000588"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:56.012919" elapsed="0.000625"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:56.014080" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:56.013733" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:56.014427" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:56.014198" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:56.014941" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:56.014665" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:56.014502" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:56.014180" elapsed="0.000836"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:04:56.015540" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:56.015192" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:56.015849" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:56.015627" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:04:56.016339" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:04:56.016081" elapsed="0.000282"/>
</kw>
<status status="PASS" start="2026-10-11T01:04:56.015922" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:56.015611" elapsed="0.000819"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:56.016576" elapsed="0.000303"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:04:56.017264" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:04:56.017041" elapsed="0.000247"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:04:56.017457" elapsed="0.000213"/>
</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-10-11T01:04:56.011959" elapsed="0.005781"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:04:56.017883" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:04:56.017801" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:56.017784" elapsed="0.000175"/>
</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-10-11T01:04:56.018104" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:04:56.018164" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:04:56.018320" 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-10-11T01:04:55.996695" elapsed="0.021649"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:56.018399" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T01:04:56.018538" 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-10-11T01:04:55.925580" elapsed="0.092981"/>
</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-10-11T01:04:56.018860" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:56.018647" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:56.018630" elapsed="0.000311"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:04:56.018971" elapsed="0.000023"/>
</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-10-11T01:04:55.924978" elapsed="0.094089"/>
</kw>
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="PASS" start="2026-10-11T01:04:55.821714" elapsed="0.197453"/>
</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-10-11T01:04:56.020764" elapsed="0.000200"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:04:56.020502" elapsed="0.000512"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:56.023264" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:56.023177" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:56.023158" elapsed="0.000168"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:56.025303" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:56.025222" elapsed="0.000122"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:56.025205" elapsed="0.000159"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:04:56.026281" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:04:56.025954" elapsed="0.000352"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:04:56.026752" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:04:56.026475" elapsed="0.000302"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:04:56.026818" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:04:56.026945" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:04:56.025585" elapsed="0.001383"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:56.029462" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:56.029362" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:56.029344" elapsed="0.000182"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:04:56.030587" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:04:56.030503" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:56.030486" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:04:56.030978" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:04:56.030809" elapsed="0.000193"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:04:56.031302" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:04:56.031165" elapsed="0.000160"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:04:56.067029" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:04:56.031842" elapsed="0.035280"/>
</kw>
<msg time="2026-10-11T01:04:56.067269" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:04:56.067310" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:56.031499" elapsed="0.035846"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:04:56.106062" 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-10-11T01:04:56.067876" elapsed="0.038312"/>
</kw>
<msg time="2026-10-11T01:04:56.106354" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:04:56.106395" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:56.067528" elapsed="0.038922"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:56.106787" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:56.106532" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:56.106508" elapsed="0.000354"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:56.107301" 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-10-11T01:04:56.107046" elapsed="0.000321"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:56.107643" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:56.107442" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:56.107424" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:04:56.107763" 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-10-11T01:04:56.156444" elapsed="0.000142"/>
</kw>
<msg time="2026-10-11T01:04:56.156662" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:04:56.155120" 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-10-11T01:04:56.157136" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:56.157495" 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-10-11T01:04:56.108627" elapsed="0.049070"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:04:56.108126" elapsed="0.049636"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:04:56.030225" elapsed="0.127615"/>
</kw>
<msg time="2026-10-11T01:04:56.157928" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:56.157970" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:56.029693" elapsed="0.128312"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:04:56.158184" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-11T01:04:56.158086" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:56.158063" 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-10-11T01:04:56.158667" elapsed="0.000043"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:56.158993" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:04:56.159059" 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-10-11T01:04:56.029074" elapsed="0.130072"/>
</kw>
<msg time="2026-10-11T01:04:56.159232" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:04:56.159273" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:56.027296" elapsed="0.132012"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:04:56.159621" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:04:56.159376" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-10-11T01:04:56.159360" elapsed="0.000353"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:04:56.027153" elapsed="0.132582"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:04:56.027015" elapsed="0.132751"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:04:56.024929" elapsed="0.134890"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:04:56.021606" elapsed="0.138264"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:04:56.021197" elapsed="0.138714"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:04:56.020143" elapsed="0.139817"/>
</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-10-11T01:04:56.161640" level="INFO">${command} = python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T01:04:56.161328" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:04:56.162106" level="INFO">python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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-10-11T01:04:56.161879" elapsed="0.000269"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:04:56.165849" level="INFO">python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --peerport=1790 --debug --rt_constrain --wfr 1 &amp;&gt; play.py.out</msg>
<msg time="2026-10-11T01:04:56.165931" level="INFO">${output} =  python3 play.py --amount 0 --myip=10.30.171.7 --myport=17900 --peerip=10.30.170.173 --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-10-11T01:04:56.162301" elapsed="0.003704"/>
</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-10-11T01:04:56.160966" elapsed="0.005097"/>
</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-10-11T01:05:02.167946" 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-10-11T01:04:56.167631" elapsed="6.000935">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-10-11T01:05:02.168889" elapsed="0.000030"/>
</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-10-11T01:04:56.167335" elapsed="6.001693">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-10-11T01:04:56.166976" elapsed="6.002166"/>
</kw>
<msg time="2026-10-11T01:05:02.169240" 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-10-11T01:04:56.166585" elapsed="6.002680"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-10-11T01:05:02.169440" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-10-11T01:05:02.169350" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:02.169327" elapsed="0.000195"/>
</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-10-11T01:05:02.170032" elapsed="0.000026"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was seen but it was not expected yet</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:02.170216" 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-10-11T01:04:56.166298" elapsed="6.003992"/>
</kw>
<doc>Starts bgp peer and verifies that the peer runs.</doc>
<status status="PASS" start="2026-10-11T01:04:56.160631" elapsed="6.009705"/>
</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-10-11T01:04:56.160148" elapsed="6.010226"/>
</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-10-11T01:04:56.019436" elapsed="6.151061"/>
</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-10-11T01:05:02.171796" elapsed="0.000239"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:05:02.171528" 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-10-11T01:05:02.173057" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:02.172958" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:02.172940" elapsed="0.000182"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:02.175187" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:02.175104" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:02.175087" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:02.176179" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:02.175849" elapsed="0.000355"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:05:02.176680" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:05:02.176358" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:05:02.176746" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:02.176872" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:05:02.175477" elapsed="0.001417"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:02.179535" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:02.179449" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:02.179430" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:02.180741" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:02.180599" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:02.180582" elapsed="0.000226"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:02.181134" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:05:02.180960" elapsed="0.000198"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:02.181483" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:05:02.181324" elapsed="0.000183"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:05:02.217640" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:05:02.182014" elapsed="0.035732"/>
</kw>
<msg time="2026-10-11T01:05:02.217897" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:05:02.217938" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:02.181681" elapsed="0.036319"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:05:02.264400" 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-10-11T01:05:02.218530" elapsed="0.045992"/>
</kw>
<msg time="2026-10-11T01:05:02.264696" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:05:02.264739" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:02.218171" elapsed="0.046601"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:02.265058" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:02.264844" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:02.264825" elapsed="0.000306"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:02.265580" 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-10-11T01:05:02.265313" elapsed="0.000336"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:02.265932" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:02.265725" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:02.265708" elapsed="0.000295"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:05:02.266033" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:05:02.268443" elapsed="0.000114"/>
</kw>
<msg time="2026-10-11T01:05:02.268615" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:02.267423" elapsed="0.001341"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:02.269069" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:02.269422" 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-10-11T01:05:02.266828" elapsed="0.002782"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:05:02.266326" elapsed="0.003358"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:05:02.180322" elapsed="0.089436"/>
</kw>
<msg time="2026-10-11T01:05:02.269839" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:02.269879" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:02.179762" elapsed="0.090150"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:05:02.270066" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:05:02.269981" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:02.269963" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:02.270479" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:02.270834" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:05:02.270898" 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-10-11T01:05:02.179144" elapsed="0.091840"/>
</kw>
<msg time="2026-10-11T01:05:02.271067" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:02.271106" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:02.177228" elapsed="0.093911"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:02.271448" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:02.271206" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:02.271189" elapsed="0.000330"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:05:02.177086" elapsed="0.094455"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:05:02.176943" elapsed="0.094626"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:05:02.174809" elapsed="0.096810"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:05:02.172693" elapsed="0.098989"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:02.172242" elapsed="0.099481"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:05:02.171142" elapsed="0.100627"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:02.272545" 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-10-11T01:05:02.272718" 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-10-11T01:05:02.272377" elapsed="0.000365"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:05:02.273083" 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-10-11T01:05:02.272904" elapsed="0.000203"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:02.273594" 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-10-11T01:05:02.273737" 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-10-11T01:05:02.273268" elapsed="0.000493"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:05:02.274088" 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-10-11T01:05:02.273921" elapsed="0.000191"/>
</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-10-11T01:05:02.274359" elapsed="0.003127"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:02.274174" elapsed="0.003356"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:02.274157" elapsed="0.003397"/>
</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-10-11T01:05:02.288158" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:02.287855" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:02.288895" 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-10-11T01:05:02.288697" elapsed="0.000263">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-10-11T01:05:02.289077" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:02.288345" elapsed="0.000756"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:02.289603" 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-10-11T01:05:02.289276" elapsed="0.000353"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:02.289920" 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-10-11T01:05:02.290040" 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-10-11T01:05:02.289811" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:02.290495" 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-10-11T01:05:02.290260" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:02.291457" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:05:02.291209" elapsed="0.000290"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:02.291954" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:02.291693" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:02.292722" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:02.292291" elapsed="0.000456"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:02.293615" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:02.293232" elapsed="0.000408"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:02.293700" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:02.293827" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:02.292921" elapsed="0.000929"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:02.294018" elapsed="0.000183"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:05:02.292160" elapsed="0.002077"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:02.294764" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:02.294482" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:02.295640" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:02.295262" elapsed="0.000416"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:02.295723" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:02.295848" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:02.294956" elapsed="0.000915"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:02.296032" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:02.294336" elapsed="0.001896"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:02.292022" elapsed="0.004241"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:02.296301" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:05:02.296449" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:05:02.290867" elapsed="0.005607"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:02.290599" elapsed="0.005904"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:02.296689" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:02.296525" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:02.290581" elapsed="0.006178"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:02.297456" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:02.296921" elapsed="0.000562"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:02.297528" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:02.287323" elapsed="0.010352"/>
</kw>
<msg time="2026-10-11T01:05:02.297727" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:02.282992" elapsed="0.014780"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:02.301899" 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/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-10-11T01:05:02.305983" 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/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-10-11T01:05:02.310045" elapsed="0.000023"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:02.310228" 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-10-11T01:05:02.310424" 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-10-11T01:05:02.310779" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:02.310618" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:02.310604" 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-10-11T01:05:02.311005" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:02.311185" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:02.311347" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:02.310580" elapsed="0.000815"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:02.310492" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:02.311586" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:02.311664" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:05:02.311775" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:02.282371" elapsed="0.029429"/>
</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-10-11T01:05:02.320933" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:02.320618" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:02.321623" 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-10-11T01:05:02.321452" elapsed="0.000245">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-10-11T01:05:02.321781" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:02.321118" elapsed="0.000685"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:02.322283" 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-10-11T01:05:02.321977" elapsed="0.000331"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:02.322597" 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-10-11T01:05:02.322729" 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-10-11T01:05:02.322489" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:02.323166" 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-10-11T01:05:02.322950" elapsed="0.000265"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:05:02.323541" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:02.323276" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:02.324040" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', '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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:02.323777" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:02.323616" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:02.323258" elapsed="0.000858"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:02.324689" 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-10-11T01:05:02.324278" elapsed="0.000440"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:02.324762" 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/app.vanadium/${file_name} exists. If 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-10-11T01:05:02.320104" elapsed="0.004759"/>
</kw>
<msg time="2026-10-11T01:05:02.324912" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:02.315785" elapsed="0.009171"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:02.329021" 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/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-10-11T01:05:02.333199" 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-10-11T01:05:02.337503" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:02.337708" 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-10-11T01:05:02.337898" 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-10-11T01:05:02.338252" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:02.338103" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:02.338088" 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-10-11T01:05:02.338500" 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-10-11T01:05:02.338702" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:02.338870" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:02.338059" elapsed="0.000858"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:02.337967" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:02.339094" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:02.339161" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:05:02.339287" 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-10-11T01:05:02.315070" elapsed="0.024245"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:02.340521" 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-10-11T01:05:02.340283" elapsed="0.000302">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-10-11T01:05:02.340684" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:02.339937" 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-10-11T01:05:02.341003" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:02.340774" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:02.341537" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:02.341254" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:02.341076" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:02.340757" elapsed="0.000859"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:02.342141" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:02.341792" elapsed="0.000412"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:02.342252" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:02.342380" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:02.339607" elapsed="0.002810"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:02.343761" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:02.343520" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:02.344214" 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-10-11T01:05:02.343999" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:02.344703" 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-10-11T01:05:02.344467" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:02.345149" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:02.344934" elapsed="0.000255"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:02.345929" 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-10-11T01:05:02.345764" elapsed="0.000189"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:05:02.346253" 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-10-11T01:05:02.346109" elapsed="0.000168"/>
</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-10-11T01:05:02.346457" elapsed="0.000161"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:02.347047" 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-10-11T01:05:02.346825" elapsed="0.000264"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:05:02.347128" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:02.347255" 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-10-11T01:05:02.345371" elapsed="0.001908"/>
</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-10-11T01:05:02.361350" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.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-10-11T01:05:02.361426" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:02.361527" 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-10-11T01:05:02.347589" elapsed="0.013962"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:02.347342" elapsed="0.014250"/>
</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-10-11T01:05:02.361781" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:02.361615" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:02.347326" elapsed="0.014536"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:02.363282" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:02.363009" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:02.362767" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:02.362750" elapsed="0.000627"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:02.363965" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:02.363691" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:02.363442" elapsed="0.000595"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:02.363426" elapsed="0.000633"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:02.364603" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:02.364237" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:02.364917" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:02.364703" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:02.365432" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:02.365154" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:02.364992" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:02.364686" elapsed="0.000824"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:02.366029" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:02.365695" elapsed="0.000360"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:02.366325" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:02.366117" elapsed="0.000261"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:02.366854" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:02.366579" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:02.366400" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:02.366100" elapsed="0.000835"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:02.367080" elapsed="0.000288"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:02.367781" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:02.367545" elapsed="0.000260"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:02.367958" elapsed="0.000211"/>
</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-10-11T01:05:02.362222" elapsed="0.006001"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:05:02.368370" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:05:02.368288" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:02.368272" elapsed="0.000191"/>
</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-10-11T01:05:02.368659" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:05:02.368723" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:05:02.368881" 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-10-11T01:05:02.342734" elapsed="0.026171"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:02.368966" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:05:02.369089" 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-10-11T01:05:02.278485" elapsed="0.090627"/>
</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-10-11T01:05:02.369423" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:02.369205" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:02.369189" elapsed="0.000351"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:02.369571" 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-10-11T01:05:02.277795" elapsed="0.091888"/>
</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-10-11T01:05:02.373243" level="INFO">${update} = </msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:05:02.370589" elapsed="0.002681"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:05:02.373805" level="FAIL"> == </msg>
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="FAIL" start="2026-10-11T01:05:02.373448" elapsed="0.000417"> == </status>
</kw>
<return>
<value>${update}</value>
<status status="NOT RUN" start="2026-10-11T01:05:02.373920" elapsed="0.000017"/>
</return>
<doc>Returns hex update message.</doc>
<status status="FAIL" start="2026-10-11T01:05:02.370315" elapsed="0.003704"> == </status>
</kw>
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:05:04.378713" level="INFO">${update} = ffffffffffffffffffffffffffffffff0032020000001b4001010040020040050400000064800e0a00018404c714a6290000</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:05:04.375525" elapsed="0.003260"/>
</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-10-11T01:05:04.379205" elapsed="0.000787"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:05:04.380096" elapsed="0.000073"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:05:04.374795" elapsed="0.005548"/>
</kw>
<msg time="2026-10-11T01:05:04.380594" 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-10-11T01:05:02.369874" elapsed="2.010797"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.382557" level="INFO">Length is 100.</msg>
<msg time="2026-10-11T01:05:04.382734" 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-10-11T01:05:04.381935" elapsed="0.000851"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.383700" level="INFO">Length is 100.</msg>
<msg time="2026-10-11T01:05:04.383852" 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-10-11T01:05:04.383140" elapsed="0.000762"/>
</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-10-11T01:05:04.384314" elapsed="0.000654"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:05:04.386118" 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-10-11T01:05:04.385299" elapsed="0.000873"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:05:04.386962" 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-10-11T01:05:04.386615" elapsed="0.000400"/>
</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-10-11T01:05:04.387448" elapsed="0.000623"/>
</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-10-11T01:05:04.381127" elapsed="0.007067"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:05:04.388540" elapsed="0.002912"/>
</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-10-11T01:05:04.422403" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:04.421976" elapsed="0.000487"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:04.423466" 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-10-11T01:05:04.423161" elapsed="0.000399">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-10-11T01:05:04.423693" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:04.422710" elapsed="0.001015"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.424401" 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-10-11T01:05:04.423972" elapsed="0.000486"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:04.424941" 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-10-11T01:05:04.425127" 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-10-11T01:05:04.424781" elapsed="0.000380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.425779" 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-10-11T01:05:04.425455" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.427139" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:05:04.426816" elapsed="0.000381"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.427834" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:04.427465" elapsed="0.000404"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.428961" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:04.428326" elapsed="0.000670"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:04.430700" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:04.430037" elapsed="0.000771"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:04.430992" elapsed="0.000049"/>
</return>
<msg time="2026-10-11T01:05:04.431239" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:04.429237" elapsed="0.002035"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:04.431535" elapsed="0.000447"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:05:04.428137" elapsed="0.003899"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.432961" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:04.432361" elapsed="0.000635"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:04.434557" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:04.433881" elapsed="0.000799"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:04.434858" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T01:05:04.435089" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:04.433232" elapsed="0.001890"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:04.435351" elapsed="0.000473"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:04.432179" elapsed="0.003697"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:04.427936" elapsed="0.007984"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:04.435975" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T01:05:04.436153" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:05:04.426299" elapsed="0.009886"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:04.425933" elapsed="0.010292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:04.436492" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:04.436257" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:04.425904" elapsed="0.010686"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.437587" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:04.436826" elapsed="0.000799"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:04.437700" 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/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-10-11T01:05:04.421242" elapsed="0.016599"/>
</kw>
<msg time="2026-10-11T01:05:04.437953" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:04.411497" elapsed="0.026521"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:04.443813" 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/app.vanadium/${file_name} exists. If 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-10-11T01:05:04.448633" 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/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-10-11T01:05:04.452725" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:04.452907" 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-10-11T01:05:04.453090" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:04.453442" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:04.453280" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:04.453266" 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-10-11T01:05:04.453682" 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-10-11T01:05:04.453862" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:04.454026" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:04.453241" elapsed="0.000832"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:04.453155" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:04.454246" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:04.454311" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:04.454433" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:04.409965" elapsed="0.044494"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.455470" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:04.455233" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:04.466004" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:04.466069" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:04.466181" 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-10-11T01:05:04.455815" elapsed="0.010399"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:04.455574" elapsed="0.010691"/>
</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-10-11T01:05:04.466541" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:04.466299" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:04.455557" elapsed="0.011107"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.468595" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:04.467961" elapsed="0.000706"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:04.467609" elapsed="0.001105"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:04.467584" elapsed="0.001163"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.469561" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:04.469157" elapsed="0.000463"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:04.468819" elapsed="0.000861"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:04.468796" elapsed="0.000918"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.470479" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:04.469972" elapsed="0.000545"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:04.470918" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:04.470607" elapsed="0.000385"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.471661" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:04.471253" elapsed="0.000445"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:04.471023" elapsed="0.000722"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:04.470583" elapsed="0.001189"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.472510" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:04.472017" elapsed="0.000529"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:04.472942" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:04.472634" elapsed="0.000380"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.473688" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:04.473270" elapsed="0.000454"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:04.473044" elapsed="0.000725"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:04.472611" elapsed="0.001185"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:04.474001" elapsed="0.000430"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:04.474981" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:04.474673" 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-10-11T01:05:04.475227" elapsed="0.000313"/>
</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-10-11T01:05:04.467118" elapsed="0.008501"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:05:04.475691" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T01:05:04.475936" 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-10-11T01:05:04.454708" elapsed="0.021261"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:04.476035" elapsed="0.000034"/>
</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-10-11T01:05:04.393680" elapsed="0.082542"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:04.392719" elapsed="0.083572"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:05:04.391857" elapsed="0.084507"/>
</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-10-11T01:05:04.480316" level="INFO">${update} = ffffffffffffffffffffffffffffffff002c02000000154001010040020040050400000064800f0400018400</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:05:04.477660" elapsed="0.002694"/>
</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-10-11T01:05:04.480627" elapsed="0.000420"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:05:04.481107" elapsed="0.000038"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:05:04.477264" elapsed="0.003981"/>
</kw>
<msg time="2026-10-11T01:05:04.481338" 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-10-11T01:05:04.476659" elapsed="0.004711"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.482497" level="INFO">Length is 88.</msg>
<msg time="2026-10-11T01:05:04.482594" 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-10-11T01:05:04.482139" elapsed="0.000486"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.483178" level="INFO">Length is 88.</msg>
<msg time="2026-10-11T01:05:04.483272" 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-10-11T01:05:04.482856" elapsed="0.000448"/>
</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-10-11T01:05:04.483590" elapsed="0.000388"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:05:04.484377" 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-10-11T01:05:04.484182" elapsed="0.000249"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:05:04.484839" 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-10-11T01:05:04.484634" 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-10-11T01:05:04.485123" elapsed="0.000389"/>
</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-10-11T01:05:04.481683" elapsed="0.003914"/>
</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-10-11T01:05:04.503614" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:04.503297" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:04.504314" 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-10-11T01:05:04.504125" elapsed="0.000249">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-10-11T01:05:04.504475" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:04.503809" elapsed="0.000689"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.504994" 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-10-11T01:05:04.504682" elapsed="0.000337"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:04.505291" 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-10-11T01:05:04.505424" 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-10-11T01:05:04.505183" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.505869" 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-10-11T01:05:04.505652" 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-10-11T01:05:04.506881" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:05:04.506640" elapsed="0.000282"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.507342" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:04.507096" elapsed="0.000270"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.508157" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:04.507707" elapsed="0.000475"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:04.509216" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:04.508791" elapsed="0.000464"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:04.509366" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:05:04.509570" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:04.508353" elapsed="0.001240"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:04.509774" elapsed="0.000272"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:05:04.507564" elapsed="0.002519"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.510800" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:04.510314" elapsed="0.000510"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:04.511862" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:04.511394" elapsed="0.000508"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:04.512012" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:04.512187" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:04.510994" elapsed="0.001216"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:04.512374" elapsed="0.000302"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:04.510183" elapsed="0.002532"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:04.507424" elapsed="0.005322"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:04.512785" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:05:04.512912" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:05:04.506258" elapsed="0.006677"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:04.506005" elapsed="0.006958"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:04.513134" elapsed="0.001207"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:04.512984" elapsed="0.001396"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:04.505987" elapsed="0.008414"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.515132" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:04.514626" elapsed="0.000533"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:04.515203" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:04.502764" elapsed="0.012540"/>
</kw>
<msg time="2026-10-11T01:05:04.515351" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:04.498392" elapsed="0.017036"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:04.519559" 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/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-10-11T01:05:04.523705" 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/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-10-11T01:05:04.527802" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:04.527985" 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-10-11T01:05:04.528168" 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-10-11T01:05:04.528522" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:04.528358" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:04.528345" 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-10-11T01:05:04.528763" 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-10-11T01:05:04.528943" 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-10-11T01:05:04.529109" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:04.528320" elapsed="0.000835"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:04.528233" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:04.529330" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:04.529396" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:05:04.529532" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:04.497445" elapsed="0.032112"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.530587" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:04.530347" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:04.537584" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:04.537876" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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+xml', 'Content-Length': '619'} 
 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-path xmlns:a="urn:opendaylight:params:xml:ns:yang:bgp-rib" xmlns:b="urn:opendaylight:params:xml:ns:yang:bgp-types" xmlns:c="urn:opendaylight:params:xml:ns:yang:bgp:route:target:constrain"&gt;/a:application-rib[a:id='10.30.170.173']/a:tables[a:afi='b:ipv4-address-family'][a:safi='c:route-target-constrain-subsequent-address-family']/c:route-target-constrain-routes&lt;/error-path&gt;&lt;error-message&gt;Data does not exist&lt;/error-message&gt;&lt;error-tag&gt;data-missing&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-10-11T01:05:04.538043" level="INFO">${response} = None</msg>
<msg time="2026-10-11T01:05:04.538083" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:04.530931" elapsed="0.007553">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:04.530704" elapsed="0.007856">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:04.538759" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:04.538592" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-10-11T01:05:04.530687" elapsed="0.008150">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:04.540067" 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-10-11T01:05:04.539790" elapsed="0.000308">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:05:04.539536" elapsed="0.000619">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:05:04.539518" elapsed="0.000666">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-10-11T01:05:04.540778" 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-10-11T01:05:04.540499" elapsed="0.000309">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:05:04.540247" elapsed="0.000616">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:05:04.540232" elapsed="0.000659">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.541438" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:04.541081" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:04.541899" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:04.541678" elapsed="0.000275"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.542428" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:04.542142" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:04.541975" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:04.541511" elapsed="0.000996"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.543040" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:04.542696" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:04.543339" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:04.543128" elapsed="0.000264"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.543869" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:04.543593" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:04.543429" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:04.543112" elapsed="0.000833"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:04.544089" elapsed="0.000289"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:04.544785" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:04.544556" elapsed="0.000253"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-10-11T01:05:04.545124" 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-10-11T01:05:04.544963" elapsed="0.000190">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-10-11T01:05:04.539162" elapsed="0.006144">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-10-11T01:05:04.545362" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:04.545652" level="INFO">${response_text} = None</msg>
<msg time="2026-10-11T01:05:04.545681" 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-10-11T01:05:04.529799" elapsed="0.015909">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-10-11T01:05:04.545766" elapsed="0.000024"/>
</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-10-11T01:05:04.486980" elapsed="0.058923">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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:04.486380" elapsed="0.059577"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:05:04.485888" elapsed="0.060125"/>
</kw>
<arg>rt_constrain_default</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<status status="PASS" start="2026-10-11T01:05:02.272028" elapsed="2.274030"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:02.170716" elapsed="2.375442"/>
</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-10-11T01:05:04.547541" elapsed="0.000252"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:05:04.547234" elapsed="0.000613"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:04.548880" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:04.548792" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:04.548774" elapsed="0.000169"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:04.551159" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:04.551075" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:04.551057" elapsed="0.000164"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.552162" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:04.551840" elapsed="0.000347"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.552617" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:05:04.552340" elapsed="0.000316"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:05:04.552697" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:04.552823" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:05:04.551460" elapsed="0.001385"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:04.555332" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:04.555248" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:04.555230" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:04.556479" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:04.556361" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:04.556343" elapsed="0.000203"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:04.556883" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:05:04.556710" elapsed="0.000198"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:04.557220" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:05:04.557074" elapsed="0.000170"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:05:04.593387" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:05:04.557779" elapsed="0.035758"/>
</kw>
<msg time="2026-10-11T01:05:04.593706" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:05:04.593749" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:04.557402" elapsed="0.036384"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:05:04.639153" 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-10-11T01:05:04.594320" elapsed="0.044968"/>
</kw>
<msg time="2026-10-11T01:05:04.639486" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:05:04.639532" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:04.593976" elapsed="0.045592"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:04.639913" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:04.639663" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:04.639626" elapsed="0.000363"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.640459" 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-10-11T01:05:04.640174" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:04.640810" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:04.640593" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:04.640577" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:05:04.640915" 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-10-11T01:05:04.643722" elapsed="0.000125"/>
</kw>
<msg time="2026-10-11T01:05:04.643907" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:04.642376" elapsed="0.001671"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:04.644363" elapsed="0.000102"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:04.644807" 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-10-11T01:05:04.641762" 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-10-11T01:05:04.641231" elapsed="0.003835"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:05:04.556106" elapsed="0.089037"/>
</kw>
<msg time="2026-10-11T01:05:04.645228" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:04.645270" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:04.555560" elapsed="0.089744"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:05:04.645497" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T01:05:04.645375" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:04.645356" 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-10-11T01:05:04.645925" 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-10-11T01:05:04.646240" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:05:04.646305" 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-10-11T01:05:04.554963" elapsed="0.091429"/>
</kw>
<msg time="2026-10-11T01:05:04.646525" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:04.646567" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:04.553175" elapsed="0.093485"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:04.646967" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:04.646736" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:04.646717" elapsed="0.000323"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:05:04.553033" elapsed="0.094029"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:05:04.552891" elapsed="0.094201"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:05:04.550779" elapsed="0.096364"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:05:04.548520" elapsed="0.098676"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:04.548000" elapsed="0.099239"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:05:04.546890" elapsed="0.100401"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.648363" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:05:04.647941" elapsed="0.000451"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.649087" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:05:04.648692" elapsed="0.000421"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.649660" 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-10-11T01:05:04.649293" elapsed="0.000393"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:04.650000" 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-10-11T01:05:04.650145" 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-10-11T01:05:04.649854" elapsed="0.000315"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:04.650483" 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-10-11T01:05:04.650595" 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-10-11T01:05:04.650332" elapsed="0.000287"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:05:04.650774" elapsed="0.002383"/>
</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-10-11T01:05:04.653304" elapsed="0.002273"/>
</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-10-11T01:05:04.671581" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:04.671261" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:04.672297" 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-10-11T01:05:04.672100" elapsed="0.000268">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-10-11T01:05:04.672468" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:04.671780" elapsed="0.000711"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.672983" 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-10-11T01:05:04.672676" elapsed="0.000332"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:04.673320" 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-10-11T01:05:04.673456" 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-10-11T01:05:04.673210" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.673907" 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-10-11T01:05:04.673688" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.674859" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:05:04.674618" elapsed="0.000283"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.675320" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:04.675076" elapsed="0.000268"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.676125" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:05:04.675693" elapsed="0.000457"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:04.677322" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:04.676807" elapsed="0.000621"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:04.677520" elapsed="0.000032"/>
</return>
<msg time="2026-10-11T01:05:04.677751" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:04.676321" elapsed="0.001455"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:04.677944" elapsed="0.000320"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:05:04.675545" elapsed="0.002757"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.679031" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:04.678568" elapsed="0.000488"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:04.680221" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:04.679717" elapsed="0.000594"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:04.680391" elapsed="0.000055"/>
</return>
<msg time="2026-10-11T01:05:04.680640" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:04.679227" 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-10-11T01:05:04.680846" elapsed="0.000305"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:04.678402" elapsed="0.002788"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:04.675388" elapsed="0.005833"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:04.681258" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:04.681387" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:05:04.674262" elapsed="0.007277"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:04.674011" elapsed="0.007563"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:04.681767" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:04.681598" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:04.673993" elapsed="0.007845"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.682720" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-fam...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:04.682005" elapsed="0.000742"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:04.682792" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:04.670757" elapsed="0.012137"/>
</kw>
<msg time="2026-10-11T01:05:04.682977" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:04.666426" elapsed="0.016597"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:04.687110" 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/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-10-11T01:05:04.691175" 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/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-10-11T01:05:04.695282" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:04.695494" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:04.695691" 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-10-11T01:05:04.696033" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:04.695885" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:04.695871" 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-10-11T01:05:04.696262" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:04.696457" 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-10-11T01:05:04.696624" elapsed="0.000029"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:04.695846" elapsed="0.000837"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:04.695757" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:04.696860" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:04.696972" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:05:04.697084" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-fam...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:05:04.665817" elapsed="0.031292"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:04.698223" 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-10-11T01:05:04.698029" elapsed="0.000254">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-10-11T01:05:04.698397" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:04.697703" elapsed="0.000733"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:04.698736" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:04.698501" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.699240" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:04.698980" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:04.698811" elapsed="0.000485"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:04.698484" elapsed="0.000831"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.699841" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:04.699491" elapsed="0.000374"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:04.699909" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:04.700031" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:04.697375" elapsed="0.002679"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:04.701156" 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-10-11T01:05:04.700968" elapsed="0.000247">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-10-11T01:05:04.701298" 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-10-11T01:05:04.700629" elapsed="0.000692"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:05:04.701498" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:05:04.701383" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:04.701366" elapsed="0.000209"/>
</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-10-11T01:05:04.701741" elapsed="0.000020"/>
</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-10-11T01:05:04.701917" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:05:04.701974" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:05:04.702096" 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-10-11T01:05:04.700300" elapsed="0.001819"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.703328" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:04.703109" elapsed="0.000261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:04.703973" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:04.703575" elapsed="0.000441"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:04.710673" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:04.710816" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:04.710907" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:04.704307" elapsed="0.006948">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:04.704077" elapsed="0.007284">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:04.711567" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:04.711394" elapsed="0.000232"/>
</branch>
<status status="FAIL" start="2026-10-11T01:05:04.704059" elapsed="0.007605">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:04.712003" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:04.712123" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:04.712090" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:04.712073" elapsed="0.000109"/>
</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-10-11T01:05:04.712324" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:05:04.712388" elapsed="0.000013"/>
</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-10-11T01:05:04.702397" elapsed="0.010102">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:04.712566" elapsed="0.000014"/>
</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-10-11T01:05:04.658190" elapsed="0.054474">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:04.712911" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:04.712748" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:04.712732" elapsed="0.000266"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:04.713027" elapsed="0.000013"/>
</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-10-11T01:05:04.657562" elapsed="0.055553">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:06.748269" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:06.747519" elapsed="0.000816"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:06.749951" 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-10-11T01:05:06.749497" elapsed="0.000600">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-10-11T01:05:06.750287" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:06.748753" elapsed="0.001593"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.751716" 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-10-11T01:05:06.750933" elapsed="0.000843"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:06.752439" 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-10-11T01:05:06.752750" 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-10-11T01:05:06.752156" elapsed="0.000650"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.753797" 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-10-11T01:05:06.753246" elapsed="0.000649"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.756008" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:05:06.755466" elapsed="0.000637"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.757114" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:06.756527" elapsed="0.000641"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.759058" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:05:06.757940" elapsed="0.001175"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:06.761873" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:06.760610" elapsed="0.001459"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:06.762255" elapsed="0.000075"/>
</return>
<msg time="2026-10-11T01:05:06.762848" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:06.759564" elapsed="0.003340"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:06.763285" elapsed="0.000792"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:05:06.757620" elapsed="0.006545"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.765955" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:06.764773" elapsed="0.001238"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:06.768794" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:06.767521" elapsed="0.001466"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:06.769164" elapsed="0.000066"/>
</return>
<msg time="2026-10-11T01:05:06.769734" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:06.766401" elapsed="0.003389"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:06.770165" elapsed="0.000779"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:06.764390" elapsed="0.006654"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:06.757271" elapsed="0.013854"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:06.771190" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T01:05:06.771371" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:05:06.754667" elapsed="0.016737"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:06.754042" elapsed="0.017447"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:06.771757" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:06.771525" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:06.753998" elapsed="0.017859"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.772905" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-fam...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:06.772084" elapsed="0.000859"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:06.773005" 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/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-10-11T01:05:06.746116" elapsed="0.027074"/>
</kw>
<msg time="2026-10-11T01:05:06.773261" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:06.735869" elapsed="0.037456"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:06.779324" 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-10-11T01:05:06.785095" 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/rib.vanadium/${file_name} exists. If 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-10-11T01:05:06.790811" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:06.791076" 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-10-11T01:05:06.791334" 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-10-11T01:05:06.791849" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:06.791623" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:06.791604" elapsed="0.000345"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:06.792166" 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-10-11T01:05:06.792434" 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-10-11T01:05:06.792682" elapsed="0.000027"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:06.791569" elapsed="0.001181"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:06.791446" elapsed="0.001337"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:06.792993" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:06.793090" elapsed="0.000020"/>
</return>
<msg time="2026-10-11T01:05:06.793242" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-fam...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:05:06.734475" elapsed="0.058801"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:06.794935" 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-10-11T01:05:06.794665" elapsed="0.000354">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-10-11T01:05:06.795134" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:06.794158" elapsed="0.001008"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:06.795582" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:06.795253" elapsed="0.000422"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.796326" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:06.795957" elapsed="0.000403"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:06.795707" elapsed="0.000697"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:06.795229" elapsed="0.001223"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.797181" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:06.796702" elapsed="0.000520"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:06.797299" elapsed="0.000047"/>
</return>
<msg time="2026-10-11T01:05:06.797529" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:06.793735" elapsed="0.003823"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:06.798662" 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-10-11T01:05:06.798458" elapsed="0.000263">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-10-11T01:05:06.798804" 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-10-11T01:05:06.798122" elapsed="0.000705"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:05:06.798986" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:05:06.798889" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:06.798873" elapsed="0.000190"/>
</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-10-11T01:05:06.799219" elapsed="0.000020"/>
</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-10-11T01:05:06.799394" elapsed="0.000034"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:05:06.799470" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:05:06.799594" 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-10-11T01:05:06.797823" elapsed="0.001794"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.800922" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:06.800662" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.801379" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:06.801159" 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-10-11T01:05:06.809369" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:06.809544" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:06.809689" 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-10-11T01:05:06.801753" elapsed="0.007963"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:06.801507" elapsed="0.008249"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:06.809939" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:06.809780" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:06.801489" elapsed="0.008546"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.811898" 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-10-11T01:05:06.811395" elapsed="0.000566"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:06.811057" elapsed="0.000949"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:06.811032" elapsed="0.001006"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.812864" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:06.812467" elapsed="0.000456"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:06.812110" elapsed="0.000857"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:06.812088" elapsed="0.000911"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.813772" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:06.813247" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:06.814201" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:06.813899" elapsed="0.000375"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.814943" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:06.814554" elapsed="0.000425"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:06.814305" elapsed="0.000725"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:06.813876" elapsed="0.001182"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.815812" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:06.815306" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:06.816230" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:06.815937" elapsed="0.000365"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.816964" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:06.816580" elapsed="0.000419"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:06.816332" elapsed="0.000712"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:06.815914" elapsed="0.001157"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:06.817272" elapsed="0.000447"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:06.818261" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:06.817946" 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-10-11T01:05:06.818530" elapsed="0.000319"/>
</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-10-11T01:05:06.810559" elapsed="0.008371"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:06.819133" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:06.819018" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:06.818995" elapsed="0.000222"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:06.820230" 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-10-11T01:05:06.819437" elapsed="0.000831"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:05:06.820333" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T01:05:06.820533" 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-10-11T01:05:06.799914" elapsed="0.020655"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:06.820707" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T01:05:06.820883" 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-10-11T01:05:06.718316" elapsed="0.102601"/>
</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-10-11T01:05:06.834776" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:06.834459" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:06.835536" 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-10-11T01:05:06.835280" elapsed="0.000391">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-10-11T01:05:06.835839" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:06.834962" elapsed="0.000901"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.836351" 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-10-11T01:05:06.836041" elapsed="0.000335"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:06.836694" 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-10-11T01:05:06.836821" 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-10-11T01:05:06.836572" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.837259" 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-10-11T01:05:06.837041" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:05:06.837715" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:06.837363" elapsed="0.000407"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.838390" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:06.837941" elapsed="0.000500"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:06.837793" elapsed="0.000685"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:06.837346" elapsed="0.001151"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.839064" 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-10-11T01:05:06.838674" elapsed="0.000417"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:06.839134" 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-10-11T01:05:06.833933" elapsed="0.005304"/>
</kw>
<msg time="2026-10-11T01:05:06.839315" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:06.828604" elapsed="0.010758"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:06.843565" 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/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-10-11T01:05:06.847672" 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/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-10-11T01:05:06.851908" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:06.852095" 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-10-11T01:05:06.852280" 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-10-11T01:05:06.852710" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:06.852494" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:06.852481" 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-10-11T01:05:06.852946" 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-10-11T01:05:06.853126" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:06.853290" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:06.852453" elapsed="0.000885"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:06.852347" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:06.853538" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:06.853607" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:06.853727" 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-10-11T01:05:06.827577" elapsed="0.026175"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:06.853917" elapsed="0.000315"/>
</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-10-11T01:05:06.855220" 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-10-11T01:05:06.854892" elapsed="0.000383"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:06.855779" 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-10-11T01:05:06.855445" 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-10-11T01:05:06.855992" elapsed="0.000280"/>
</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-10-11T01:05:06.854519" elapsed="0.001808"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:06.854301" 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-10-11T01:05:06.856571" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:06.856380" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:06.854285" 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-10-11T01:05:06.822273" elapsed="0.034421"/>
</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-10-11T01:05:06.821313" elapsed="0.035447"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:06.821021" elapsed="0.035778"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:06.820998" elapsed="0.035822"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:06.856850" elapsed="0.000026"/>
</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-10-11T01:05:06.716763" elapsed="0.140187"/>
</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-10-11T01:05:04.655789" elapsed="2.201213"/>
</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-10-11T01:05:06.873842" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:06.873522" elapsed="0.000348"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:06.874541" 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-10-11T01:05:06.874350" elapsed="0.000252">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-10-11T01:05:06.874699" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:06.874029" elapsed="0.000693"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.875215" 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-10-11T01:05:06.874896" elapsed="0.000346"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:06.875535" 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-10-11T01:05:06.875663" 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-10-11T01:05:06.875424" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.876103" 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-10-11T01:05:06.875884" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.877062" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:05:06.876830" elapsed="0.000274"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.877585" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:06.877314" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.878369" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:05:06.877938" elapsed="0.000457"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:06.879604" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:06.879059" elapsed="0.000649"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:06.879791" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:05:06.880009" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:06.878604" elapsed="0.001431"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:06.880205" elapsed="0.000341"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/effective-rib-in</var>
<status status="PASS" start="2026-10-11T01:05:06.877805" elapsed="0.002781"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.881280" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:06.880838" elapsed="0.000469"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:06.882502" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:06.881966" elapsed="0.000626"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:06.882695" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:05:06.882915" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:06.881516" elapsed="0.001423"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:06.883111" elapsed="0.000417"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:06.880702" elapsed="0.002870"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:06.877665" elapsed="0.005939"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:06.883654" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:06.883790" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:05:06.876475" elapsed="0.007339"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:06.876207" elapsed="0.007636"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:06.884018" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:06.883866" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:06.876189" elapsed="0.007904"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.884789" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-addre...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:06.884252" elapsed="0.000565"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:06.884862" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:06.872993" elapsed="0.011969"/>
</kw>
<msg time="2026-10-11T01:05:06.885011" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:06.867503" elapsed="0.017553"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:06.889314" 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/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-10-11T01:05:06.893396" 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/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-10-11T01:05:06.897513" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:06.897708" 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-10-11T01:05:06.897894" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:06.898231" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:06.898086" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:06.898072" 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-10-11T01:05:06.898474" 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-10-11T01:05:06.898666" 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-10-11T01:05:06.898834" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:06.898047" elapsed="0.000835"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:06.897960" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:06.899056" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:06.899122" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:05:06.899230" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-addre...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:05:06.866895" elapsed="0.032360"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:06.900353" 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-10-11T01:05:06.900168" elapsed="0.000259">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-10-11T01:05:06.900513" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:06.899846" elapsed="0.000690"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:06.900851" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:06.900599" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.901357" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:06.901094" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:06.900927" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:06.900582" elapsed="0.000877"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.901977" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:06.901625" elapsed="0.000377"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:06.902046" elapsed="0.000056"/>
</return>
<msg time="2026-10-11T01:05:06.902203" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:06.899531" elapsed="0.002695"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:06.903303" 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-10-11T01:05:06.903120" elapsed="0.000242">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-10-11T01:05:06.903462" 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-10-11T01:05:06.902801" elapsed="0.000684"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:05:06.903658" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:05:06.903549" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:06.903532" elapsed="0.000218"/>
</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-10-11T01:05:06.903905" elapsed="0.000019"/>
</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-10-11T01:05:06.904080" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:05:06.904139" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:05:06.904263" 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-10-11T01:05:06.902488" elapsed="0.001798"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.905601" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:06.905309" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.906100" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:06.905858" 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-10-11T01:05:06.912310" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:06.912477" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:06.912587" 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-10-11T01:05:06.906532" elapsed="0.006080"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:06.906243" elapsed="0.006427"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:06.912851" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:06.912695" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:06.906221" elapsed="0.006708"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.914231" 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-10-11T01:05:06.913896" elapsed="0.000380"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:06.913652" elapsed="0.000657"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:06.913623" elapsed="0.000709"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.914923" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:06.914653" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:06.914382" elapsed="0.000614"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:06.914367" elapsed="0.000693"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.915676" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:06.915251" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:06.915983" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:06.915767" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.916509" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:06.916228" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:06.916063" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:06.915750" elapsed="0.000839"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.917114" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:06.916777" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:06.917428" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:06.917204" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.917939" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:06.917676" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:06.917504" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:06.917187" elapsed="0.000830"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:06.918163" elapsed="0.000310"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:06.918879" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:06.918647" elapsed="0.000257"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:06.919063" elapsed="0.000216"/>
</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-10-11T01:05:06.913273" elapsed="0.006063"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:06.919497" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:06.919398" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:06.919381" elapsed="0.000178"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:06.920272" 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-10-11T01:05:06.919713" elapsed="0.000586"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:05:06.920345" elapsed="0.000032"/>
</return>
<msg time="2026-10-11T01:05:06.920497" 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-10-11T01:05:06.904599" elapsed="0.015923"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:06.920580" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:05:06.920714" 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-10-11T01:05:06.859575" elapsed="0.061164"/>
</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-10-11T01:05:06.931478" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:06.931158" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:06.932274" 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-10-11T01:05:06.932030" elapsed="0.000370">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-10-11T01:05:06.932601" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:06.931677" elapsed="0.000949"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.933134" 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-10-11T01:05:06.932819" elapsed="0.000341"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:06.933466" 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-10-11T01:05:06.933606" 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-10-11T01:05:06.933328" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.934064" 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-10-11T01:05:06.933845" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:05:06.934506" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:06.934170" elapsed="0.000393"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.935208" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:06.934749" elapsed="0.000485"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:06.934585" elapsed="0.000682"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:06.934153" elapsed="0.001134"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.935886" 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-10-11T01:05:06.935481" elapsed="0.000432"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:06.935956" 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_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-10-11T01:05:06.930653" elapsed="0.005404"/>
</kw>
<msg time="2026-10-11T01:05:06.936107" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:06.926174" elapsed="0.009979"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:06.940313" 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/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-10-11T01:05:06.944384" 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_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-10-11T01:05:06.948663" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:06.948848" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:06.949031" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:06.949381" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:06.949236" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:06.949222" 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-10-11T01:05:06.949625" 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-10-11T01:05:06.949822" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:06.949987" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:06.949195" elapsed="0.000841"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:06.949100" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:06.950213" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:06.950279" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:06.950388" 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-10-11T01:05:06.925461" elapsed="0.024966"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:06.950596" elapsed="0.000351"/>
</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-10-11T01:05:06.951966" 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-10-11T01:05:06.951620" elapsed="0.000373"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:06.952480" 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-10-11T01:05:06.952145" 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-10-11T01:05:06.952720" elapsed="0.000292"/>
</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-10-11T01:05:06.951224" elapsed="0.001843"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:06.951020" elapsed="0.002076"/>
</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-10-11T01:05:06.953296" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:06.953120" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:06.951002" elapsed="0.002366"/>
</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-10-11T01:05:06.921705" elapsed="0.031735"/>
</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-10-11T01:05:06.921023" elapsed="0.032491"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:06.920815" elapsed="0.032790"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:06.920798" elapsed="0.032831"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:06.953676" 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-10-11T01:05:06.858856" elapsed="0.094927"/>
</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-10-11T01:05:06.857192" elapsed="0.096645"/>
</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-10-11T01:05:06.969588" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:06.969270" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:06.970272" 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-10-11T01:05:06.970103" elapsed="0.000228">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-10-11T01:05:06.970429" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:06.969786" elapsed="0.000667"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.970944" 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-10-11T01:05:06.970625" elapsed="0.000344"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:06.971242" 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-10-11T01:05:06.971357" 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-10-11T01:05:06.971134" elapsed="0.000246"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.971825" 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-10-11T01:05:06.971592" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.972780" 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-10-11T01:05:06.972534" elapsed="0.000287"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.973251" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:06.972998" elapsed="0.000277"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.974055" 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-10-11T01:05:06.973605" elapsed="0.000475"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:06.975255" 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-10-11T01:05:06.974739" elapsed="0.000604"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:06.975451" elapsed="0.000032"/>
</return>
<msg time="2026-10-11T01:05:06.975691" 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-10-11T01:05:06.974251" elapsed="0.001464"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:06.975882" elapsed="0.000308"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:05:06.973473" elapsed="0.002755"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.976959" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:06.976492" elapsed="0.000492"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:06.978217" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:06.977630" elapsed="0.000679"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:06.978390" elapsed="0.000053"/>
</return>
<msg time="2026-10-11T01:05:06.978662" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:06.977157" elapsed="0.001531"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:06.978855" elapsed="0.000306"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:06.976327" elapsed="0.002875"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:06.973319" elapsed="0.005915"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:06.979272" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:06.979402" 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-10-11T01:05:06.972177" elapsed="0.007379"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:06.971928" elapsed="0.007661"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:06.979781" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:06.979611" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:06.971910" elapsed="0.007943"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.980543" 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-10-11T01:05:06.980012" elapsed="0.000560"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:06.980616" 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/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-10-11T01:05:06.968769" elapsed="0.011966"/>
</kw>
<msg time="2026-10-11T01:05:06.980785" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:06.964328" elapsed="0.016502"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:06.985106" 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/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-10-11T01:05:06.989196" 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/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-10-11T01:05:06.993259" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:06.993455" 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-10-11T01:05:06.993653" 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-10-11T01:05:06.993990" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:06.993846" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:06.993833" 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-10-11T01:05:06.994251" 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-10-11T01:05:06.994447" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:06.994615" elapsed="0.000030"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:06.993808" elapsed="0.000869"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:06.993720" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:06.994853" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:06.994919" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:06.995028" 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-10-11T01:05:06.963735" elapsed="0.031318"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:06.996154" 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-10-11T01:05:06.995970" elapsed="0.000243">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-10-11T01:05:06.996297" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:06.995630" elapsed="0.000693"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:06.996699" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:06.996424" elapsed="0.000330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.997209" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:06.996942" elapsed="0.000292"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:06.996776" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:06.996385" elapsed="0.000900"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:06.997840" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:06.997476" elapsed="0.000389"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:06.997910" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:06.998035" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:06.995315" elapsed="0.002743"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:06.999165" 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-10-11T01:05:06.998979" elapsed="0.000245">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-10-11T01:05:06.999308" 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-10-11T01:05:06.998655" elapsed="0.000675"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:05:06.999525" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-11T01:05:06.999394" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:06.999378" elapsed="0.000227"/>
</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-10-11T01:05:06.999776" 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-10-11T01:05:06.999953" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:05:07.000045" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:07.000176" 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-10-11T01:05:06.998310" elapsed="0.001890"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.001500" 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-10-11T01:05:07.001246" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.001970" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:07.001752" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:07.007451" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:07.007565" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:05:07.007670" 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-10-11T01:05:07.002296" elapsed="0.005399"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:07.002069" elapsed="0.005666"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:07.007916" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:07.007760" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:07.002053" elapsed="0.005942"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.009347" 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-10-11T01:05:07.008967" elapsed="0.000428"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:07.008721" elapsed="0.000732"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:07.008703" elapsed="0.000776"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.010068" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:07.009793" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:07.009532" elapsed="0.000609"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:07.009516" elapsed="0.000647"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.010711" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:07.010340" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:07.011012" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:07.010801" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.011527" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:07.011249" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:07.011085" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:07.010784" elapsed="0.000821"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.012123" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:07.011791" elapsed="0.000357"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:07.012437" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:07.012212" elapsed="0.000277"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.012952" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:07.012689" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:07.012513" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:07.012195" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:07.013233" elapsed="0.000309"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:07.013934" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:07.013715" elapsed="0.000242"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:07.014110" elapsed="0.000208"/>
</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-10-11T01:05:07.008322" elapsed="0.006052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:07.014534" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:07.014452" elapsed="0.000122"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:07.014434" elapsed="0.000159"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:07.015273" 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-10-11T01:05:07.014745" elapsed="0.000555"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:05:07.015346" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:07.015490" 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-10-11T01:05:07.000505" elapsed="0.015010"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:07.015570" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:05:07.015702" 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-10-11T01:05:06.956396" elapsed="0.059330"/>
</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-10-11T01:05:07.026473" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:07.026157" elapsed="0.000343"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:07.027200" 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-10-11T01:05:07.026982" elapsed="0.000336">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-10-11T01:05:07.027514" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:07.026667" elapsed="0.000872"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.028044" 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-10-11T01:05:07.027729" elapsed="0.000340"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:07.028348" 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-10-11T01:05:07.028494" 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-10-11T01:05:07.028238" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.028945" 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-10-11T01:05:07.028728" 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-10-11T01:05:07.029378" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:07.029084" elapsed="0.000380"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.030113" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:07.029652" elapsed="0.000488"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:07.029489" elapsed="0.000684"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:07.029066" elapsed="0.001127"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.030799" 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-10-11T01:05:07.030357" elapsed="0.000469"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:07.030870" 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_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-10-11T01:05:07.025655" elapsed="0.005316"/>
</kw>
<msg time="2026-10-11T01:05:07.031020" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:07.021244" elapsed="0.009821"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:07.035198" 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/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-10-11T01:05:07.039248" 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/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-10-11T01:05:07.043423" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:07.043608" 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-10-11T01:05:07.043802" 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-10-11T01:05:07.044140" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:07.043995" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:07.043982" 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-10-11T01:05:07.044367" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:07.044563" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:07.044738" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:07.043956" elapsed="0.000831"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:07.043868" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:07.044998" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:07.045066" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:07.045175" 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-10-11T01:05:07.020358" elapsed="0.024842"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:07.045368" elapsed="0.000344"/>
</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-10-11T01:05:07.046697" 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-10-11T01:05:07.046345" elapsed="0.000379"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:07.047191" 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-10-11T01:05:07.046875" 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-10-11T01:05:07.047400" elapsed="0.000303"/>
</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-10-11T01:05:07.045983" elapsed="0.001774"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:07.045783" elapsed="0.002004"/>
</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-10-11T01:05:07.047987" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:07.047810" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:07.045766" elapsed="0.002290"/>
</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-10-11T01:05:07.016675" elapsed="0.031423"/>
</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-10-11T01:05:07.016001" elapsed="0.032162"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:07.015798" elapsed="0.032405"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:07.015783" elapsed="0.032441"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:07.048254" elapsed="0.000026"/>
</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-10-11T01:05:06.955778" elapsed="0.092575"/>
</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-10-11T01:05:06.954033" elapsed="0.094371"/>
</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-10-11T01:05:07.048574" elapsed="0.002973"/>
</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-10-11T01:05:07.067534" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:07.067215" elapsed="0.000346"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:07.068271" 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-10-11T01:05:07.068081" elapsed="0.000283">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-10-11T01:05:07.068478" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:07.067752" elapsed="0.000751"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.069005" 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-10-11T01:05:07.068691" elapsed="0.000339"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:07.069305" 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-10-11T01:05:07.069444" 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-10-11T01:05:07.069197" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.069890" 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-10-11T01:05:07.069673" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.070841" 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-10-11T01:05:07.070600" elapsed="0.000283"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.071313" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:07.071066" elapsed="0.000271"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.072107" 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-10-11T01:05:07.071674" elapsed="0.000458"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:07.073294" 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-10-11T01:05:07.072787" elapsed="0.000596"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:07.073495" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:05:07.073725" 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-10-11T01:05:07.072302" elapsed="0.001447"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:07.073916" elapsed="0.000303"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:05:07.071533" elapsed="0.002724"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.074988" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:07.074531" elapsed="0.000482"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:07.076159" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:07.075666" elapsed="0.000580"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:07.076324" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:07.076567" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:07.075183" 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-10-11T01:05:07.076774" elapsed="0.000303"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:07.074356" elapsed="0.002761"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:07.071380" elapsed="0.005770"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:07.077189" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:07.077320" 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-10-11T01:05:07.070243" elapsed="0.007102"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:07.069993" elapsed="0.007382"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:07.077693" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:07.077397" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:07.069975" elapsed="0.007791"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.078450" 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-10-11T01:05:07.077930" elapsed="0.000549"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:07.078555" 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-10-11T01:05:07.066702" elapsed="0.011975"/>
</kw>
<msg time="2026-10-11T01:05:07.078726" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:07.062205" elapsed="0.016567"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:07.083047" 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/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-10-11T01:05:07.087105" 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/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-10-11T01:05:07.091205" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:07.091388" 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-10-11T01:05:07.091586" 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-10-11T01:05:07.091939" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:07.091794" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:07.091780" 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-10-11T01:05:07.092167" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:07.092346" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:07.092524" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:07.091755" elapsed="0.000817"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:07.091664" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:07.092760" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:07.092826" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:07.092933" 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-10-11T01:05:07.061597" elapsed="0.031360"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:07.094105" 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-10-11T01:05:07.093912" elapsed="0.000253">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-10-11T01:05:07.094248" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:07.093572" elapsed="0.000698"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:07.094572" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:07.094334" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.095088" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:07.094825" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:07.094657" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:07.094317" elapsed="0.000846"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.095688" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:07.095324" elapsed="0.000388"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:07.095757" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:07.095882" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:07.093254" elapsed="0.002651"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:07.096942" 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-10-11T01:05:07.096800" elapsed="0.000191"/>
</kw>
<msg time="2026-10-11T01:05:07.097065" 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-10-11T01:05:07.096468" elapsed="0.000619"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:05:07.097248" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:07.097151" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:07.097134" elapsed="0.000175"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:07.097603" 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-10-11T01:05:07.097739" 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-10-11T01:05:07.097476" elapsed="0.000287"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:05:07.098109" 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-10-11T01:05:07.097924" elapsed="0.000208"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:05:07.098173" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:07.098296" 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-10-11T01:05:07.096153" elapsed="0.002165"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.099555" 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-10-11T01:05:07.099314" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.100020" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:07.099803" elapsed="0.000256"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:07.106669" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:07.106782" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:05:07.106924" 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-10-11T01:05:07.100344" elapsed="0.006605"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:07.100119" elapsed="0.006868"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:07.107171" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:07.107011" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:07.100101" elapsed="0.007147"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.108527" 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-10-11T01:05:07.108181" elapsed="0.000392"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:07.107935" elapsed="0.000670"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:07.107918" elapsed="0.000710"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.109199" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:07.108930" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:07.108689" elapsed="0.000581"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:07.108674" elapsed="0.000619"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.109843" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:07.109487" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:07.110142" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:07.109931" elapsed="0.000263"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.110672" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:07.110379" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:07.110216" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:07.109914" elapsed="0.000837"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.111264" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:07.110927" elapsed="0.000361"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:07.111578" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:07.111352" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.112088" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:07.111828" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:07.111665" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:07.111335" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:07.112308" elapsed="0.000304"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:07.113005" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:07.112787" elapsed="0.000241"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:07.113205" elapsed="0.000234"/>
</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-10-11T01:05:07.107585" elapsed="0.005930"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:07.113719" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:07.113606" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:07.113579" elapsed="0.000203"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:07.114657" 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-10-11T01:05:07.113926" elapsed="0.000762"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:05:07.114739" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:05:07.114877" 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-10-11T01:05:07.098611" elapsed="0.016364"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:07.115036" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:07.115167" 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-10-11T01:05:07.054083" elapsed="0.061108"/>
</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-10-11T01:05:07.126046" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:07.125737" elapsed="0.000336"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:07.126835" 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-10-11T01:05:07.126576" elapsed="0.000383">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-10-11T01:05:07.127125" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:07.126235" elapsed="0.000914"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.127727" 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-10-11T01:05:07.127328" elapsed="0.000425"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:07.128044" 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-10-11T01:05:07.128188" 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-10-11T01:05:07.127927" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.128683" 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-10-11T01:05:07.128438" 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-10-11T01:05:07.129089" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:07.128791" elapsed="0.000353"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.129830" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:07.129316" elapsed="0.000541"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:07.129168" elapsed="0.000722"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:07.128773" elapsed="0.001137"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.130514" 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-10-11T01:05:07.130080" elapsed="0.000461"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:07.130586" 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/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-10-11T01:05:07.125199" elapsed="0.005506"/>
</kw>
<msg time="2026-10-11T01:05:07.130756" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:07.120704" elapsed="0.010097"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:07.134998" 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/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-10-11T01:05:07.139090" 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/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-10-11T01:05:07.143286" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:07.143483" 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-10-11T01:05:07.143680" 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-10-11T01:05:07.144040" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:07.143891" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:07.143877" 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-10-11T01:05:07.144269" 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-10-11T01:05:07.144464" 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-10-11T01:05:07.144631" elapsed="0.000032"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:07.143851" elapsed="0.000841"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:07.143752" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:07.144871" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:07.144938" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:07.145043" 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-10-11T01:05:07.119946" elapsed="0.025122"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:07.145235" elapsed="0.000329"/>
</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-10-11T01:05:07.146471" 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-10-11T01:05:07.146214" elapsed="0.000285"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:07.147172" 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-10-11T01:05:07.146662" elapsed="0.000537"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:05:07.147710" 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-10-11T01:05:07.147871" 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-10-11T01:05:07.147385" elapsed="0.000550">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-10-11T01:05:07.145848" elapsed="0.002215">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-10-11T01:05:07.145646" elapsed="0.002485">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-10-11T01:05:07.148342" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:07.148162" elapsed="0.000232"/>
</branch>
<status status="FAIL" start="2026-10-11T01:05:07.145618" elapsed="0.002819">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-10-11T01:05:07.116186" elapsed="0.032367">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-10-11T01:05:07.115509" elapsed="0.033183">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-10-11T01:05:07.115270" elapsed="0.033499">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-10-11T01:05:07.115253" elapsed="0.033574">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-10-11T01:05:07.148876" 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-10-11T01:05:07.053457" elapsed="0.095524">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-10-11T01:05:09.184934" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:09.184172" elapsed="0.000828"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:09.186614" 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-10-11T01:05:09.186161" elapsed="0.000620">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-10-11T01:05:09.186975" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:09.185374" elapsed="0.001654"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.188174" 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-10-11T01:05:09.187447" elapsed="0.000787"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:09.188930" 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-10-11T01:05:09.189210" 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-10-11T01:05:09.188673" elapsed="0.000592"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.190249" 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-10-11T01:05:09.189753" elapsed="0.000592"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.192520" 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-10-11T01:05:09.191944" elapsed="0.000677"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.193786" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:09.193059" elapsed="0.000794"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.195923" 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-10-11T01:05:09.194723" elapsed="0.001259"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:09.198793" 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-10-11T01:05:09.197489" elapsed="0.001506"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:09.199177" elapsed="0.000078"/>
</return>
<msg time="2026-10-11T01:05:09.199775" 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-10-11T01:05:09.196382" elapsed="0.003448"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:09.200218" elapsed="0.000513"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:05:09.194322" elapsed="0.006465"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.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-10-11T01:05:09.201110" elapsed="0.000672"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:09.203392" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:09.202682" elapsed="0.000958"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:09.203760" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T01:05:09.204062" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:09.202020" elapsed="0.002075"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:09.204331" elapsed="0.000546"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:09.200927" elapsed="0.004008"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:09.193961" elapsed="0.011020"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:09.205038" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T01:05:09.205223" 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-10-11T01:05:09.191121" elapsed="0.014137"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:09.190524" elapsed="0.014776"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.205613" elapsed="0.000272"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.205334" elapsed="0.000599"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.190478" elapsed="0.015485"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.207016" 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-10-11T01:05:09.206196" elapsed="0.000858"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:09.207117" 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/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-10-11T01:05:09.182980" elapsed="0.024281"/>
</kw>
<msg time="2026-10-11T01:05:09.207329" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:09.172963" elapsed="0.034434"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:09.213264" 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-10-11T01:05:09.218974" 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/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-10-11T01:05:09.224788" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.225096" 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-10-11T01:05:09.225357" 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-10-11T01:05:09.225898" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.225690" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:09.225669" elapsed="0.000329"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.226266" elapsed="0.000032"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.226519" 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-10-11T01:05:09.226696" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:09.225615" elapsed="0.001130"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:09.225488" elapsed="0.001280"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.226921" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:09.226987" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:05:09.227096" 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-10-11T01:05:09.171527" elapsed="0.055594"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:09.228260" 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-10-11T01:05:09.228050" elapsed="0.000276">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-10-11T01:05:09.228423" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:09.227721" elapsed="0.000727"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.228747" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.228511" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.229268" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:09.229004" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:09.228822" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.228494" elapsed="0.000850"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.229870" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:09.229520" elapsed="0.000374"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:09.229938" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:09.230062" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:09.227392" elapsed="0.002693"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:09.231128" 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-10-11T01:05:09.230983" elapsed="0.000195"/>
</kw>
<msg time="2026-10-11T01:05:09.231254" 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-10-11T01:05:09.230662" elapsed="0.000614"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:05:09.231455" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:09.231340" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.231322" elapsed="0.000226"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:09.231843" 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-10-11T01:05:09.231974" 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-10-11T01:05:09.231714" elapsed="0.000283"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:05:09.232345" 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-10-11T01:05:09.232160" elapsed="0.000209"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:05:09.232425" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:09.232552" 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-10-11T01:05:09.230334" elapsed="0.002242"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.233815" 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-10-11T01:05:09.233581" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.234435" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:09.234048" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:09.241038" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:09.241214" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:05:09.241352" 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-10-11T01:05:09.234786" elapsed="0.006602"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:09.234543" elapsed="0.006943"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.241760" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.241524" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.234525" elapsed="0.007345"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.243679" 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-10-11T01:05:09.243181" elapsed="0.000560"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:09.242838" elapsed="0.000948"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.242814" elapsed="0.001004"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.244620" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:09.244223" elapsed="0.000472"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:09.243889" elapsed="0.000851"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.243867" elapsed="0.000904"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.245525" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:09.245019" elapsed="0.000542"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.245961" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.245665" elapsed="0.000368"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.246703" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:09.246292" elapsed="0.000446"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:09.246065" elapsed="0.000718"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.245640" elapsed="0.001171"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.247545" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:09.247055" elapsed="0.000526"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.248022" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.247684" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.248770" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:09.248359" elapsed="0.000446"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:09.248128" elapsed="0.000723"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.247660" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:09.249083" elapsed="0.000436"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:09.250074" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:09.249762" 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-10-11T01:05:09.250324" elapsed="0.000332"/>
</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-10-11T01:05:09.242326" elapsed="0.008409"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:09.250939" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:09.250823" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.250799" elapsed="0.000227"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:09.251896" 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-10-11T01:05:09.251224" elapsed="0.000710"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:05:09.251998" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T01:05:09.252175" 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-10-11T01:05:09.232868" elapsed="0.019342"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:09.252286" elapsed="0.000033"/>
</return>
<msg time="2026-10-11T01:05:09.252477" 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-10-11T01:05:09.154194" elapsed="0.098318"/>
</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-10-11T01:05:09.266257" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:09.265953" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:09.267003" 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-10-11T01:05:09.266784" elapsed="0.000338">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-10-11T01:05:09.267284" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:09.266455" elapsed="0.000853"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.267852" 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-10-11T01:05:09.267517" elapsed="0.000361"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:09.268157" 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-10-11T01:05:09.268304" 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-10-11T01:05:09.268046" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.268791" 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-10-11T01:05:09.268553" elapsed="0.000280"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:05:09.269192" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.268895" elapsed="0.000351"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.269930" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:09.269441" elapsed="0.000515"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:09.269269" elapsed="0.000720"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.268877" elapsed="0.001132"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.270594" 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-10-11T01:05:09.270172" elapsed="0.000449"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:09.270678" 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-10-11T01:05:09.265437" elapsed="0.005345"/>
</kw>
<msg time="2026-10-11T01:05:09.270829" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:09.260338" elapsed="0.010536"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:09.275005" 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/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-10-11T01:05:09.279113" 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-10-11T01:05:09.283297" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.283495" 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-10-11T01:05:09.283687" 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-10-11T01:05:09.284026" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.283882" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:09.283868" 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-10-11T01:05:09.284252" 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-10-11T01:05:09.284480" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.284658" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:09.283842" elapsed="0.000865"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:09.283754" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.284882" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:09.284948" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:09.285053" 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-10-11T01:05:09.259170" elapsed="0.025908"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:09.285244" elapsed="0.000329"/>
</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-10-11T01:05:09.286470" 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-10-11T01:05:09.286218" elapsed="0.000279"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:09.286884" 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-10-11T01:05:09.286657" elapsed="0.000253"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:05:09.287090" elapsed="0.000272"/>
</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-10-11T01:05:09.285859" elapsed="0.001572"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:09.285656" elapsed="0.001806"/>
</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-10-11T01:05:09.287669" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.287485" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.285639" elapsed="0.002098"/>
</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-10-11T01:05:09.253862" elapsed="0.033919"/>
</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-10-11T01:05:09.252920" elapsed="0.034926"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:09.252616" elapsed="0.035268"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.252593" elapsed="0.035312"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:09.287934" elapsed="0.000025"/>
</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-10-11T01:05:09.152645" elapsed="0.135390"/>
</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-10-11T01:05:07.051750" elapsed="2.236337"/>
</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-10-11T01:05:09.288286" elapsed="0.002695"/>
</kw>
<arg>rt_constrain_default</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<status status="PASS" start="2026-10-11T01:05:04.647553" elapsed="4.643483"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:04.546490" elapsed="4.744658"/>
</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-10-11T01:05:09.292770" elapsed="0.000244"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:05:09.292492" 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-10-11T01:05:09.294225" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:09.294135" elapsed="0.000134"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.294114" elapsed="0.000175"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:09.296448" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:09.296349" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.296332" elapsed="0.000179"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.297427" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:09.297087" elapsed="0.000367"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.297878" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:05:09.297607" elapsed="0.000295"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:05:09.297942" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:09.298068" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:05:09.296731" elapsed="0.001360"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:09.300583" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:09.300499" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.300482" elapsed="0.000175"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:09.301740" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:09.301652" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.301619" elapsed="0.000186"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:09.302126" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:05:09.301955" elapsed="0.000196"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:09.302490" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:05:09.302318" elapsed="0.000197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:05:09.338206" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:05:09.303023" elapsed="0.035291"/>
</kw>
<msg time="2026-10-11T01:05:09.338502" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:05:09.338551" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:09.302691" elapsed="0.035909"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:05:09.383820" 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-10-11T01:05:09.339134" elapsed="0.044793"/>
</kw>
<msg time="2026-10-11T01:05:09.384075" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:05:09.384116" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:09.338791" elapsed="0.045361"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.384459" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.384219" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.384202" elapsed="0.000334"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.384960" 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-10-11T01:05:09.384733" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.385294" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.385092" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.385075" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:05:09.385455" 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-10-11T01:05:09.388063" elapsed="0.000118"/>
</kw>
<msg time="2026-10-11T01:05:09.388240" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:09.386855" 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-10-11T01:05:09.388732" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.389131" 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-10-11T01:05:09.386214" elapsed="0.003110"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:05:09.385747" 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-10-11T01:05:09.301342" elapsed="0.088151"/>
</kw>
<msg time="2026-10-11T01:05:09.389577" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:09.389617" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:09.300808" elapsed="0.088855"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:05:09.389819" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:05:09.389733" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.389715" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.390215" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.390552" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:05:09.390618" 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-10-11T01:05:09.300199" elapsed="0.090519"/>
</kw>
<msg time="2026-10-11T01:05:09.390802" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:09.390841" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:09.298433" elapsed="0.092443"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.391165" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.390942" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.390926" elapsed="0.000311"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:05:09.298277" elapsed="0.092981"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:05:09.298138" elapsed="0.093146"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:05:09.296056" elapsed="0.095275"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:05:09.293843" elapsed="0.097538"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:09.293295" elapsed="0.098246"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:05:09.292079" elapsed="0.099516"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:09.392369" 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-10-11T01:05:09.392519" 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-10-11T01:05:09.392226" elapsed="0.000319"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:05:09.392899" 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-10-11T01:05:09.392721" elapsed="0.000233"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:09.393256" 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-10-11T01:05:09.393377" 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-10-11T01:05:09.393120" elapsed="0.000282"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:05:09.393756" 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-10-11T01:05:09.393577" elapsed="0.000203"/>
</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-10-11T01:05:09.394027" elapsed="0.002544"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:09.393843" elapsed="0.002770"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.393826" elapsed="0.002824"/>
</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-10-11T01:05:09.407714" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:09.407352" elapsed="0.000392"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:09.408465" 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-10-11T01:05:09.408233" elapsed="0.000300">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-10-11T01:05:09.408619" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:09.407912" elapsed="0.000745"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.409142" 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-10-11T01:05:09.408833" elapsed="0.000335"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:09.409464" 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-10-11T01:05:09.409604" 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-10-11T01:05:09.409336" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.410057" 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-10-11T01:05:09.409836" elapsed="0.000264"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.411027" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:05:09.410795" elapsed="0.000277"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.411523" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:09.411252" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.412153" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:09.411882" elapsed="0.000295"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:09.413069" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:09.412690" elapsed="0.000404"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:09.413141" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:05:09.413271" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:09.412350" 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-10-11T01:05:09.413497" elapsed="0.000202"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:05:09.411747" elapsed="0.001991"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.414300" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:09.414022" elapsed="0.000305"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:09.415239" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:09.414863" elapsed="0.000403"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:09.415312" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:09.415473" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:09.414531" 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-10-11T01:05:09.415684" elapsed="0.000172"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:09.413887" elapsed="0.002007"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:09.411594" elapsed="0.004333"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:09.415966" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:09.416098" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:05:09.410437" elapsed="0.005686"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:09.410167" elapsed="0.005985"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.416326" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.416175" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.410147" elapsed="0.006250"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.417133" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:09.416600" elapsed="0.000561"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:09.417205" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:09.406809" elapsed="0.010497"/>
</kw>
<msg time="2026-10-11T01:05:09.417355" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:09.402157" elapsed="0.015243"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:09.421755" 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/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-10-11T01:05:09.425872" 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/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-10-11T01:05:09.429975" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.430163" 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-10-11T01:05:09.430379" 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-10-11T01:05:09.430766" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.430605" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:09.430591" 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-10-11T01:05:09.430997" 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-10-11T01:05:09.431179" 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-10-11T01:05:09.431345" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:09.430565" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:09.430475" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.431587" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:09.431665" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:05:09.431777" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:09.401492" elapsed="0.030310"/>
</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-10-11T01:05:09.440701" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:09.440376" elapsed="0.000351"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:09.441370" 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-10-11T01:05:09.441199" elapsed="0.000247">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-10-11T01:05:09.441531" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:09.440885" elapsed="0.000668"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.442041" 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-10-11T01:05:09.441737" elapsed="0.000329"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:09.442338" 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-10-11T01:05:09.442474" 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-10-11T01:05:09.442231" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.442919" 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-10-11T01:05:09.442703" elapsed="0.000267"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:05:09.443275" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.443030" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.443826" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', '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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:09.443546" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:09.443381" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.443012" elapsed="0.000891"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.444463" 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-10-11T01:05:09.444065" elapsed="0.000426"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:09.444535" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:09.439873" elapsed="0.004773"/>
</kw>
<msg time="2026-10-11T01:05:09.444699" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:09.435567" elapsed="0.009175"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:09.450023" 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/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-10-11T01:05:09.454094" 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/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-10-11T01:05:09.458210" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.458395" 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-10-11T01:05:09.458596" 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-10-11T01:05:09.458954" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.458807" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:09.458793" 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-10-11T01:05:09.459235" 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-10-11T01:05:09.459485" 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-10-11T01:05:09.459706" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:09.458768" elapsed="0.000997"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:09.458678" elapsed="0.001115"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.459985" elapsed="0.000054"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:09.460092" elapsed="0.000017"/>
</return>
<msg time="2026-10-11T01:05:09.460214" 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-10-11T01:05:09.434869" elapsed="0.025372"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:09.461383" 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-10-11T01:05:09.461190" elapsed="0.000282">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-10-11T01:05:09.461559" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:09.460865" elapsed="0.000716"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.461880" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.461658" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.462396" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:09.462130" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:09.461954" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.461639" elapsed="0.000849"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.463002" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:09.462663" elapsed="0.000363"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:09.463071" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:09.463194" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:09.460547" elapsed="0.002670"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.464593" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:09.464337" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.465053" 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-10-11T01:05:09.464841" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.465528" 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-10-11T01:05:09.465293" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.465983" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:09.465768" elapsed="0.000255"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:09.466749" 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-10-11T01:05:09.466577" elapsed="0.000197"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:05:09.467073" 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-10-11T01:05:09.466929" elapsed="0.000168"/>
</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-10-11T01:05:09.467258" elapsed="0.000169"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.467854" 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-10-11T01:05:09.467622" elapsed="0.000306"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:05:09.467967" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:09.468096" 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-10-11T01:05:09.466202" elapsed="0.001918"/>
</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-10-11T01:05:09.480614" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.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-10-11T01:05:09.480694" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:09.480788" 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-10-11T01:05:09.468428" elapsed="0.012386"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:09.468182" elapsed="0.012673"/>
</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-10-11T01:05:09.481036" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.480880" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.468166" elapsed="0.012956"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.482347" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:09.482073" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:09.481831" elapsed="0.000604"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.481814" elapsed="0.000645"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.483057" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:09.482762" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:09.482510" elapsed="0.000622"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.482495" elapsed="0.000659"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.483733" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:09.483334" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.484035" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.483822" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.484560" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:09.484279" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:09.484111" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.483805" elapsed="0.000844"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.485159" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:09.484824" elapsed="0.000360"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.485472" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.485246" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.485982" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:09.485720" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:09.485546" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.485230" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:09.486262" elapsed="0.000322"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:09.486981" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:09.486757" elapsed="0.000248"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:09.487158" elapsed="0.000214"/>
</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-10-11T01:05:09.481459" elapsed="0.005997"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:05:09.487610" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-10-11T01:05:09.487526" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.487508" elapsed="0.000191"/>
</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-10-11T01:05:09.487842" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:05:09.487903" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:05:09.488061" 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-10-11T01:05:09.463530" elapsed="0.024556"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:09.488146" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:05:09.488267" 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-10-11T01:05:09.397574" elapsed="0.090715"/>
</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-10-11T01:05:09.488597" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.488377" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.488362" elapsed="0.000329"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:09.488721" elapsed="0.000024"/>
</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-10-11T01:05:09.396899" elapsed="0.091918"/>
</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-10-11T01:05:09.492201" level="INFO">${update} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0002fbf000000065</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:05:09.489722" elapsed="0.002507"/>
</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-10-11T01:05:09.492387" elapsed="0.000370"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:05:09.492801" elapsed="0.000028"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:05:09.489451" elapsed="0.003452"/>
</kw>
<msg time="2026-10-11T01:05:09.492970" 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-10-11T01:05:09.489002" elapsed="0.003991"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.493813" level="INFO">Length is 124.</msg>
<msg time="2026-10-11T01:05:09.493883" 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-10-11T01:05:09.493551" elapsed="0.000354"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.494294" level="INFO">Length is 124.</msg>
<msg time="2026-10-11T01:05:09.494360" 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-10-11T01:05:09.494061" elapsed="0.000321"/>
</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-10-11T01:05:09.494599" elapsed="0.000289"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:05:09.495194" 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-10-11T01:05:09.495041" elapsed="0.000178"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:05:09.495579" 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-10-11T01:05:09.495399" 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-10-11T01:05:09.495795" elapsed="0.000266"/>
</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-10-11T01:05:09.493189" elapsed="0.002927"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:05:09.496254" elapsed="0.002018"/>
</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-10-11T01:05:09.512352" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:09.512049" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:09.513064" 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-10-11T01:05:09.512889" elapsed="0.000234">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-10-11T01:05:09.513207" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:09.512555" elapsed="0.000674"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.513738" 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-10-11T01:05:09.513418" elapsed="0.000345"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:09.514037" 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-10-11T01:05:09.514152" 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-10-11T01:05:09.513930" elapsed="0.000246"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.514605" 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-10-11T01:05:09.514371" 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-10-11T01:05:09.515563" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:05:09.515316" elapsed="0.000289"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.516041" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:09.515792" elapsed="0.000273"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.516813" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:09.516382" elapsed="0.000455"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:09.517904" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:09.517428" elapsed="0.000554"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:09.518118" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:05:09.518291" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:09.517007" elapsed="0.001308"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:09.518510" elapsed="0.000326"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:05:09.516250" elapsed="0.002625"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.519710" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:09.519110" elapsed="0.000626"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:09.520817" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:09.520323" elapsed="0.000577"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:09.521062" elapsed="0.000032"/>
</return>
<msg time="2026-10-11T01:05:09.521237" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:09.519910" elapsed="0.001351"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:09.521460" elapsed="0.000331"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:09.518976" elapsed="0.002854"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:09.516109" elapsed="0.005753"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:09.521902" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:09.522035" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:05:09.514973" elapsed="0.007086"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:09.514721" elapsed="0.007367"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.522268" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.522111" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.514703" elapsed="0.007635"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.523135" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:09.522619" elapsed="0.000545"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:09.523209" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:09.511535" elapsed="0.011775"/>
</kw>
<msg time="2026-10-11T01:05:09.523359" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:09.507212" elapsed="0.016191"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:09.527550" 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/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-10-11T01:05:09.531666" 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/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-10-11T01:05:09.535839" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.536024" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.536205" 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-10-11T01:05:09.536557" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.536395" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:09.536382" 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-10-11T01:05:09.536831" 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-10-11T01:05:09.537012" 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-10-11T01:05:09.537176" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:09.536357" elapsed="0.000866"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:09.536270" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.537398" elapsed="0.000033"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:09.537480" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:09.537589" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:09.506588" elapsed="0.031026"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.538615" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:09.538378" elapsed="0.000597"/>
</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-10-11T01:05:09.546372" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:09.546442" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:09.546528" 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-10-11T01:05:09.539264" elapsed="0.007287"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:09.539036" elapsed="0.007551"/>
</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-10-11T01:05:09.546775" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.546611" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.539019" elapsed="0.007830"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.548042" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:09.547770" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:09.547513" elapsed="0.000600"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.547496" elapsed="0.000639"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.548714" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:09.548435" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:09.548184" elapsed="0.000602"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.548169" elapsed="0.000639"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.549323" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:09.548984" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.549651" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.549426" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.550320" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:09.549889" elapsed="0.000456"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:09.549726" elapsed="0.000653"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.549393" elapsed="0.001006"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.550982" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:09.550641" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.551279" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.551069" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.551807" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:09.551530" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:09.551352" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.551052" elapsed="0.000832"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:09.552028" elapsed="0.000290"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:09.552749" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:09.552510" elapsed="0.000263"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:09.552927" elapsed="0.000210"/>
</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-10-11T01:05:09.547168" elapsed="0.006023"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:05:09.553232" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:09.553403" 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-10-11T01:05:09.537861" elapsed="0.015584"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:09.553493" elapsed="0.000025"/>
</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-10-11T01:05:09.499390" elapsed="0.054198"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:09.498994" elapsed="0.054652"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:05:09.498485" elapsed="0.055213"/>
</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-10-11T01:05:09.557232" level="INFO">${update} = ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0002fbf000000065</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:05:09.554570" elapsed="0.002690"/>
</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-10-11T01:05:09.557482" elapsed="0.000314"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:05:09.557840" elapsed="0.000027"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:05:09.554296" elapsed="0.003643"/>
</kw>
<msg time="2026-10-11T01:05:09.558005" 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-10-11T01:05:09.553876" elapsed="0.004154"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.558840" level="INFO">Length is 112.</msg>
<msg time="2026-10-11T01:05:09.558909" 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-10-11T01:05:09.558588" elapsed="0.000342"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.559314" level="INFO">Length is 112.</msg>
<msg time="2026-10-11T01:05:09.559381" 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-10-11T01:05:09.559087" elapsed="0.000316"/>
</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-10-11T01:05:09.559635" elapsed="0.000273"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:05:09.560208" 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-10-11T01:05:09.560056" elapsed="0.000175"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:05:09.560547" 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-10-11T01:05:09.560375" 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-10-11T01:05:09.560762" elapsed="0.000265"/>
</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-10-11T01:05:09.558225" elapsed="0.002855"/>
</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-10-11T01:05:09.575359" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:09.575057" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:09.576083" 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-10-11T01:05:09.575896" elapsed="0.000245">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-10-11T01:05:09.576226" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:09.575561" elapsed="0.000687"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.576766" 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-10-11T01:05:09.576438" elapsed="0.000353"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:09.577069" 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-10-11T01:05:09.577185" 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-10-11T01:05:09.576961" elapsed="0.000249"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.577675" 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-10-11T01:05:09.577423" 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-10-11T01:05:09.578676" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:05:09.578423" elapsed="0.000295"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.579142" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:09.578896" elapsed="0.000270"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.579959" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:09.579492" elapsed="0.000491"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:09.581035" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:09.580587" elapsed="0.000488"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:09.581186" elapsed="0.000032"/>
</return>
<msg time="2026-10-11T01:05:09.581365" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:09.580151" elapsed="0.001238"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:09.581583" elapsed="0.000287"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:05:09.579345" elapsed="0.002564"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.582641" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:09.582140" elapsed="0.000528"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:09.583732" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:09.583253" elapsed="0.000519"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:09.583880" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:05:09.584055" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:09.582838" elapsed="0.001240"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:09.584243" elapsed="0.000283"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:09.582009" elapsed="0.002555"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:09.579209" elapsed="0.005386"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:09.584645" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:09.584776" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:05:09.578035" elapsed="0.006793"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:09.577781" elapsed="0.007078"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.585034" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.584882" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.577763" elapsed="0.007340"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.585974" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:09.585266" elapsed="0.000736"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:09.586046" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:09.574518" elapsed="0.011631"/>
</kw>
<msg time="2026-10-11T01:05:09.586197" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:09.570165" elapsed="0.016087"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:09.590517" 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/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-10-11T01:05:09.594617" 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/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-10-11T01:05:09.598795" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.598977" 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-10-11T01:05:09.599160" 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-10-11T01:05:09.599511" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.599351" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:09.599338" 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-10-11T01:05:09.599749" 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-10-11T01:05:09.599929" elapsed="0.000017"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.600090" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:09.599312" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:09.599225" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.600308" elapsed="0.000017"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:09.600417" elapsed="0.000018"/>
</return>
<msg time="2026-10-11T01:05:09.600532" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:09.569510" elapsed="0.031046"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.601588" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:09.601348" 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-10-11T01:05:09.607607" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:09.607915" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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+xml', 'Content-Length': '619'} 
 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-path xmlns:a="urn:opendaylight:params:xml:ns:yang:bgp-rib" xmlns:b="urn:opendaylight:params:xml:ns:yang:bgp-types" xmlns:c="urn:opendaylight:params:xml:ns:yang:bgp:route:target:constrain"&gt;/a:application-rib[a:id='10.30.170.173']/a:tables[a:afi='b:ipv4-address-family'][a:safi='c:route-target-constrain-subsequent-address-family']/c:route-target-constrain-routes&lt;/error-path&gt;&lt;error-message&gt;Data does not exist&lt;/error-message&gt;&lt;error-tag&gt;data-missing&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-10-11T01:05:09.608046" level="INFO">${response} = None</msg>
<msg time="2026-10-11T01:05:09.608086" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:09.601928" elapsed="0.006532">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:09.601704" elapsed="0.006832">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:09.608736" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.608568" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-10-11T01:05:09.601687" elapsed="0.007127">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:09.610136" 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-10-11T01:05:09.609838" elapsed="0.000360">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:05:09.609553" elapsed="0.000717">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:05:09.609526" elapsed="0.000777">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-10-11T01:05:09.610935" 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-10-11T01:05:09.610669" elapsed="0.000296">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:05:09.610371" elapsed="0.000649">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:05:09.610355" elapsed="0.000733">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.611881" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:09.611299" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.612190" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.611973" elapsed="0.000271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.612731" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:09.612448" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:09.612267" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.611956" elapsed="0.000854"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.613327" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:09.612986" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.613656" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.613432" elapsed="0.000277"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.614159" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:09.613895" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:09.613732" elapsed="0.000485"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.613400" elapsed="0.000837"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:09.614384" elapsed="0.000327"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:09.615103" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:09.614874" elapsed="0.000254"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-10-11T01:05:09.615460" 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-10-11T01:05:09.615282" elapsed="0.000209">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-10-11T01:05:09.609147" elapsed="0.006469">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-10-11T01:05:09.615684" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:09.615943" level="INFO">${response_text} = None</msg>
<msg time="2026-10-11T01:05:09.615970" 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-10-11T01:05:09.600799" elapsed="0.015198">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-10-11T01:05:09.616055" 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-10-11T01:05:09.562086" elapsed="0.054111">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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:09.561698" elapsed="0.054558"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:05:09.561278" elapsed="0.055034"/>
</kw>
<arg>rt_constrain_type_0</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<status status="PASS" start="2026-10-11T01:05:09.391871" elapsed="0.224488"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:09.291533" elapsed="0.324943"/>
</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-10-11T01:05:09.618005" elapsed="0.000259"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:05:09.617742" 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-10-11T01:05:09.619359" elapsed="0.000045"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:09.619269" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.619251" 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-10-11T01:05:09.621639" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:09.621544" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.621528" elapsed="0.000174"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.622640" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:09.622269" elapsed="0.000397"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.623087" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:05:09.622820" elapsed="0.000292"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:05:09.623153" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:09.623278" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:05:09.621912" elapsed="0.001388"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:09.625821" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:09.625737" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.625720" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:09.626942" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:09.626860" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.626843" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:09.627323" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:05:09.627153" elapsed="0.000195"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:09.627713" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:05:09.627553" elapsed="0.000184"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:05:09.678811" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:05:09.628235" elapsed="0.050685"/>
</kw>
<msg time="2026-10-11T01:05:09.679088" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:05:09.679138" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:09.627900" elapsed="0.051275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:05:09.724316" 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-10-11T01:05:09.679744" elapsed="0.044786"/>
</kw>
<msg time="2026-10-11T01:05:09.724747" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:05:09.724791" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:09.679346" elapsed="0.045483"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.725229" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.724928" elapsed="0.000355"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.724899" elapsed="0.000410"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.725825" 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-10-11T01:05:09.725509" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.726165" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.725961" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.725944" elapsed="0.000293"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:05:09.726273" 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-10-11T01:05:09.729100" elapsed="0.000122"/>
</kw>
<msg time="2026-10-11T01:05:09.729280" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:09.727848" elapsed="0.001592"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.729761" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.730097" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:05:09.727208" elapsed="0.003074"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:05:09.726643" 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-10-11T01:05:09.626590" elapsed="0.103841"/>
</kw>
<msg time="2026-10-11T01:05:09.730516" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:09.730557" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:09.626035" elapsed="0.104558"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:05:09.730760" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:05:09.730673" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.730656" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.731164" 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-10-11T01:05:09.731533" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:05:09.731598" 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-10-11T01:05:09.625440" elapsed="0.106257"/>
</kw>
<msg time="2026-10-11T01:05:09.731782" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:09.731824" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:09.623664" elapsed="0.108196"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.732148" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.731927" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.731911" elapsed="0.000308"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:05:09.623508" elapsed="0.108733"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:05:09.623350" elapsed="0.108920"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:05:09.621237" elapsed="0.111083"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:05:09.619009" elapsed="0.113362"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:09.618573" elapsed="0.113910"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:05:09.617330" elapsed="0.115206"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.733583" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:05:09.733151" elapsed="0.000460"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.734196" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:05:09.733808" elapsed="0.000415"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.734771" 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-10-11T01:05:09.734418" elapsed="0.000378"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:09.735116" 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-10-11T01:05:09.735299" 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-10-11T01:05:09.734965" elapsed="0.000359"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:09.735655" 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-10-11T01:05:09.735781" 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-10-11T01:05:09.735504" elapsed="0.000302"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:05:09.735949" elapsed="0.002522"/>
</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-10-11T01:05:09.738638" elapsed="0.002489"/>
</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-10-11T01:05:09.756876" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:09.756559" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:09.757597" 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-10-11T01:05:09.757386" elapsed="0.000295">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-10-11T01:05:09.757767" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:09.757063" elapsed="0.000727"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.758272" 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-10-11T01:05:09.757963" elapsed="0.000334"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:09.758587" 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-10-11T01:05:09.758713" 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-10-11T01:05:09.758478" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.759150" 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-10-11T01:05:09.758934" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.760105" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:05:09.759875" elapsed="0.000272"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.760583" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:09.760321" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.761367" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:05:09.760938" elapsed="0.000454"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:09.762541" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:09.762024" elapsed="0.000612"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:09.762718" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:05:09.762928" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:09.761585" 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-10-11T01:05:09.763121" elapsed="0.000339"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:05:09.760805" elapsed="0.002694"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.764212" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:09.763742" elapsed="0.000495"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:09.765365" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:09.764872" elapsed="0.000596"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:09.765548" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:09.765771" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:09.764433" 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-10-11T01:05:09.765962" elapsed="0.000297"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:09.763600" elapsed="0.002697"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:09.760664" elapsed="0.005666"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:09.766368" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:05:09.766518" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:05:09.759520" elapsed="0.007022"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:09.759253" elapsed="0.007318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.766754" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.766592" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.759235" elapsed="0.007589"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.767785" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-fam...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:09.766984" elapsed="0.000828"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:09.767857" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:09.756040" elapsed="0.011915"/>
</kw>
<msg time="2026-10-11T01:05:09.768005" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:09.751740" elapsed="0.016308"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:09.772143" 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/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-10-11T01:05:09.776207" 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/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-10-11T01:05:09.780265" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.780462" 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-10-11T01:05:09.780685" 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-10-11T01:05:09.781027" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.780878" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:09.780865" 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-10-11T01:05:09.781262" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.781457" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.781638" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:09.780839" elapsed="0.000848"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:09.780753" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.781863" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:09.781928" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:09.782037" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-fam...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:05:09.751118" elapsed="0.030944"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:09.783171" 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-10-11T01:05:09.782985" elapsed="0.000246">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-10-11T01:05:09.783314" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:09.782659" elapsed="0.000677"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:09.783647" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.783399" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.784162" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:09.783894" elapsed="0.000292"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:09.783721" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.783382" elapsed="0.000855"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.784757" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:09.784397" elapsed="0.000384"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:09.784825" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:09.784948" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:09.782330" elapsed="0.002640"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:09.786055" 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-10-11T01:05:09.785871" elapsed="0.000242">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-10-11T01:05:09.786197" 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-10-11T01:05:09.785537" elapsed="0.000682"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:05:09.786378" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-10-11T01:05:09.786281" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:09.786264" elapsed="0.000207"/>
</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-10-11T01:05:09.786636" elapsed="0.000048"/>
</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-10-11T01:05:09.786845" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:05:09.786904" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:05:09.787028" 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-10-11T01:05:09.785221" elapsed="0.001830"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.788273" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:09.788050" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:09.790165" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:09.788523" elapsed="0.001685"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:09.796850" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:09.796990" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:09.797088" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:09.790518" elapsed="0.006941">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:09.790270" elapsed="0.007267">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:09.797737" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.797568" elapsed="0.000228"/>
</branch>
<status status="FAIL" start="2026-10-11T01:05:09.790253" elapsed="0.007565">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:09.798156" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:09.798275" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:09.798242" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:09.798226" elapsed="0.000108"/>
</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-10-11T01:05:09.798490" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:05:09.798552" 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-10-11T01:05:09.787330" elapsed="0.011330">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:09.798755" 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-10-11T01:05:09.743728" elapsed="0.055116">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:09.799096" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:09.798926" elapsed="0.000234"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:09.798911" elapsed="0.000271"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:09.799213" elapsed="0.000013"/>
</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-10-11T01:05:09.743083" elapsed="0.056218">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:11.834952" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:11.834167" elapsed="0.000852"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:11.836659" 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-10-11T01:05:11.836174" elapsed="0.000634">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-10-11T01:05:11.837001" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:11.835395" elapsed="0.001656"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.838190" 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-10-11T01:05:11.837473" elapsed="0.000774"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:11.838927" 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-10-11T01:05:11.839218" 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-10-11T01:05:11.838669" elapsed="0.000604"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.840260" 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-10-11T01:05:11.839761" elapsed="0.000593"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.843101" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:05:11.842530" elapsed="0.000666"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.844226" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:11.843650" elapsed="0.000630"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.846300" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:05:11.845062" elapsed="0.001295"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:11.849167" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:11.847908" elapsed="0.001457"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:11.849648" elapsed="0.000081"/>
</return>
<msg time="2026-10-11T01:05:11.850163" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:11.846834" elapsed="0.003464"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:11.850796" elapsed="0.000770"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:05:11.844765" elapsed="0.006917"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.853401" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:11.852210" elapsed="0.001342"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:11.856221" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:11.855026" elapsed="0.001431"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:11.856704" elapsed="0.000070"/>
</return>
<msg time="2026-10-11T01:05:11.857204" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:11.853969" elapsed="0.003300"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:11.857571" elapsed="0.000444"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:11.851913" elapsed="0.006156"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:11.844384" elapsed="0.013731"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:11.858168" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T01:05:11.858352" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:05:11.841190" elapsed="0.017196"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:11.840566" elapsed="0.017898"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:11.858736" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:11.858505" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:11.840509" elapsed="0.018327"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.860046" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-fam...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:11.859063" elapsed="0.001024"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:11.860150" 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/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-10-11T01:05:11.832921" elapsed="0.027372"/>
</kw>
<msg time="2026-10-11T01:05:11.860362" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:11.822610" elapsed="0.037873"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:11.866364" 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_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-10-11T01:05:11.872099" 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_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-10-11T01:05:11.878030" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:11.878339" 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-10-11T01:05:11.878634" 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-10-11T01:05:11.879116" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:11.878909" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:11.878890" 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-10-11T01:05:11.879454" 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-10-11T01:05:11.879723" 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-10-11T01:05:11.879955" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:11.878854" elapsed="0.001168"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:11.878729" elapsed="0.001325"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:11.880265" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:11.880358" elapsed="0.000021"/>
</return>
<msg time="2026-10-11T01:05:11.880534" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-fam...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:05:11.821178" elapsed="0.059392"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:11.882178" 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-10-11T01:05:11.881911" elapsed="0.000358">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-10-11T01:05:11.882389" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:11.881387" elapsed="0.001066"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:11.882879" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:11.882549" elapsed="0.000403"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.883673" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:11.883258" elapsed="0.000441"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:11.882983" elapsed="0.000748"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:11.882525" elapsed="0.001226"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.884249" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:11.883914" elapsed="0.000360"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:11.884319" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:11.884460" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:11.880966" elapsed="0.003518"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:11.885580" 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-10-11T01:05:11.885380" elapsed="0.000274">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-10-11T01:05:11.885739" 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-10-11T01:05:11.885055" elapsed="0.000707"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:05:11.885925" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:05:11.885826" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:11.885810" elapsed="0.000226"/>
</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-10-11T01:05:11.886190" elapsed="0.000020"/>
</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-10-11T01:05:11.886366" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:05:11.886440" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:11.886566" 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-10-11T01:05:11.884755" elapsed="0.001834"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.887844" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:11.887604" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.888297" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:11.888077" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:11.894725" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:11.894870" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:11.894959" 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-10-11T01:05:11.888656" elapsed="0.006328"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:11.888397" elapsed="0.006626"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:11.895201" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:11.895047" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:11.888381" elapsed="0.006898"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.896756" 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-10-11T01:05:11.896390" elapsed="0.000413"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:11.896145" elapsed="0.000690"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:11.896126" elapsed="0.000734"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.897456" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:11.897152" elapsed="0.000359"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:11.896911" elapsed="0.000646"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:11.896896" elapsed="0.000703"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.898216" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:11.897804" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:11.898588" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:11.898327" elapsed="0.000333"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.899123" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:11.898852" elapsed="0.000297"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:11.898683" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:11.898307" elapsed="0.000895"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.899748" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:11.899380" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:11.900097" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:11.899883" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.900630" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:11.900335" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:11.900171" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:11.899865" elapsed="0.000844"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:11.900860" elapsed="0.000300"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:11.901576" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:11.901324" elapsed="0.000277"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:11.901770" elapsed="0.000217"/>
</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-10-11T01:05:11.895801" elapsed="0.006246"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:11.902198" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:11.902113" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:11.902096" elapsed="0.000164"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:11.903038" 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-10-11T01:05:11.902401" elapsed="0.000664"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:05:11.903114" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:05:11.903249" 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-10-11T01:05:11.886888" elapsed="0.016386"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:11.903331" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:05:11.903473" 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-10-11T01:05:11.804528" elapsed="0.098970"/>
</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-10-11T01:05:11.914242" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:11.913923" elapsed="0.000346"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:11.915043" 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-10-11T01:05:11.914798" elapsed="0.000371">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-10-11T01:05:11.915334" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:11.914458" elapsed="0.000900"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.915904" 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-10-11T01:05:11.915571" elapsed="0.000359"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:11.916220" 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-10-11T01:05:11.916395" 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-10-11T01:05:11.916100" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.916884" 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-10-11T01:05:11.916658" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:05:11.917303" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:11.916994" elapsed="0.000363"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.918040" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:11.917564" elapsed="0.000502"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:11.917380" elapsed="0.000719"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:11.916976" elapsed="0.001144"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.918739" 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-10-11T01:05:11.918285" elapsed="0.000481"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:11.918811" 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-10-11T01:05:11.913366" elapsed="0.005549"/>
</kw>
<msg time="2026-10-11T01:05:11.918967" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:11.908779" elapsed="0.010235"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:11.923149" 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_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-10-11T01:05:11.927196" 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/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-10-11T01:05:11.931228" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:11.931423" 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-10-11T01:05:11.931606" 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-10-11T01:05:11.932005" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:11.931857" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:11.931844" 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-10-11T01:05:11.932234" 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-10-11T01:05:11.932427" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:11.932594" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:11.931818" elapsed="0.000835"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:11.931719" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:11.932831" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:11.932900" elapsed="0.000020"/>
</return>
<msg time="2026-10-11T01:05:11.933045" 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-10-11T01:05:11.908058" elapsed="0.025012"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:11.933241" elapsed="0.000347"/>
</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-10-11T01:05:11.934604" 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-10-11T01:05:11.934238" elapsed="0.000404"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:11.935284" 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-10-11T01:05:11.934792" elapsed="0.000520"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:05:11.935512" elapsed="0.000297"/>
</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-10-11T01:05:11.933875" elapsed="0.001989"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:11.933672" elapsed="0.002222"/>
</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-10-11T01:05:11.936093" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:11.935917" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:11.933655" elapsed="0.002507"/>
</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-10-11T01:05:11.904482" elapsed="0.031724"/>
</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-10-11T01:05:11.903800" elapsed="0.032470"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:11.903571" elapsed="0.032739"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:11.903555" elapsed="0.032776"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:11.936361" elapsed="0.000026"/>
</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-10-11T01:05:11.802930" elapsed="0.133551"/>
</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-10-11T01:05:09.741323" elapsed="2.195213"/>
</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-10-11T01:05:11.952149" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:11.951845" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:11.952854" 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-10-11T01:05:11.952682" elapsed="0.000230">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-10-11T01:05:11.952996" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:11.952334" elapsed="0.000686"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.953524" 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-10-11T01:05:11.953194" elapsed="0.000355"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:11.953842" 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-10-11T01:05:11.953957" 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-10-11T01:05:11.953730" elapsed="0.000252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.954396" 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-10-11T01:05:11.954178" elapsed="0.000277"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.955358" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:05:11.955124" elapsed="0.000276"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.955860" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:11.955594" elapsed="0.000290"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.956691" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:05:11.956198" elapsed="0.000519"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:11.958043" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:11.957336" elapsed="0.000801"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:11.958222" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:05:11.958469" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:11.956892" 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-10-11T01:05:11.958680" elapsed="0.000319"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/effective-rib-in</var>
<status status="PASS" start="2026-10-11T01:05:11.956067" elapsed="0.002970"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.959764" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:11.959270" elapsed="0.000519"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:11.960966" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:11.960401" elapsed="0.000657"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:11.961140" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:05:11.961356" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:11.959963" elapsed="0.001417"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:11.961671" elapsed="0.000312"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:11.959138" elapsed="0.002883"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:11.955928" elapsed="0.006124"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:11.962089" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:11.962255" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:05:11.954780" elapsed="0.007499"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:11.954517" elapsed="0.007791"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:11.962512" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:11.962332" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:11.954499" elapsed="0.008088"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.963271" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-addre...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:11.962760" elapsed="0.000538"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:11.963342" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:11.951299" elapsed="0.012216"/>
</kw>
<msg time="2026-10-11T01:05:11.963568" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:11.946945" elapsed="0.016679"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:11.967740" 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/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-10-11T01:05:11.971761" 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/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-10-11T01:05:11.975766" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:11.975946" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:11.976128" 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-10-11T01:05:11.976477" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:11.976317" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:11.976304" 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-10-11T01:05:11.976716" 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-10-11T01:05:11.976896" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:11.977058" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:11.976279" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:11.976193" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:11.977311" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:11.977378" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:11.977505" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-addre...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:05:11.946307" elapsed="0.031223"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:11.978651" 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-10-11T01:05:11.978453" elapsed="0.000259">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-10-11T01:05:11.978796" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:11.978112" elapsed="0.000706"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:11.979101" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:11.978881" elapsed="0.000271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.979633" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:11.979339" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:11.979173" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:11.978864" elapsed="0.000847"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.980205" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:11.979871" elapsed="0.000357"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:11.980273" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:11.980397" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:11.977808" elapsed="0.002627"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:11.981726" 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-10-11T01:05:11.981520" elapsed="0.000266">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-10-11T01:05:11.981871" 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-10-11T01:05:11.981001" elapsed="0.000892"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:05:11.982055" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:05:11.981957" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:11.981939" elapsed="0.000192"/>
</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-10-11T01:05:11.982284" elapsed="0.000019"/>
</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-10-11T01:05:11.982473" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:05:11.982534" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:05:11.982670" 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-10-11T01:05:11.980700" elapsed="0.001993"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.983913" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:11.983689" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.984363" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:11.984147" 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-10-11T01:05:11.990650" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:11.990764" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:11.990856" 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-10-11T01:05:11.984756" elapsed="0.006124"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:11.984513" elapsed="0.006407"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:11.991098" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:11.990944" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:11.984496" elapsed="0.006680"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.992461" 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-10-11T01:05:11.992111" elapsed="0.000396"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:11.991866" elapsed="0.000673"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:11.991849" elapsed="0.000713"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.993142" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:11.992871" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:11.992611" elapsed="0.000603"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:11.992597" elapsed="0.000639"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.993792" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:11.993428" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:11.994101" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:11.993883" elapsed="0.000272"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.994645" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:11.994343" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:11.994177" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:11.993866" elapsed="0.000860"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.995271" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:11.994904" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:11.995605" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:11.995362" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:11.996129" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:11.995863" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:11.995696" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:11.995345" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:11.996351" elapsed="0.000322"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:11.997055" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:11.996833" elapsed="0.000247"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:11.997234" elapsed="0.000260"/>
</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-10-11T01:05:11.991513" elapsed="0.006039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:11.997715" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:11.997628" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:11.997598" elapsed="0.000178"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:11.998640" 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-10-11T01:05:11.997919" elapsed="0.000750"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:05:11.998717" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:11.998846" 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-10-11T01:05:11.982968" elapsed="0.015903"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:11.998927" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:05:11.999049" 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-10-11T01:05:11.939125" elapsed="0.059948"/>
</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-10-11T01:05:12.009576" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:12.009254" elapsed="0.000348"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:12.010370" 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-10-11T01:05:12.010146" elapsed="0.000378">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-10-11T01:05:12.010706" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:12.009816" elapsed="0.000914"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.011216" 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-10-11T01:05:12.010907" elapsed="0.000334"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:12.011545" 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-10-11T01:05:12.011683" 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-10-11T01:05:12.011425" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.012125" 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-10-11T01:05:12.011903" elapsed="0.000269"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:05:12.012562" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:12.012233" elapsed="0.000398"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.013288" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:12.012837" elapsed="0.000477"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:12.012684" elapsed="0.000664"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:12.012216" elapsed="0.001152"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.013972" 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-10-11T01:05:12.013564" elapsed="0.000434"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:12.014043" 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/rib.vanadium/${file_name} exists. If 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-10-11T01:05:12.008746" elapsed="0.005419"/>
</kw>
<msg time="2026-10-11T01:05:12.014218" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:12.004342" elapsed="0.009921"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:12.018589" 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/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-10-11T01:05:12.022669" 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/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-10-11T01:05:12.026726" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:12.026906" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:12.027086" 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-10-11T01:05:12.027438" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:12.027278" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:12.027264" 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-10-11T01:05:12.027677" 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-10-11T01:05:12.027856" elapsed="0.000017"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:12.028018" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:12.027239" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:12.027152" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:12.028237" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:12.028333" elapsed="0.000017"/>
</return>
<msg time="2026-10-11T01:05:12.028475" 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-10-11T01:05:12.003648" elapsed="0.024853"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:12.028680" elapsed="0.000315"/>
</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-10-11T01:05:12.030001" 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-10-11T01:05:12.029652" elapsed="0.000376"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:12.030532" 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-10-11T01:05:12.030179" elapsed="0.000380"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:05:12.030753" elapsed="0.000277"/>
</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-10-11T01:05:12.029263" elapsed="0.001821"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:12.029066" elapsed="0.002049"/>
</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-10-11T01:05:12.031312" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:12.031137" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:12.029049" 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-10-11T01:05:12.000034" elapsed="0.031404"/>
</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-10-11T01:05:11.999355" elapsed="0.032149"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:11.999148" elapsed="0.032396"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:11.999132" elapsed="0.032433"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:12.031595" elapsed="0.000035"/>
</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-10-11T01:05:11.938458" elapsed="0.093248"/>
</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-10-11T01:05:11.936737" elapsed="0.095020"/>
</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-10-11T01:05:12.047458" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:12.047138" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:12.048144" 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-10-11T01:05:12.047973" elapsed="0.000230">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-10-11T01:05:12.048285" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:12.047655" elapsed="0.000653"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.048858" 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-10-11T01:05:12.048534" elapsed="0.000349"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:12.049158" 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-10-11T01:05:12.049273" 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-10-11T01:05:12.049050" elapsed="0.000247"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.049745" 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-10-11T01:05:12.049511" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.050696" 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-10-11T01:05:12.050455" elapsed="0.000282"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.051184" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:12.050915" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.052007" 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-10-11T01:05:12.051550" elapsed="0.000481"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:12.053191" 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-10-11T01:05:12.052683" elapsed="0.000597"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:12.053363" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:05:12.053606" 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-10-11T01:05:12.052202" elapsed="0.001455"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:12.053827" elapsed="0.000303"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:05:12.051391" elapsed="0.002777"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.054887" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:12.054397" elapsed="0.000514"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:12.056089" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:12.055565" elapsed="0.000659"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:12.056311" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:05:12.056564" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:12.055084" elapsed="0.001505"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:12.056780" elapsed="0.000307"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:12.054267" elapsed="0.002859"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:12.051252" elapsed="0.005907"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:12.057195" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:12.057326" 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-10-11T01:05:12.050100" elapsed="0.007250"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:12.049848" elapsed="0.007532"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:12.057700" elapsed="0.000165"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:12.057403" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:12.049830" elapsed="0.008088"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.058627" 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-10-11T01:05:12.058082" elapsed="0.000575"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:12.058702" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:12.046633" elapsed="0.012171"/>
</kw>
<msg time="2026-10-11T01:05:12.058891" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:12.042218" elapsed="0.016720"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:12.063231" 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/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-10-11T01:05:12.067328" 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/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-10-11T01:05:12.071370" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:12.071565" 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-10-11T01:05:12.071755" 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-10-11T01:05:12.072087" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:12.071943" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:12.071930" 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-10-11T01:05:12.072315" 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-10-11T01:05:12.072507" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:12.072683" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:12.071906" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:12.071820" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:12.072904" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:12.072970" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:05:12.073077" 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-10-11T01:05:12.041623" elapsed="0.031478"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:12.074210" 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-10-11T01:05:12.074026" elapsed="0.000244">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-10-11T01:05:12.074385" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:12.073700" 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-10-11T01:05:12.074779" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:12.074538" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.075291" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:12.075024" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:12.074856" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:12.074520" elapsed="0.000847"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.075916" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:12.075558" elapsed="0.000382"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:12.075986" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:12.076110" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:12.073366" elapsed="0.002768"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:12.077237" 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-10-11T01:05:12.077052" elapsed="0.000244">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-10-11T01:05:12.077380" 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-10-11T01:05:12.076730" elapsed="0.000687"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:05:12.077580" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:05:12.077483" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:12.077465" elapsed="0.000222"/>
</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-10-11T01:05:12.077841" elapsed="0.000019"/>
</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-10-11T01:05:12.078015" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:05:12.078073" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:05:12.078197" 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-10-11T01:05:12.076384" elapsed="0.001836"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.080516" 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-10-11T01:05:12.079222" elapsed="0.001338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.080984" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:12.080765" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:12.085579" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:12.085704" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:05:12.085800" 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-10-11T01:05:12.081311" elapsed="0.004513"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:12.081084" elapsed="0.004780"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:12.086039" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:12.085887" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:12.081067" elapsed="0.005080"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.087421" 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-10-11T01:05:12.087077" elapsed="0.000391"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:12.086837" elapsed="0.000663"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:12.086820" elapsed="0.000702"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.088092" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:12.087827" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:12.087572" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:12.087557" elapsed="0.000629"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.088749" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:12.088361" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:12.089048" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:12.088838" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.089563" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:12.089285" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:12.089122" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:12.088821" elapsed="0.000831"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.090159" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:12.089827" elapsed="0.000356"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:12.090475" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:12.090250" elapsed="0.000276"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.090984" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:12.090724" elapsed="0.000283"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:12.090548" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:12.090234" elapsed="0.000824"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:12.091202" elapsed="0.000304"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:12.091899" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:12.091679" elapsed="0.000244"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:12.092096" elapsed="0.000216"/>
</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-10-11T01:05:12.086488" elapsed="0.005880"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:12.092548" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:12.092457" elapsed="0.000133"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:12.092433" elapsed="0.000176"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:12.093334" 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-10-11T01:05:12.092768" elapsed="0.000593"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:05:12.093425" elapsed="0.000034"/>
</return>
<msg time="2026-10-11T01:05:12.093568" 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-10-11T01:05:12.078515" elapsed="0.015078"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:12.093661" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:12.093815" 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-10-11T01:05:12.034216" elapsed="0.059624"/>
</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-10-11T01:05:12.104463" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:12.104145" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:12.105208" 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-10-11T01:05:12.104985" elapsed="0.000341">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-10-11T01:05:12.105533" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:12.104663" elapsed="0.000910"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.106118" 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-10-11T01:05:12.105783" elapsed="0.000391"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:12.106510" 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-10-11T01:05:12.106670" 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-10-11T01:05:12.106356" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.107117" 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-10-11T01:05:12.106895" elapsed="0.000268"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:05:12.107605" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:12.107230" elapsed="0.000447"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.108324" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:12.107855" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:12.107701" elapsed="0.000684"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:12.107209" elapsed="0.001230"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.109027" 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-10-11T01:05:12.108628" elapsed="0.000426"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:12.109102" 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-10-11T01:05:12.103641" elapsed="0.005577"/>
</kw>
<msg time="2026-10-11T01:05:12.109272" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:12.099187" elapsed="0.010135"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:12.113610" 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_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-10-11T01:05:12.117703" 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/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-10-11T01:05:12.121902" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:12.122085" 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-10-11T01:05:12.122269" 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-10-11T01:05:12.122650" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:12.122491" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:12.122477" 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-10-11T01:05:12.122880" 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-10-11T01:05:12.123061" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:12.123226" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:12.122448" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:12.122338" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:12.123465" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:12.123532" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:12.123669" 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-10-11T01:05:12.098477" elapsed="0.025218"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:12.123863" elapsed="0.000315"/>
</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-10-11T01:05:12.125234" 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-10-11T01:05:12.124869" elapsed="0.000391"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:12.125779" 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-10-11T01:05:12.125425" 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-10-11T01:05:12.126021" elapsed="0.000282"/>
</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-10-11T01:05:12.124464" elapsed="0.001893"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:12.124248" elapsed="0.002139"/>
</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-10-11T01:05:12.126602" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:12.126425" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:12.124232" elapsed="0.002450"/>
</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-10-11T01:05:12.094794" elapsed="0.031931"/>
</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-10-11T01:05:12.094116" elapsed="0.032676"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:12.093913" elapsed="0.032919"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:12.093897" elapsed="0.032956"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:12.126884" elapsed="0.000025"/>
</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-10-11T01:05:12.033604" elapsed="0.093380"/>
</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-10-11T01:05:12.031945" elapsed="0.095093"/>
</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-10-11T01:05:12.127189" elapsed="0.002947"/>
</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-10-11T01:05:12.146014" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:12.145710" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:12.146787" 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-10-11T01:05:12.146533" elapsed="0.000325">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-10-11T01:05:12.146947" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:12.146201" elapsed="0.000769"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.147491" 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-10-11T01:05:12.147147" elapsed="0.000370"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:12.147825" 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-10-11T01:05:12.147941" 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-10-11T01:05:12.147714" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.148378" 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-10-11T01:05:12.148161" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.149330" 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-10-11T01:05:12.149101" elapsed="0.000271"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.149830" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:12.149565" elapsed="0.000289"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.150667" 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-10-11T01:05:12.150173" elapsed="0.000551"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:12.151910" 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-10-11T01:05:12.151347" elapsed="0.000654"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:12.152084" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:05:12.152300" 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-10-11T01:05:12.150905" 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-10-11T01:05:12.152531" elapsed="0.000344"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:05:12.150041" elapsed="0.002874"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.153649" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:12.153152" elapsed="0.000524"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:12.154853" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:12.154289" elapsed="0.000653"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:12.155022" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:05:12.155240" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:12.153850" 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-10-11T01:05:12.155542" elapsed="0.000329"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:12.153017" elapsed="0.002895"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:12.149899" elapsed="0.006047"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:12.155985" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:12.156116" 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-10-11T01:05:12.148760" elapsed="0.007380"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:12.148500" elapsed="0.007670"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:12.156367" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:12.156193" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:12.148482" elapsed="0.007985"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.157147" 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-10-11T01:05:12.156643" elapsed="0.000531"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:12.157218" 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/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-10-11T01:05:12.145164" elapsed="0.012156"/>
</kw>
<msg time="2026-10-11T01:05:12.157371" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:12.140688" elapsed="0.016790"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:12.161886" 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/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-10-11T01:05:12.166033" 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/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-10-11T01:05:12.170130" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:12.170314" 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-10-11T01:05:12.170512" 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-10-11T01:05:12.170864" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:12.170718" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:12.170704" 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-10-11T01:05:12.171094" 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-10-11T01:05:12.171276" 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-10-11T01:05:12.171456" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:12.170677" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:12.170578" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:12.171708" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:12.171776" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:12.171884" 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-10-11T01:05:12.140046" elapsed="0.031862"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:12.173017" 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-10-11T01:05:12.172832" elapsed="0.000244">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-10-11T01:05:12.173159" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:12.172494" elapsed="0.000687"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:12.173495" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:12.173245" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.174026" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:12.173762" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:12.173572" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:12.173228" elapsed="0.000874"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.174628" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:12.174265" elapsed="0.000388"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:12.174699" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:12.174822" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:12.172176" elapsed="0.002669"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:12.175890" 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-10-11T01:05:12.175745" elapsed="0.000224"/>
</kw>
<msg time="2026-10-11T01:05:12.176047" 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-10-11T01:05:12.175390" elapsed="0.000679"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:05:12.176232" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:12.176134" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:12.176117" elapsed="0.000175"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:12.176587" 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-10-11T01:05:12.176716" 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-10-11T01:05:12.176461" elapsed="0.000278"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:05:12.177087" 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-10-11T01:05:12.176902" elapsed="0.000209"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:05:12.177152" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:12.177275" 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-10-11T01:05:12.175091" elapsed="0.002207"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.178544" 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-10-11T01:05:12.178304" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.179005" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:12.178790" elapsed="0.000255"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:12.184832" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:12.184976" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:05:12.185066" 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-10-11T01:05:12.179333" elapsed="0.005757"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:12.179105" elapsed="0.006025"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:12.185313" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:12.185154" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:12.179088" elapsed="0.006303"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.186707" 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-10-11T01:05:12.186342" elapsed="0.000413"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:12.186097" elapsed="0.000689"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:12.186080" elapsed="0.000729"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.187373" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:12.187101" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:12.186859" elapsed="0.000604"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:12.186844" elapsed="0.000641"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.188019" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:12.187674" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:12.188358" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:12.188138" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.188893" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:12.188626" elapsed="0.000292"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:12.188450" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:12.188120" elapsed="0.000850"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.189497" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:12.189146" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:12.189807" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:12.189585" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.190306" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:12.190045" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:12.189881" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:12.189568" elapsed="0.000814"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:12.190541" elapsed="0.000307"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:12.191238" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:12.191011" elapsed="0.000251"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:12.191432" elapsed="0.000221"/>
</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-10-11T01:05:12.185761" elapsed="0.005948"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:12.191853" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:12.191772" elapsed="0.000122"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:12.191755" elapsed="0.000159"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:12.192684" 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-10-11T01:05:12.192054" elapsed="0.000658"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:05:12.192758" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:12.192883" 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-10-11T01:05:12.177594" elapsed="0.015314"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:12.192962" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:05:12.193082" 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-10-11T01:05:12.132761" elapsed="0.060345"/>
</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-10-11T01:05:12.203731" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:12.203419" elapsed="0.000339"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:12.204483" 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-10-11T01:05:12.204234" elapsed="0.000375">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-10-11T01:05:12.204818" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:12.203916" elapsed="0.000927"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.205336" 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-10-11T01:05:12.205021" elapsed="0.000341"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:12.205682" 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-10-11T01:05:12.205799" 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-10-11T01:05:12.205556" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.206237" 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-10-11T01:05:12.206019" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:05:12.206686" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:12.206340" elapsed="0.000403"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.207371" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:12.206915" elapsed="0.000481"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:12.206766" elapsed="0.000691"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:12.206323" elapsed="0.001156"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.208048" 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-10-11T01:05:12.207657" elapsed="0.000418"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:12.208119" 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-10-11T01:05:12.202903" elapsed="0.005319"/>
</kw>
<msg time="2026-10-11T01:05:12.208271" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:12.198489" elapsed="0.009826"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:12.212456" 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/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-10-11T01:05:12.216540" 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/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-10-11T01:05:12.220703" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:12.220915" 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-10-11T01:05:12.221100" 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-10-11T01:05:12.221455" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:12.221294" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:12.221281" 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-10-11T01:05:12.221698" 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-10-11T01:05:12.221881" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:12.222046" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:12.221255" elapsed="0.000838"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:12.221166" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:12.222266" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:12.222331" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:12.222451" 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-10-11T01:05:12.197765" elapsed="0.024712"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:12.222657" elapsed="0.000310"/>
</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-10-11T01:05:12.223858" 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-10-11T01:05:12.223610" elapsed="0.000275"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:12.224573" 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-10-11T01:05:12.224034" elapsed="0.000567"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:05:12.225075" 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-10-11T01:05:12.225243" 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-10-11T01:05:12.224804" elapsed="0.000502">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-10-11T01:05:12.223235" elapsed="0.002260">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-10-11T01:05:12.223036" elapsed="0.002533">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-10-11T01:05:12.225792" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:12.225601" elapsed="0.000243"/>
</branch>
<status status="FAIL" start="2026-10-11T01:05:12.223020" elapsed="0.002844">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-10-11T01:05:12.194056" elapsed="0.031917">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-10-11T01:05:12.193383" elapsed="0.032714">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-10-11T01:05:12.193179" elapsed="0.032994">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-10-11T01:05:12.193163" elapsed="0.033042">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-10-11T01:05:12.226248" elapsed="0.000015"/>
</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-10-11T01:05:12.132083" elapsed="0.094270">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-10-11T01:05:14.261977" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:14.261172" elapsed="0.000871"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:14.263679" 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-10-11T01:05:14.263203" elapsed="0.000624">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-10-11T01:05:14.264019" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:14.262446" elapsed="0.001624"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.265206" 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-10-11T01:05:14.264489" elapsed="0.000773"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:14.266005" 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-10-11T01:05:14.266360" 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-10-11T01:05:14.265743" elapsed="0.000714"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.267461" 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-10-11T01:05:14.266941" elapsed="0.000619"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.269674" 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-10-11T01:05:14.269112" elapsed="0.000657"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.270871" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:14.270165" elapsed="0.000762"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.272927" 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-10-11T01:05:14.271805" elapsed="0.001178"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:14.275757" 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-10-11T01:05:14.274457" elapsed="0.001500"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:14.276145" elapsed="0.000075"/>
</return>
<msg time="2026-10-11T01:05:14.276731" 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-10-11T01:05:14.273372" elapsed="0.003416"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:14.277165" elapsed="0.000818"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:05:14.271461" elapsed="0.006609"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.279884" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:14.278684" elapsed="0.001259"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:14.281812" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:14.281037" elapsed="0.000901"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:14.282055" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T01:05:14.282353" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:14.280352" elapsed="0.002035"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:14.282685" elapsed="0.000612"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:14.278293" elapsed="0.005058"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:14.271029" elapsed="0.012366"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:14.283495" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T01:05:14.283708" 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-10-11T01:05:14.268299" elapsed="0.015442"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:14.267725" elapsed="0.016120"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:14.284095" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:14.283880" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:14.267682" elapsed="0.016512"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.285209" 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-10-11T01:05:14.284474" elapsed="0.000771"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:14.285306" 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/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-10-11T01:05:14.259903" elapsed="0.025586"/>
</kw>
<msg time="2026-10-11T01:05:14.285564" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:14.249645" elapsed="0.036002"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:14.291375" elapsed="0.000050"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:14.297145" 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-10-11T01:05:14.302878" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:14.303133" 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-10-11T01:05:14.303384" elapsed="0.000045"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:14.303890" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:14.303686" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:14.303666" elapsed="0.000323"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:14.304206" 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-10-11T01:05:14.304477" 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-10-11T01:05:14.304723" elapsed="0.000027"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:14.303630" elapsed="0.001162"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:14.303496" elapsed="0.001328"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:14.305032" elapsed="0.000025"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:14.305167" elapsed="0.000023"/>
</return>
<msg time="2026-10-11T01:05:14.305326" 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-10-11T01:05:14.248182" elapsed="0.057179"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:14.306892" 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-10-11T01:05:14.306706" elapsed="0.000245">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-10-11T01:05:14.307034" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:14.306197" elapsed="0.000860"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:14.307338" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:14.307120" elapsed="0.000269"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.307882" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:14.307620" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:14.307425" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:14.307103" elapsed="0.000854"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.308468" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:14.308116" elapsed="0.000376"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:14.308536" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:14.308670" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:14.305771" elapsed="0.002923"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:14.309730" 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-10-11T01:05:14.309575" elapsed="0.000204"/>
</kw>
<msg time="2026-10-11T01:05:14.309854" 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-10-11T01:05:14.309241" elapsed="0.000635"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:05:14.310037" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:14.309939" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:14.309923" elapsed="0.000173"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:14.310369" 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-10-11T01:05:14.310501" 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-10-11T01:05:14.310246" elapsed="0.000279"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:05:14.310887" 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-10-11T01:05:14.310699" elapsed="0.000211"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:05:14.310951" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:14.311074" 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-10-11T01:05:14.308944" elapsed="0.002152"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.312502" 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-10-11T01:05:14.312100" elapsed="0.000446"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.312969" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:14.312750" 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-10-11T01:05:14.319133" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:14.319282" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:05:14.319369" 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-10-11T01:05:14.313335" elapsed="0.006058"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:14.313104" elapsed="0.006359"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:14.319660" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:14.319489" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:14.313087" elapsed="0.006653"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.321033" 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-10-11T01:05:14.320701" elapsed="0.000375"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:14.320437" elapsed="0.000670"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:14.320397" elapsed="0.000734"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.321737" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:14.321447" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:14.321180" elapsed="0.000628"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:14.321165" elapsed="0.000665"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.322350" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:14.322007" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:14.322682" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:14.322454" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.323180" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:14.322920" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:14.322757" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:14.322436" elapsed="0.000824"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.323795" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:14.323448" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:14.324091" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:14.323881" elapsed="0.000260"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.324614" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:14.324325" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:14.324163" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:14.323865" elapsed="0.000827"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:14.324836" elapsed="0.000289"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:14.325526" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:14.325285" elapsed="0.000266"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:14.325716" elapsed="0.000216"/>
</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-10-11T01:05:14.320070" elapsed="0.005917"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:14.326163" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:14.326080" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:14.326062" elapsed="0.000161"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:14.326860" 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-10-11T01:05:14.326364" elapsed="0.000524"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:05:14.326935" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:14.327062" 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-10-11T01:05:14.311384" elapsed="0.015703"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:14.327142" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:05:14.327268" 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-10-11T01:05:14.231562" elapsed="0.095730"/>
</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-10-11T01:05:14.337922" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:14.337621" elapsed="0.000327"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:14.338669" 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-10-11T01:05:14.338436" elapsed="0.000351">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-10-11T01:05:14.338946" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:14.338105" elapsed="0.000865"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.339495" 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-10-11T01:05:14.339145" elapsed="0.000376"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:14.339815" 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-10-11T01:05:14.339933" 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-10-11T01:05:14.339703" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.340377" 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-10-11T01:05:14.340151" 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-10-11T01:05:14.340822" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:14.340511" elapsed="0.000365"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.341521" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:14.341046" elapsed="0.000501"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:14.340898" elapsed="0.000681"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:14.340493" elapsed="0.001106"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.342159" 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-10-11T01:05:14.341776" elapsed="0.000410"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:14.342261" 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-10-11T01:05:14.337092" elapsed="0.005275"/>
</kw>
<msg time="2026-10-11T01:05:14.342449" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:14.332681" elapsed="0.009818"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:14.346625" 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/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-10-11T01:05:14.350669" 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/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-10-11T01:05:14.355872" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:14.356057" 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-10-11T01:05:14.356239" 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-10-11T01:05:14.356645" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:14.356484" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:14.356469" 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-10-11T01:05:14.356876" 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-10-11T01:05:14.357056" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:14.357218" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:14.356437" elapsed="0.000829"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:14.356322" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:14.357454" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:14.357521" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:14.357638" 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-10-11T01:05:14.331953" elapsed="0.025711"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:14.357883" elapsed="0.000321"/>
</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-10-11T01:05:14.359117" 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-10-11T01:05:14.358879" elapsed="0.000265"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:14.359538" 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-10-11T01:05:14.359292" elapsed="0.000272"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:05:14.359757" elapsed="0.000276"/>
</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-10-11T01:05:14.358503" elapsed="0.001585"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:14.358274" elapsed="0.001844"/>
</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-10-11T01:05:14.360314" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:14.360140" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:14.358257" elapsed="0.002125"/>
</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-10-11T01:05:14.328252" elapsed="0.032188"/>
</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-10-11T01:05:14.327589" elapsed="0.032916"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:14.327365" elapsed="0.033179"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:14.327349" elapsed="0.033216"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:14.360595" elapsed="0.000036"/>
</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-10-11T01:05:14.229993" elapsed="0.130711"/>
</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-10-11T01:05:12.130325" elapsed="2.230431"/>
</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-10-11T01:05:14.360951" elapsed="0.002693"/>
</kw>
<arg>rt_constrain_type_0</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<status status="PASS" start="2026-10-11T01:05:09.732780" elapsed="4.630919"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:09.616827" elapsed="4.746978"/>
</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-10-11T01:05:14.365298" elapsed="0.000238"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:05:14.365025" 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-10-11T01:05:14.366689" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:14.366584" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:14.366565" elapsed="0.000189"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:14.368915" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:14.368829" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:14.368812" elapsed="0.000168"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.369939" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:14.369589" elapsed="0.000377"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.370392" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:05:14.370124" elapsed="0.000314"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:05:14.370488" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T01:05:14.370648" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:05:14.369194" elapsed="0.001478"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:14.373247" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:14.373162" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:14.373144" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:14.374362" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:14.374277" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:14.374257" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:14.374798" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:05:14.374625" elapsed="0.000199"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:14.375135" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:05:14.374992" elapsed="0.000166"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:05:14.410296" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:05:14.375696" elapsed="0.034765"/>
</kw>
<msg time="2026-10-11T01:05:14.410675" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:05:14.410719" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:14.375317" elapsed="0.035438"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:05:14.454942" 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-10-11T01:05:14.411348" elapsed="0.043705"/>
</kw>
<msg time="2026-10-11T01:05:14.455203" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:05:14.455244" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:14.410957" elapsed="0.044322"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:14.455630" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:14.455354" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:14.455333" elapsed="0.000374"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.456125" 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-10-11T01:05:14.455893" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:14.456494" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:14.456258" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:14.456241" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:05:14.456602" 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-10-11T01:05:14.459253" elapsed="0.000367"/>
</kw>
<msg time="2026-10-11T01:05:14.459694" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:14.458070" elapsed="0.001782"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:14.460196" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:14.460579" 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-10-11T01:05:14.457442" elapsed="0.003349"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:05:14.456934" elapsed="0.003920"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:05:14.374018" elapsed="0.086912"/>
</kw>
<msg time="2026-10-11T01:05:14.461016" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:14.461057" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:14.373478" elapsed="0.087616"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:05:14.461296" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T01:05:14.461207" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:14.461188" elapsed="0.000186"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:14.461835" 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-10-11T01:05:14.462151" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:05:14.462217" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T01:05:14.372873" elapsed="0.089435"/>
</kw>
<msg time="2026-10-11T01:05:14.462394" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:14.462484" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:14.371044" elapsed="0.091479"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:14.462833" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:14.462592" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:14.462576" elapsed="0.000328"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:05:14.370898" elapsed="0.092028"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:05:14.370756" elapsed="0.092200"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:05:14.368514" elapsed="0.094491"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:05:14.366239" elapsed="0.096817"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:14.365752" elapsed="0.097345"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:05:14.364676" elapsed="0.098468"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:14.464026" 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-10-11T01:05:14.464180" 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-10-11T01:05:14.463872" elapsed="0.000333"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:05:14.464581" 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-10-11T01:05:14.464368" elapsed="0.000250"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:14.464919" 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-10-11T01:05:14.465040" 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-10-11T01:05:14.464783" elapsed="0.000280"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:05:14.465388" 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-10-11T01:05:14.465222" elapsed="0.000205"/>
</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-10-11T01:05:14.465711" elapsed="0.002569"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:14.465493" elapsed="0.002821"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:14.465475" elapsed="0.002871"/>
</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-10-11T01:05:14.479283" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:14.478979" elapsed="0.000372"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:14.480118" 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-10-11T01:05:14.479890" elapsed="0.000303">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-10-11T01:05:14.480281" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:14.479552" elapsed="0.000753"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.480842" 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-10-11T01:05:14.480511" elapsed="0.000356"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:14.481145" 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-10-11T01:05:14.481308" 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-10-11T01:05:14.481036" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.481802" 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-10-11T01:05:14.481562" 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-10-11T01:05:14.482767" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:05:14.482525" elapsed="0.000284"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.483242" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:14.482985" elapsed="0.000281"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.483883" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:14.483613" elapsed="0.000294"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:14.484791" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:14.484388" elapsed="0.000429"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:14.484862" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:14.484989" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:14.484078" 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-10-11T01:05:14.485181" elapsed="0.000188"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:05:14.483471" elapsed="0.001956"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.485961" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:14.485689" elapsed="0.000297"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:14.486879" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:14.486496" elapsed="0.000408"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:14.486950" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:14.487076" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:14.486157" 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-10-11T01:05:14.487267" elapsed="0.000199"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:14.485541" elapsed="0.001966"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:14.483312" elapsed="0.004228"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:14.487578" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T01:05:14.487726" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:05:14.482162" elapsed="0.005588"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:14.481908" elapsed="0.005872"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:14.487954" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:14.487802" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:14.481891" elapsed="0.006167"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.488802" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:14.488225" elapsed="0.000605"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:14.488875" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:14.478460" elapsed="0.010516"/>
</kw>
<msg time="2026-10-11T01:05:14.489025" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:14.473913" elapsed="0.015156"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:14.493398" 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/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-10-11T01:05:14.497500" 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/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-10-11T01:05:14.501564" elapsed="0.000023"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:14.501774" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:14.501956" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:14.502294" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:14.502147" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:14.502134" 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-10-11T01:05:14.502537" 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-10-11T01:05:14.502729" 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-10-11T01:05:14.502894" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:14.502108" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:14.502021" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:14.503118" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:14.503185" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:14.503294" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:14.473297" elapsed="0.030051"/>
</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-10-11T01:05:14.512273" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:14.511969" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:14.512975" 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-10-11T01:05:14.512803" elapsed="0.000231">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-10-11T01:05:14.513119" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:14.512474" elapsed="0.000667"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.513667" 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-10-11T01:05:14.513315" elapsed="0.000378"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:14.513969" 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-10-11T01:05:14.514089" 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-10-11T01:05:14.513861" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.514547" 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-10-11T01:05:14.514311" 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-10-11T01:05:14.514922" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:14.514671" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.515420" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', '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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:14.515143" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:14.514997" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:14.514654" elapsed="0.000844"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.516052" 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-10-11T01:05:14.515669" elapsed="0.000411"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:14.516124" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:14.511457" elapsed="0.004767"/>
</kw>
<msg time="2026-10-11T01:05:14.516274" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:14.507135" elapsed="0.009183"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:14.520599" 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/app.vanadium/${file_name} exists. If 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-10-11T01:05:14.524705" 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/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-10-11T01:05:14.528824" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:14.529008" 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-10-11T01:05:14.529193" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:14.529551" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:14.529386" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:14.529372" 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-10-11T01:05:14.529796" 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-10-11T01:05:14.529975" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:14.530138" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:14.529346" elapsed="0.000839"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:14.529257" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:14.530360" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:14.530458" elapsed="0.000017"/>
</return>
<msg time="2026-10-11T01:05:14.530579" 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-10-11T01:05:14.506438" elapsed="0.024182"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:14.531766" 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-10-11T01:05:14.531560" elapsed="0.000266">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-10-11T01:05:14.531909" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:14.531205" elapsed="0.000727"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:14.532251" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:14.532029" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.532789" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:14.532512" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:14.532325" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:14.532011" elapsed="0.000855"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.533365" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:14.533028" elapsed="0.000361"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:14.533450" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:14.533576" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:14.530902" elapsed="0.002697"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.534929" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:14.534707" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.535374" 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-10-11T01:05:14.535162" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.535857" 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-10-11T01:05:14.535639" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.536298" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:14.536085" elapsed="0.000252"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:14.537063" 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-10-11T01:05:14.536902" elapsed="0.000185"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:05:14.537383" 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-10-11T01:05:14.537240" elapsed="0.000183"/>
</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-10-11T01:05:14.537587" elapsed="0.000183"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.538186" 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-10-11T01:05:14.537965" elapsed="0.000262"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:05:14.538264" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:14.538391" 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-10-11T01:05:14.536535" elapsed="0.001894"/>
</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-10-11T01:05:14.550869" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.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-10-11T01:05:14.550958" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:14.551057" 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-10-11T01:05:14.538736" elapsed="0.012345"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:14.538494" elapsed="0.012628"/>
</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-10-11T01:05:14.551303" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:14.551147" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:14.538477" elapsed="0.012906"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.552660" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:14.552356" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:14.552117" elapsed="0.000615"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:14.552099" elapsed="0.000655"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.553304" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:14.553039" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:14.552803" elapsed="0.000573"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:14.552788" elapsed="0.000610"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.553956" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:14.553590" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:14.554274" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:14.554055" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.554824" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:14.554545" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:14.554354" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:14.554038" elapsed="0.000863"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.555422" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:14.555073" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:14.555731" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:14.555511" elapsed="0.000272"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.556224" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:14.555965" elapsed="0.000283"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:14.555805" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:14.555494" elapsed="0.000806"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:14.556458" elapsed="0.000300"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:14.557144" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:14.556919" elapsed="0.000249"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:14.557327" elapsed="0.000227"/>
</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-10-11T01:05:14.551758" elapsed="0.005862"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:05:14.557768" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:05:14.557685" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:14.557668" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:14.557988" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:05:14.558046" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:14.558203" 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-10-11T01:05:14.533907" elapsed="0.024320"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:14.558341" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:14.558497" 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-10-11T01:05:14.469334" elapsed="0.089187"/>
</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-10-11T01:05:14.558831" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:14.558623" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:14.558596" elapsed="0.000318"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:14.558944" 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-10-11T01:05:14.468625" elapsed="0.090416"/>
</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-10-11T01:05:14.562547" level="INFO">${update} = </msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:05:14.559945" elapsed="0.002630"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:05:14.563085" level="FAIL"> == </msg>
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="FAIL" start="2026-10-11T01:05:14.562745" elapsed="0.000396"> == </status>
</kw>
<return>
<value>${update}</value>
<status status="NOT RUN" start="2026-10-11T01:05:14.563192" elapsed="0.000015"/>
</return>
<doc>Returns hex update message.</doc>
<status status="FAIL" start="2026-10-11T01:05:14.559687" elapsed="0.003604"> == </status>
</kw>
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:05:16.568139" level="INFO">${update} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0102c0000202007b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:05:16.564938" elapsed="0.003269"/>
</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-10-11T01:05:16.568705" elapsed="0.000778"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:05:16.569625" elapsed="0.000078"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:05:16.564101" elapsed="0.005777"/>
</kw>
<msg time="2026-10-11T01:05:16.570035" 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-10-11T01:05:14.559225" elapsed="2.010864"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.572575" level="INFO">Length is 124.</msg>
<msg time="2026-10-11T01:05:16.572757" 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-10-11T01:05:16.571972" elapsed="0.000837"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.573774" level="INFO">Length is 124.</msg>
<msg time="2026-10-11T01:05:16.573929" 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-10-11T01:05:16.573166" elapsed="0.000812"/>
</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-10-11T01:05:16.574390" elapsed="0.000651"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:05:16.575762" 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-10-11T01:05:16.575370" elapsed="0.000445"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:05:16.576555" 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-10-11T01:05:16.576136" elapsed="0.000493"/>
</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-10-11T01:05:16.577040" elapsed="0.000657"/>
</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-10-11T01:05:16.570634" elapsed="0.007186"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:05:16.578134" elapsed="0.002859"/>
</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-10-11T01:05:16.612979" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:16.612256" elapsed="0.000922"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:16.614690" 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-10-11T01:05:16.614331" elapsed="0.000454">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-10-11T01:05:16.614904" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:16.613574" elapsed="0.001361"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.615651" 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-10-11T01:05:16.615178" elapsed="0.000510"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:16.616077" 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-10-11T01:05:16.616255" 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-10-11T01:05:16.615923" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.616903" 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-10-11T01:05:16.616580" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.618252" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:05:16.617930" elapsed="0.000382"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.619135" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:16.618580" elapsed="0.000590"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.620260" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:16.619666" elapsed="0.000629"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:16.621874" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:16.621193" elapsed="0.000790"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:16.622163" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T01:05:16.622398" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:16.620590" elapsed="0.001878"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:16.622735" elapsed="0.000440"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:05:16.619460" elapsed="0.003770"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.624191" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:16.623625" elapsed="0.000602"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:16.625870" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:16.625111" elapsed="0.000870"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:16.626165" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T01:05:16.626404" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:16.624509" elapsed="0.001990"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:16.626753" elapsed="0.000431"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:16.623373" elapsed="0.003866"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:16.619235" elapsed="0.008049"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:16.627339" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T01:05:16.627569" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:05:16.617431" elapsed="0.010191"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:16.617053" elapsed="0.010613"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:16.627913" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:16.627698" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:16.617026" elapsed="0.011033"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.629084" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:16.628288" elapsed="0.000835"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:16.629184" 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/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-10-11T01:05:16.611092" elapsed="0.018232"/>
</kw>
<msg time="2026-10-11T01:05:16.629391" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:16.601364" elapsed="0.028135"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:16.635247" 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/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-10-11T01:05:16.640917" 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/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-10-11T01:05:16.644953" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:16.645135" 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-10-11T01:05:16.645319" 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-10-11T01:05:16.645690" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:16.645528" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:16.645514" 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-10-11T01:05:16.645923" 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-10-11T01:05:16.646105" 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-10-11T01:05:16.646269" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:16.645487" elapsed="0.000830"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:16.645385" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:16.646513" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:16.646580" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:05:16.646700" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:16.599946" elapsed="0.046808"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.647776" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:16.647535" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:16.655886" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:16.655931" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:16.656012" 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-10-11T01:05:16.648109" elapsed="0.007927"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:16.647880" elapsed="0.008192"/>
</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-10-11T01:05:16.656247" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:16.656096" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:16.647864" elapsed="0.008457"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.657817" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:16.657506" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:16.657212" elapsed="0.000678"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:16.657194" elapsed="0.000720"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.658505" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:16.658210" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:16.657966" elapsed="0.000615"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:16.657950" elapsed="0.000666"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.659187" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:16.658812" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:16.659574" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:16.659293" elapsed="0.000358"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.660185" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:16.659887" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:16.659679" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:16.659273" elapsed="0.000990"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.660826" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:16.660469" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:16.661125" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:16.660915" elapsed="0.000261"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.661676" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:16.661365" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:16.661199" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:16.660898" elapsed="0.000855"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:16.661899" elapsed="0.000291"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:16.662588" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:16.662350" 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-10-11T01:05:16.662810" elapsed="0.000213"/>
</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-10-11T01:05:16.656876" elapsed="0.006203"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:05:16.663120" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:16.663291" 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-10-11T01:05:16.646995" elapsed="0.016320"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:16.663362" 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="PASS" start="2026-10-11T01:05:16.583266" elapsed="0.080210"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:16.582270" elapsed="0.081254"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:05:16.581363" elapsed="0.082214"/>
</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-10-11T01:05:16.666783" level="INFO">${update} = ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0102c0000202007b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:05:16.664474" elapsed="0.002337"/>
</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-10-11T01:05:16.666968" elapsed="0.000309"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:05:16.667320" elapsed="0.000027"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:05:16.664201" elapsed="0.003244"/>
</kw>
<msg time="2026-10-11T01:05:16.667524" 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-10-11T01:05:16.663773" elapsed="0.003775"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.668346" level="INFO">Length is 112.</msg>
<msg time="2026-10-11T01:05:16.668515" 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-10-11T01:05:16.668087" elapsed="0.000463"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.669101" level="INFO">Length is 112.</msg>
<msg time="2026-10-11T01:05:16.669194" 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-10-11T01:05:16.668784" elapsed="0.000440"/>
</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-10-11T01:05:16.669520" elapsed="0.000406"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:05:16.670340" 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-10-11T01:05:16.670134" elapsed="0.000240"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:05:16.670840" 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-10-11T01:05:16.670633" 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-10-11T01:05:16.671127" elapsed="0.000391"/>
</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-10-11T01:05:16.667755" elapsed="0.003852"/>
</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-10-11T01:05:16.689250" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:16.688941" elapsed="0.000338"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:16.690009" 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-10-11T01:05:16.689789" elapsed="0.000287">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-10-11T01:05:16.690162" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:16.689456" elapsed="0.000728"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.690787" 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-10-11T01:05:16.690428" elapsed="0.000387"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:16.691100" 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-10-11T01:05:16.691289" 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-10-11T01:05:16.690985" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.691787" 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-10-11T01:05:16.691543" 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-10-11T01:05:16.692783" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:05:16.692541" elapsed="0.000282"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.693249" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:16.692998" elapsed="0.000275"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.694097" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:16.693623" elapsed="0.000499"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:16.695197" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:16.694749" elapsed="0.000488"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:16.695354" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T01:05:16.695573" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:16.694292" elapsed="0.001319"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:16.695781" elapsed="0.000282"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:05:16.693481" elapsed="0.002619"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.696825" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:16.696329" elapsed="0.000521"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:16.697929" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:16.697465" elapsed="0.000505"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:16.698083" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:16.698263" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:16.697020" elapsed="0.001268"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:16.698492" elapsed="0.000294"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:16.696200" elapsed="0.002624"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:16.693320" elapsed="0.005538"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:16.698897" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:16.699027" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:05:16.692161" elapsed="0.006889"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:16.691899" elapsed="0.007181"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:16.699254" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:16.699103" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:16.691878" elapsed="0.007446"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.700214" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:16.699523" elapsed="0.000718"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:16.700287" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:16.688382" elapsed="0.012005"/>
</kw>
<msg time="2026-10-11T01:05:16.700589" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:16.684038" elapsed="0.016627"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:16.704768" 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/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-10-11T01:05:16.708837" 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/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-10-11T01:05:16.712901" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:16.713082" 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-10-11T01:05:16.713262" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:16.713623" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:16.713468" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:16.713454" 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-10-11T01:05:16.713852" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:16.714030" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:16.714193" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:16.713427" elapsed="0.000813"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:16.713326" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:16.714426" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:16.714494" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:16.714614" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:16.683310" elapsed="0.031330"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.715676" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:16.715440" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:16.722735" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:16.723010" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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+xml', 'Content-Length': '619'} 
 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-path xmlns:a="urn:opendaylight:params:xml:ns:yang:bgp-rib" xmlns:b="urn:opendaylight:params:xml:ns:yang:bgp-types" xmlns:c="urn:opendaylight:params:xml:ns:yang:bgp:route:target:constrain"&gt;/a:application-rib[a:id='10.30.170.173']/a:tables[a:afi='b:ipv4-address-family'][a:safi='c:route-target-constrain-subsequent-address-family']/c:route-target-constrain-routes&lt;/error-path&gt;&lt;error-message&gt;Data does not exist&lt;/error-message&gt;&lt;error-tag&gt;data-missing&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-10-11T01:05:16.723144" level="INFO">${response} = None</msg>
<msg time="2026-10-11T01:05:16.723186" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:16.716008" elapsed="0.007562">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:16.715780" elapsed="0.007879">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:16.723848" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:16.723692" elapsed="0.000214"/>
</branch>
<status status="FAIL" start="2026-10-11T01:05:16.715763" elapsed="0.008165">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:16.725183" 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-10-11T01:05:16.724904" elapsed="0.000312">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:05:16.724660" elapsed="0.000614">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:05:16.724642" elapsed="0.000662">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-10-11T01:05:16.725909" 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-10-11T01:05:16.725637" elapsed="0.000304">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:05:16.725367" elapsed="0.000631">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:05:16.725351" elapsed="0.002013">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.727975" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:16.727610" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:16.728287" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:16.728067" elapsed="0.000276"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.728835" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:16.728547" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:16.728366" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:16.728050" elapsed="0.000864"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.729453" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:16.729093" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:16.729767" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:16.729544" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.730307" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:16.730039" elapsed="0.000294"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:16.729873" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:16.729527" elapsed="0.000859"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:16.730548" elapsed="0.000310"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:16.731245" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:16.731020" elapsed="0.000249"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-10-11T01:05:16.731619" 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-10-11T01:05:16.731441" elapsed="0.000209">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-10-11T01:05:16.724267" elapsed="0.007504">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-10-11T01:05:16.731826" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:16.732075" level="INFO">${response_text} = None</msg>
<msg time="2026-10-11T01:05:16.732103" 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-10-11T01:05:16.714874" elapsed="0.017255">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-10-11T01:05:16.732187" elapsed="0.000024"/>
</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-10-11T01:05:16.672937" elapsed="0.059386">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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:16.672371" elapsed="0.060007"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:05:16.671886" elapsed="0.060562"/>
</kw>
<arg>rt_constrain_type_1</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<status status="PASS" start="2026-10-11T01:05:14.463405" elapsed="2.269088"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:14.364167" elapsed="2.368424"/>
</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-10-11T01:05:16.734096" elapsed="0.000218"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:05:16.733826" elapsed="0.000559"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:16.735459" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:16.735345" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:16.735327" 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-10-11T01:05:16.737671" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:16.737577" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:16.737560" elapsed="0.000173"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.738651" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:16.738296" elapsed="0.000381"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.739093" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:05:16.738831" elapsed="0.000286"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:05:16.739158" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:16.739286" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:05:16.737940" elapsed="0.001368"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:16.741860" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:16.741775" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:16.741758" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:16.742976" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:16.742892" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:16.742875" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:16.743354" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:05:16.743186" elapsed="0.000192"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:16.743741" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:05:16.743579" elapsed="0.000186"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:05:16.779445" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:05:16.744262" elapsed="0.035281"/>
</kw>
<msg time="2026-10-11T01:05:16.779735" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:05:16.779777" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:16.743926" elapsed="0.035888"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:05:16.824888" 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-10-11T01:05:16.780325" elapsed="0.044675"/>
</kw>
<msg time="2026-10-11T01:05:16.825154" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:05:16.825196" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:16.779984" elapsed="0.045249"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:16.825539" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:16.825304" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:16.825285" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.826038" 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-10-11T01:05:16.825804" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:16.826374" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:16.826172" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:16.826156" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:05:16.826492" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:05:16.829025" elapsed="0.000118"/>
</kw>
<msg time="2026-10-11T01:05:16.829200" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:16.827852" elapsed="0.001480"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:16.829670" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:16.830003" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:05:16.827247" 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-10-11T01:05:16.826779" elapsed="0.003465"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:05:16.742634" elapsed="0.087683"/>
</kw>
<msg time="2026-10-11T01:05:16.830399" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:16.830461" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:16.742075" elapsed="0.088422"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:05:16.830697" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:05:16.830608" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:16.830580" elapsed="0.000193"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:16.831099" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:16.831399" elapsed="0.000043"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:05:16.831484" 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-10-11T01:05:16.741479" elapsed="0.090092"/>
</kw>
<msg time="2026-10-11T01:05:16.831667" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:16.831708" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:16.739700" elapsed="0.092044"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:16.832034" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:16.831812" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:16.831796" elapsed="0.000308"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:05:16.739511" elapsed="0.092615"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:05:16.739356" elapsed="0.092797"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:05:16.737267" elapsed="0.094934"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:05:16.735081" elapsed="0.097170"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:16.734580" elapsed="0.097711"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:05:16.733435" elapsed="0.098902"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.833459" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:05:16.833035" elapsed="0.000452"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.834067" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:05:16.833680" elapsed="0.000413"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.834756" 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-10-11T01:05:16.834273" elapsed="0.000510"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:16.835096" 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-10-11T01:05:16.835225" 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-10-11T01:05:16.834951" elapsed="0.000298"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:16.835564" 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-10-11T01:05:16.835687" 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-10-11T01:05:16.835426" elapsed="0.000285"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:05:16.835851" elapsed="0.002526"/>
</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-10-11T01:05:16.838543" elapsed="0.002408"/>
</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-10-11T01:05:16.856731" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:16.856396" elapsed="0.000362"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:16.857447" 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-10-11T01:05:16.857242" elapsed="0.000271">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-10-11T01:05:16.857609" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:16.856919" elapsed="0.000714"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.858114" 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-10-11T01:05:16.857807" elapsed="0.000332"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:16.858428" 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-10-11T01:05:16.858550" 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-10-11T01:05:16.858305" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.859019" 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-10-11T01:05:16.858800" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.859976" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:05:16.859747" elapsed="0.000270"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.860451" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:16.860191" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.861236" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:05:16.860806" elapsed="0.000454"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:16.862393" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:16.861891" elapsed="0.000608"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:16.862578" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T01:05:16.862802" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:16.861452" 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-10-11T01:05:16.862990" elapsed="0.000303"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:05:16.860673" elapsed="0.002657"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.864023" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:16.863586" elapsed="0.000462"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:16.865169" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:16.864676" elapsed="0.000579"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:16.865334" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:16.865562" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:16.864218" elapsed="0.001368"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:16.865761" elapsed="0.000299"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:16.863453" elapsed="0.002644"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:16.860520" elapsed="0.005608"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:16.866166" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:16.866328" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:05:16.859375" elapsed="0.006977"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:16.859122" elapsed="0.007260"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:16.866641" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:16.866404" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:16.859105" elapsed="0.007609"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.867623" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-fam...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:16.866873" elapsed="0.000778"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:16.867696" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:16.855890" elapsed="0.011905"/>
</kw>
<msg time="2026-10-11T01:05:16.867844" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:16.851562" elapsed="0.016326"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:16.872003" 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/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-10-11T01:05:16.876090" 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/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-10-11T01:05:16.880178" elapsed="0.000023"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:16.880360" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:16.880555" 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-10-11T01:05:16.880905" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:16.880758" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:16.880745" 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-10-11T01:05:16.881132" 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-10-11T01:05:16.881310" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:16.881487" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:16.880720" elapsed="0.000816"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:16.880631" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:16.881756" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:16.881825" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:16.881935" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-fam...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:05:16.850946" elapsed="0.031014"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:16.883093" 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-10-11T01:05:16.882900" elapsed="0.000252">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-10-11T01:05:16.883236" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:16.882546" elapsed="0.000712"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:16.883559" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:16.883320" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.884071" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:16.883810" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:16.883643" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:16.883304" elapsed="0.000842"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.884668" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:16.884306" elapsed="0.000386"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:16.884736" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:16.884860" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:16.882229" elapsed="0.002653"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:16.885969" 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-10-11T01:05:16.885780" elapsed="0.000248">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-10-11T01:05:16.886112" 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-10-11T01:05:16.885445" elapsed="0.000689"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:05:16.886293" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:05:16.886196" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:16.886179" elapsed="0.000191"/>
</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-10-11T01:05:16.886540" elapsed="0.000020"/>
</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-10-11T01:05:16.886729" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:05:16.886787" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:05:16.886910" 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-10-11T01:05:16.885133" elapsed="0.001800"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.888156" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:16.887935" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:16.888803" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:16.888389" elapsed="0.000455"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:16.894841" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:16.895032" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:16.895170" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:16.889174" elapsed="0.006562">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:16.888938" elapsed="0.006883">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:16.896040" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:16.895856" elapsed="0.000244"/>
</branch>
<status status="FAIL" start="2026-10-11T01:05:16.888919" elapsed="0.007203">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:16.896523" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:16.896662" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:16.896626" elapsed="0.000075"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:16.896608" elapsed="0.000113"/>
</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-10-11T01:05:16.896866" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:05:16.896928" elapsed="0.000013"/>
</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-10-11T01:05:16.887215" elapsed="0.009812">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:16.897093" 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-10-11T01:05:16.843502" elapsed="0.053681">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:16.897456" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:16.897268" elapsed="0.000255"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:16.897250" elapsed="0.000296"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:16.897576" 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-10-11T01:05:16.842871" elapsed="0.054807">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:18.932764" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:18.932010" elapsed="0.000821"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:18.934536" 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-10-11T01:05:18.934072" elapsed="0.000629">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-10-11T01:05:18.934894" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:18.933272" elapsed="0.001674"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:18.936081" 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-10-11T01:05:18.935331" elapsed="0.000807"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:18.936818" 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-10-11T01:05:18.937108" 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-10-11T01:05:18.936546" elapsed="0.000616"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:18.938141" 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-10-11T01:05:18.937647" elapsed="0.000591"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:18.940340" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:05:18.939825" elapsed="0.000638"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:18.941465" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:18.940874" elapsed="0.000648"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:18.943335" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:05:18.942265" elapsed="0.001124"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:18.946055" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:18.944860" elapsed="0.001390"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:18.946475" elapsed="0.000077"/>
</return>
<msg time="2026-10-11T01:05:18.946986" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:18.943835" elapsed="0.003204"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:18.947467" elapsed="0.000723"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:05:18.941968" elapsed="0.006308"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:18.949975" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:18.948855" elapsed="0.001174"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:18.952714" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:18.951495" elapsed="0.001416"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:18.953088" elapsed="0.000066"/>
</return>
<msg time="2026-10-11T01:05:18.953614" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:18.950470" elapsed="0.003200"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:18.954123" elapsed="0.000758"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:18.948540" elapsed="0.006427"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:18.941643" elapsed="0.013393"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:18.955120" elapsed="0.000058"/>
</return>
<msg time="2026-10-11T01:05:18.955439" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:05:18.939013" elapsed="0.016464"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:18.938385" elapsed="0.017133"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:18.955774" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:18.955551" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:18.938339" elapsed="0.017533"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:18.956918" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-fam...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:18.956095" elapsed="0.000860"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:18.957017" 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/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-10-11T01:05:18.930819" elapsed="0.026338"/>
</kw>
<msg time="2026-10-11T01:05:18.957225" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:18.920627" elapsed="0.036662"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:18.963246" 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-10-11T01:05:18.968952" 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/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-10-11T01:05:18.974638" elapsed="0.000038"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:18.974905" 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-10-11T01:05:18.975159" 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-10-11T01:05:18.975678" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:18.975455" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:18.975433" 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-10-11T01:05:18.976002" 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-10-11T01:05:18.976253" elapsed="0.000076"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:18.976564" elapsed="0.000041"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:18.975376" elapsed="0.001273"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:18.975251" elapsed="0.001433"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:18.976901" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:18.976997" elapsed="0.000021"/>
</return>
<msg time="2026-10-11T01:05:18.977159" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-fam...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:05:18.919177" elapsed="0.058017"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:18.978824" 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-10-11T01:05:18.978528" elapsed="0.000386">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-10-11T01:05:18.979030" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:18.978038" 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-10-11T01:05:18.979484" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:18.979148" elapsed="0.000409"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:18.980220" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:18.979854" elapsed="0.000400"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:18.979600" elapsed="0.000698"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:18.979125" elapsed="0.001200"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:18.981054" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:18.980569" elapsed="0.000517"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:18.981148" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T01:05:18.981318" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:18.977609" elapsed="0.003740"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:18.982438" 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-10-11T01:05:18.982241" elapsed="0.000257">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-10-11T01:05:18.982581" 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-10-11T01:05:18.981923" elapsed="0.000691"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:05:18.982777" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:05:18.982679" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:18.982662" elapsed="0.000191"/>
</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-10-11T01:05:18.983008" elapsed="0.000019"/>
</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-10-11T01:05:18.983182" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:05:18.983241" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:05:18.983362" 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-10-11T01:05:18.981624" elapsed="0.001760"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:18.984676" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:18.984441" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:18.985123" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:18.984909" elapsed="0.000253"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:18.991942" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:18.992092" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:18.992181" 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-10-11T01:05:18.985464" elapsed="0.006741"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:18.985221" elapsed="0.007023"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:18.992443" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:18.992268" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:18.985204" elapsed="0.007320"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:18.993800" 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-10-11T01:05:18.993458" elapsed="0.000387"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:18.993197" elapsed="0.000680"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:18.993181" elapsed="0.000718"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:18.994468" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:18.994188" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:18.993949" elapsed="0.000592"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:18.993934" elapsed="0.000629"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:18.995100" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:18.994750" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:18.995403" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:18.995188" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:18.995931" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:18.995668" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:18.995493" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:18.995171" elapsed="0.000836"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:18.996549" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:18.996185" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:18.996858" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:18.996648" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:18.997355" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:18.997094" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:18.996931" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:18.996631" elapsed="0.000817"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:18.997604" elapsed="0.000294"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:18.998330" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:18.998098" elapsed="0.000256"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:18.998532" elapsed="0.000223"/>
</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-10-11T01:05:18.992861" elapsed="0.005949"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:18.998953" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:18.998871" elapsed="0.000122"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:18.998855" elapsed="0.000158"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:18.999773" 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-10-11T01:05:18.999154" elapsed="0.000646"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:05:18.999846" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:18.999971" 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-10-11T01:05:18.983731" elapsed="0.016264"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:19.000049" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:05:19.000171" 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-10-11T01:05:18.902959" 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-10-11T01:05:19.010862" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:19.010550" elapsed="0.000339"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:19.011609" 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-10-11T01:05:19.011362" elapsed="0.000365">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-10-11T01:05:19.011888" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:19.011047" elapsed="0.000864"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.012391" 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-10-11T01:05:19.012085" elapsed="0.000347"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:19.012723" 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-10-11T01:05:19.012856" 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-10-11T01:05:19.012613" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.013292" 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-10-11T01:05:19.013076" 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-10-11T01:05:19.013759" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:19.013449" elapsed="0.000364"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.014453" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:19.013985" elapsed="0.000498"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:19.013836" elapsed="0.000686"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.013430" elapsed="0.001112"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.015109" 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-10-11T01:05:19.014718" elapsed="0.000418"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:19.015181" 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_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-10-11T01:05:19.010003" elapsed="0.005280"/>
</kw>
<msg time="2026-10-11T01:05:19.015336" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:19.005671" elapsed="0.009711"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:19.019488" 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/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-10-11T01:05:19.023537" 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/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-10-11T01:05:19.027724" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.027908" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.028091" 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-10-11T01:05:19.028446" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:19.028286" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:19.028272" 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-10-11T01:05:19.028685" 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-10-11T01:05:19.028865" 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-10-11T01:05:19.029030" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:19.028246" elapsed="0.000859"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:19.028156" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.029288" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:19.029354" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:19.029491" 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-10-11T01:05:19.004938" elapsed="0.024579"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:19.029695" elapsed="0.000316"/>
</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-10-11T01:05:19.031016" 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-10-11T01:05:19.030667" elapsed="0.000375"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:19.031550" 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-10-11T01:05:19.031193" elapsed="0.000383"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:05:19.031772" elapsed="0.000278"/>
</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-10-11T01:05:19.030281" elapsed="0.001823"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:19.030080" elapsed="0.002054"/>
</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-10-11T01:05:19.032331" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:19.032157" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.030063" elapsed="0.002336"/>
</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-10-11T01:05:19.001156" elapsed="0.031302"/>
</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-10-11T01:05:19.000491" elapsed="0.032032"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:19.000269" elapsed="0.032293"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.000253" elapsed="0.032330"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:19.032624" elapsed="0.000026"/>
</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-10-11T01:05:18.901352" elapsed="0.131372"/>
</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-10-11T01:05:16.841148" elapsed="2.191630"/>
</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-10-11T01:05:19.048383" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:19.048081" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:19.049087" 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-10-11T01:05:19.048916" elapsed="0.000230">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-10-11T01:05:19.049393" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:19.048585" elapsed="0.000846"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.049934" 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-10-11T01:05:19.049623" elapsed="0.000336"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:19.050234" 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-10-11T01:05:19.050349" 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-10-11T01:05:19.050126" elapsed="0.000247"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.050821" 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-10-11T01:05:19.050602" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.051851" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:05:19.051619" elapsed="0.000274"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.052340" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:19.052072" elapsed="0.000291"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.053153" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:05:19.052709" elapsed="0.000469"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:19.054466" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:19.053939" elapsed="0.000677"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:19.054703" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:05:19.054917" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:19.053393" 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-10-11T01:05:19.055108" elapsed="0.000328"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/effective-rib-in</var>
<status status="PASS" start="2026-10-11T01:05:19.052565" elapsed="0.002909"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.056155" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:19.055715" elapsed="0.000464"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:19.057325" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:19.056822" elapsed="0.000611"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:19.057516" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:19.057736" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:19.056347" elapsed="0.001413"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:19.057925" elapsed="0.000301"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:19.055574" elapsed="0.002689"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:19.052421" elapsed="0.005873"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:19.058332" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:19.058540" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:05:19.051242" elapsed="0.007322"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:19.050924" elapsed="0.007679"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.058777" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:19.058626" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.050906" elapsed="0.007941"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.059580" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-addre...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:19.059006" elapsed="0.000612"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:19.059696" 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_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-10-11T01:05:19.047570" elapsed="0.012229"/>
</kw>
<msg time="2026-10-11T01:05:19.059848" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:19.043157" elapsed="0.016735"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:19.065140" 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/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-10-11T01:05:19.069190" 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/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-10-11T01:05:19.073230" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.073426" 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-10-11T01:05:19.073620" 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-10-11T01:05:19.073958" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:19.073813" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:19.073799" 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-10-11T01:05:19.074186" 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-10-11T01:05:19.074370" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.074552" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:19.073773" elapsed="0.000845"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:19.073687" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.074794" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:19.074861" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:05:19.074971" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-addre...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:05:19.042550" elapsed="0.032446"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:19.076134" 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-10-11T01:05:19.075947" elapsed="0.000246">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-10-11T01:05:19.076276" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:19.075620" elapsed="0.000679"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.076611" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:19.076361" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.077119" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:19.076856" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:19.076688" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.076345" elapsed="0.000851"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.077724" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:19.077358" elapsed="0.000390"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:19.077794" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:19.077919" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:19.075290" elapsed="0.002652"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:19.079035" 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-10-11T01:05:19.078849" elapsed="0.000244">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-10-11T01:05:19.079176" 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-10-11T01:05:19.078511" elapsed="0.000688"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:05:19.079359" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:05:19.079262" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.079245" elapsed="0.000207"/>
</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-10-11T01:05:19.079616" elapsed="0.000020"/>
</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-10-11T01:05:19.079793" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:05:19.079852" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:05:19.079977" 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-10-11T01:05:19.078188" elapsed="0.001812"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.081215" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:19.080993" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.081693" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:19.081464" elapsed="0.000269"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:19.087124" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:19.087240" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:19.087367" 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-10-11T01:05:19.082019" elapsed="0.005374"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:19.081793" elapsed="0.005659"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.087652" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:19.087477" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.081776" elapsed="0.005954"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.088984" 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-10-11T01:05:19.088655" elapsed="0.000375"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:19.088387" elapsed="0.000674"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.088369" elapsed="0.000715"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.089667" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:19.089370" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:19.089133" elapsed="0.000607"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.089118" elapsed="0.000644"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.090280" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:19.089938" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.090608" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:19.090368" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.091110" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:19.090848" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:19.090684" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.090351" elapsed="0.000836"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.091723" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:19.091362" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.092020" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:19.091811" elapsed="0.000260"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.092531" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:19.092254" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:19.092092" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.091795" elapsed="0.000823"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:19.092764" elapsed="0.000288"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:19.093445" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:19.093211" elapsed="0.000260"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:19.093641" elapsed="0.000208"/>
</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-10-11T01:05:19.088046" elapsed="0.005859"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:19.094048" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:19.093967" elapsed="0.000121"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.093950" elapsed="0.000157"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:19.094833" 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-10-11T01:05:19.094248" elapsed="0.000612"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:05:19.094906" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:19.095031" 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-10-11T01:05:19.080275" elapsed="0.014780"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:19.095143" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:19.095266" 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-10-11T01:05:19.035259" elapsed="0.060031"/>
</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-10-11T01:05:19.105842" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:19.105527" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:19.106600" 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-10-11T01:05:19.106346" elapsed="0.000376">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-10-11T01:05:19.106884" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:19.106029" elapsed="0.000879"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.107391" 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-10-11T01:05:19.107084" elapsed="0.000348"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:19.107726" 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-10-11T01:05:19.107852" 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-10-11T01:05:19.107617" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.108290" 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-10-11T01:05:19.108073" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:05:19.108723" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:19.108398" elapsed="0.000380"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.109395" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:19.108948" elapsed="0.000493"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:19.108800" elapsed="0.000676"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.108380" elapsed="0.001121"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.110058" 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-10-11T01:05:19.109676" elapsed="0.000409"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:19.110129" 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_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-10-11T01:05:19.104998" elapsed="0.005232"/>
</kw>
<msg time="2026-10-11T01:05:19.110317" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:19.100653" elapsed="0.009711"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:19.114494" 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/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-10-11T01:05:19.118632" 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/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-10-11T01:05:19.122821" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.123003" 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-10-11T01:05:19.123192" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.123549" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:19.123386" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:19.123372" 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-10-11T01:05:19.123791" 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-10-11T01:05:19.123974" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.124139" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:19.123346" elapsed="0.000841"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:19.123257" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.124360" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:19.124440" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:05:19.124571" 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-10-11T01:05:19.099923" elapsed="0.024687"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:19.124779" elapsed="0.000316"/>
</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-10-11T01:05:19.126113" 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-10-11T01:05:19.125755" elapsed="0.000415"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:19.126698" 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-10-11T01:05:19.126326" elapsed="0.000399"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:05:19.126910" elapsed="0.000279"/>
</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-10-11T01:05:19.125365" elapsed="0.001879"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:19.125165" elapsed="0.002110"/>
</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-10-11T01:05:19.127488" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:19.127298" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.125149" 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-10-11T01:05:19.096239" elapsed="0.031374"/>
</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-10-11T01:05:19.095582" elapsed="0.032097"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:19.095363" elapsed="0.032356"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.095347" elapsed="0.032393"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:19.127770" elapsed="0.000026"/>
</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-10-11T01:05:19.034652" elapsed="0.093217"/>
</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-10-11T01:05:19.032969" elapsed="0.094951"/>
</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-10-11T01:05:19.143505" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:19.143187" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:19.144265" 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-10-11T01:05:19.144092" elapsed="0.000232">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-10-11T01:05:19.144429" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:19.143701" elapsed="0.000753"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.144956" 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-10-11T01:05:19.144648" elapsed="0.000334"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:19.145256" 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-10-11T01:05:19.145370" 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-10-11T01:05:19.145148" elapsed="0.000247"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.145841" 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-10-11T01:05:19.145621" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.146789" 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-10-11T01:05:19.146549" elapsed="0.000281"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.147295" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:19.147042" elapsed="0.000277"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.148100" 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-10-11T01:05:19.147666" elapsed="0.000458"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:19.149259" 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-10-11T01:05:19.148758" elapsed="0.000588"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:19.149443" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:05:19.149676" 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-10-11T01:05:19.148296" elapsed="0.001404"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:19.149865" elapsed="0.000305"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:05:19.147525" elapsed="0.002683"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.150907" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:19.150457" elapsed="0.000475"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:19.152072" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:19.151562" elapsed="0.000601"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:19.152243" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:19.152471" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:19.151101" elapsed="0.001394"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:19.152670" elapsed="0.000298"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:19.150307" elapsed="0.002699"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:19.147366" elapsed="0.005671"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:19.153075" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:19.153202" 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-10-11T01:05:19.146194" elapsed="0.007031"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:19.145944" elapsed="0.007310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.153534" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:19.153276" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.145926" elapsed="0.007690"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.154274" 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-10-11T01:05:19.153776" elapsed="0.000525"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:19.154345" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:19.142683" elapsed="0.011777"/>
</kw>
<msg time="2026-10-11T01:05:19.154510" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:19.138246" elapsed="0.016309"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:19.158809" 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/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-10-11T01:05:19.162857" 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/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-10-11T01:05:19.166947" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.167129" 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-10-11T01:05:19.167312" 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-10-11T01:05:19.167674" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:19.167519" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:19.167505" 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-10-11T01:05:19.167901" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.168079" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.168242" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:19.167479" elapsed="0.000810"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:19.167377" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.168476" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:19.168543" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:19.168663" 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-10-11T01:05:19.137651" elapsed="0.031037"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:19.169786" 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-10-11T01:05:19.169599" elapsed="0.000245">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-10-11T01:05:19.169927" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:19.169248" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.170231" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:19.170012" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.170760" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:19.170483" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:19.170304" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.169996" elapsed="0.000839"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.171330" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:19.170997" elapsed="0.000357"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:19.171398" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T01:05:19.171539" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:19.168950" elapsed="0.002653"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:19.172691" 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-10-11T01:05:19.172493" elapsed="0.000257">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-10-11T01:05:19.172833" 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-10-11T01:05:19.172158" elapsed="0.000698"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:05:19.173017" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:05:19.172919" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.172902" elapsed="0.000191"/>
</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-10-11T01:05:19.173246" elapsed="0.000020"/>
</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-10-11T01:05:19.173440" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:05:19.173501" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:05:19.173636" 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-10-11T01:05:19.171857" elapsed="0.001803"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.174880" 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-10-11T01:05:19.174655" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.175325" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:19.175112" elapsed="0.000253"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:19.180626" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:19.180773" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:05:19.180879" 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-10-11T01:05:19.175675" elapsed="0.005231"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:19.175439" elapsed="0.005515"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.181159" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:19.180982" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.175421" elapsed="0.005816"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.182631" 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-10-11T01:05:19.182243" elapsed="0.000434"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:19.181990" elapsed="0.000719"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.181971" elapsed="0.000761"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.183290" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:19.183022" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:19.182783" elapsed="0.000581"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.182768" elapsed="0.000618"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.183958" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:19.183604" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.184311" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:19.184096" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.184847" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:19.184567" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:19.184386" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.184079" elapsed="0.000846"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.185455" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:19.185100" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.185764" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:19.185544" elapsed="0.000272"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.186265" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:19.186002" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:19.185838" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.185527" elapsed="0.000815"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:19.186503" elapsed="0.000305"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:19.187200" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:19.186969" elapsed="0.000256"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:19.187378" elapsed="0.000278"/>
</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-10-11T01:05:19.181624" elapsed="0.006092"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:19.187864" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:19.187778" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.187761" elapsed="0.000164"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:19.188671" 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-10-11T01:05:19.188066" elapsed="0.000633"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:05:19.188744" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:05:19.188877" 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-10-11T01:05:19.173934" elapsed="0.014967"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:19.188956" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:05:19.189077" 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-10-11T01:05:19.130399" elapsed="0.058702"/>
</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-10-11T01:05:19.199746" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:19.199431" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:19.200515" 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-10-11T01:05:19.200252" elapsed="0.000428">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-10-11T01:05:19.200847" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:19.199933" elapsed="0.000938"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.201356" 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-10-11T01:05:19.201047" elapsed="0.000335"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:19.201690" 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-10-11T01:05:19.201829" 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-10-11T01:05:19.201569" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.202265" 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-10-11T01:05:19.202048" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:05:19.202699" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:19.202372" elapsed="0.000382"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.203371" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:19.202925" elapsed="0.000471"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:19.202777" elapsed="0.000671"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.202354" elapsed="0.001115"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.204033" 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-10-11T01:05:19.203646" elapsed="0.000414"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:19.204103" 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_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-10-11T01:05:19.198918" elapsed="0.005286"/>
</kw>
<msg time="2026-10-11T01:05:19.204255" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:19.194525" elapsed="0.009775"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:19.208385" 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/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-10-11T01:05:19.212454" 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/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-10-11T01:05:19.216675" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.216858" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.217040" 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-10-11T01:05:19.217396" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:19.217244" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:19.217230" 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-10-11T01:05:19.217649" 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-10-11T01:05:19.217830" 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-10-11T01:05:19.217994" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:19.217204" elapsed="0.000838"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:19.217110" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.218218" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:19.218284" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:05:19.218418" 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-10-11T01:05:19.193806" elapsed="0.024638"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:19.218620" elapsed="0.000313"/>
</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-10-11T01:05:19.219936" 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-10-11T01:05:19.219579" elapsed="0.000384"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:19.220464" 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-10-11T01:05:19.220111" elapsed="0.000379"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:05:19.220686" 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-10-11T01:05:19.219200" elapsed="0.001885"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:19.219002" 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-10-11T01:05:19.221313" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:19.221137" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.218985" elapsed="0.002396"/>
</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-10-11T01:05:19.190066" elapsed="0.031375"/>
</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-10-11T01:05:19.189381" elapsed="0.032135"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:19.189174" elapsed="0.032421"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.189159" elapsed="0.032460"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:19.221650" elapsed="0.000026"/>
</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-10-11T01:05:19.129779" elapsed="0.091974"/>
</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-10-11T01:05:19.128106" elapsed="0.093701"/>
</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-10-11T01:05:19.221961" elapsed="0.002686"/>
</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-10-11T01:05:19.240219" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:19.239912" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:19.240928" 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-10-11T01:05:19.240754" elapsed="0.000234">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-10-11T01:05:19.241073" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:19.240420" elapsed="0.000677"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.241611" 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-10-11T01:05:19.241271" elapsed="0.000367"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:19.241917" 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-10-11T01:05:19.242032" 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-10-11T01:05:19.241809" elapsed="0.000249"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.242495" 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-10-11T01:05:19.242256" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.243452" 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-10-11T01:05:19.243206" elapsed="0.000288"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.243938" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:19.243684" elapsed="0.000278"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.244746" 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-10-11T01:05:19.244278" elapsed="0.000493"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:19.245904" 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-10-11T01:05:19.245367" elapsed="0.000628"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:19.246076" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:05:19.246287" 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-10-11T01:05:19.244941" 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-10-11T01:05:19.246497" elapsed="0.000321"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:05:19.244147" elapsed="0.002709"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.247568" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:19.247112" elapsed="0.000491"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:19.248789" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:19.248246" elapsed="0.000632"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:19.248958" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:19.249169" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:19.247818" 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-10-11T01:05:19.249358" elapsed="0.000395"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:19.246981" elapsed="0.002811"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:19.244006" elapsed="0.005817"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:19.249861" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:05:19.249989" 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-10-11T01:05:19.242868" elapsed="0.007145"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:19.242609" elapsed="0.007432"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.250212" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:19.250063" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.242580" elapsed="0.007701"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.251016" 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-10-11T01:05:19.250502" elapsed="0.000541"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:19.251085" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:19.239380" elapsed="0.011803"/>
</kw>
<msg time="2026-10-11T01:05:19.251231" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:19.234983" elapsed="0.016292"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:19.255624" 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/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-10-11T01:05:19.259652" 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/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-10-11T01:05:19.263712" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.263893" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.264073" 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-10-11T01:05:19.264423" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:19.264263" elapsed="0.000242"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:19.264249" 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-10-11T01:05:19.264699" 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-10-11T01:05:19.264891" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.265054" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:19.264223" elapsed="0.000879"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:19.264137" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.265275" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:19.265341" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:19.265462" 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-10-11T01:05:19.234360" elapsed="0.031127"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:19.266600" 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-10-11T01:05:19.266389" elapsed="0.000271">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-10-11T01:05:19.266743" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:19.266066" elapsed="0.000699"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.267047" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:19.266827" elapsed="0.000271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.267571" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:19.267286" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:19.267120" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.266810" elapsed="0.000849"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.268155" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:19.267821" elapsed="0.000357"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:19.268223" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:19.268345" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:19.265766" elapsed="0.002601"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:19.269417" 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-10-11T01:05:19.269262" elapsed="0.000205"/>
</kw>
<msg time="2026-10-11T01:05:19.269542" 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-10-11T01:05:19.268942" elapsed="0.000622"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:05:19.269738" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:19.269640" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.269623" elapsed="0.000174"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:19.270071" 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-10-11T01:05:19.270185" 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-10-11T01:05:19.269949" elapsed="0.000259"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:05:19.270613" 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-10-11T01:05:19.270398" elapsed="0.000239"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:05:19.270679" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:19.270803" 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-10-11T01:05:19.268642" elapsed="0.002184"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.272044" 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-10-11T01:05:19.271824" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.272508" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:19.272277" elapsed="0.000272"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:19.278379" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:19.278525" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:05:19.278634" 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-10-11T01:05:19.272845" elapsed="0.005814"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:19.272619" elapsed="0.006079"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.278873" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:19.278721" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.272601" elapsed="0.006347"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.280194" 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-10-11T01:05:19.279866" elapsed="0.000374"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:19.279627" elapsed="0.000644"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.279609" elapsed="0.000684"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.280876" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:19.280610" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:19.280343" elapsed="0.000605"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.280327" elapsed="0.000643"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.281500" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:19.281145" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.281811" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:19.281600" elapsed="0.000262"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.282306" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:19.282046" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:19.281884" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.281571" elapsed="0.000811"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.282912" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:19.282570" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.283238" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:19.283000" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.283767" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:19.283493" elapsed="0.000298"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:19.283313" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.282982" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:19.283986" elapsed="0.000289"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:19.284688" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:19.284449" elapsed="0.000262"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:19.284872" elapsed="0.000207"/>
</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-10-11T01:05:19.279264" elapsed="0.005869"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:19.285274" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:19.285194" elapsed="0.000120"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.285177" elapsed="0.000156"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:19.286106" 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-10-11T01:05:19.285487" elapsed="0.000647"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:05:19.286180" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:19.286306" 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-10-11T01:05:19.271103" elapsed="0.015227"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:19.286385" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T01:05:19.286528" 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-10-11T01:05:19.227149" elapsed="0.059402"/>
</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-10-11T01:05:19.297975" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:19.297669" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:19.298731" 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-10-11T01:05:19.298499" elapsed="0.000350">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-10-11T01:05:19.299014" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:19.298163" elapsed="0.000874"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.299545" 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-10-11T01:05:19.299213" elapsed="0.000357"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:19.299856" 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-10-11T01:05:19.300001" 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-10-11T01:05:19.299748" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.300458" 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-10-11T01:05:19.300221" elapsed="0.000280"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:05:19.300877" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:19.300570" elapsed="0.000361"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.301570" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:19.301101" elapsed="0.000506"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:19.300954" elapsed="0.000687"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:19.300553" elapsed="0.001108"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.302208" 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-10-11T01:05:19.301826" elapsed="0.000410"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:19.302281" 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/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-10-11T01:05:19.297139" elapsed="0.005244"/>
</kw>
<msg time="2026-10-11T01:05:19.302459" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:19.292802" elapsed="0.009712"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:19.306618" 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/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-10-11T01:05:19.310680" 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/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-10-11T01:05:19.314874" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.315059" 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-10-11T01:05:19.315245" 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-10-11T01:05:19.315621" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:19.315464" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:19.315450" 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-10-11T01:05:19.315853" 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-10-11T01:05:19.316066" 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-10-11T01:05:19.316235" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:19.315422" elapsed="0.000862"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:19.315312" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:19.316477" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:19.316546" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:19.316662" 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-10-11T01:05:19.292070" elapsed="0.024617"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:19.316856" elapsed="0.000313"/>
</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-10-11T01:05:19.318075" 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-10-11T01:05:19.317836" elapsed="0.000267"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:19.318797" 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-10-11T01:05:19.318254" elapsed="0.000570"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:05:19.319276" 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-10-11T01:05:19.319455" 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-10-11T01:05:19.319009" elapsed="0.000511">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-10-11T01:05:19.317457" elapsed="0.002202">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-10-11T01:05:19.317239" elapsed="0.002489">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-10-11T01:05:19.319967" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:19.319786" elapsed="0.000232"/>
</branch>
<status status="FAIL" start="2026-10-11T01:05:19.317222" elapsed="0.002817">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-10-11T01:05:19.287500" elapsed="0.032648">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-10-11T01:05:19.286838" elapsed="0.033433">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-10-11T01:05:19.286635" elapsed="0.033712">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-10-11T01:05:19.286619" elapsed="0.033761">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-10-11T01:05:19.320443" 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-10-11T01:05:19.226527" elapsed="0.094024">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-10-11T01:05:21.358098" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:21.357346" elapsed="0.000907"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:21.360120" 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-10-11T01:05:21.359461" elapsed="0.000809">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-10-11T01:05:21.360495" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:21.358702" elapsed="0.001845"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.361702" 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-10-11T01:05:21.360964" elapsed="0.000794"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:21.362383" 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-10-11T01:05:21.362717" 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-10-11T01:05:21.362135" elapsed="0.000636"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.363753" 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-10-11T01:05:21.363207" elapsed="0.000641"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.365940" 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-10-11T01:05:21.365382" elapsed="0.000650"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.367029" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:21.366453" elapsed="0.000628"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.368728" 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-10-11T01:05:21.367838" elapsed="0.000926"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:21.370488" 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-10-11T01:05:21.369697" elapsed="0.000941"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:21.370762" elapsed="0.000049"/>
</return>
<msg time="2026-10-11T01:05:21.371080" 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-10-11T01:05:21.369019" elapsed="0.002096"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:21.371364" elapsed="0.000514"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:05:21.367521" elapsed="0.004414"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.372973" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:21.372279" elapsed="0.000731"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:21.374823" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:21.374007" elapsed="0.000947"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:21.375075" elapsed="0.000045"/>
</return>
<msg time="2026-10-11T01:05:21.375383" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:21.373264" elapsed="0.002181"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:21.375711" elapsed="0.000450"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:21.372083" elapsed="0.004135"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:21.367184" elapsed="0.009080"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:21.376321" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T01:05:21.376549" 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-10-11T01:05:21.364622" elapsed="0.011975"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:21.363997" elapsed="0.012645"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:21.376899" elapsed="0.000253"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:21.376677" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:21.363952" elapsed="0.013277"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.378328" 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-10-11T01:05:21.377550" elapsed="0.000818"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:21.378538" 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/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-10-11T01:05:21.356168" elapsed="0.022536"/>
</kw>
<msg time="2026-10-11T01:05:21.378777" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:21.345994" elapsed="0.032850"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:21.384983" 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/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-10-11T01:05:21.391099" 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/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-10-11T01:05:21.396937" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:21.397121" 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-10-11T01:05:21.397304" 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-10-11T01:05:21.397670" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:21.397513" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:21.397499" 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-10-11T01:05:21.397900" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:21.398082" elapsed="0.000017"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:21.398246" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:21.397472" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:21.397370" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:21.398483" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:21.398550" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:21.398668" 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-10-11T01:05:21.344362" elapsed="0.054331"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:21.399847" 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-10-11T01:05:21.399660" elapsed="0.000247">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-10-11T01:05:21.399990" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:21.399301" elapsed="0.000712"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:21.400298" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:21.400076" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.400849" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:21.400574" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:21.400373" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:21.400059" elapsed="0.000866"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.401438" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:21.401088" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:21.401508" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:21.401644" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:21.398997" elapsed="0.002670"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:21.402710" 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-10-11T01:05:21.402555" elapsed="0.000204"/>
</kw>
<msg time="2026-10-11T01:05:21.402834" 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-10-11T01:05:21.402217" elapsed="0.000639"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:05:21.403016" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:21.402919" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:21.402902" elapsed="0.000174"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:21.403354" 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-10-11T01:05:21.403487" 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-10-11T01:05:21.403231" elapsed="0.000280"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:05:21.403873" 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-10-11T01:05:21.403689" elapsed="0.000208"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:05:21.403938" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:21.404062" 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-10-11T01:05:21.401917" elapsed="0.002168"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.405312" 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-10-11T01:05:21.405088" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.405949" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:21.405560" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:21.412671" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:21.412809" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:05:21.412938" 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-10-11T01:05:21.406288" elapsed="0.006676"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:21.406053" elapsed="0.006950"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:21.413184" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:21.413028" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:21.406035" elapsed="0.007227"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.414551" 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-10-11T01:05:21.414201" elapsed="0.000408"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:21.413959" elapsed="0.000683"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:21.413941" elapsed="0.000723"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.415225" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:21.414955" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:21.414714" elapsed="0.000584"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:21.414699" elapsed="0.000622"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.415880" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:21.415520" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:21.416185" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:21.415969" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.416719" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:21.416439" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:21.416259" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:21.415953" elapsed="0.000844"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.417308" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:21.416973" elapsed="0.000360"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:21.417638" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:21.417394" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.418133" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:21.417874" elapsed="0.000283"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:21.417711" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:21.417378" elapsed="0.000830"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:21.418352" elapsed="0.000336"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:21.419076" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:21.418850" elapsed="0.000250"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:21.419253" elapsed="0.000236"/>
</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-10-11T01:05:21.413618" elapsed="0.005927"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:21.419705" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:21.419621" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:21.419604" elapsed="0.000162"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:21.420375" 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-10-11T01:05:21.419909" elapsed="0.000493"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:05:21.420464" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:21.420603" 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-10-11T01:05:21.404366" elapsed="0.016262"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:21.420714" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:21.420840" 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-10-11T01:05:21.326728" elapsed="0.094136"/>
</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-10-11T01:05:21.431485" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:21.431168" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:21.432266" 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-10-11T01:05:21.432000" elapsed="0.000389">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-10-11T01:05:21.432570" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:21.431682" elapsed="0.000923"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.433089" 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-10-11T01:05:21.432780" elapsed="0.000335"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:21.433388" 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-10-11T01:05:21.433522" 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-10-11T01:05:21.433281" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.433970" 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-10-11T01:05:21.433754" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:05:21.434366" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:21.434072" elapsed="0.000374"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.435078" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:21.434628" elapsed="0.000475"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:21.434469" elapsed="0.000666"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:21.434055" elapsed="0.001100"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.435730" 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-10-11T01:05:21.435317" elapsed="0.000439"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:21.435799" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:21.430659" elapsed="0.005239"/>
</kw>
<msg time="2026-10-11T01:05:21.435944" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:21.426274" elapsed="0.009714"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:21.440081" 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/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-10-11T01:05:21.444187" 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/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-10-11T01:05:21.448371" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:21.448570" 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-10-11T01:05:21.448767" 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-10-11T01:05:21.449109" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:21.448963" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:21.448949" 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-10-11T01:05:21.449336" 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-10-11T01:05:21.449530" 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-10-11T01:05:21.449707" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:21.448923" elapsed="0.000832"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:21.448833" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:21.449927" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:21.449992" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:21.450096" 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-10-11T01:05:21.425558" elapsed="0.024563"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:21.450286" elapsed="0.000340"/>
</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-10-11T01:05:21.451531" 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-10-11T01:05:21.451273" elapsed="0.000285"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:21.451949" 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-10-11T01:05:21.451719" elapsed="0.000290"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:05:21.452195" elapsed="0.000303"/>
</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-10-11T01:05:21.450913" elapsed="0.001640"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:21.450697" elapsed="0.001897"/>
</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-10-11T01:05:21.452793" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:21.452617" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:21.450680" elapsed="0.002182"/>
</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-10-11T01:05:21.421826" elapsed="0.031079"/>
</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-10-11T01:05:21.421144" elapsed="0.031825"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:21.420937" elapsed="0.032071"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:21.420921" elapsed="0.032108"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:21.453060" elapsed="0.000026"/>
</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-10-11T01:05:21.324935" elapsed="0.128224"/>
</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-10-11T01:05:19.224835" elapsed="2.228377"/>
</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-10-11T01:05:21.453424" elapsed="0.002755"/>
</kw>
<arg>rt_constrain_type_1</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<status status="PASS" start="2026-10-11T01:05:16.832669" elapsed="4.623566"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:16.732933" elapsed="4.723410"/>
</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-10-11T01:05:21.457754" elapsed="0.000203"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:05:21.457485" 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-10-11T01:05:21.458918" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:21.458831" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:21.458814" elapsed="0.000166"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:21.461086" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:21.461003" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:21.460987" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.462061" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:21.461740" elapsed="0.000346"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.462513" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:05:21.462237" elapsed="0.000300"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:05:21.462589" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:21.462717" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:05:21.461354" elapsed="0.001386"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:21.465228" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:21.465144" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:21.465127" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:21.466396" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:21.466303" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:21.466284" elapsed="0.000202"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:21.466833" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:05:21.466657" elapsed="0.000202"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:21.467226" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:05:21.467080" elapsed="0.000171"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:05:21.502125" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:05:21.467793" elapsed="0.034428"/>
</kw>
<msg time="2026-10-11T01:05:21.502373" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:05:21.502436" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:21.467431" elapsed="0.035043"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:05:21.546520" 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-10-11T01:05:21.502993" elapsed="0.043642"/>
</kw>
<msg time="2026-10-11T01:05:21.546783" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:05:21.546824" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:21.502655" elapsed="0.044203"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:21.547141" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:21.546928" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:21.546910" elapsed="0.000303"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.547655" 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-10-11T01:05:21.547396" elapsed="0.000327"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:21.547984" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:21.547783" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:21.547766" elapsed="0.000288"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:05:21.548083" 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-10-11T01:05:21.550734" elapsed="0.000116"/>
</kw>
<msg time="2026-10-11T01:05:21.550908" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:21.549494" 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-10-11T01:05:21.551346" elapsed="0.000089"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:21.551711" elapsed="0.000071"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:05:21.548892" elapsed="0.003002"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:05:21.548387" elapsed="0.003565"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:05:21.466000" elapsed="0.086024"/>
</kw>
<msg time="2026-10-11T01:05:21.552104" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:21.552144" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:21.465456" elapsed="0.086723"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:05:21.552331" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:05:21.552247" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:21.552230" elapsed="0.000199"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:21.552770" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:21.553070" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:05:21.553168" 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-10-11T01:05:21.464859" elapsed="0.088398"/>
</kw>
<msg time="2026-10-11T01:05:21.553341" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:21.553380" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:21.463065" elapsed="0.090379"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:21.553748" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:21.553512" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:21.553496" elapsed="0.000323"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:05:21.462923" elapsed="0.090918"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:05:21.462786" elapsed="0.091084"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:05:21.460712" elapsed="0.093207"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:05:21.458571" elapsed="0.095396"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:21.458159" elapsed="0.095849"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:05:21.457119" elapsed="0.096937"/>
</kw>
<kw name="Odl_To_Play_Template" owner="BgpOperations">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:21.554852" 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-10-11T01:05:21.555007" 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-10-11T01:05:21.554704" elapsed="0.000328"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:05:21.555370" 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-10-11T01:05:21.555193" elapsed="0.000202"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:21.555797" 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-10-11T01:05:21.555913" 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-10-11T01:05:21.555661" elapsed="0.000276"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:05:21.556261" 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-10-11T01:05:21.556095" elapsed="0.000190"/>
</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-10-11T01:05:21.556545" elapsed="0.002560"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:21.556347" elapsed="0.002791"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:21.556330" elapsed="0.002839"/>
</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-10-11T01:05:21.569971" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:21.569668" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:21.570708" 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-10-11T01:05:21.570494" elapsed="0.000285">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-10-11T01:05:21.570864" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:21.570158" elapsed="0.000729"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.571370" 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-10-11T01:05:21.571062" elapsed="0.000377"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:21.571734" 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-10-11T01:05:21.571853" 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-10-11T01:05:21.571622" elapsed="0.000256"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.572292" 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-10-11T01:05:21.572074" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.573246" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:05:21.573016" elapsed="0.000272"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.573747" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:21.573480" elapsed="0.000291"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.574356" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:21.574091" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:21.575240" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:21.574887" elapsed="0.000378"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:21.575310" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:21.575456" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:21.574566" elapsed="0.000914"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:21.575655" elapsed="0.000182"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:05:21.573958" elapsed="0.001915"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.576365" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:21.576101" elapsed="0.000288"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:21.577243" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:21.576890" elapsed="0.000378"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:21.577312" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:21.577456" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:21.576573" elapsed="0.000907"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:21.577654" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:21.575971" elapsed="0.001884"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:21.573817" elapsed="0.004069"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:21.577923" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:05:21.578048" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:05:21.572676" elapsed="0.005395"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:21.572396" elapsed="0.005703"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:21.578268" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:21.578121" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:21.572379" elapsed="0.005957"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.579037" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:21.578522" elapsed="0.000541"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:21.579106" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:21.569134" elapsed="0.010072"/>
</kw>
<msg time="2026-10-11T01:05:21.579285" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:21.564520" elapsed="0.014811"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:21.583598" 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/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-10-11T01:05:21.587641" 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/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-10-11T01:05:21.591696" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:21.591878" 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-10-11T01:05:21.592062" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:21.592398" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:21.592252" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:21.592239" 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-10-11T01:05:21.592658" 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-10-11T01:05:21.592837" 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-10-11T01:05:21.593002" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:21.592214" elapsed="0.000836"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:21.592128" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:21.593225" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:21.593291" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:05:21.593398" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:21.563913" elapsed="0.029525"/>
</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-10-11T01:05:21.602281" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:21.601983" elapsed="0.000324"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:21.603013" 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-10-11T01:05:21.602842" elapsed="0.000231">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-10-11T01:05:21.603157" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:21.602479" elapsed="0.000701"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.603691" 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-10-11T01:05:21.603353" elapsed="0.000364"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:21.603990" 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-10-11T01:05:21.604109" 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-10-11T01:05:21.603883" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.604563" 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-10-11T01:05:21.604331" 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-10-11T01:05:21.604936" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:21.604690" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.605430" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', '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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:21.605156" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:21.605010" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:21.604672" elapsed="0.000840"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.606062" 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-10-11T01:05:21.605685" elapsed="0.000405"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:21.606133" 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_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-10-11T01:05:21.601474" elapsed="0.004760"/>
</kw>
<msg time="2026-10-11T01:05:21.606284" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:21.597188" elapsed="0.009139"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:21.610540" 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/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-10-11T01:05:21.614620" 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/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-10-11T01:05:21.618726" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:21.618907" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:21.619088" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:21.619436" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:21.619278" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:21.619265" 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-10-11T01:05:21.619676" 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-10-11T01:05:21.619859" 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-10-11T01:05:21.620024" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:21.619240" elapsed="0.000831"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:21.619152" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:21.620244" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:21.620310" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:05:21.620442" 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-10-11T01:05:21.596495" elapsed="0.023975"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:21.621606" 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-10-11T01:05:21.621379" elapsed="0.000287">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-10-11T01:05:21.621749" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:21.621056" elapsed="0.000716"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:21.622053" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:21.621835" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.622571" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:21.622291" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:21.622125" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:21.621818" elapsed="0.000841"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.623150" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:21.622819" elapsed="0.000355"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:21.623218" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:21.623373" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:21.620756" elapsed="0.002640"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.624746" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:21.624511" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.625191" 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-10-11T01:05:21.624979" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.625675" 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-10-11T01:05:21.625446" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.626118" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:21.625906" elapsed="0.000251"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:21.626884" 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-10-11T01:05:21.626723" elapsed="0.000186"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:05:21.627205" 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-10-11T01:05:21.627063" elapsed="0.000166"/>
</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-10-11T01:05:21.627390" elapsed="0.000169"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.627986" 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-10-11T01:05:21.627766" elapsed="0.000260"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:05:21.628065" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:21.628191" 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-10-11T01:05:21.626338" elapsed="0.001876"/>
</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-10-11T01:05:21.640113" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.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-10-11T01:05:21.640175" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:21.640269" 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-10-11T01:05:21.628519" elapsed="0.011774"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:21.628276" elapsed="0.012057"/>
</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-10-11T01:05:21.640534" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:21.640357" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:21.628260" elapsed="0.012397"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.641884" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:21.641607" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:21.641338" elapsed="0.000619"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:21.641321" elapsed="0.000659"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.642552" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:21.642269" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:21.642030" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:21.642015" elapsed="0.000646"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.643184" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:21.642839" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:21.643509" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:21.643274" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.644028" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:21.643763" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:21.643597" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:21.643257" elapsed="0.000848"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.644646" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:21.644281" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:21.644948" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:21.644736" elapsed="0.000265"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.645468" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:21.645186" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:21.645023" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:21.644719" elapsed="0.000828"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:21.645703" elapsed="0.000296"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:21.646385" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:21.646160" elapsed="0.000265"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:21.646595" elapsed="0.000215"/>
</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-10-11T01:05:21.640980" elapsed="0.005887"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:05:21.647014" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:05:21.646932" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:21.646915" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:21.647237" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:05:21.647298" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:05:21.647473" 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-10-11T01:05:21.623719" elapsed="0.023778"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:21.647558" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T01:05:21.647693" 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-10-11T01:05:21.560092" elapsed="0.087624"/>
</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-10-11T01:05:21.648070" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:21.647864" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:21.647847" elapsed="0.000306"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:21.648184" elapsed="0.000024"/>
</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-10-11T01:05:21.559394" elapsed="0.088887"/>
</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-10-11T01:05:21.651619" level="INFO">${update} = </msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:05:21.649185" elapsed="0.002461"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:05:21.652143" level="FAIL"> == </msg>
<arg>${update}</arg>
<arg>${Empty}</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="FAIL" start="2026-10-11T01:05:21.651805" elapsed="0.000395"> == </status>
</kw>
<return>
<value>${update}</value>
<status status="NOT RUN" start="2026-10-11T01:05:21.652250" elapsed="0.000016"/>
</return>
<doc>Returns hex update message.</doc>
<status status="FAIL" start="2026-10-11T01:05:21.648927" elapsed="0.003422"> == </status>
</kw>
<kw name="Get_Update_Message" owner="BgpOperations">
<kw name="Play Get" owner="BgpRpcClient">
<msg time="2026-10-11T01:05:23.657370" level="INFO">${update} = ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff02020000fde8007b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:05:23.653960" elapsed="0.003522"/>
</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-10-11T01:05:23.657926" elapsed="0.000787"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:05:23.658818" elapsed="0.000075"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:05:23.653142" elapsed="0.005922"/>
</kw>
<msg time="2026-10-11T01:05:23.659220" 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-10-11T01:05:21.648483" elapsed="2.010792"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.724947" level="INFO">Length is 124.</msg>
<msg time="2026-10-11T01:05:23.725083" 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-10-11T01:05:23.660598" elapsed="0.064517"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.725854" level="INFO">Length is 124.</msg>
<msg time="2026-10-11T01:05:23.725929" 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-10-11T01:05:23.725424" 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-10-11T01:05:23.726139" elapsed="0.000292"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:05:23.726752" 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-10-11T01:05:23.726596" elapsed="0.000182"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:05:23.727068" 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-10-11T01:05:23.726922" elapsed="0.000170"/>
</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-10-11T01:05:23.727271" elapsed="0.000283"/>
</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-10-11T01:05:23.659772" elapsed="0.067859"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:05:23.727773" elapsed="0.002515"/>
</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-10-11T01:05:23.750541" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:23.750096" elapsed="0.000500"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:23.751588" 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-10-11T01:05:23.751270" elapsed="0.000415">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-10-11T01:05:23.751803" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:23.750822" elapsed="0.001012"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.752665" 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-10-11T01:05:23.752184" elapsed="0.000518"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:23.753091" 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-10-11T01:05:23.753274" 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-10-11T01:05:23.752936" elapsed="0.000372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.753920" 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-10-11T01:05:23.753612" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.755372" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:05:23.755036" elapsed="0.000422"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.756089" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:23.755728" elapsed="0.000395"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.757221" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:23.756620" elapsed="0.000637"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:23.758786" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:23.758112" elapsed="0.000788"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:23.759085" elapsed="0.000049"/>
</return>
<msg time="2026-10-11T01:05:23.759331" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:23.757526" elapsed="0.001838"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:23.759646" elapsed="0.000434"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:05:23.756392" elapsed="0.003741"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.761079" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:23.760490" elapsed="0.000624"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:23.762739" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:23.761964" elapsed="0.000898"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:23.762995" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:05:23.763160" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:23.761351" 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-10-11T01:05:23.763349" elapsed="0.000360"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:23.760274" elapsed="0.003473"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:23.756189" elapsed="0.007591"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:23.763818" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:23.763946" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:05:23.754519" elapsed="0.009451"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:23.754074" elapsed="0.009925"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:23.764172" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:23.764022" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:23.754045" elapsed="0.010195"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.764952" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:23.764399" elapsed="0.000580"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:23.765022" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:23.749357" elapsed="0.015764"/>
</kw>
<msg time="2026-10-11T01:05:23.765218" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:23.743122" 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/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-10-11T01:05:23.769596" 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/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-10-11T01:05:23.773672" 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/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-10-11T01:05:23.777752" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:23.777936" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:23.778118" 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-10-11T01:05:23.778473" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:23.778312" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:23.778297" 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-10-11T01:05:23.778716" 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-10-11T01:05:23.778899" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:23.779064" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:23.778271" elapsed="0.000840"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:23.778183" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:23.779288" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:23.779353" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:05:23.779477" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:23.742214" elapsed="0.037288"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.780515" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:23.780277" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:23.792686" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:23.792733" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:23.792831" 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-10-11T01:05:23.780861" elapsed="0.011994"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:23.780632" elapsed="0.012260"/>
</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-10-11T01:05:23.793068" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:23.792917" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:23.780615" elapsed="0.012527"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.794338" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:23.794067" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:23.793826" elapsed="0.000599"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:23.793809" elapsed="0.000640"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.795022" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:23.794755" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:23.794498" elapsed="0.000596"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:23.794483" elapsed="0.000633"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.795677" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:23.795307" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:23.795978" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:23.795765" elapsed="0.000264"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.796492" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:23.796215" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:23.796051" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:23.795748" elapsed="0.000840"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.797095" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:23.796763" elapsed="0.000357"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:23.797389" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:23.797181" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.797918" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:23.797658" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:23.797477" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:23.797165" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:23.798139" elapsed="0.000303"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:23.798839" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:23.798614" elapsed="0.000249"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:23.799015" elapsed="0.000212"/>
</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-10-11T01:05:23.793477" elapsed="0.005804"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:05:23.799321" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:23.799508" 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-10-11T01:05:23.779748" elapsed="0.019784"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:23.799589" elapsed="0.000024"/>
</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-10-11T01:05:23.732083" elapsed="0.067636"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:23.731349" elapsed="0.068418"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:05:23.730517" elapsed="0.069301"/>
</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-10-11T01:05:23.803654" level="INFO">${update} = ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff02020000fde8007b</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:05:23.800717" elapsed="0.002965"/>
</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-10-11T01:05:23.803842" elapsed="0.000319"/>
</kw>
<return>
<value>${update}</value>
<status status="PASS" start="2026-10-11T01:05:23.804204" elapsed="0.000027"/>
</return>
<doc>Returns hex update message.</doc>
<status status="PASS" start="2026-10-11T01:05:23.800448" elapsed="0.003856"/>
</kw>
<msg time="2026-10-11T01:05:23.804370" 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-10-11T01:05:23.799999" elapsed="0.004394"/>
</kw>
<kw name="Verify_Two_Hex_Messages_Are_Equal" owner="BgpOperations">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.805191" level="INFO">Length is 112.</msg>
<msg time="2026-10-11T01:05:23.805258" 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-10-11T01:05:23.804951" elapsed="0.000329"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.805704" level="INFO">Length is 112.</msg>
<msg time="2026-10-11T01:05:23.805772" 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-10-11T01:05:23.805453" elapsed="0.000340"/>
</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-10-11T01:05:23.805976" elapsed="0.000264"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:05:23.806554" 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-10-11T01:05:23.806386" elapsed="0.000201"/>
</kw>
<kw name="Sum Hex Message" owner="BgpRpcClient">
<msg time="2026-10-11T01:05:23.806870" 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-10-11T01:05:23.806730" elapsed="0.000163"/>
</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-10-11T01:05:23.807072" elapsed="0.000262"/>
</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-10-11T01:05:23.804624" elapsed="0.002765"/>
</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-10-11T01:05:23.821529" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:23.821211" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:23.822259" 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-10-11T01:05:23.822051" elapsed="0.000277">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-10-11T01:05:23.822428" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:23.821728" elapsed="0.000725"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.822949" 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-10-11T01:05:23.822639" elapsed="0.000335"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:23.823250" 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-10-11T01:05:23.823382" 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-10-11T01:05:23.823140" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.823844" 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-10-11T01:05:23.823627" 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-10-11T01:05:23.824992" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:05:23.824761" elapsed="0.000272"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.825475" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:23.825208" elapsed="0.000291"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.826284" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:23.825830" elapsed="0.000478"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:23.827343" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:23.826918" elapsed="0.000464"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:23.827521" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:05:23.827711" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:23.826500" elapsed="0.001235"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:23.827901" elapsed="0.000271"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:05:23.825699" elapsed="0.002511"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.828922" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:23.828458" elapsed="0.000488"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:23.829986" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:23.829552" elapsed="0.000473"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:23.830133" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:23.830310" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:23.829115" elapsed="0.001218"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:23.830519" elapsed="0.000280"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:23.828308" elapsed="0.002529"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:23.825550" elapsed="0.005318"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:23.830906" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:23.831034" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:05:23.824365" elapsed="0.006693"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:23.823982" elapsed="0.007104"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:23.831258" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:23.831108" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:23.823964" elapsed="0.007363"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.832046" level="INFO">${final_text} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:23.831543" elapsed="0.000530"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:23.832117" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:23.820682" elapsed="0.011534"/>
</kw>
<msg time="2026-10-11T01:05:23.832264" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:23.816308" elapsed="0.016010"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:23.836506" 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/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-10-11T01:05:23.840789" 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/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-10-11T01:05:23.844897" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:23.845077" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:23.845257" 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-10-11T01:05:23.845632" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:23.845464" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:23.845450" 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-10-11T01:05:23.845862" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:23.846041" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:23.846206" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:23.845423" elapsed="0.000830"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:23.845322" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:23.846442" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:23.846510" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:23.846630" level="INFO">${uri} = /rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:23.815672" elapsed="0.030983"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.847778" level="INFO">/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:23.847543" elapsed="0.000278"/>
</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-10-11T01:05:23.853860" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:23.854153" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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+xml', 'Content-Length': '619'} 
 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-path xmlns:a="urn:opendaylight:params:xml:ns:yang:bgp-rib" xmlns:b="urn:opendaylight:params:xml:ns:yang:bgp-types" xmlns:c="urn:opendaylight:params:xml:ns:yang:bgp:route:target:constrain"&gt;/a:application-rib[a:id='10.30.170.173']/a:tables[a:afi='b:ipv4-address-family'][a:safi='c:route-target-constrain-subsequent-address-family']/c:route-target-constrain-routes&lt;/error-path&gt;&lt;error-message&gt;Data does not exist&lt;/error-message&gt;&lt;error-tag&gt;data-missing&lt;/error-tag&gt;&lt;/error&gt;&lt;/errors&gt; 
 </msg>
<msg time="2026-10-11T01:05:23.854318" level="INFO">${response} = None</msg>
<msg time="2026-10-11T01:05:23.854358" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:23.848106" elapsed="0.006639">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:23.847881" elapsed="0.006939">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:23.855004" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:23.854852" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-11T01:05:23.847864" elapsed="0.007218">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:05:23.856314" 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-10-11T01:05:23.856043" elapsed="0.000303">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:05:23.855804" elapsed="0.000613">Resolving variable '${response.text}' failed: AttributeError: 'NoneType' object has no attribute 'text'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:05:23.855786" elapsed="0.000662">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-10-11T01:05:23.857031" 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-10-11T01:05:23.856765" elapsed="0.000296">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</kw>
<status status="FAIL" start="2026-10-11T01:05:23.856513" elapsed="0.000604">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</branch>
<status status="FAIL" start="2026-10-11T01:05:23.856497" elapsed="0.000648">Resolving variable '${response.status_code}' failed: AttributeError: 'NoneType' object has no attribute 'status_code'</status>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.857713" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:23.857335" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:23.858011" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:23.857801" elapsed="0.000261"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.858526" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:23.858245" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:23.858084" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:23.857784" elapsed="0.000829"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.859250" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:23.858787" elapsed="0.000489"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:23.859574" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:23.859339" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.860074" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:23.859813" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:23.859651" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:23.859322" elapsed="0.000828"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:23.860294" elapsed="0.000320"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:23.860992" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:23.860774" elapsed="0.000242"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<msg time="2026-10-11T01:05:23.861333" 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-10-11T01:05:23.861170" elapsed="0.000193">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-10-11T01:05:23.855427" elapsed="0.006113">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-10-11T01:05:23.861607" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:23.861862" level="INFO">${response_text} = None</msg>
<msg time="2026-10-11T01:05:23.861888" 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-10-11T01:05:23.846886" elapsed="0.015028">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-10-11T01:05:23.861972" elapsed="0.000023"/>
</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-10-11T01:05:23.808371" elapsed="0.053737">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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:23.807987" elapsed="0.054177"/>
</kw>
<arg>${totest}</arg>
<arg>${dir}</arg>
<doc>Removes the route if present.</doc>
<status status="PASS" start="2026-10-11T01:05:23.807636" elapsed="0.054581"/>
</kw>
<arg>rt_constrain_type_2</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<status status="PASS" start="2026-10-11T01:05:21.554316" elapsed="2.307947"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:21.456696" elapsed="2.405671"/>
</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-10-11T01:05:23.863718" elapsed="0.000201"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:05:23.863400" 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-10-11T01:05:23.864881" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:23.864793" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:23.864776" elapsed="0.000169"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:23.866955" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:23.866872" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:23.866856" elapsed="0.000160"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.867939" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:23.867612" elapsed="0.000352"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.868382" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:05:23.868118" elapsed="0.000303"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:05:23.868463" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:23.868603" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:05:23.867227" elapsed="0.001400"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:23.871258" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:23.871175" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:23.871157" elapsed="0.000162"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:23.872365" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:23.872282" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:23.872264" elapsed="0.000183"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:23.872776" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:05:23.872606" elapsed="0.000195"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:23.873107" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:05:23.872965" elapsed="0.000165"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:05:23.906270" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:05:23.873653" elapsed="0.032737"/>
</kw>
<msg time="2026-10-11T01:05:23.906585" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:05:23.906629" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:23.873286" elapsed="0.033379"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:05:23.948933" 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-10-11T01:05:23.907171" elapsed="0.041866"/>
</kw>
<msg time="2026-10-11T01:05:23.949183" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:05:23.949224" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:23.906833" elapsed="0.042426"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:23.949554" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:23.949327" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:23.949309" elapsed="0.000328"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.950044" 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-10-11T01:05:23.949817" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:23.950373" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:23.950174" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:23.950158" elapsed="0.000303"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:05:23.950493" 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-10-11T01:05:23.952918" elapsed="0.000116"/>
</kw>
<msg time="2026-10-11T01:05:23.953090" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:23.951859" elapsed="0.001360"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:23.953544" elapsed="0.000084"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:23.953889" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:05:23.951251" 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-10-11T01:05:23.950787" elapsed="0.003345"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:05:23.872027" elapsed="0.082178"/>
</kw>
<msg time="2026-10-11T01:05:23.954285" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:23.954325" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:23.871487" elapsed="0.082873"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:05:23.954545" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-10-11T01:05:23.954448" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:23.954430" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:23.954962" 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-10-11T01:05:23.955264" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:05:23.955327" 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-10-11T01:05:23.870886" elapsed="0.084545"/>
</kw>
<msg time="2026-10-11T01:05:23.955518" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:23.955556" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:23.868955" elapsed="0.086699"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:23.955948" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:23.955726" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:23.955709" elapsed="0.000308"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:05:23.868811" elapsed="0.087228"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:05:23.868674" elapsed="0.087391"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:05:23.866579" elapsed="0.089534"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:05:23.864529" elapsed="0.091633"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:23.864119" elapsed="0.092083"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:05:23.863058" elapsed="0.093190"/>
</kw>
<kw name="Play_To_Odl_Template" owner="BgpOperations">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.957537" level="INFO">&amp;{adj_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:05:23.956948" elapsed="0.000626"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.958144" level="INFO">&amp;{effective_rib_in} = { PATH=peer=bgp:%2F%2F10.30.171.7/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-10-11T01:05:23.957759" elapsed="0.000410"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.958724" 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-10-11T01:05:23.958349" elapsed="0.000400"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:23.959055" 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-10-11T01:05:23.959179" 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-10-11T01:05:23.958915" elapsed="0.000288"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:23.959519" 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-10-11T01:05:23.959645" 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-10-11T01:05:23.959366" elapsed="0.000304"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:05:23.959811" elapsed="0.002359"/>
</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-10-11T01:05:23.962350" elapsed="0.002300"/>
</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-10-11T01:05:23.980285" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:23.979975" elapsed="0.000338"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:23.981040" 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-10-11T01:05:23.980826" elapsed="0.000284">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-10-11T01:05:23.981194" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:23.980490" elapsed="0.000727"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.981739" 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-10-11T01:05:23.981391" elapsed="0.000373"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:23.982096" 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-10-11T01:05:23.982227" 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-10-11T01:05:23.981981" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.982697" 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-10-11T01:05:23.982461" elapsed="0.000279"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.983785" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:05:23.983418" elapsed="0.000409"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.984257" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:23.984004" elapsed="0.000277"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.985088" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:05:23.984638" elapsed="0.000474"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:23.986258" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:23.985745" elapsed="0.000603"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:23.986447" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T01:05:23.986688" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:23.985284" 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-10-11T01:05:23.986880" elapsed="0.000311"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:05:23.984491" elapsed="0.002739"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.987925" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:23.987483" elapsed="0.000467"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:23.989083" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:23.988583" elapsed="0.000587"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:23.989249" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:05:23.989476" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:23.988119" 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-10-11T01:05:23.989678" elapsed="0.000302"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:23.987331" elapsed="0.002686"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:23.984329" elapsed="0.005720"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:23.990087" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:23.990216" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:05:23.983067" elapsed="0.007172"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:23.982806" elapsed="0.007462"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:23.990458" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:23.990291" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:23.982786" elapsed="0.007744"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:23.991213" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-fam...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:23.990701" elapsed="0.000539"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:23.991284" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:23.979438" elapsed="0.011945"/>
</kw>
<msg time="2026-10-11T01:05:23.991612" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:23.975117" elapsed="0.016545"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:23.995734" 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/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-10-11T01:05:23.999798" 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/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-10-11T01:05:24.004368" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:24.004578" 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-10-11T01:05:24.004763" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:24.005104" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:24.004956" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:24.004942" 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-10-11T01:05:24.005331" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:24.005525" 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-10-11T01:05:24.005708" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:24.004916" elapsed="0.000840"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:24.004828" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:24.005931" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:24.005997" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:05:24.006107" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-fam...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:05:23.974508" elapsed="0.031624"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:24.007260" 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-10-11T01:05:24.007064" elapsed="0.000255">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-10-11T01:05:24.007450" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:24.006739" elapsed="0.000736"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:24.007779" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:24.007539" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:24.008481" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:24.008032" elapsed="0.000474"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:24.007853" elapsed="0.000686"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:24.007522" elapsed="0.001037"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:24.009072" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:24.008733" elapsed="0.000363"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:24.009141" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:24.009265" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:24.006402" elapsed="0.002886"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:24.010425" 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-10-11T01:05:24.010190" elapsed="0.000296">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-10-11T01:05:24.010584" 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-10-11T01:05:24.009870" elapsed="0.000738"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:05:24.010770" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:05:24.010672" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:24.010655" elapsed="0.000222"/>
</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-10-11T01:05:24.011034" elapsed="0.000019"/>
</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-10-11T01:05:24.011209" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:05:24.011266" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:05:24.011388" 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-10-11T01:05:24.009558" elapsed="0.001869"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:24.012677" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:24.012441" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:24.013126" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:24.012912" elapsed="0.000254"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:24.019023" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:24.019164" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:24.019254" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:24.013472" elapsed="0.006174">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:24.013226" elapsed="0.006528">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:24.019943" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:24.019787" elapsed="0.000214"/>
</branch>
<status status="FAIL" start="2026-10-11T01:05:24.013208" elapsed="0.006814">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:24.020364" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:24.020503" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:24.020467" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:24.020450" elapsed="0.000112"/>
</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-10-11T01:05:24.020718" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:05:24.020780" elapsed="0.000013"/>
</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-10-11T01:05:24.011730" elapsed="0.009146">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:24.020940" 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-10-11T01:05:23.967280" elapsed="0.053746">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:24.021272" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:24.021108" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:24.021092" elapsed="0.000266"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:24.021387" elapsed="0.000013"/>
</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-10-11T01:05:23.966639" elapsed="0.054852">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:26.057747" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:26.056923" elapsed="0.000900"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:26.059435" 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-10-11T01:05:26.058964" elapsed="0.000642">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-10-11T01:05:26.059797" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:26.058189" elapsed="0.001658"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.061098" 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-10-11T01:05:26.060330" elapsed="0.000826"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:26.061843" 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-10-11T01:05:26.062198" 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-10-11T01:05:26.061586" elapsed="0.000669"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.063237" 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-10-11T01:05:26.062739" elapsed="0.000598"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.065485" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:05:26.064940" elapsed="0.000662"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.066610" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:26.065998" elapsed="0.000667"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.068489" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:05:26.067387" elapsed="0.001160"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:26.071019" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:26.069979" elapsed="0.001165"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:26.071263" elapsed="0.000048"/>
</return>
<msg time="2026-10-11T01:05:26.071629" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:26.068954" elapsed="0.002711"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:26.071901" elapsed="0.000435"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/adj-rib-in</var>
<status status="PASS" start="2026-10-11T01:05:26.067089" elapsed="0.005301"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.075210" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:26.074584" elapsed="0.000661"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:26.076944" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:26.076198" elapsed="0.000870"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:26.077182" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T01:05:26.077522" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:26.075588" elapsed="0.001981"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:26.077807" elapsed="0.000423"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:26.072574" elapsed="0.005711"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:26.066769" elapsed="0.011561"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:26.078384" elapsed="0.000058"/>
</return>
<msg time="2026-10-11T01:05:26.078619" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:05:26.064122" elapsed="0.014534"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.063515" elapsed="0.015181"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.078943" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.078729" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.063469" elapsed="0.015572"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.080113" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-fam...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:26.079266" elapsed="0.000885"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:26.080213" 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/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-10-11T01:05:26.055506" elapsed="0.024894"/>
</kw>
<msg time="2026-10-11T01:05:26.080575" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:26.045090" elapsed="0.035553"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:26.086433" 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_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-10-11T01:05:26.092138" 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_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-10-11T01:05:26.097664" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.097848" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.098029" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.098367" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.098219" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:26.098206" 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-10-11T01:05:26.098624" 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-10-11T01:05:26.098805" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.098968" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:26.098181" elapsed="0.000835"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:26.098094" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.099190" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:26.099257" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:05:26.099366" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/adj-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-address-fam...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:05:26.043667" elapsed="0.055724"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:26.100547" 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-10-11T01:05:26.100341" elapsed="0.000288">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-10-11T01:05:26.100715" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:26.100013" elapsed="0.000725"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.101023" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.100802" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.101566" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:26.101278" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.101098" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.100785" elapsed="0.000861"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.102142" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:26.101808" elapsed="0.000358"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:26.102211" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:26.102334" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:26.099710" elapsed="0.002647"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:26.103457" 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-10-11T01:05:26.103259" elapsed="0.000257">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-10-11T01:05:26.103613" 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-10-11T01:05:26.102942" elapsed="0.000694"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:05:26.103799" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:05:26.103700" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.103683" elapsed="0.000193"/>
</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-10-11T01:05:26.104031" elapsed="0.000019"/>
</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-10-11T01:05:26.104206" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:05:26.104265" elapsed="0.000198"/>
</return>
<msg time="2026-10-11T01:05:26.104592" 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-10-11T01:05:26.102641" elapsed="0.001976"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.105847" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:26.105620" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.106299" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:26.106083" elapsed="0.000256"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:26.113437" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:26.113598" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:26.113729" 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-10-11T01:05:26.106656" elapsed="0.007099"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.106399" elapsed="0.007396"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.113975" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.113820" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.106382" elapsed="0.007673"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.115343" 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-10-11T01:05:26.115012" elapsed="0.000377"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.114746" elapsed="0.000691"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.114729" elapsed="0.000732"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.116044" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:26.115774" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.115512" elapsed="0.000605"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.115497" elapsed="0.000644"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.116703" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:26.116320" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.117011" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.116794" elapsed="0.000269"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.117529" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:26.117250" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.117086" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.116777" elapsed="0.000842"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.118129" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:26.117795" elapsed="0.000359"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.118446" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.118217" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.118967" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:26.118705" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.118520" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.118200" elapsed="0.000844"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:26.119187" elapsed="0.000308"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:26.119896" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:26.119673" elapsed="0.000248"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:26.120074" elapsed="0.000210"/>
</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-10-11T01:05:26.114379" elapsed="0.005961"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:26.120498" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:26.120401" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.120385" elapsed="0.000181"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:26.121306" 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-10-11T01:05:26.120708" elapsed="0.000624"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:05:26.121378" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:26.121522" 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-10-11T01:05:26.104897" elapsed="0.016649"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:26.121645" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:26.121769" 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-10-11T01:05:26.027248" elapsed="0.094545"/>
</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-10-11T01:05:26.132385" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:26.132083" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:26.133144" 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-10-11T01:05:26.132924" elapsed="0.000337">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-10-11T01:05:26.133440" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:26.132598" elapsed="0.000867"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.133958" 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-10-11T01:05:26.133650" elapsed="0.000334"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:26.134258" 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-10-11T01:05:26.134386" 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-10-11T01:05:26.134150" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.134854" 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-10-11T01:05:26.134637" elapsed="0.000264"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:05:26.135255" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.134961" elapsed="0.000347"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.135966" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:26.135500" elapsed="0.000491"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.135330" elapsed="0.000694"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.134944" elapsed="0.001100"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.136639" 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-10-11T01:05:26.136206" elapsed="0.000460"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:26.136711" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:26.131575" elapsed="0.005237"/>
</kw>
<msg time="2026-10-11T01:05:26.136892" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:26.127187" elapsed="0.009752"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:26.141051" 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/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-10-11T01:05:26.145114" 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/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-10-11T01:05:26.149305" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.149503" 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-10-11T01:05:26.149864" 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-10-11T01:05:26.150206" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.150059" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:26.150046" 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-10-11T01:05:26.150452" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.150651" 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-10-11T01:05:26.150818" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:26.150020" elapsed="0.000845"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:26.149932" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.151043" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:26.151109" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:26.151232" 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-10-11T01:05:26.126467" elapsed="0.024791"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:26.151444" elapsed="0.000332"/>
</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-10-11T01:05:26.152818" 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-10-11T01:05:26.152429" elapsed="0.000445"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:26.153387" 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-10-11T01:05:26.153030" elapsed="0.000399"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:05:26.153627" elapsed="0.000283"/>
</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-10-11T01:05:26.152049" elapsed="0.001916"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.151846" elapsed="0.002149"/>
</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-10-11T01:05:26.154196" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.154018" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.151829" elapsed="0.002436"/>
</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-10-11T01:05:26.122751" elapsed="0.031558"/>
</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-10-11T01:05:26.122073" elapsed="0.032301"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.121866" elapsed="0.032562"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.121850" elapsed="0.032600"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:26.154480" 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="PASS" start="2026-10-11T01:05:26.025630" elapsed="0.128962"/>
</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-10-11T01:05:23.964852" elapsed="2.189792"/>
</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-10-11T01:05:26.170315" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:26.170012" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:26.171018" 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-10-11T01:05:26.170847" elapsed="0.000230">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-10-11T01:05:26.171160" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:26.170516" elapsed="0.000667"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.171696" 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-10-11T01:05:26.171358" elapsed="0.000364"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:26.171999" 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-10-11T01:05:26.172116" 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-10-11T01:05:26.171890" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.172587" 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-10-11T01:05:26.172341" 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-10-11T01:05:26.173527" level="INFO">mapping: {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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-10-11T01:05:26.173281" elapsed="0.000299"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.174055" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:26.173801" elapsed="0.000278"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.174857" level="INFO">${value} = peer=bgp:%2F%2F10.30.171.7/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-10-11T01:05:26.174394" elapsed="0.000488"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:26.176014" level="INFO">${encoded} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:26.175497" elapsed="0.000605"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:26.176184" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:05:26.176395" level="INFO">${encoded_value} = peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:26.175050" elapsed="0.001386"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:26.176618" elapsed="0.000302"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">peer=bgp:%2F%2F10.30.171.7/effective-rib-in</var>
<status status="PASS" start="2026-10-11T01:05:26.174261" elapsed="0.002697"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.177651" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:26.177189" elapsed="0.000487"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:26.178812" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:26.178268" elapsed="0.000635"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:26.178982" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:05:26.179190" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:26.177844" 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-10-11T01:05:26.179380" elapsed="0.000333"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:26.177058" elapsed="0.002694"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:26.174123" elapsed="0.005660"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:26.179820" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:26.179946" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:05:26.172940" elapsed="0.007029"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.172691" elapsed="0.007306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.180170" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.180020" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.172673" elapsed="0.007566"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.181013" level="INFO">${final_text} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-addre...</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:26.180400" elapsed="0.000639"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:26.181083" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:26.169497" elapsed="0.011685"/>
</kw>
<msg time="2026-10-11T01:05:26.181230" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:26.165009" elapsed="0.016266"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:26.185525" 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/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-10-11T01:05:26.189598" 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/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-10-11T01:05:26.193690" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.193875" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.194058" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.194396" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.194250" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:26.194236" 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-10-11T01:05:26.194656" 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-10-11T01:05:26.194839" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.195004" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:26.194211" elapsed="0.000840"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:26.194122" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.195227" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:26.195292" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:26.195402" level="INFO">${uri} = rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/effective-rib-in/tables=bgp-types%3Aipv4-address-family,bgp-route-target-constrain%3Aroute-target-constrain-subsequent-addre...</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-10-11T01:05:26.164392" elapsed="0.031050"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:26.196547" 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-10-11T01:05:26.196346" elapsed="0.000271">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-10-11T01:05:26.196701" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:26.196023" elapsed="0.000701"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.197008" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.196786" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.197531" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:26.197251" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.197083" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.196770" elapsed="0.000848"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.198120" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:26.197783" elapsed="0.000362"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:26.198189" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:26.198348" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:26.195722" elapsed="0.002649"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:26.199475" 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-10-11T01:05:26.199275" elapsed="0.000260">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-10-11T01:05:26.199631" 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-10-11T01:05:26.198952" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:05:26.199815" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:05:26.199716" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.199699" elapsed="0.000192"/>
</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-10-11T01:05:26.200048" elapsed="0.000019"/>
</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-10-11T01:05:26.200222" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:05:26.200280" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:05:26.200417" 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-10-11T01:05:26.198651" elapsed="0.001791"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.201681" level="INFO">rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:26.201440" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.202131" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:26.201916" elapsed="0.000254"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:26.207944" level="INFO">GET Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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.171.7/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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:26.208055" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:bgp-rib/rib=example-bgp-rib/peer=bgp%3A%2F%2F10.30.171.7/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-10-11T01:05:26.208154" 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-10-11T01:05:26.202471" elapsed="0.005707"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.202230" elapsed="0.005987"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.208394" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.208241" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.202213" elapsed="0.006281"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.209779" 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-10-11T01:05:26.209430" elapsed="0.000395"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.209173" elapsed="0.000684"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.209156" elapsed="0.000723"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.210454" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:26.210171" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.209929" elapsed="0.000644"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.209914" elapsed="0.000686"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.211123" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:26.210779" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.211438" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.211211" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.211956" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:26.211691" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.211514" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.211194" elapsed="0.000839"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.212573" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:26.212210" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.212874" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.212662" elapsed="0.000264"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.213371" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:26.213111" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.212948" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.212645" elapsed="0.000818"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:26.213620" elapsed="0.000292"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:26.214290" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:26.214073" elapsed="0.000241"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:26.214482" elapsed="0.000227"/>
</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-10-11T01:05:26.208834" elapsed="0.005930"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:26.214905" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:26.214825" elapsed="0.000120"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.214808" elapsed="0.000156"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:26.215708" 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-10-11T01:05:26.215106" elapsed="0.000628"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:05:26.215781" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:26.215905" 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-10-11T01:05:26.200728" elapsed="0.015201"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:26.215983" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:05:26.216102" 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-10-11T01:05:26.157124" elapsed="0.059002"/>
</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-10-11T01:05:26.226805" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:26.226489" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:26.227602" 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-10-11T01:05:26.227347" elapsed="0.000374">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-10-11T01:05:26.227883" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:26.227025" elapsed="0.000882"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.228388" 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-10-11T01:05:26.228081" elapsed="0.000348"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:26.228720" 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-10-11T01:05:26.228837" 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-10-11T01:05:26.228611" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.229275" 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-10-11T01:05:26.229057" elapsed="0.000264"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:05:26.229708" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.229383" elapsed="0.000380"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.230378" level="INFO">${mapping_to_use} = {'PATH': 'peer=bgp:%2F%2F10.30.171.7/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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:26.229935" elapsed="0.000484"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.229786" elapsed="0.000669"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.229365" elapsed="0.001109"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.231042" 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-10-11T01:05:26.230658" elapsed="0.000410"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:26.231112" 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_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-10-11T01:05:26.225968" elapsed="0.005245"/>
</kw>
<msg time="2026-10-11T01:05:26.231264" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:26.221602" elapsed="0.009707"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:26.235422" 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/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-10-11T01:05:26.239475" 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/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-10-11T01:05:26.243708" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.243893" 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-10-11T01:05:26.244074" 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-10-11T01:05:26.244427" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.244266" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:26.244253" 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-10-11T01:05:26.244672" 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-10-11T01:05:26.244852" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.245021" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:26.244228" elapsed="0.000840"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:26.244140" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.245242" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:26.245308" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:26.245445" 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-10-11T01:05:26.220874" elapsed="0.024598"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:26.245651" elapsed="0.000320"/>
</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-10-11T01:05:26.247000" 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-10-11T01:05:26.246632" elapsed="0.000394"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:26.247548" 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-10-11T01:05:26.247178" 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-10-11T01:05:26.247772" elapsed="0.000274"/>
</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-10-11T01:05:26.246241" elapsed="0.001860"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.246042" elapsed="0.002088"/>
</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-10-11T01:05:26.248331" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.248153" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.246025" elapsed="0.002418"/>
</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-10-11T01:05:26.217080" elapsed="0.031413"/>
</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-10-11T01:05:26.216401" elapsed="0.032169"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.216198" elapsed="0.032413"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.216182" elapsed="0.032451"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:26.248663" elapsed="0.000026"/>
</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-10-11T01:05:26.156506" elapsed="0.092257"/>
</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-10-11T01:05:26.154834" elapsed="0.093981"/>
</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-10-11T01:05:26.264545" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:26.264219" elapsed="0.000366"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:26.265273" 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-10-11T01:05:26.265071" elapsed="0.000268">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-10-11T01:05:26.265438" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:26.264749" elapsed="0.000714"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.265969" 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-10-11T01:05:26.265658" elapsed="0.000337"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:26.266274" 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-10-11T01:05:26.266429" 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-10-11T01:05:26.266163" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.266880" 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-10-11T01:05:26.266661" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.267844" 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-10-11T01:05:26.267614" elapsed="0.000272"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.268312" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:26.268060" elapsed="0.000277"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.269148" 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-10-11T01:05:26.268695" elapsed="0.000477"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:26.270317" 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-10-11T01:05:26.269804" elapsed="0.000616"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:26.270508" elapsed="0.000034"/>
</return>
<msg time="2026-10-11T01:05:26.270738" 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-10-11T01:05:26.269343" 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-10-11T01:05:26.270929" elapsed="0.000313"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:05:26.268550" elapsed="0.002780"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.272037" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:26.271601" elapsed="0.000461"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:26.273320" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:26.272811" elapsed="0.000616"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:26.273512" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:26.273735" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:26.272232" 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-10-11T01:05:26.273924" elapsed="0.000304"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:26.271452" elapsed="0.002814"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:26.268383" elapsed="0.005914"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:26.274335" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:05:26.274511" 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-10-11T01:05:26.267243" elapsed="0.007292"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.266990" elapsed="0.007587"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.274750" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.274600" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.266970" elapsed="0.007850"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.275545" 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-10-11T01:05:26.274993" elapsed="0.000592"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:26.275630" 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_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-10-11T01:05:26.263711" elapsed="0.012021"/>
</kw>
<msg time="2026-10-11T01:05:26.275781" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:26.259223" elapsed="0.016603"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:26.280100" 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/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-10-11T01:05:26.284159" 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/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-10-11T01:05:26.288207" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.288435" 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-10-11T01:05:26.288631" 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-10-11T01:05:26.288972" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.288826" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:26.288812" 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-10-11T01:05:26.289201" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.289380" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.289572" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:26.288787" elapsed="0.000835"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:26.288698" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.289797" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:26.289862" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:26.289971" 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-10-11T01:05:26.258611" elapsed="0.031385"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:26.291097" 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-10-11T01:05:26.290911" elapsed="0.000245">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-10-11T01:05:26.291239" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:26.290589" elapsed="0.000673"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.291574" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.291326" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.292090" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:26.291828" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.291650" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.291309" elapsed="0.000856"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.292687" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:26.292324" elapsed="0.000387"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:26.292755" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:26.292878" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:26.290262" elapsed="0.002638"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:26.293973" 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-10-11T01:05:26.293789" elapsed="0.000241">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-10-11T01:05:26.294113" 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-10-11T01:05:26.293459" elapsed="0.000676"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:05:26.294293" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:05:26.294197" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.294180" elapsed="0.000221"/>
</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-10-11T01:05:26.294592" elapsed="0.000020"/>
</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-10-11T01:05:26.294769" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:05:26.294828" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:05:26.294951" 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-10-11T01:05:26.293147" elapsed="0.001827"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.296192" 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-10-11T01:05:26.295970" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.296671" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:26.296439" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:26.302446" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:26.302727" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:05:26.302908" 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-10-11T01:05:26.296999" elapsed="0.005935"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.296771" elapsed="0.006202"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.303151" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.302997" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.296754" elapsed="0.006475"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.304509" 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-10-11T01:05:26.304162" elapsed="0.000406"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.303922" elapsed="0.000679"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.303905" elapsed="0.000723"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.305190" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:26.304922" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.304680" elapsed="0.000582"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.304665" elapsed="0.000620"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.305850" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:26.305492" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.306151" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.305938" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.306689" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:26.306391" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.306226" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.305921" elapsed="0.000846"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.307277" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:26.306942" elapsed="0.000361"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.307635" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.307395" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.308136" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:26.307873" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.307710" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.307377" elapsed="0.000835"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:26.308356" elapsed="0.000320"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:26.309061" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:26.308838" elapsed="0.000249"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:26.309242" elapsed="0.000231"/>
</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-10-11T01:05:26.303584" elapsed="0.005947"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:26.309693" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:26.309611" elapsed="0.000122"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.309593" elapsed="0.000160"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:26.310494" 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-10-11T01:05:26.309895" elapsed="0.000626"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:05:26.310578" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:26.310708" 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-10-11T01:05:26.295251" elapsed="0.015481"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:26.310786" elapsed="0.000023"/>
</return>
<msg time="2026-10-11T01:05:26.310906" 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-10-11T01:05:26.251391" elapsed="0.059539"/>
</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-10-11T01:05:26.322529" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:26.322208" elapsed="0.000359"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:26.323273" 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-10-11T01:05:26.323051" elapsed="0.000342">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-10-11T01:05:26.323586" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:26.322729" elapsed="0.000881"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.324099" 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-10-11T01:05:26.323785" elapsed="0.000340"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:26.324402" 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-10-11T01:05:26.324590" 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-10-11T01:05:26.324292" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.325038" 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-10-11T01:05:26.324815" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:05:26.325468" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.325151" elapsed="0.000372"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.326155" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:26.325708" elapsed="0.000472"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.325547" elapsed="0.000666"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.325133" elapsed="0.001101"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.326831" 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-10-11T01:05:26.326399" elapsed="0.000459"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:26.326902" 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_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-10-11T01:05:26.321696" elapsed="0.005308"/>
</kw>
<msg time="2026-10-11T01:05:26.327056" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:26.317299" elapsed="0.009802"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:26.331176" 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/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-10-11T01:05:26.335244" 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/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-10-11T01:05:26.339446" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.339642" 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-10-11T01:05:26.339827" 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-10-11T01:05:26.340201" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.340053" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:26.340040" 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-10-11T01:05:26.340446" 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-10-11T01:05:26.340643" 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-10-11T01:05:26.340814" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:26.340014" elapsed="0.000848"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:26.339921" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.341040" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:26.341106" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:26.341230" 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-10-11T01:05:26.316589" elapsed="0.024666"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:26.341438" elapsed="0.000331"/>
</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-10-11T01:05:26.342811" 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-10-11T01:05:26.342419" elapsed="0.000419"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:26.343350" 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-10-11T01:05:26.342990" 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-10-11T01:05:26.343586" elapsed="0.000281"/>
</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-10-11T01:05:26.342038" elapsed="0.001883"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.341839" 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-10-11T01:05:26.344150" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.343974" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.341822" elapsed="0.002398"/>
</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-10-11T01:05:26.311892" elapsed="0.032372"/>
</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-10-11T01:05:26.311208" elapsed="0.033121"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.311002" elapsed="0.033366"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.310986" elapsed="0.033403"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:26.344434" elapsed="0.000026"/>
</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-10-11T01:05:26.250715" elapsed="0.093818"/>
</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-10-11T01:05:26.249000" elapsed="0.095595"/>
</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-10-11T01:05:26.344751" elapsed="0.002701"/>
</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-10-11T01:05:26.363122" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:26.362819" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:26.363843" 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-10-11T01:05:26.363668" elapsed="0.000235">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-10-11T01:05:26.363987" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:26.363308" elapsed="0.000701"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.364508" 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-10-11T01:05:26.364183" elapsed="0.000351"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:26.364820" 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-10-11T01:05:26.364938" 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-10-11T01:05:26.364711" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.365377" 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-10-11T01:05:26.365156" elapsed="0.000280"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.366328" 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-10-11T01:05:26.366100" elapsed="0.000269"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.366821" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:26.366572" elapsed="0.000273"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.367616" 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-10-11T01:05:26.367157" elapsed="0.000486"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:26.368774" 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-10-11T01:05:26.368247" elapsed="0.000614"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:26.368941" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:05:26.369152" 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-10-11T01:05:26.367816" 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-10-11T01:05:26.369340" elapsed="0.000336"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:05:26.367026" elapsed="0.002688"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.370368" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:26.369944" elapsed="0.000448"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:26.371537" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:26.371021" elapsed="0.000615"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:26.371717" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:26.371923" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:26.370601" elapsed="0.001345"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:26.372112" elapsed="0.000397"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:26.369814" elapsed="0.002735"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:26.366888" elapsed="0.005703"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:26.372628" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:26.372757" 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-10-11T01:05:26.365761" elapsed="0.007049"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.365499" elapsed="0.007342"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.373013" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.372863" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.365481" elapsed="0.007601"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.373756" 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-10-11T01:05:26.373241" elapsed="0.000542"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:26.373826" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:26.362287" elapsed="0.011638"/>
</kw>
<msg time="2026-10-11T01:05:26.373973" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:26.357862" elapsed="0.016156"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:26.378417" 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/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-10-11T01:05:26.382526" 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/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-10-11T01:05:26.386612" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.386795" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.386978" 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-10-11T01:05:26.387314" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.387169" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:26.387156" 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-10-11T01:05:26.387566" 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-10-11T01:05:26.387750" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.387913" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:26.387131" elapsed="0.000830"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:26.387043" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.388133" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:26.388232" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:05:26.388342" 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-10-11T01:05:26.357246" elapsed="0.031121"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:26.389487" 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-10-11T01:05:26.389286" elapsed="0.000260">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-10-11T01:05:26.389644" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:26.388963" elapsed="0.000706"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.389952" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.389733" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.390472" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:26.390192" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.390025" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.389715" elapsed="0.000834"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.391061" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:26.390724" elapsed="0.000360"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:26.391130" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:26.391254" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:26.388661" elapsed="0.002616"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:26.392314" 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-10-11T01:05:26.392172" elapsed="0.000191"/>
</kw>
<msg time="2026-10-11T01:05:26.392455" 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-10-11T01:05:26.391853" elapsed="0.000624"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:05:26.392648" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:26.392541" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.392524" elapsed="0.000184"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:26.392982" 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-10-11T01:05:26.393097" 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-10-11T01:05:26.392859" elapsed="0.000261"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:05:26.393482" 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-10-11T01:05:26.393282" elapsed="0.000224"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:05:26.393547" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T01:05:26.393684" 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-10-11T01:05:26.391541" elapsed="0.002166"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.394916" 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-10-11T01:05:26.394694" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.395405" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:26.395185" elapsed="0.000277"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:26.400939" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:26.401058" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:05:26.401157" 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-10-11T01:05:26.395764" elapsed="0.005417"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.395523" elapsed="0.005698"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.401398" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.401245" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.395506" elapsed="0.005991"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.402782" 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-10-11T01:05:26.402432" elapsed="0.000397"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.402175" elapsed="0.000686"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.402157" elapsed="0.000728"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.403457" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:26.403174" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.402935" elapsed="0.000604"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.402920" elapsed="0.000652"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.404093" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:26.403750" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.404392" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.404181" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.404924" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:26.404662" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.404483" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.404165" elapsed="0.000835"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.405524" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:26.405174" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.405838" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.405628" elapsed="0.000261"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.406332" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:26.406072" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.405911" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.405610" elapsed="0.000813"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:26.406580" elapsed="0.000290"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:26.407251" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:26.407032" elapsed="0.000243"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:26.407479" elapsed="0.000226"/>
</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-10-11T01:05:26.401840" elapsed="0.005921"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:26.407904" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:26.407823" elapsed="0.000121"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.407806" elapsed="0.000158"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:26.408762" 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-10-11T01:05:26.408105" elapsed="0.000684"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:05:26.408836" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:26.408962" 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-10-11T01:05:26.393981" elapsed="0.015005"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:26.409041" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:05:26.409160" 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-10-11T01:05:26.350003" elapsed="0.059181"/>
</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-10-11T01:05:26.419801" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:26.419486" elapsed="0.000341"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:26.420545" 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-10-11T01:05:26.420305" elapsed="0.000369">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-10-11T01:05:26.420835" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:26.419986" elapsed="0.000873"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.421340" 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-10-11T01:05:26.421033" elapsed="0.000332"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:26.421674" 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-10-11T01:05:26.421791" 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-10-11T01:05:26.421554" elapsed="0.000261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.422226" 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-10-11T01:05:26.422009" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:05:26.422655" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.422328" elapsed="0.000382"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.423317" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:26.422879" elapsed="0.000462"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:26.422732" elapsed="0.000690"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:26.422311" elapsed="0.001134"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.424023" 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-10-11T01:05:26.423632" elapsed="0.000417"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:26.424092" 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-10-11T01:05:26.418968" elapsed="0.005225"/>
</kw>
<msg time="2026-10-11T01:05:26.424240" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:26.414603" elapsed="0.009682"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:26.428414" 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/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-10-11T01:05:26.432499" 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/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-10-11T01:05:26.436716" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.436900" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.437082" 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-10-11T01:05:26.437435" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.437276" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:26.437262" 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-10-11T01:05:26.437675" 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-10-11T01:05:26.437856" 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-10-11T01:05:26.438022" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:26.437237" elapsed="0.000832"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:26.437148" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:26.438243" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:26.438308" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:26.438427" 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-10-11T01:05:26.413872" elapsed="0.024610"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:26.438672" elapsed="0.000316"/>
</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-10-11T01:05:26.439891" 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-10-11T01:05:26.439648" elapsed="0.000269"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:26.440627" 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-10-11T01:05:26.440066" elapsed="0.000588"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<msg time="2026-10-11T01:05:26.441103" 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-10-11T01:05:26.441273" 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-10-11T01:05:26.440838" elapsed="0.000498">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-10-11T01:05:26.439258" elapsed="0.002231">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-10-11T01:05:26.439057" elapsed="0.002522">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-10-11T01:05:26.441791" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:26.441613" elapsed="0.000228"/>
</branch>
<status status="FAIL" start="2026-10-11T01:05:26.439040" elapsed="0.002822">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-10-11T01:05:26.410142" elapsed="0.031859">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-10-11T01:05:26.409478" elapsed="0.032651">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-10-11T01:05:26.409257" elapsed="0.032951">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-10-11T01:05:26.409241" elapsed="0.032999">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-10-11T01:05:26.442285" elapsed="0.000015"/>
</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-10-11T01:05:26.349364" elapsed="0.093028">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-10-11T01:05:28.478193" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:28.477467" elapsed="0.000791"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:28.479878" 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-10-11T01:05:28.479391" elapsed="0.000631">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-10-11T01:05:28.480211" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:28.478675" elapsed="0.001586"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.481394" 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-10-11T01:05:28.480703" elapsed="0.000797"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:28.482344" 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-10-11T01:05:28.482908" 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-10-11T01:05:28.482003" elapsed="0.000965"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.484014" 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-10-11T01:05:28.483455" elapsed="0.000657"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.486285" 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-10-11T01:05:28.485770" elapsed="0.000608"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.487388" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:28.486827" elapsed="0.000645"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.489332" 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-10-11T01:05:28.488211" elapsed="0.001179"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:28.492175" 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-10-11T01:05:28.490944" elapsed="0.001430"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:28.492618" elapsed="0.000076"/>
</return>
<msg time="2026-10-11T01:05:28.493110" 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-10-11T01:05:28.489867" elapsed="0.003298"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:28.493631" elapsed="0.000713"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:05:28.487916" elapsed="0.006594"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.496187" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:28.495074" elapsed="0.001170"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:28.499153" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:28.497931" elapsed="0.001420"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:28.499633" elapsed="0.000070"/>
</return>
<msg time="2026-10-11T01:05:28.500102" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:28.496843" elapsed="0.003312"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:28.500615" elapsed="0.000691"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:28.494776" elapsed="0.006615"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:28.487600" elapsed="0.013968"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:28.501662" elapsed="0.000059"/>
</return>
<msg time="2026-10-11T01:05:28.502288" 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-10-11T01:05:28.484899" elapsed="0.017443"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:28.484264" elapsed="0.018185"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:28.502925" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:28.502528" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.484218" elapsed="0.018869"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.504405" 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-10-11T01:05:28.503566" elapsed="0.000918"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:28.504568" 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/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-10-11T01:05:28.476255" elapsed="0.028463"/>
</kw>
<msg time="2026-10-11T01:05:28.504834" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:28.466351" elapsed="0.038552"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:28.510718" 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/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-10-11T01:05:28.516370" 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/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-10-11T01:05:28.522069" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:28.522322" 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-10-11T01:05:28.522611" 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-10-11T01:05:28.523083" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:28.522879" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:28.522861" elapsed="0.000321"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:28.523399" elapsed="0.000059"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:28.523716" 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-10-11T01:05:28.523947" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:28.522827" elapsed="0.001185"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:28.522705" elapsed="0.001339"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:28.524254" elapsed="0.000025"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:28.524346" elapsed="0.000020"/>
</return>
<msg time="2026-10-11T01:05:28.524518" 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-10-11T01:05:28.464897" elapsed="0.059672"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:28.526118" 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-10-11T01:05:28.525859" elapsed="0.000342">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-10-11T01:05:28.526317" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:28.525369" elapsed="0.000980"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:28.526837" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:28.526503" elapsed="0.000406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.527600" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:28.527195" elapsed="0.000441"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:28.526940" elapsed="0.000741"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.526478" elapsed="0.001231"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.528425" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:28.527938" elapsed="0.000524"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:28.528524" elapsed="0.000053"/>
</return>
<msg time="2026-10-11T01:05:28.528716" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:28.524948" elapsed="0.003800"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:28.530199" 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-10-11T01:05:28.530056" elapsed="0.000191"/>
</kw>
<msg time="2026-10-11T01:05:28.530322" 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-10-11T01:05:28.529540" elapsed="0.000804"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="NOT RUN" start="2026-10-11T01:05:28.530523" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:28.530422" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.530391" elapsed="0.000204"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:28.530875" 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-10-11T01:05:28.530992" 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-10-11T01:05:28.530751" elapsed="0.000264"/>
</kw>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:05:28.531363" 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-10-11T01:05:28.531177" elapsed="0.000209"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="PASS" start="2026-10-11T01:05:28.531444" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:28.531583" 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-10-11T01:05:28.529097" elapsed="0.002509"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.532881" 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-10-11T01:05:28.532655" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.533513" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:28.533115" elapsed="0.000452"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:28.541130" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:28.541323" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:05:28.541496" 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-10-11T01:05:28.533868" elapsed="0.007667"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:28.533631" elapsed="0.007983"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:28.541890" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:28.541652" elapsed="0.000371"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.533613" elapsed="0.008440"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.543954" 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-10-11T01:05:28.543447" elapsed="0.000569"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:28.543077" elapsed="0.000984"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.543052" elapsed="0.001041"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.544916" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:28.544520" elapsed="0.000455"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:28.544164" elapsed="0.000855"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.544143" elapsed="0.000907"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.545851" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:28.545317" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:28.546274" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:28.545976" elapsed="0.000369"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.547023" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:28.546654" elapsed="0.000403"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:28.546377" elapsed="0.000726"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.545953" elapsed="0.001177"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.547878" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:28.547376" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:28.548297" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:28.548002" elapsed="0.000368"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.549033" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:28.548667" elapsed="0.000401"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:28.548401" elapsed="0.000713"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.547978" elapsed="0.001164"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:28.549345" elapsed="0.000447"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:28.550335" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:28.550018" 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-10-11T01:05:28.550620" elapsed="0.000294"/>
</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-10-11T01:05:28.542574" elapsed="0.008420"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:28.551199" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:28.551081" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.551058" elapsed="0.000227"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:28.552151" 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-10-11T01:05:28.551503" elapsed="0.000686"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:05:28.552252" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T01:05:28.552456" 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-10-11T01:05:28.531885" elapsed="0.020607"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:28.552587" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T01:05:28.552761" 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-10-11T01:05:28.447737" elapsed="0.105097"/>
</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-10-11T01:05:28.566850" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:28.566535" elapsed="0.000341"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:28.567648" 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-10-11T01:05:28.567351" elapsed="0.000429">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-10-11T01:05:28.567949" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:28.567034" elapsed="0.000939"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.568494" 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-10-11T01:05:28.568151" elapsed="0.000369"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:28.568822" 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-10-11T01:05:28.568957" 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-10-11T01:05:28.568708" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.569399" 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-10-11T01:05:28.569178" 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-10-11T01:05:28.569853" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:28.569537" elapsed="0.000369"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.570575" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:28.570077" elapsed="0.000524"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:28.569929" elapsed="0.000705"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.569519" elapsed="0.001135"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.571199" 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-10-11T01:05:28.570817" elapsed="0.000408"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:28.571269" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:28.566017" elapsed="0.005351"/>
</kw>
<msg time="2026-10-11T01:05:28.571442" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:28.560509" elapsed="0.010988"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:28.575655" 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/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-10-11T01:05:28.579770" 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/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-10-11T01:05:28.584026" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:28.584212" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:28.584393" 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-10-11T01:05:28.584770" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:28.584623" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:28.584609" 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-10-11T01:05:28.584997" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:28.585176" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:28.585338" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:28.584583" elapsed="0.000802"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:28.584479" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:28.585588" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:28.585654" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:28.585758" 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-10-11T01:05:28.559487" elapsed="0.026296"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:28.585949" elapsed="0.000310"/>
</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-10-11T01:05:28.587156" 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-10-11T01:05:28.586918" elapsed="0.000265"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:28.587588" 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-10-11T01:05:28.587332" elapsed="0.000283"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:05:28.587799" elapsed="0.000396"/>
</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-10-11T01:05:28.586544" elapsed="0.001707"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:28.586328" elapsed="0.001953"/>
</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-10-11T01:05:28.588510" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:28.588305" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.586311" 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-10-11T01:05:28.554175" elapsed="0.034497"/>
</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-10-11T01:05:28.553230" elapsed="0.035507"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:28.552941" elapsed="0.035836"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.552918" elapsed="0.035880"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:28.588829" elapsed="0.000026"/>
</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-10-11T01:05:28.446127" elapsed="0.142803"/>
</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-10-11T01:05:26.347695" elapsed="2.241291"/>
</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-10-11T01:05:28.589186" elapsed="0.002663"/>
</kw>
<arg>rt_constrain_type_2</arg>
<arg>${RT_CONSTRAIN_DIR}</arg>
<status status="PASS" start="2026-10-11T01:05:23.956579" elapsed="4.635326"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:23.862666" elapsed="4.729349"/>
</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-10-11T01:05:28.593704" elapsed="0.000269"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:05:28.593370" elapsed="0.000657"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:28.594993" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:28.594902" elapsed="0.000134"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.594883" elapsed="0.000173"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:28.598314" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:28.598230" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.598212" elapsed="0.000165"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.599305" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:28.598977" elapsed="0.000355"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.599782" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:05:28.599503" elapsed="0.000305"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:05:28.599848" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:28.599978" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:05:28.598615" elapsed="0.001387"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:28.602542" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:28.602456" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.602438" elapsed="0.000179"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:28.603696" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:28.603609" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.603591" elapsed="0.000167"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:28.604081" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:05:28.603908" elapsed="0.000199"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:28.604443" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:05:28.604276" elapsed="0.000194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:05:28.641059" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:05:28.604985" elapsed="0.036169"/>
</kw>
<msg time="2026-10-11T01:05:28.641362" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:05:28.641424" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:28.604648" elapsed="0.036827"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:05:28.685055" 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-10-11T01:05:28.642016" elapsed="0.043143"/>
</kw>
<msg time="2026-10-11T01:05:28.685304" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:05:28.685345" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:28.641668" elapsed="0.043712"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:28.685712" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:28.685483" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.685460" elapsed="0.000326"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.686197" 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-10-11T01:05:28.685968" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:28.686570" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:28.686327" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.686310" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:05:28.686676" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:05:28.689224" elapsed="0.000262"/>
</kw>
<msg time="2026-10-11T01:05:28.689559" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:28.688076" 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-10-11T01:05:28.690009" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:28.690382" elapsed="0.000118"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:05:28.687456" elapsed="0.003183"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:05:28.686959" 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-10-11T01:05:28.603306" elapsed="0.087470"/>
</kw>
<msg time="2026-10-11T01:05:28.690858" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:28.690898" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:28.602776" elapsed="0.088157"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:05:28.691090" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:05:28.691002" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.690985" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:28.691531" elapsed="0.000040"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:28.691859" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:05:28.691924" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T01:05:28.602151" elapsed="0.089859"/>
</kw>
<msg time="2026-10-11T01:05:28.692094" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:28.692135" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:28.600333" elapsed="0.091837"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:28.692584" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:28.692271" elapsed="0.000368"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.692254" elapsed="0.000406"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:05:28.600189" elapsed="0.092493"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:05:28.600049" elapsed="0.092660"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:05:28.597928" elapsed="0.094829"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:05:28.594637" elapsed="0.098170"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:28.594182" elapsed="0.098665"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:05:28.592942" elapsed="0.099952"/>
</kw>
<kw name="Kill_BGP_Speaker" owner="BGPSpeaker">
<kw name="Write_Bare_Ctrl_C" owner="RemoteBash">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.694130" 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-10-11T01:05:28.693836" elapsed="0.000320"/>
</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-10-11T01:05:28.694310" elapsed="0.000192"/>
</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-10-11T01:05:28.693539" elapsed="0.001028"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:05:28.716614" level="INFO">^C
[?2004h[jenkins@releng-26932-423-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-10-11T01:05:28.695065" elapsed="0.021608"/>
</kw>
<msg time="2026-10-11T01:05:28.716759" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:28.716797" level="INFO">${message} = ^C
[?2004h[jenkins@releng-26932-423-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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:28.694732" elapsed="0.022088"/>
</kw>
<kw name="Dump_BGP_Speaker_Logs" owner="BGPSpeaker">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:05:28.717429" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-10-11T01:05:28.729753" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:05:28.729844" level="INFO">${output_log} = 2026-10-11 01:04:56,261 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 01:04:56,261 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 01:04:56,261 DEBUG BGP-Threa...</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-10-11T01:05:28.717302" elapsed="0.012570"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.730298" level="INFO">2026-10-11 01:04:56,261 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 01:04:56,261 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 01:04:56,261 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 01:04:56,261 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 01:04:56,261 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 01:04:56,262 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 01:04:56,265 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 01:04:56,265 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00d90104fbf000b4c0000202bc02ba41040000fbf0060002000104000100010104000100040104000100850104000200040104000100810104000100840104000200810104000200800104000100860104000200860104000200850104000200050104000100800104000100050104400400470104001900460104000200014046003c00010500000286000001810040044700000204000002800000020500000281000001010000018500000184000001860000194600000201000002850000010400000180004700
2026-10-11 01:04:56,265 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 01:04:56,265 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-10-11 01:04:56,265 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-10-11 01:04:56,266 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 01:04:56,266 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 01:04:56,266 INFO BGP-Thread-1 (job):   My BGP Identifier: 169782023
2026-10-11 01:04:56,266 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 01:04:56,266 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 01:04:56,266 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 01:04:56,266 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 01:04:56,266 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 01:04:56,266 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 01:04:56,266 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-10-11 01:04:56,266 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-10-11 01:04:56,266 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 01:04:56,266 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 01:04:56,266 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 01:04:56,266 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 01:04:56,266 DEBUG BGP-Thread-1 (job):   Length=53 (0x0035)
2026-10-11 01:04:56,266 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 01:04:56,266 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 01:04:56,266 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-10-11 01:04:56,266 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 01:04:56,266 DEBUG BGP-Thread-1 (job):   BGP Identifier=169782023 (0x0a1eab07)
2026-10-11 01:04:56,266 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=24 (0x18)
2026-10-11 01:04:56,266 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x02060104000100010206010400010084020641040000fbf0
2026-10-11 01:04:56,266 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff00350104fbf000b40a1eab071802060104000100010206010400010084020641040000fbf0'
2026-10-11 01:04:56,266 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff00350104fbf000b40a1eab071802060104000100010206010400010084020641040000fbf0
2026-10-11 01:04:56,268 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 01:04:56,268 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 01:04:56,268 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 01:04:56,268 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 01:04:56,268 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 01:04:56,268 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 01:04:56,268 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 01:04:56,268 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 01:04:56,268 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 01:04:56,268 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 01:04:56,268 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 01:04:56,268 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:56,268 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:56,268 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:56,280 INFO BGP-Thread-1 (job): ... idle for 0.012s
2026-10-11 01:04:56,280 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.012s
2026-10-11 01:04:56,280 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 01:04:56,280 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:56,280 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:56,280 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 01:04:56,281 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:56,281 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:56,281 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:04:56,281 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:04:56,281 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:04:56,281 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-10-11 01:04:56,281 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-10-11 01:04:56,281 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:56,281 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:56,281 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:56,281 INFO BGP-Thread-1 (job): ... idle for 0.000s
2026-10-11 01:04:56,281 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.012s
2026-10-11 01:04:56,281 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000184
2026-10-11 01:04:56,281 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:56,282 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:56,282 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:04:56,282 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:56,282 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:56,282 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:04:56,282 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:04:56,282 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:04:56,282 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-10-11 01:04:56,282 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-10-11 01:04:56,282 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:56,282 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:56,282 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:57,283 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:57,286 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.013s
2026-10-11 01:04:57,286 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:57,286 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:57,286 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:58,287 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:58,287 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 2.014s
2026-10-11 01:04:58,287 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:58,288 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:58,288 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:59,289 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:59,289 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 3.015s
2026-10-11 01:04:59,289 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:59,289 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:59,289 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:00,290 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:00,291 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 4.017s
2026-10-11 01:05:00,291 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:00,291 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:00,291 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:01,292 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:01,292 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 5.018s
2026-10-11 01:05:01,292 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:01,292 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:01,293 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:02] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:02,294 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:02,294 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.019s
2026-10-11 01:05:02,294 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:02,294 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:02,294 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:02] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:02,385 INFO BGP-Thread-1 (job): ... idle for 0.091s
2026-10-11 01:05:02,385 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.110s
2026-10-11 01:05:02,385 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0032020000001b4001010040020040050400000064800e0a00018404c714a6290000
2026-10-11 01:05:02,385 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:02,385 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:02,386 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0032' (50)
2026-10-11 01:05:02,386 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:02,386 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:02,386 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:02,386 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:02,386 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:02,386 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-10-11 01:05:02,386 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-10-11 01:05:02,386 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:02,386 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:02,386 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:03,387 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:03,387 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 7.111s
2026-10-11 01:05:03,388 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:03,388 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:03,388 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:04] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:04,389 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:04,389 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.112s
2026-10-11 01:05:04,389 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:04,389 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:04,389 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:04] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:04,479 INFO BGP-Thread-1 (job): ... idle for 0.090s
2026-10-11 01:05:04,479 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.202s
2026-10-11 01:05:04,480 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff002c02000000154001010040020040050400000064800f0400018400
2026-10-11 01:05:04,480 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:04,480 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:04,480 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'002c' (44)
2026-10-11 01:05:04,480 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:04,480 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:04,480 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:04,480 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:04,480 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:04,480 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-10-11 01:05:04,480 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-10-11 01:05:04,480 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:04,480 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:04,480 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:04] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:05,482 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:05,482 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 9.203s
2026-10-11 01:05:05,482 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0032020000001b4001010040020040050400000064800e0a00018404c714a6290000
2026-10-11 01:05:05,482 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:05,482 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:05,482 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:06,483 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:06,484 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.204s
2026-10-11 01:05:06,485 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:06,485 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:06,485 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:07] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:07,486 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:07,486 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 11.205s
2026-10-11 01:05:07,486 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff002c02000000154001010040020040050400000064800f0400018400
2026-10-11 01:05:07,486 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:07,487 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:07,487 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:08,488 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:08,488 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 12.206s
2026-10-11 01:05:08,488 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:08,488 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:08,488 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:09] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:09,487 INFO BGP-Thread-1 (job): ... idle for 0.999s
2026-10-11 01:05:09,488 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 13.205s
2026-10-11 01:05:09,488 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff002c02000000154001010040020040050400000064800f0400018400
2026-10-11 01:05:09,488 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0002fbf000000065
2026-10-11 01:05:09,488 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:09,488 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:09,488 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-10-11 01:05:09,488 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:09,488 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:09,488 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:09,488 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:09,488 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:09,488 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-10-11 01:05:09,488 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-10-11 01:05:09,489 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:09,489 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:09,489 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:09] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:09,553 INFO BGP-Thread-1 (job): ... idle for 0.065s
2026-10-11 01:05:09,554 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 13.270s
2026-10-11 01:05:09,554 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0002fbf000000065
2026-10-11 01:05:09,554 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:09,554 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:09,554 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0038' (56)
2026-10-11 01:05:09,554 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:09,554 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:09,554 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:09,554 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:09,554 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:09,554 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-10-11 01:05:09,554 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-10-11 01:05:09,554 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:09,555 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:09,555 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:09] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:10,556 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:10,556 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 14.271s
2026-10-11 01:05:10,556 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0002fbf000000065
2026-10-11 01:05:10,556 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:10,556 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:10,556 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:11,558 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:11,562 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 15.272s
2026-10-11 01:05:11,562 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:11,562 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:11,562 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:12] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:12,563 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:12,564 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 16.273s
2026-10-11 01:05:12,564 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0002fbf000000065
2026-10-11 01:05:12,564 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:12,564 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:12,564 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:13,565 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:13,565 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 17.274s
2026-10-11 01:05:13,565 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:13,565 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:13,566 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:14] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:14] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:14] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:14,566 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:14,566 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 18.275s
2026-10-11 01:05:14,566 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0002fbf000000065
2026-10-11 01:05:14,567 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0102c0000202007b
2026-10-11 01:05:14,567 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:14,567 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:14,567 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-10-11 01:05:14,567 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:14,567 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:14,567 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:14,567 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:14,567 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:14,567 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-10-11 01:05:14,567 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-10-11 01:05:14,567 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:14,568 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:14,568 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:15,569 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:15,569 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 19.276s
2026-10-11 01:05:15,569 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:15,569 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:15,569 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:16] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:16,570 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:16,573 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.277s
2026-10-11 01:05:16,573 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:16,573 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:16,573 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:16] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:16,664 INFO BGP-Thread-1 (job): ... idle for 0.091s
2026-10-11 01:05:16,664 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.368s
2026-10-11 01:05:16,665 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0102c0000202007b
2026-10-11 01:05:16,665 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:16,665 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:16,665 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0038' (56)
2026-10-11 01:05:16,665 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:16,665 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:16,665 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:16,665 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:16,665 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:16,665 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-10-11 01:05:16,665 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-10-11 01:05:16,665 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:16,665 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:16,666 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:16] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:16] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:16] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:17,667 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:17,667 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 21.369s
2026-10-11 01:05:17,667 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0102c0000202007b
2026-10-11 01:05:17,667 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:17,667 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:17,667 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:18,669 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:18,669 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 22.370s
2026-10-11 01:05:18,669 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:18,669 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:18,669 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:19] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:19,670 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:19,670 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 23.372s
2026-10-11 01:05:19,670 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0102c0000202007b
2026-10-11 01:05:19,671 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:19,671 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:19,671 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:20,672 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:20,672 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 24.373s
2026-10-11 01:05:20,672 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:20,672 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:20,672 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:21] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:21] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:21] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:21,661 INFO BGP-Thread-1 (job): ... idle for 0.988s
2026-10-11 01:05:21,661 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 25.361s
2026-10-11 01:05:21,661 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0102c0000202007b
2026-10-11 01:05:21,661 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff02020000fde8007b
2026-10-11 01:05:21,661 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:21,661 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:21,661 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-10-11 01:05:21,662 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:21,662 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:21,662 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:21,662 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:21,662 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:21,662 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-10-11 01:05:21,662 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-10-11 01:05:21,662 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:21,662 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:21,662 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:22,663 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:22,664 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 26.362s
2026-10-11 01:05:22,664 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:22,664 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:22,664 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:23] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:23,665 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:23,665 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 27.363s
2026-10-11 01:05:23,665 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:23,665 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:23,665 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:23] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:23,800 INFO BGP-Thread-1 (job): ... idle for 0.134s
2026-10-11 01:05:23,800 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 27.497s
2026-10-11 01:05:23,800 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff02020000fde8007b
2026-10-11 01:05:23,800 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:23,800 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:23,800 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0038' (56)
2026-10-11 01:05:23,800 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:23,800 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:23,800 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:23,800 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:23,801 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:23,801 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-10-11 01:05:23,801 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-10-11 01:05:23,801 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:23,801 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:23,801 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:23] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:23] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:23] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:24,802 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:24,802 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 28.499s
2026-10-11 01:05:24,802 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff02020000fde8007b
2026-10-11 01:05:24,802 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:24,803 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:24,803 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:25,804 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:25,804 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 29.500s
2026-10-11 01:05:25,804 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:25,804 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:25,804 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:26] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:26,805 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:26,807 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 30.501s
2026-10-11 01:05:26,807 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff02020000fde8007b
2026-10-11 01:05:26,807 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:26,808 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:26,808 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:27,809 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:27,809 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 31.502s
2026-10-11 01:05:27,809 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:27,809 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:27,809 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:28] "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-10-11T01:05:28.730073" elapsed="0.000677"/>
</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-10-11T01:05:28.716997" elapsed="0.013807"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<status status="PASS" start="2026-10-11T01:05:28.730950" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T01:05:28.730861" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.730844" elapsed="0.000181"/>
</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-10-11T01:05:28.731212" elapsed="0.000020"/>
</kw>
<kw name="Fail" owner="BuiltIn">
<arg>The prompt was not seen within timeout period.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:28.731381" elapsed="0.000018"/>
</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-10-11T01:05:28.693146" elapsed="0.038321"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:05:28.734731" level="INFO">Executing command 'cat play.py.out'.</msg>
<msg time="2026-10-11T01:05:28.780680" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:05:28.780835" level="INFO">${output_log} = 2026-10-11 01:04:56,261 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 01:04:56,261 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 01:04:56,261 DEBUG BGP-Threa...</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-10-11T01:05:28.734621" elapsed="0.046250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.781603" level="INFO">2026-10-11 01:04:56,261 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 01:04:56,261 DEBUG BGP-Thread-1 (job): Local IP address: 10.30.171.7
2026-10-11 01:04:56,261 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 01:04:56,261 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 01:04:56,261 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 01:04:56,262 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 01:04:56,265 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 01:04:56,265 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00d90104fbf000b4c0000202bc02ba41040000fbf0060002000104000100010104000100040104000100850104000200040104000100810104000100840104000200810104000200800104000100860104000200860104000200850104000200050104000100800104000100050104400400470104001900460104000200014046003c00010500000286000001810040044700000204000002800000020500000281000001010000018500000184000001860000194600000201000002850000010400000180004700
2026-10-11 01:04:56,265 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 01:04:56,265 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-10-11 01:04:56,265 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-10-11 01:04:56,266 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 01:04:56,266 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 01:04:56,266 INFO BGP-Thread-1 (job):   My BGP Identifier: 169782023
2026-10-11 01:04:56,266 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 01:04:56,266 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 01:04:56,266 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 01:04:56,266 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 01:04:56,266 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 01:04:56,266 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 01:04:56,266 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-10-11 01:04:56,266 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-10-11 01:04:56,266 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 01:04:56,266 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 01:04:56,266 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 01:04:56,266 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 01:04:56,266 DEBUG BGP-Thread-1 (job):   Length=53 (0x0035)
2026-10-11 01:04:56,266 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 01:04:56,266 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 01:04:56,266 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-10-11 01:04:56,266 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 01:04:56,266 DEBUG BGP-Thread-1 (job):   BGP Identifier=169782023 (0x0a1eab07)
2026-10-11 01:04:56,266 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=24 (0x18)
2026-10-11 01:04:56,266 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x02060104000100010206010400010084020641040000fbf0
2026-10-11 01:04:56,266 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff00350104fbf000b40a1eab071802060104000100010206010400010084020641040000fbf0'
2026-10-11 01:04:56,266 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff00350104fbf000b40a1eab071802060104000100010206010400010084020641040000fbf0
2026-10-11 01:04:56,268 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 01:04:56,268 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 01:04:56,268 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 01:04:56,268 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 01:04:56,268 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 01:04:56,268 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 01:04:56,268 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 01:04:56,268 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 01:04:56,268 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 01:04:56,268 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 01:04:56,268 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 01:04:56,268 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:56,268 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:56,268 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:56,280 INFO BGP-Thread-1 (job): ... idle for 0.012s
2026-10-11 01:04:56,280 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.012s
2026-10-11 01:04:56,280 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 01:04:56,280 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:56,280 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:56,280 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 01:04:56,281 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:56,281 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:56,281 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:04:56,281 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:04:56,281 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:04:56,281 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-10-11 01:04:56,281 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-10-11 01:04:56,281 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:56,281 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:56,281 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:56,281 INFO BGP-Thread-1 (job): ... idle for 0.000s
2026-10-11 01:04:56,281 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.012s
2026-10-11 01:04:56,281 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000184
2026-10-11 01:04:56,281 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:04:56,282 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:04:56,282 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:04:56,282 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:04:56,282 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:04:56,282 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:04:56,282 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:04:56,282 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:04:56,282 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-10-11 01:04:56,282 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-10-11 01:04:56,282 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:56,282 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:56,282 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:57,283 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:57,286 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.013s
2026-10-11 01:04:57,286 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:57,286 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:57,286 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:58,287 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:58,287 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 2.014s
2026-10-11 01:04:58,287 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:58,288 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:58,288 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:04:59,289 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:04:59,289 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 3.015s
2026-10-11 01:04:59,289 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:04:59,289 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:04:59,289 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:00,290 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:00,291 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 4.017s
2026-10-11 01:05:00,291 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:00,291 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:00,291 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:01,292 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:01,292 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 5.018s
2026-10-11 01:05:01,292 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:01,292 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:01,293 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:02] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:02,294 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:02,294 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.019s
2026-10-11 01:05:02,294 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:02,294 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:02,294 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:02] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:02,385 INFO BGP-Thread-1 (job): ... idle for 0.091s
2026-10-11 01:05:02,385 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.110s
2026-10-11 01:05:02,385 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff0032020000001b4001010040020040050400000064800e0a00018404c714a6290000
2026-10-11 01:05:02,385 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:02,385 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:02,386 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0032' (50)
2026-10-11 01:05:02,386 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:02,386 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:02,386 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:02,386 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:02,386 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:02,386 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-10-11 01:05:02,386 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-10-11 01:05:02,386 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:02,386 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:02,386 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:03,387 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:03,387 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 7.111s
2026-10-11 01:05:03,388 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:03,388 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:03,388 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:04] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:04,389 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:04,389 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.112s
2026-10-11 01:05:04,389 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:04,389 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:04,389 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:04] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:04,479 INFO BGP-Thread-1 (job): ... idle for 0.090s
2026-10-11 01:05:04,479 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.202s
2026-10-11 01:05:04,480 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff002c02000000154001010040020040050400000064800f0400018400
2026-10-11 01:05:04,480 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:04,480 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:04,480 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'002c' (44)
2026-10-11 01:05:04,480 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:04,480 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:04,480 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:04,480 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:04,480 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:04,480 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-10-11 01:05:04,480 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-10-11 01:05:04,480 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:04,480 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:04,480 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:04] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:04] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:05,482 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:05,482 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 9.203s
2026-10-11 01:05:05,482 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0032020000001b4001010040020040050400000064800e0a00018404c714a6290000
2026-10-11 01:05:05,482 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:05,482 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:05,482 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:06,483 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:06,484 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.204s
2026-10-11 01:05:06,485 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:06,485 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:06,485 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:07] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:07,486 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:07,486 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 11.205s
2026-10-11 01:05:07,486 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff002c02000000154001010040020040050400000064800f0400018400
2026-10-11 01:05:07,486 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:07,487 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:07,487 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:08,488 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:08,488 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 12.206s
2026-10-11 01:05:08,488 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:08,488 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:08,488 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:09] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:09,487 INFO BGP-Thread-1 (job): ... idle for 0.999s
2026-10-11 01:05:09,488 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 13.205s
2026-10-11 01:05:09,488 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff002c02000000154001010040020040050400000064800f0400018400
2026-10-11 01:05:09,488 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0002fbf000000065
2026-10-11 01:05:09,488 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:09,488 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:09,488 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-10-11 01:05:09,488 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:09,488 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:09,488 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:09,488 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:09,488 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:09,488 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-10-11 01:05:09,488 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-10-11 01:05:09,489 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:09,489 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:09,489 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:09] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:09,553 INFO BGP-Thread-1 (job): ... idle for 0.065s
2026-10-11 01:05:09,554 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 13.270s
2026-10-11 01:05:09,554 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0002fbf000000065
2026-10-11 01:05:09,554 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:09,554 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:09,554 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0038' (56)
2026-10-11 01:05:09,554 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:09,554 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:09,554 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:09,554 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:09,554 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:09,554 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-10-11 01:05:09,554 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-10-11 01:05:09,554 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:09,555 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:09,555 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:09] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:09] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:10,556 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:10,556 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 14.271s
2026-10-11 01:05:10,556 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0002fbf000000065
2026-10-11 01:05:10,556 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:10,556 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:10,556 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:11,558 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:11,562 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 15.272s
2026-10-11 01:05:11,562 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:11,562 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:11,562 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:12] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:12,563 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:12,564 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 16.273s
2026-10-11 01:05:12,564 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0002fbf000000065
2026-10-11 01:05:12,564 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:12,564 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:12,564 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:13,565 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:13,565 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 17.274s
2026-10-11 01:05:13,565 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:13,565 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:13,566 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:14] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:14] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:14] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:14,566 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:14,566 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 18.275s
2026-10-11 01:05:14,566 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0002fbf000000065
2026-10-11 01:05:14,567 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0102c0000202007b
2026-10-11 01:05:14,567 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:14,567 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:14,567 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-10-11 01:05:14,567 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:14,567 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:14,567 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:14,567 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:14,567 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:14,567 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-10-11 01:05:14,567 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-10-11 01:05:14,567 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:14,568 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:14,568 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:15,569 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:15,569 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 19.276s
2026-10-11 01:05:15,569 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:15,569 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:15,569 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:16] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:16,570 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:16,573 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.277s
2026-10-11 01:05:16,573 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:16,573 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:16,573 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:16] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:16,664 INFO BGP-Thread-1 (job): ... idle for 0.091s
2026-10-11 01:05:16,664 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 20.368s
2026-10-11 01:05:16,665 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0102c0000202007b
2026-10-11 01:05:16,665 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:16,665 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:16,665 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0038' (56)
2026-10-11 01:05:16,665 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:16,665 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:16,665 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:16,665 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:16,665 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:16,665 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-10-11 01:05:16,665 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-10-11 01:05:16,665 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:16,665 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:16,666 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:16] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:16] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:16] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:17,667 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:17,667 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 21.369s
2026-10-11 01:05:17,667 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0102c0000202007b
2026-10-11 01:05:17,667 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:17,667 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:17,667 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:18,669 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:18,669 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 22.370s
2026-10-11 01:05:18,669 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:18,669 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:18,669 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:19] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:19,670 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:19,670 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 23.372s
2026-10-11 01:05:19,670 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0102c0000202007b
2026-10-11 01:05:19,671 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:19,671 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:19,671 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:20,672 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:20,672 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 24.373s
2026-10-11 01:05:20,672 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:20,672 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:20,672 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:21] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:21] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:21] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:21,661 INFO BGP-Thread-1 (job): ... idle for 0.988s
2026-10-11 01:05:21,661 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 25.361s
2026-10-11 01:05:21,661 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff0102c0000202007b
2026-10-11 01:05:21,661 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff02020000fde8007b
2026-10-11 01:05:21,661 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:21,661 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:21,661 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'003e' (62)
2026-10-11 01:05:21,662 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:21,662 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:21,662 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:21,662 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:21,662 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:21,662 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-10-11 01:05:21,662 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-10-11 01:05:21,662 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:21,662 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:21,662 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:22,663 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:22,664 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 26.362s
2026-10-11 01:05:22,664 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:22,664 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:22,664 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:23] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:23,665 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:23,665 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 27.363s
2026-10-11 01:05:23,665 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:23,665 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:23,665 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:23] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:23,800 INFO BGP-Thread-1 (job): ... idle for 0.134s
2026-10-11 01:05:23,800 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 27.497s
2026-10-11 01:05:23,800 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff02020000fde8007b
2026-10-11 01:05:23,800 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:23,800 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:23,800 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0038' (56)
2026-10-11 01:05:23,800 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:23,800 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:23,800 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:23,800 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:23,801 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:23,801 DEBUG BGP-Thread-1 (job): Route-Target-Constrain True
2026-10-11 01:05:23,801 DEBUG BGP-Thread-1 (job): Skipping update decoding due to Route-Target-Constrain data expected
2026-10-11 01:05:23,801 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:23,801 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:23,801 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:23] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:23] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:23] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:24,802 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:24,802 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 28.499s
2026-10-11 01:05:24,802 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff02020000fde8007b
2026-10-11 01:05:24,802 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:24,803 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:24,803 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:25,804 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:25,804 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 29.500s
2026-10-11 01:05:25,804 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:25,804 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:25,804 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:26] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:26,805 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:26,807 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 30.501s
2026-10-11 01:05:26,807 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003802000000214001010040020040050400000064800f10000184600000fbff02020000fde8007b
2026-10-11 01:05:26,807 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:26,808 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:26,808 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:27,809 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:27,809 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 31.502s
2026-10-11 01:05:27,809 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:27,809 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:27,809 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:28] "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-10-11T01:05:28.781184" elapsed="0.000967"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:28.782941" 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-10-11T01:05:28.782453" elapsed="0.000561"/>
</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-10-11T01:05:28.734251" elapsed="0.048845"/>
</kw>
<doc>Abort the Python speaker</doc>
<status status="PASS" start="2026-10-11T01:05:28.592378" elapsed="0.190859"/>
</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-10-11T01:05:28.785732" elapsed="0.000292"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:05:28.785297" elapsed="0.000799"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:28.787887" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:28.787748" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.787718" elapsed="0.000270"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:28.790837" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:28.790720" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.790697" elapsed="0.000228"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.792242" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:28.791782" elapsed="0.000496"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.792903" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:05:28.792518" elapsed="0.000419"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:05:28.792996" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T01:05:28.793178" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:05:28.791216" elapsed="0.001995"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:28.796759" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:28.796641" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.796616" 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-10-11T01:05:28.798321" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:28.798203" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.798180" elapsed="0.000260"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:28.798942" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:05:28.798694" elapsed="0.000283"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:28.799437" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:05:28.799212" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:05:28.836541" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:05:28.800201" elapsed="0.036446"/>
</kw>
<msg time="2026-10-11T01:05:28.836801" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:05:28.836862" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:28.799734" elapsed="0.037165"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:05:28.882183" 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-10-11T01:05:28.837431" elapsed="0.044858"/>
</kw>
<msg time="2026-10-11T01:05:28.882465" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:05:28.882511" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:28.837070" elapsed="0.045494"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:28.882884" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:28.882672" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.882653" elapsed="0.000303"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.883367" 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-10-11T01:05:28.883138" elapsed="0.000329"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:28.883746" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:28.883530" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.883513" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:05:28.883848" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:05:28.886526" elapsed="0.000133"/>
</kw>
<msg time="2026-10-11T01:05:28.886719" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:28.885362" 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-10-11T01:05:28.887157" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:28.887533" 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-10-11T01:05:28.884769" elapsed="0.002971"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:05:28.884127" elapsed="0.003673"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:05:28.797846" elapsed="0.090029"/>
</kw>
<msg time="2026-10-11T01:05:28.887958" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:28.887998" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:28.797063" elapsed="0.090971"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:05:28.888191" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:05:28.888104" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.888086" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:28.888653" 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-10-11T01:05:28.888954" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:05:28.889017" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T01:05:28.796207" elapsed="0.092895"/>
</kw>
<msg time="2026-10-11T01:05:28.889186" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:28.889225" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:28.793725" elapsed="0.095535"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:28.889647" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:28.889342" elapsed="0.000359"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.889319" elapsed="0.000404"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:05:28.793501" elapsed="0.096244"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:05:28.793281" elapsed="0.096492"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:05:28.790274" elapsed="0.099548"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:05:28.787334" elapsed="0.102537"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:28.786314" elapsed="0.103597"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:05:28.784625" elapsed="0.105368"/>
</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-10-11T01:05:28.903265" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:28.902963" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:28.903998" 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-10-11T01:05:28.903804" elapsed="0.000265">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-10-11T01:05:28.904153" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:28.903467" elapsed="0.000709"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.904687" 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-10-11T01:05:28.904348" elapsed="0.000365"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:28.904991" 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-10-11T01:05:28.905117" 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-10-11T01:05:28.904882" elapsed="0.000259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.905589" 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-10-11T01:05:28.905335" 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-10-11T01:05:28.906539" level="INFO">mapping: {'IP': '10.30.171.7', '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-10-11T01:05:28.906289" elapsed="0.000308"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.907215" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:28.906774" elapsed="0.000466"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.907869" level="INFO">${value} = 10.30.171.7</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:28.907595" elapsed="0.000298"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:28.908597" level="INFO">${encoded} = 10.30.171.7</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:28.908379" elapsed="0.000243"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:28.908666" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:28.908793" level="INFO">${encoded_value} = 10.30.171.7</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:28.908068" elapsed="0.000748"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:28.908980" elapsed="0.000181"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.171.7</var>
<status status="PASS" start="2026-10-11T01:05:28.907447" elapsed="0.001751"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.909730" 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-10-11T01:05:28.909444" elapsed="0.000310"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:28.910472" 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-10-11T01:05:28.910257" elapsed="0.000241"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:28.910543" elapsed="0.000045"/>
</return>
<msg time="2026-10-11T01:05:28.910690" 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-10-11T01:05:28.909925" 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-10-11T01:05:28.910894" elapsed="0.000169"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T01:05:28.909299" elapsed="0.001801"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.911646" 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-10-11T01:05:28.911336" elapsed="0.000334"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:28.912370" 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-10-11T01:05:28.912191" elapsed="0.000204"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:28.912455" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:28.912596" 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-10-11T01:05:28.911878" elapsed="0.000742"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:28.912785" elapsed="0.000168"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T01:05:28.911203" elapsed="0.001787"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.913509" 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-10-11T01:05:28.913221" elapsed="0.000312"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:28.914207" 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-10-11T01:05:28.914029" elapsed="0.000204"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:28.914277" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:28.914401" 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-10-11T01:05:28.913720" elapsed="0.000719"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:28.914618" elapsed="0.000166"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T01:05:28.913091" elapsed="0.001731"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.915315" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:28.915049" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:28.916020" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:28.915846" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:28.916088" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:28.916211" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:28.915521" elapsed="0.000713"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:28.916398" elapsed="0.000193"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:28.914920" elapsed="0.001707"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.917281" 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-10-11T01:05:28.916854" elapsed="0.000451"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:28.917990" 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-10-11T01:05:28.917812" elapsed="0.000203"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:28.918059" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:28.918183" 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-10-11T01:05:28.917490" elapsed="0.000715"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:28.918368" elapsed="0.000212"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T01:05:28.916725" elapsed="0.001893"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:28.907285" elapsed="0.011364"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:28.918687" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:05:28.918816" level="INFO">${mapping_to_use} = {'IP': '10.30.171.7', '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-10-11T01:05:28.905950" elapsed="0.012890"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:28.905694" elapsed="0.013175"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:28.919040" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:28.918891" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.905677" elapsed="0.013432"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.919879" 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-10-11T01:05:28.919267" elapsed="0.000638"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:28.919949" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:28.902447" elapsed="0.017634"/>
</kw>
<msg time="2026-10-11T01:05:28.920131" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:28.898138" elapsed="0.022037"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:28.924291" 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/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-10-11T01:05:28.928394" 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/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-10-11T01:05:28.932506" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:28.932706" 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-10-11T01:05:28.932891" 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-10-11T01:05:28.933227" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:28.933081" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:28.933068" 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-10-11T01:05:28.933469" 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-10-11T01:05:28.933668" 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-10-11T01:05:28.933834" elapsed="0.000017"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:28.933043" elapsed="0.000838"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:28.932956" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:28.934055" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:28.934121" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:28.934231" 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-10-11T01:05:28.897510" elapsed="0.036747"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.935306" 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.171.7</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:28.935081" elapsed="0.000269"/>
</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-10-11T01:05:28.944171" level="INFO">DELETE Request : url=http://10.30.170.173: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.171.7 
 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.171.7 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:28.944217" level="INFO">DELETE Response : url=http://10.30.170.173: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.171.7 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:28.944311" 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-10-11T01:05:28.935676" elapsed="0.008660"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:28.935427" elapsed="0.008947"/>
</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-10-11T01:05:28.944598" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:28.944399" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.935394" elapsed="0.009288"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.945888" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:28.945613" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:28.945341" elapsed="0.000620"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.945325" elapsed="0.000659"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.946568" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:28.946272" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:28.946035" elapsed="0.000610"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.946019" elapsed="0.000652"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.947197" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:28.946851" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:28.947515" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:28.947286" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.948038" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:28.947774" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:28.947604" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.947270" elapsed="0.000845"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.948655" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:28.948291" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:28.949132" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:28.948911" elapsed="0.000276"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.949676" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:28.949375" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:28.949210" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.948729" elapsed="0.001027"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:28.949902" elapsed="0.000297"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:28.950617" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:28.950361" elapsed="0.000281"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:28.950802" elapsed="0.000215"/>
</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-10-11T01:05:28.945008" elapsed="0.006065"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:05:28.951147" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:28.951324" 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-10-11T01:05:28.934508" elapsed="0.016841"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:28.951396" elapsed="0.000051"/>
</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-10-11T01:05:28.890202" elapsed="0.061329"/>
</kw>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-10-11T01:05:28.783707" elapsed="0.167933"/>
</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-10-11T01:05:28.953141" elapsed="0.000305"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:05:28.952844" elapsed="0.000673"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:28.954604" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:28.954486" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.954464" 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-10-11T01:05:28.956744" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:28.956660" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.956643" elapsed="0.000164"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.957746" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:28.957381" elapsed="0.000391"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:05:28.958196" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:05:28.957928" elapsed="0.000293"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:05:28.958262" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:05:28.958395" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:05:28.957018" elapsed="0.001417"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:28.961151" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:28.961065" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.961047" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:28.962292" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:28.962209" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:28.962192" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:28.962733" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:05:28.962541" elapsed="0.000216"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:28.963068" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:05:28.962925" elapsed="0.000167"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:05:28.999506" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:05:28.963621" elapsed="0.035994"/>
</kw>
<msg time="2026-10-11T01:05:28.999787" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:05:28.999828" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:28.963251" elapsed="0.036612"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:05:29.038996" 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-10-11T01:05:29.000371" elapsed="0.038725"/>
</kw>
<msg time="2026-10-11T01:05:29.039242" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:05:29.039283" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:29.000030" elapsed="0.039288"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:29.039694" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:29.039464" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:29.039437" elapsed="0.000332"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.040185" 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-10-11T01:05:29.039952" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:29.040558" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:29.040315" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:29.040299" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:05:29.040664" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:05:29.043215" elapsed="0.000120"/>
</kw>
<msg time="2026-10-11T01:05:29.043396" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:29.042064" 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-10-11T01:05:29.043886" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:29.044274" elapsed="0.000086"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:05:29.041444" elapsed="0.003070"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:05:29.040953" elapsed="0.003643"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:05:28.961952" elapsed="0.082722"/>
</kw>
<msg time="2026-10-11T01:05:29.044757" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:29.044797" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:28.961366" elapsed="0.083467"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:05:29.044990" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:05:29.044903" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:29.044884" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:29.045386" elapsed="0.000093"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:29.045788" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:05:29.045853" 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-10-11T01:05:28.960772" elapsed="0.085168"/>
</kw>
<msg time="2026-10-11T01:05:29.046026" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:29.046066" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:28.958788" elapsed="0.087313"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:29.046392" elapsed="0.000118"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:29.046169" elapsed="0.000388"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:29.046152" elapsed="0.000430"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:05:28.958644" elapsed="0.087960"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:05:28.958487" elapsed="0.088144"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:05:28.956330" 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-10-11T01:05:28.954151" elapsed="0.092581"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:28.953722" elapsed="0.093051"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:05:28.952473" elapsed="0.094380"/>
</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-10-11T01:05:29.060434" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:29.060096" elapsed="0.000369"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:29.061182" 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-10-11T01:05:29.060976" elapsed="0.000278">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-10-11T01:05:29.061340" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:29.060646" elapsed="0.000717"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.061893" 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-10-11T01:05:29.061578" elapsed="0.000341"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:29.062199" 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-10-11T01:05:29.062331" 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-10-11T01:05:29.062089" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.062831" 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-10-11T01:05:29.062609" elapsed="0.000264"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.063788" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:05:29.063538" elapsed="0.000291"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.064261" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:29.064007" elapsed="0.000277"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.064894" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:29.064629" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:29.065630" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:29.065395" elapsed="0.000259"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:29.065699" elapsed="0.000032"/>
</return>
<msg time="2026-10-11T01:05:29.065827" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:29.065087" elapsed="0.000763"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:29.066015" elapsed="0.000178"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:05:29.064481" elapsed="0.001748"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.066760" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:29.066473" elapsed="0.000312"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:29.067455" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:29.067262" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:29.067523" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T01:05:29.067661" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:29.066952" elapsed="0.000732"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:29.067848" elapsed="0.000163"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:29.066327" elapsed="0.001720"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:29.064327" elapsed="0.003751"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:29.068116" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:05:29.068275" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:05:29.063185" elapsed="0.005114"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:29.062934" elapsed="0.005393"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:29.068514" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:29.068349" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:29.062917" elapsed="0.005680"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.069436" 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-10-11T01:05:29.068755" elapsed="0.000709"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:29.069509" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:29.059473" elapsed="0.010149"/>
</kw>
<msg time="2026-10-11T01:05:29.069671" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:29.055055" elapsed="0.014659"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:29.073757" 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/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-10-11T01:05:29.077857" 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/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-10-11T01:05:29.081967" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:29.082151" 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-10-11T01:05:29.082331" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:29.082695" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:29.082536" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:29.082522" 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-10-11T01:05:29.082920" 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-10-11T01:05:29.083098" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:29.083264" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:29.082497" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:29.082395" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:29.083498" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:29.083611" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:05:29.083724" 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-10-11T01:05:29.054423" elapsed="0.029326"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.084756" 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.173</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:29.084519" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:29.093691" level="INFO">DELETE Request : url=http://10.30.170.173: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.173 
 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.173 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0xv7811emqnfs16wlhl4585jl124.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:29.093739" level="INFO">DELETE Response : url=http://10.30.170.173: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.173 
 status=204, reason=No Content 
 headers={} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:29.093823" 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-10-11T01:05:29.085084" elapsed="0.008763"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:29.084858" elapsed="0.009025"/>
</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-10-11T01:05:29.094058" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:29.093907" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:29.084842" elapsed="0.009291"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.095366" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:29.095093" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:29.094852" elapsed="0.000602"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:29.094835" elapsed="0.000642"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.096050" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:29.095784" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:29.095527" elapsed="0.000595"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:29.095512" elapsed="0.000633"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.096693" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:29.096323" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:29.096991" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:29.096780" elapsed="0.000263"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.097507" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:29.097228" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:29.097065" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:29.096764" elapsed="0.000831"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.098101" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:29.097769" elapsed="0.000358"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:29.098397" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:29.098189" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.098950" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:29.098685" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:29.098504" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:29.098172" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:29.099206" elapsed="0.000311"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:29.099916" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:29.099691" elapsed="0.000250"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:29.100094" elapsed="0.000211"/>
</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-10-11T01:05:29.094504" elapsed="0.005857"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:05:29.100403" elapsed="0.000041"/>
</return>
<msg time="2026-10-11T01:05:29.100602" 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-10-11T01:05:29.083983" elapsed="0.016644"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:29.100673" elapsed="0.000025"/>
</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-10-11T01:05:29.047064" elapsed="0.053706"/>
</kw>
<doc>Revert the BGP configuration to the original state: without application peer</doc>
<status status="PASS" start="2026-10-11T01:05:28.951919" elapsed="0.148949"/>
</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-10-11T01:05:29.101805" elapsed="0.000414"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:29.102536" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects </doc>
<status status="PASS" start="2026-10-11T01:05:29.102441" elapsed="0.000193"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-10-11T01:05:29.101375" elapsed="0.001312"/>
</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-10-11T01:04:54.366542" elapsed="34.736173"/>
</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-10-11T01:05:29.139993" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:05:29.138162" elapsed="0.001881"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-10-11T01:05:29.137891" elapsed="0.002213"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.142471" 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-10-11T01:05:29.141113" elapsed="0.001385"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-10-11T01:05:29.142682" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:29.142587" elapsed="0.000135"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:29.142566" elapsed="0.000177"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.143244" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:05:29.142921" elapsed="0.000363"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.143899" 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-10-11T01:05:29.143465" elapsed="0.000459"/>
</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-10-11T01:05:29.144467" elapsed="0.000273"/>
</kw>
<msg time="2026-10-11T01:05:29.144829" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:29.144872" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:29.144094" elapsed="0.000801"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.145391" 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-10-11T01:05:29.145074" elapsed="0.000367"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.146308" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:05:29.146060" elapsed="0.000274"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.146784" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:05:29.146518" elapsed="0.000292"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.147315" 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-10-11T01:05:29.147039" elapsed="0.000302"/>
</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-10-11T01:05:29.148245" elapsed="0.000173"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.148870" level="INFO">${member_ip} = 10.30.170.173</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:29.148591" elapsed="0.000304"/>
</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-10-11T01:05:29.149063" elapsed="0.000166"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.150093" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:29.149703" elapsed="0.000415"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-11T01:05:29.150160" elapsed="0.000033"/>
</return>
<msg time="2026-10-11T01:05:29.150290" 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-10-11T01:05:29.149420" elapsed="0.000894"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:29.150830" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x743444b21450&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-10-11T01:05:29.150510" elapsed="0.000436"/>
</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-10-11T01:05:29.151112" elapsed="0.000148"/>
</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-10-11T01:05:29.147795" elapsed="0.003518"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:05:29.147622" elapsed="0.003730"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-10-11T01:05:29.147388" elapsed="0.003993"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.151947" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:05:29.151594" elapsed="0.000392"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.152536" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.173'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:05:29.152175" elapsed="0.000414"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.153115" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:05:29.152779" elapsed="0.000374"/>
</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-10-11T01:05:29.145683" elapsed="0.007522"/>
</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-10-11T01:05:29.140800" elapsed="0.012453"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:29.153398" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:29.153311" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:29.153294" elapsed="0.000180"/>
</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-10-11T01:05:29.154682" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:29.154329" elapsed="0.000378"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.155127" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:05:29.154863" elapsed="0.000288"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:05:29.155192" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:29.155319" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:05:29.154026" elapsed="0.001316"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:29.156227" level="INFO">${member_ip} = 10.30.170.173</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-10-11T01:05:29.156013" elapsed="0.000239"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:29.157049" 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-10-11T01:05:29.157142" 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-10-11T01:05:29.156903" elapsed="0.000264"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:29.160182" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:29.159528" elapsed="0.000735"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:29.159508" elapsed="0.000793"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:29.161027" 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-10-11T01:05:29.161248" 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-10-11T01:05:29.160589" elapsed="0.000710"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.162571" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.173" 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-10-11T01:05:29.161688" elapsed="0.001012"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:29.163882" 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-10-11T01:05:29.163017" elapsed="0.000916"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.165830" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T01:05:29.166002" 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-10-11T01:05:29.165279" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:29.166385" elapsed="0.000487"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T01:05:29.168033" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T01:05:29.531990" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 01:04:31 UTC 2026

  System load:  0.09               Processes:             122
  Usage of /:   14.2% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.173
  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.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 01:04:54 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T01:05:29.167789" elapsed="0.364311"/>
</kw>
<msg time="2026-10-11T01:05:29.532169" 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-10-11T01:05:29.167230" elapsed="0.365077"/>
</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-10-11T01:05:29.164371" elapsed="0.368101"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:05:29.533310" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-10-11T01:05:29.546158" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-10-11T01:05:29.546320" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T01:05:29.546447" 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-10-11T01:05:29.532871" elapsed="0.013633"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:05:29.546933" elapsed="0.000713"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.549388" 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-10-11T01:05:29.548650" elapsed="0.000977"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T01:05:29.550159" elapsed="0.000096"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:29.549851" elapsed="0.000620"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:29.549817" elapsed="0.000723"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T01:05:29.550961" elapsed="0.000108"/>
</return>
<status status="PASS" start="2026-10-11T01:05:29.550676" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:29.550652" elapsed="0.000588"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T01:05:29.551318" elapsed="0.000021"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:29.553254" elapsed="0.000689"/>
</kw>
<kw name="Open 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-10-11T01:05:29.554378" elapsed="0.000434"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:05:29.555188" elapsed="0.000415"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:05:29.552199" elapsed="0.003500"/>
</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-10-11T01:05:29.158845" elapsed="0.397009"/>
</kw>
<msg time="2026-10-11T01:05:29.555923" 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-10-11T01:05:29.158227" elapsed="0.397765"/>
</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-10-11T01:05:29.157834" elapsed="0.398257"/>
</kw>
<msg time="2026-10-11T01:05:29.556142" 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-10-11T01:05:29.157329" elapsed="0.398871"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:29.557137" elapsed="0.000449"/>
</kw>
<kw name="Open 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-10-11T01:05:29.557854" elapsed="0.000190"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:05:29.558251" 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-10-11T01:05:29.556665" elapsed="0.001840"/>
</kw>
<msg time="2026-10-11T01:05:29.558641" 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-10-11T01:05:29.156520" elapsed="0.402154"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.559293" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:29.558980" elapsed="0.000367"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-11T01:05:29.559401" elapsed="0.000078"/>
</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-10-11T01:05:29.155676" elapsed="0.403935"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:05:29.155504" elapsed="0.404154"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:05:29.155388" elapsed="0.404315"/>
</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-10-11T01:05:29.153690" elapsed="0.406082"/>
</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-10-11T01:05:29.559994" elapsed="0.000289"/>
</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-10-11T01:05:29.568435" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:29.568294" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:29.568269" elapsed="0.000255"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:29.568986" 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-10-11T01:05:29.569115" 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-10-11T01:05:29.568816" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.569771" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:29.569433" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.570394" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:29.570096" elapsed="0.000374"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:29.571541" 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-10-11T01:05:29.571275" elapsed="0.000420">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-10-11T01:05:29.571829" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T01:05:29.571886" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:29.570766" elapsed="0.001150"/>
</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-10-11T01:05:29.572321" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:29.572011" elapsed="0.000424"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:29.571987" elapsed="0.000481"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:29.573332" level="INFO">${ip_address} = 10.30.170.173</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-10-11T01:05:29.573124" elapsed="0.000232"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-10-11T01:05:29.573398" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T01:05:29.573539" level="INFO">${odl_ip} = 10.30.170.173</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-10-11T01:05:29.572773" 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-10-11T01:05:29.573756" elapsed="0.000321"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:29.574388" level="INFO">index=4
host=10.30.170.173
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-10-11T01:05:29.574492" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.173
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-10-11T01:05:29.574291" elapsed="0.000226"/>
</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-10-11T01:05:29.574695" elapsed="0.000237"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-10-11T01:05:29.575315" level="INFO">Logging into '10.30.170.173:8101' as 'karaf'.</msg>
<msg time="2026-10-11T01:05:29.807117" 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-10-11T01:05:29.575123" elapsed="0.232111"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:29.808907" elapsed="0.000281"/>
</kw>
<kw name="Open 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-10-11T01:05:29.809381" elapsed="0.000175"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:05:29.809710" elapsed="0.000094"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:05:29.808531" elapsed="0.001323"/>
</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-10-11T01:05:29.807668" elapsed="0.002229"/>
</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-10-11T01:05:29.567969" elapsed="0.241977"/>
</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-10-11T01:05:29.561318" elapsed="0.248672"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:29.560788" elapsed="0.249251"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:05:29.560576" elapsed="0.249500"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-10-11T01:05:29.560355" elapsed="0.249806"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-10-11T01:05:29.140369" elapsed="0.669850"/>
</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-10-11T01:05:29.811098" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:29.811006" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:29.810986" elapsed="0.000180"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:29.813202" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:29.813115" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:29.813098" elapsed="0.000170"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.814186" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:29.813852" elapsed="0.000360"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.814661" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:05:29.814370" elapsed="0.000315"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:05:29.814726" elapsed="0.000032"/>
</return>
<msg time="2026-10-11T01:05:29.814857" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:05:29.813524" elapsed="0.001357"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:29.817370" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:29.817284" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:29.817265" 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-10-11T01:05:29.818536" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:29.818439" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:29.818395" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:29.819035" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:05:29.818765" elapsed="0.000294"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:29.819446" 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-10-11T01:05:29.819229" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:05:29.862376" 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-10-11T01:05:29.820154" elapsed="0.042447"/>
</kw>
<msg time="2026-10-11T01:05:29.862733" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:05:29.862774" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:29.819651" elapsed="0.043159"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:05:29.950580" 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-10-11T01:05:29.863587" elapsed="0.087151"/>
</kw>
<msg time="2026-10-11T01:05:29.950866" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:05:29.950908" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:29.862983" elapsed="0.087960"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:29.951229" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:29.951013" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:29.950994" elapsed="0.000399"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.952025" 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-10-11T01:05:29.951658" elapsed="0.000494"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:29.952626" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:29.952215" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:29.952198" elapsed="0.000598"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:05:29.952828" 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">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:29.954850" elapsed="0.000413"/>
</kw>
<kw name="Open 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-10-11T01:05:29.955689" elapsed="0.000275"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:05:29.956286" 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-10-11T01:05:29.954102" elapsed="0.002531"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:05:29.953119" 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-10-11T01:05:29.818211" elapsed="0.138627"/>
</kw>
<msg time="2026-10-11T01:05:29.956921" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:29.956962" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:29.817634" elapsed="0.139362"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:05:29.957153" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:05:29.957066" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:29.957048" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:29.957602" 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-10-11T01:05:29.957909" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:05:29.957974" 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-10-11T01:05:29.817044" elapsed="0.141016"/>
</kw>
<msg time="2026-10-11T01:05:29.958143" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:29.958185" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:29.815220" elapsed="0.143000"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:29.958659" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:29.958286" elapsed="0.000427"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:29.958270" elapsed="0.000467"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:05:29.815070" elapsed="0.143689"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:05:29.814929" elapsed="0.143855"/>
</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-10-11T01:05:29.812876" elapsed="0.145956"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-10-11T01:05:29.810825" elapsed="0.148056"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:29.810381" elapsed="0.148538"/>
</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-10-11T01:05:29.137616" elapsed="0.821348"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:29.959467" 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-10-11T01:05:29.959147" elapsed="0.000347"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:29.959993" level="INFO">${conn_id} = 7</msg>
<arg>${conn_id}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:05:29.959708" elapsed="0.000324"/>
</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-10-11T01:05:29.961567" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T01:05:29.961640" 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-10-11T01:05:29.961280" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:29.961859" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T01:05:29.962990" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T01:05:30.329645" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 01:04:31 UTC 2026

  System load:  0.09               Processes:             122
  Usage of /:   14.2% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.173
  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.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 01:05:29 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T01:05:29.962762" elapsed="0.367035"/>
</kw>
<msg time="2026-10-11T01:05:30.329882" 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-10-11T01:05:29.962335" elapsed="0.367627"/>
</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-10-11T01:05:29.960902" elapsed="0.369170"/>
</kw>
<msg time="2026-10-11T01:05:30.330123" 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-10-11T01:05:29.960529" elapsed="0.369637"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-10-11T01:05:29.960222" elapsed="0.370016"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:30.330862" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x74344564aa90&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-10-11T01:05:30.330531" elapsed="0.000833"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T01:05:30.341601" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-10-11T01:05:30.355893" 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-10-11T01:05:30.331591" elapsed="0.024390"/>
</kw>
<kw name="Assure_Library_Ipaddr" owner="SSHKeywords">
<kw name="Execute_Command_Passes" owner="SSHKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:05:30.357925" level="INFO">Executing command 'bash -c 'cd "." &amp;&amp; python -c "import ipaddr"''.</msg>
<msg time="2026-10-11T01:05:30.400847" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:05:30.401076" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T01:05:30.401163" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T01:05:30.401242" 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-10-11T01:05:30.357691" elapsed="0.043598"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.403170" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T01:05:30.402631" elapsed="0.000631"/>
</kw>
<msg time="2026-10-11T01:05:30.403478" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T01:05:30.403589" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:30.401775" elapsed="0.001862"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.404877" 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-10-11T01:05:30.404043" elapsed="0.000887"/>
</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-10-11T01:05:30.405721" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.405094" elapsed="0.000752"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.405050" elapsed="0.000848"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="PASS" start="2026-10-11T01:05:30.406171" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-10-11T01:05:30.406007" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.405977" elapsed="0.000369"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-10-11T01:05:30.406575" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:30.406486" elapsed="0.000170"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:30.406453" elapsed="0.000246"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.407033" elapsed="0.000042"/>
</kw>
<msg time="2026-10-11T01:05:30.407296" 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-10-11T01:05:30.357087" elapsed="0.050374"/>
</kw>
<if>
<branch type="IF" condition="${passed}">
<return>
<status status="PASS" start="2026-10-11T01:05:30.407796" elapsed="0.000053"/>
</return>
<status status="PASS" start="2026-10-11T01:05:30.407635" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.407597" elapsed="0.000359"/>
</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-10-11T01:05:30.408337" elapsed="0.000043"/>
</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-10-11T01:05:30.356401" elapsed="0.052133"/>
</kw>
<doc>Initialize SetupUtils. Suite setup keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:29.137275" elapsed="1.271386"/>
</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-10-11T01:05:30.411868" elapsed="0.000463"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:05:30.411148" elapsed="0.001354"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:30.414694" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:30.414472" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.414401" elapsed="0.000432"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:30.419881" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:30.419695" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.419655" elapsed="0.000363"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.422110" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:30.421342" elapsed="0.000825"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.423156" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:05:30.422575" elapsed="0.000633"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:05:30.423297" elapsed="0.000062"/>
</return>
<msg time="2026-10-11T01:05:30.423632" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:05:30.420519" elapsed="0.003156"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:30.427632" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:30.427491" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.427465" elapsed="0.000259"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:30.429298" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:30.429174" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.429148" elapsed="0.000241"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:30.429951" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:05:30.429688" elapsed="0.000300"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:30.430483" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:05:30.430240" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:05:30.469083" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:05:30.431275" elapsed="0.037910"/>
</kw>
<msg time="2026-10-11T01:05:30.469344" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:05:30.469388" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:30.430779" elapsed="0.038671"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:05:30.529597" 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-10-11T01:05:30.470016" elapsed="0.059729"/>
</kw>
<msg time="2026-10-11T01:05:30.529979" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:05:30.530022" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:30.469647" elapsed="0.060412"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.530395" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.530142" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.530119" elapsed="0.000378"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.530984" 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-10-11T01:05:30.530706" elapsed="0.000356"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.531331" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.531124" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.531107" elapsed="0.000294"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:05:30.531453" 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-10-11T01:05:30.533968" elapsed="0.000277"/>
</kw>
<msg time="2026-10-11T01:05:30.534304" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:30.532943" elapsed="0.001592"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.534871" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.535216" 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-10-11T01:05:30.532306" 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-10-11T01:05:30.531806" 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-10-11T01:05:30.428797" elapsed="0.106778"/>
</kw>
<msg time="2026-10-11T01:05:30.535659" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:30.535700" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:30.427953" elapsed="0.107782"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:05:30.535890" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:05:30.535803" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.535786" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.536300" elapsed="0.000022"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.536639" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:05:30.536705" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T01:05:30.427052" elapsed="0.109737"/>
</kw>
<msg time="2026-10-11T01:05:30.536872" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:30.536913" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:30.424289" elapsed="0.112658"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.537239" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.537013" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.536998" elapsed="0.000311"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:05:30.424069" elapsed="0.113262"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:05:30.423836" elapsed="0.113525"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:05:30.418960" elapsed="0.118557"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:05:30.413879" elapsed="0.123740"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:30.412874" elapsed="0.124788"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:05:30.410186" elapsed="0.127534"/>
</kw>
<for flavor="IN ZIP">
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.538813" 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-10-11T01:05:30.538176" elapsed="0.000666"/>
</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-10-11T01:05:30.549444" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:30.549126" elapsed="0.000346"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:30.550205" 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-10-11T01:05:30.549977" elapsed="0.000303">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-10-11T01:05:30.550377" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:30.549651" elapsed="0.000775"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.550941" 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-10-11T01:05:30.550629" elapsed="0.000338"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:30.551252" 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-10-11T01:05:30.551402" 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-10-11T01:05:30.551139" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.551879" 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-10-11T01:05:30.551660" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.553037" 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-10-11T01:05:30.552615" elapsed="0.000466"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.553530" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:30.553263" elapsed="0.000304"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.554169" 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-10-11T01:05:30.553894" elapsed="0.000300"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:30.555078" 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-10-11T01:05:30.554721" elapsed="0.000382"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:30.555148" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:30.555276" 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-10-11T01:05:30.554369" 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-10-11T01:05:30.555491" elapsed="0.000202"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-10-11T01:05:30.553757" elapsed="0.001978"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.556254" 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-10-11T01:05:30.555988" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:30.557260" 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-10-11T01:05:30.556893" elapsed="0.000426"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:30.557366" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:30.557517" 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-10-11T01:05:30.556486" 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-10-11T01:05:30.557726" elapsed="0.000166"/>
</kw>
<var name="${key}">TYPE</var>
<var name="${value}">external</var>
<status status="PASS" start="2026-10-11T01:05:30.555852" elapsed="0.002077"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.558457" 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-10-11T01:05:30.558162" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:30.559329" 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-10-11T01:05:30.558986" elapsed="0.000367"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:30.559398" elapsed="0.000048"/>
</return>
<msg time="2026-10-11T01:05:30.559564" 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-10-11T01:05:30.558668" elapsed="0.000920"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:30.559760" elapsed="0.000167"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T01:05:30.558027" elapsed="0.001935"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.560489" 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-10-11T01:05:30.560195" elapsed="0.000318"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:30.561348" 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-10-11T01:05:30.561008" elapsed="0.000364"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:30.561436" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:05:30.561578" 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-10-11T01:05:30.560698" elapsed="0.000904"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:30.561775" elapsed="0.000164"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T01:05:30.560061" elapsed="0.001914"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.562502" 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-10-11T01:05:30.562209" elapsed="0.000317"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:30.563360" 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-10-11T01:05:30.563021" elapsed="0.000363"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:30.563446" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:30.563586" 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-10-11T01:05:30.562709" elapsed="0.000900"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:30.563777" elapsed="0.000164"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T01:05:30.562074" elapsed="0.001902"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.565871" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:30.564206" elapsed="0.001691"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:30.566774" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:30.566386" elapsed="0.000414"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:30.566845" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:30.566972" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:30.566071" elapsed="0.000924"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:30.567165" elapsed="0.000168"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:30.564073" elapsed="0.003297"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.567914" 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-10-11T01:05:30.567638" elapsed="0.000302"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:30.568802" 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-10-11T01:05:30.568440" elapsed="0.000388"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:30.568903" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:30.569030" 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-10-11T01:05:30.568112" 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-10-11T01:05:30.569222" elapsed="0.000165"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T01:05:30.567489" elapsed="0.001957"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:30.553611" elapsed="0.015867"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:30.569516" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T01:05:30.569661" 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-10-11T01:05:30.552240" elapsed="0.017446"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:30.551983" elapsed="0.017733"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.569893" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.569739" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.551966" elapsed="0.017998"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.570783" 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-10-11T01:05:30.570128" elapsed="0.000683"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:30.570855" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:05:30.548616" elapsed="0.022339"/>
</kw>
<msg time="2026-10-11T01:05:30.571004" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:30.544162" elapsed="0.026886"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:05:30.575258" 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/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-10-11T01:05:30.579489" 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/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-10-11T01:05:30.583683" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.583868" 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-10-11T01:05:30.584055" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.584400" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.584249" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:30.584235" 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-10-11T01:05:30.584663" 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-10-11T01:05:30.584882" 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-10-11T01:05:30.585051" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:30.584210" elapsed="0.000889"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:30.584120" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.585278" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:30.585343" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:30.585467" 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-10-11T01:05:30.543566" elapsed="0.041926"/>
</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-10-11T01:05:30.594888" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:30.594577" elapsed="0.000338"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:30.595631" 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-10-11T01:05:30.595417" elapsed="0.000276">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-10-11T01:05:30.595779" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:30.595079" elapsed="0.000722"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.596293" 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-10-11T01:05:30.595981" elapsed="0.000338"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:30.596646" 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-10-11T01:05:30.596774" 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-10-11T01:05:30.596508" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.597226" 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-10-11T01:05:30.597002" elapsed="0.000270"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:05:30.597640" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.597333" elapsed="0.000363"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.598139" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:30.597871" elapsed="0.000293"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:30.597719" elapsed="0.000477"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.597316" elapsed="0.000900"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.599014" 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-10-11T01:05:30.598383" elapsed="0.000660"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:30.599086" 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-10-11T01:05:30.594004" elapsed="0.005187"/>
</kw>
<msg time="2026-10-11T01:05:30.599283" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:30.589511" elapsed="0.009819"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:05:30.603762" 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/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-10-11T01:05:30.608008" 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/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-10-11T01:05:30.612345" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.612558" 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-10-11T01:05:30.612748" 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-10-11T01:05:30.613091" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.612941" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:30.612927" 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-10-11T01:05:30.613322" 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-10-11T01:05:30.613523" 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-10-11T01:05:30.613707" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:30.612902" elapsed="0.000853"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:30.612813" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.613934" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:30.614000" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:30.614110" 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-10-11T01:05:30.588787" elapsed="0.025350"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:30.615312" 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-10-11T01:05:30.615117" elapsed="0.000256">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-10-11T01:05:30.615475" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:30.614750" 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-10-11T01:05:30.615805" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.615577" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.616326" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:30.616064" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:30.615881" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.615559" elapsed="0.000858"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.616947" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:30.616606" elapsed="0.000365"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:30.617016" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:30.617140" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:30.614426" elapsed="0.002737"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.618517" 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-10-11T01:05:30.618246" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.619019" 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-10-11T01:05:30.618791" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.619514" 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-10-11T01:05:30.619271" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.619991" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:30.619768" elapsed="0.000273"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:30.620846" 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-10-11T01:05:30.620673" elapsed="0.000199"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:05:30.621197" 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-10-11T01:05:30.621034" elapsed="0.000188"/>
</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-10-11T01:05:30.621392" elapsed="0.000201"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.622016" 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-10-11T01:05:30.621791" elapsed="0.000265"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:05:30.622108" elapsed="0.000035"/>
</return>
<msg time="2026-10-11T01:05:30.622249" 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-10-11T01:05:30.620254" 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-10-11T01:05:30.637936" level="INFO">PUT Request : url=http://10.30.170.173: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.34.2', '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-10-11T01:05:30.637993" level="INFO">PUT Response : url=http://10.30.170.173: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=node04zxcc0fk4bkfg607mewx0lv525.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Sat, 10-Oct-2026 01:05:30 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:30.638212" 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-10-11T01:05:30.622624" elapsed="0.015624"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:30.622340" elapsed="0.015950"/>
</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-10-11T01:05:30.638515" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.638317" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.622322" elapsed="0.016290"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.640091" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:30.639806" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:30.639534" elapsed="0.000631"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.639292" elapsed="0.000897"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.640814" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:30.640520" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:30.640239" elapsed="0.000648"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.640223" elapsed="0.000686"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.641507" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:30.641107" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.641843" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.641615" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.642365" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:30.642094" elapsed="0.000296"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:30.641919" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.641597" elapsed="0.000876"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.643021" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:30.642674" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.643331" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.643111" elapsed="0.000272"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.643895" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:30.643624" elapsed="0.000296"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:30.643421" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.643094" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:30.644126" elapsed="0.000316"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:30.644871" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:30.644637" elapsed="0.000259"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:30.645055" elapsed="0.000219"/>
</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-10-11T01:05:30.638997" elapsed="0.006334"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:05:30.645494" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-10-11T01:05:30.645389" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.645373" 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-10-11T01:05:30.645754" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:05:30.645815" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:05:30.645980" 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-10-11T01:05:30.617483" elapsed="0.028522"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:30.646061" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:30.646188" 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-10-11T01:05:30.539762" elapsed="0.106448"/>
</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-10-11T01:05:30.646587" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.646334" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.646317" elapsed="0.000357"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:30.646706" elapsed="0.000024"/>
</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-10-11T01:05:30.539109" elapsed="0.107697"/>
</kw>
<var name="${i}">2</var>
<var name="${type}">external</var>
<status status="PASS" start="2026-10-11T01:05:30.537981" elapsed="0.108861"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.647715" 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-10-11T01:05:30.647115" elapsed="0.000627"/>
</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-10-11T01:05:30.658776" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:30.658431" elapsed="0.000378"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:30.659532" 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-10-11T01:05:30.659316" elapsed="0.000309">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-10-11T01:05:30.659712" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:30.658985" elapsed="0.000751"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.660252" 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-10-11T01:05:30.659936" elapsed="0.000341"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:30.660595" 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-10-11T01:05:30.660730" 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-10-11T01:05:30.660467" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.661195" 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-10-11T01:05:30.660972" elapsed="0.000265"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.662190" 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-10-11T01:05:30.661953" elapsed="0.000280"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.662703" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:30.662429" elapsed="0.000300"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.663357" 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-10-11T01:05:30.663085" elapsed="0.000296"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:30.664303" 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-10-11T01:05:30.663917" elapsed="0.000412"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:30.664374" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:30.664523" 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-10-11T01:05:30.663589" 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-10-11T01:05:30.664734" elapsed="0.000211"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-10-11T01:05:30.662940" elapsed="0.002052"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.665524" 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-10-11T01:05:30.665232" elapsed="0.000329"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:30.666448" 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-10-11T01:05:30.666073" elapsed="0.000401"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:30.666519" elapsed="0.000045"/>
</return>
<msg time="2026-10-11T01:05:30.666674" 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-10-11T01:05:30.665741" 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-10-11T01:05:30.666868" elapsed="0.000180"/>
</kw>
<var name="${key}">TYPE</var>
<var name="${value}">internal</var>
<status status="PASS" start="2026-10-11T01:05:30.665095" elapsed="0.001991"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.667631" 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-10-11T01:05:30.667323" elapsed="0.000334"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:30.668560" 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-10-11T01:05:30.668159" elapsed="0.000428"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:30.668634" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:30.668762" 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-10-11T01:05:30.667827" 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-10-11T01:05:30.668959" elapsed="0.000344"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T01:05:30.667187" elapsed="0.002154"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.669890" 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-10-11T01:05:30.669616" elapsed="0.000298"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:30.670819" 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-10-11T01:05:30.670447" elapsed="0.000397"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:30.670895" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:30.671022" 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-10-11T01:05:30.670099" 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-10-11T01:05:30.671227" elapsed="0.000170"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T01:05:30.669464" elapsed="0.001992"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.671984" 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-10-11T01:05:30.671708" elapsed="0.000301"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:30.672906" 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-10-11T01:05:30.672554" elapsed="0.000378"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:30.672976" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:30.673103" 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-10-11T01:05:30.672195" elapsed="0.000932"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:30.673310" elapsed="0.000192"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T01:05:30.671570" elapsed="0.001981"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.674062" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:30.673791" elapsed="0.000295"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:30.674982" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:30.674630" elapsed="0.000377"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:30.675050" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:30.675177" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:30.674273" 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-10-11T01:05:30.675382" elapsed="0.000206"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:30.673653" elapsed="0.002005"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.676172" 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-10-11T01:05:30.675896" elapsed="0.000301"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:30.677095" 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-10-11T01:05:30.676746" elapsed="0.000375"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:30.677165" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:30.677305" 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-10-11T01:05:30.676382" 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-10-11T01:05:30.677522" elapsed="0.000184"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T01:05:30.675759" elapsed="0.001985"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:30.662776" elapsed="0.015000"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:30.677816" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:05:30.677949" 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-10-11T01:05:30.661588" elapsed="0.016385"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:30.661298" elapsed="0.016705"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.678181" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.678025" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.661280" elapsed="0.016974"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.679083" 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-10-11T01:05:30.678457" elapsed="0.000653"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:30.679153" 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/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-10-11T01:05:30.657895" elapsed="0.021360"/>
</kw>
<msg time="2026-10-11T01:05:30.679318" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:30.653171" elapsed="0.026196"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:05:30.683850" 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/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-10-11T01:05:30.688133" 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/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-10-11T01:05:30.692385" elapsed="0.000039"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.692616" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.692842" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.693189" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.693037" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:30.693024" 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-10-11T01:05:30.693436" 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-10-11T01:05:30.693651" 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-10-11T01:05:30.693831" elapsed="0.000024"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:30.692999" elapsed="0.000886"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:30.692911" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.694065" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:30.694130" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:30.694246" 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-10-11T01:05:30.652531" elapsed="0.041740"/>
</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-10-11T01:05:30.703693" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:30.703350" elapsed="0.000371"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:30.704418" 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-10-11T01:05:30.704231" elapsed="0.000250">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-10-11T01:05:30.704578" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:30.703905" elapsed="0.000698"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.705110" 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-10-11T01:05:30.704780" elapsed="0.000356"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:30.705432" 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-10-11T01:05:30.705596" 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-10-11T01:05:30.705307" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.706063" 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-10-11T01:05:30.705826" 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-10-11T01:05:30.706439" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.706169" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.706968" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:30.706680" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:30.706515" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.706152" elapsed="0.000927"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.707868" 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-10-11T01:05:30.707252" elapsed="0.000646"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:30.707955" 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-10-11T01:05:30.702772" elapsed="0.005291"/>
</kw>
<msg time="2026-10-11T01:05:30.708112" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:30.698209" elapsed="0.009947"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:05:30.712560" 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/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-10-11T01:05:30.716812" 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/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-10-11T01:05:30.721061" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.721264" elapsed="0.000022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.721475" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.721832" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.721682" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:30.721668" 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-10-11T01:05:30.722063" 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-10-11T01:05:30.722262" 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-10-11T01:05:30.722450" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:30.721643" elapsed="0.000857"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:30.721553" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.722730" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:30.722803" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:30.722915" 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-10-11T01:05:30.697470" elapsed="0.025472"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:30.724206" 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-10-11T01:05:30.724020" elapsed="0.000249">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-10-11T01:05:30.724364" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:30.723686" elapsed="0.000701"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.724712" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.724468" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.725226" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:30.724961" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:30.724786" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.724450" elapsed="0.000862"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.725864" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:30.725502" elapsed="0.000386"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:30.725932" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:30.726059" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:30.723260" elapsed="0.002822"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.727334" 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-10-11T01:05:30.727112" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.727834" 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-10-11T01:05:30.727616" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.728290" 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-10-11T01:05:30.728073" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.728787" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:30.728565" elapsed="0.000262"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:30.729569" 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-10-11T01:05:30.729367" elapsed="0.000229"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:05:30.729898" 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-10-11T01:05:30.729755" elapsed="0.000166"/>
</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-10-11T01:05:30.730086" elapsed="0.000156"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.730714" 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-10-11T01:05:30.730469" elapsed="0.000285"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:05:30.730793" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:30.730922" 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-10-11T01:05:30.729009" elapsed="0.001936"/>
</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-10-11T01:05:30.742063" level="INFO">PUT Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node04zxcc0fk4bkfg607mewx0lv525.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-10-11T01:05:30.742146" level="INFO">PUT Response : url=http://10.30.170.173: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-10-11T01:05:30.742230" 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-10-11T01:05:30.731243" elapsed="0.011011"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:30.731008" elapsed="0.011288"/>
</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-10-11T01:05:30.742501" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.742319" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.730991" elapsed="0.011609"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.743790" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:30.743483" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:30.743224" elapsed="0.000639"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.743207" elapsed="0.000679"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.744463" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:30.744178" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:30.743934" elapsed="0.000614"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.743919" elapsed="0.000654"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.745133" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:30.744783" elapsed="0.000377"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.745469" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.745228" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.746028" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:30.745755" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:30.745557" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.745206" elapsed="0.000900"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.746673" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:30.746290" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.747009" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.746781" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.747532" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:30.747253" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:30.747083" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.746762" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:30.747796" elapsed="0.000298"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:30.748500" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:30.748259" elapsed="0.000265"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:30.748700" elapsed="0.000227"/>
</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-10-11T01:05:30.742935" elapsed="0.006048"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:05:30.749124" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:05:30.749041" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.749024" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.749349" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:05:30.749424" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:30.749601" 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-10-11T01:05:30.726395" elapsed="0.023231"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:30.749715" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:30.749858" 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-10-11T01:05:30.648619" elapsed="0.101264"/>
</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-10-11T01:05:30.750178" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.749970" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.749954" elapsed="0.000306"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:30.750290" elapsed="0.000023"/>
</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-10-11T01:05:30.647996" elapsed="0.102392"/>
</kw>
<var name="${i}">3</var>
<var name="${type}">internal</var>
<status status="PASS" start="2026-10-11T01:05:30.646946" elapsed="0.103494"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.751283" 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-10-11T01:05:30.750728" elapsed="0.000583"/>
</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-10-11T01:05:30.762218" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:30.761900" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:30.762953" 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-10-11T01:05:30.762775" elapsed="0.000239">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-10-11T01:05:30.763104" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:30.762425" elapsed="0.000711"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.763666" 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-10-11T01:05:30.763318" elapsed="0.000374"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:30.763975" 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-10-11T01:05:30.764094" 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-10-11T01:05:30.763866" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.764602" 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-10-11T01:05:30.764338" 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-10-11T01:05:30.765588" 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-10-11T01:05:30.765321" elapsed="0.000311"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.766060" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:30.765814" elapsed="0.000269"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.766737" 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-10-11T01:05:30.766444" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:30.767660" 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-10-11T01:05:30.767264" elapsed="0.000422"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:30.767731" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:30.767892" 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-10-11T01:05:30.766933" 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-10-11T01:05:30.768086" elapsed="0.000183"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.4</var>
<status status="PASS" start="2026-10-11T01:05:30.766290" elapsed="0.002018"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.768850" 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-10-11T01:05:30.768578" elapsed="0.000297"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:30.769769" 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-10-11T01:05:30.769378" elapsed="0.000417"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:30.769840" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:30.769966" 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-10-11T01:05:30.769048" 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-10-11T01:05:30.770158" elapsed="0.000183"/>
</kw>
<var name="${key}">TYPE</var>
<var name="${value}">internal</var>
<status status="PASS" start="2026-10-11T01:05:30.768423" elapsed="0.001955"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.771084" 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-10-11T01:05:30.770665" elapsed="0.000444"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:30.772003" 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-10-11T01:05:30.771652" elapsed="0.000376"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:30.772073" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:30.772197" 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-10-11T01:05:30.771283" 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-10-11T01:05:30.772431" elapsed="0.000190"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T01:05:30.770506" elapsed="0.002154"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.773162" 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-10-11T01:05:30.772894" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:30.774072" 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-10-11T01:05:30.773723" elapsed="0.000374"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:30.774141" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:30.774267" 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-10-11T01:05:30.773363" elapsed="0.000927"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:30.774504" elapsed="0.000185"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T01:05:30.772758" elapsed="0.001969"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.775230" 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-10-11T01:05:30.774960" elapsed="0.000295"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:30.776134" 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-10-11T01:05:30.775791" elapsed="0.000369"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:30.776204" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:30.776330" 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-10-11T01:05:30.775457" elapsed="0.000896"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:30.776573" elapsed="0.000171"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T01:05:30.774825" elapsed="0.001958"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.777284" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:30.777015" elapsed="0.000294"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:30.778187" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:30.777844" elapsed="0.000368"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:30.778258" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:30.778384" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:30.777514" elapsed="0.000920"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:30.778675" elapsed="0.000177"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:30.776880" elapsed="0.002009"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.779394" 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-10-11T01:05:30.779125" elapsed="0.000315"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:30.780307" 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-10-11T01:05:30.779960" elapsed="0.000373"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:30.780378" elapsed="0.000053"/>
</return>
<msg time="2026-10-11T01:05:30.780560" 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-10-11T01:05:30.779642" 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-10-11T01:05:30.780762" elapsed="0.000170"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T01:05:30.778990" elapsed="0.001980"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:30.766128" elapsed="0.014874"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:30.781040" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:30.781171" 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-10-11T01:05:30.764961" elapsed="0.016234"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:30.764708" elapsed="0.016517"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.781400" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.781247" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.764691" elapsed="0.016801"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.782284" 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-10-11T01:05:30.781683" elapsed="0.000628"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:30.782354" 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/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-10-11T01:05:30.761358" elapsed="0.021131"/>
</kw>
<msg time="2026-10-11T01:05:30.782551" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:30.756842" elapsed="0.025768"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:05:30.787069" 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/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-10-11T01:05:30.791329" 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/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-10-11T01:05:30.795645" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.795875" 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-10-11T01:05:30.796096" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.796459" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.796288" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:30.796275" 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-10-11T01:05:30.796727" 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-10-11T01:05:30.796933" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.797106" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:30.796251" elapsed="0.000902"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:30.796164" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.797332" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:30.797397" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:05:30.797527" 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-10-11T01:05:30.756205" elapsed="0.041357"/>
</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-10-11T01:05:30.806863" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:30.806553" elapsed="0.000337"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:30.807613" 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-10-11T01:05:30.807400" elapsed="0.000273">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-10-11T01:05:30.807758" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:30.807055" elapsed="0.000727"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.808285" 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-10-11T01:05:30.807960" elapsed="0.000351"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:30.808626" 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-10-11T01:05:30.808749" 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-10-11T01:05:30.808503" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.809207" 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-10-11T01:05:30.808976" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:05:30.809603" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.809315" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.810096" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:30.809831" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:30.809680" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.809298" elapsed="0.000930"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.811021" 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-10-11T01:05:30.810397" elapsed="0.000652"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:30.811093" 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-10-11T01:05:30.805997" elapsed="0.005201"/>
</kw>
<msg time="2026-10-11T01:05:30.811261" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:30.801490" elapsed="0.009816"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:05:30.816570" 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/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-10-11T01:05:30.820838" 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/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-10-11T01:05:30.825010" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.825197" 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-10-11T01:05:30.825383" 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-10-11T01:05:30.825777" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.825626" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:30.825613" 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-10-11T01:05:30.826009" 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-10-11T01:05:30.826193" 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-10-11T01:05:30.826389" elapsed="0.000035"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:30.825587" elapsed="0.000868"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:30.825485" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.826671" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:30.826740" elapsed="0.000017"/>
</return>
<msg time="2026-10-11T01:05:30.826874" 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-10-11T01:05:30.800747" elapsed="0.026196"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:30.828170" 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-10-11T01:05:30.827959" elapsed="0.000277">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-10-11T01:05:30.828321" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:30.827603" elapsed="0.000741"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.828677" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.828424" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.829211" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:30.828942" elapsed="0.000294"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:30.828751" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.828392" elapsed="0.000896"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.829829" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:30.829469" elapsed="0.000385"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:30.829900" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:30.830027" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:30.827243" elapsed="0.002807"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.831296" 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-10-11T01:05:30.831071" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.831821" 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-10-11T01:05:30.831604" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.832278" 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-10-11T01:05:30.832061" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.832754" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:30.832525" elapsed="0.000269"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:30.833532" 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-10-11T01:05:30.833343" elapsed="0.000225"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:05:30.833872" 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-10-11T01:05:30.833727" elapsed="0.000169"/>
</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-10-11T01:05:30.834061" elapsed="0.000163"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.834679" 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-10-11T01:05:30.834436" elapsed="0.000284"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:05:30.834758" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:30.834886" 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-10-11T01:05:30.832980" elapsed="0.001929"/>
</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-10-11T01:05:30.847063" level="INFO">PUT Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node04zxcc0fk4bkfg607mewx0lv525.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-10-11T01:05:30.847147" level="INFO">PUT Response : url=http://10.30.170.173: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-10-11T01:05:30.847244" 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-10-11T01:05:30.835204" elapsed="0.012065"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:30.834971" elapsed="0.012339"/>
</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-10-11T01:05:30.847513" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.847334" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.834955" elapsed="0.012662"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.848782" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:30.848494" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:30.848236" elapsed="0.000617"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.848219" elapsed="0.000660"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.849451" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:30.849171" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:30.848931" elapsed="0.000594"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.848916" elapsed="0.000642"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.850093" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:30.849742" elapsed="0.000377"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.850403" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.850182" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.850942" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:30.850677" elapsed="0.000292"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:30.850495" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.850166" elapsed="0.000856"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.851572" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:30.851207" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.851888" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.851662" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.852396" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:30.852135" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:30.851962" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.851645" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:30.852686" elapsed="0.000297"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:30.853372" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:30.853148" elapsed="0.000248"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:30.853581" elapsed="0.000214"/>
</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-10-11T01:05:30.847945" elapsed="0.005906"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:05:30.853993" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:05:30.853910" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.853893" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.854219" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:05:30.854280" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:05:30.854454" 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-10-11T01:05:30.830352" elapsed="0.024127"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:30.854581" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:30.854711" 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-10-11T01:05:30.752180" elapsed="0.102555"/>
</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-10-11T01:05:30.855024" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.854820" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.854804" elapsed="0.000303"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:30.855137" elapsed="0.000024"/>
</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-10-11T01:05:30.751595" elapsed="0.103639"/>
</kw>
<var name="${i}">4</var>
<var name="${type}">internal</var>
<status status="PASS" start="2026-10-11T01:05:30.750550" elapsed="0.104719"/>
</iter>
<var>${i}</var>
<var>${type}</var>
<value>${ODL_IP_INDICES_ALL}</value>
<value>${BGP_PEER_TYPES}</value>
<status status="PASS" start="2026-10-11T01:05:30.537791" elapsed="0.317512"/>
</for>
<doc>Configures BGP peer module with initiate-connection set to false.</doc>
<status status="PASS" start="2026-10-11T01:05:30.408781" elapsed="0.446644"/>
</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-10-11T01:05:30.857093" elapsed="0.000203"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:05:30.856836" elapsed="0.000511"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:30.858271" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:30.858184" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.858166" elapsed="0.000168"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:30.860594" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:30.860498" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.860481" elapsed="0.000177"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.861608" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:30.861242" elapsed="0.000393"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.862065" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:05:30.861799" elapsed="0.000291"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:05:30.862131" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:30.862260" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:05:30.860873" elapsed="0.001411"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:30.864883" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:30.864798" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.864780" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:30.866022" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:30.865939" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.865922" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:30.866402" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:05:30.866236" elapsed="0.000214"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:30.866770" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:05:30.866630" elapsed="0.000164"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:05:30.904623" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:05:30.867288" elapsed="0.037448"/>
</kw>
<msg time="2026-10-11T01:05:30.904893" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:05:30.904936" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:30.866954" elapsed="0.038018"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:05:30.952015" 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-10-11T01:05:30.905574" elapsed="0.046554"/>
</kw>
<msg time="2026-10-11T01:05:30.952284" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:05:30.952327" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:30.905190" elapsed="0.047173"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.952709" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.952465" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.952439" elapsed="0.000346"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.953211" 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-10-11T01:05:30.952974" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.953594" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.953343" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.953325" elapsed="0.000343"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:05:30.953699" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:05:30.956296" elapsed="0.000291"/>
</kw>
<msg time="2026-10-11T01:05:30.956650" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:30.955129" elapsed="0.001653"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.957151" elapsed="0.000082"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.957560" 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-10-11T01:05:30.954507" 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-10-11T01:05:30.953992" elapsed="0.003825"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:05:30.865683" elapsed="0.092210"/>
</kw>
<msg time="2026-10-11T01:05:30.957974" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:30.958016" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:30.865102" elapsed="0.092950"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:05:30.958208" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:05:30.958120" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.958102" elapsed="0.000183"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.958706" 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-10-11T01:05:30.959020" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:05:30.959085" 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-10-11T01:05:30.864500" elapsed="0.094671"/>
</kw>
<msg time="2026-10-11T01:05:30.959255" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:30.959296" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:30.862658" elapsed="0.096675"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:30.959752" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:30.959400" elapsed="0.000436"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.959384" elapsed="0.000478"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:05:30.862497" elapsed="0.097388"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:05:30.862334" elapsed="0.097578"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:05:30.860183" elapsed="0.099778"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:05:30.857931" elapsed="0.102082"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:30.857517" elapsed="0.102536"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:05:30.856458" elapsed="0.103644"/>
</kw>
<for flavor="IN ZIP">
<iter>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.960755" level="INFO">IP: 127.0.0.2</msg>
<msg time="2026-10-11T01:05:30.960807" 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-10-11T01:05:30.960484" elapsed="0.000358"/>
</kw>
<kw name="Start_Bgp_Peer">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.961762" level="INFO">${command} = python3 play.py --amount 0 --myip=127.0.0.2 --myport=17900 --peerip=10.30.170.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:30.961381" elapsed="0.000408"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.962206" level="INFO">python3 play.py --amount 0 --myip=127.0.0.2 --myport=17900 --peerip=10.30.170.173 --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-10-11T01:05:30.961991" elapsed="0.000258"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:05:30.966088" level="INFO">python3 play.py --amount 0 --myip=127.0.0.2 --myport=17900 --peerip=10.30.170.173 --asnumber=65000 --peerport=1790 --port=8002 --usepeerip --debug --allf --wfr 1 &amp;&gt; play.py.090.2 &amp;</msg>
<msg time="2026-10-11T01:05:30.966174" level="INFO">${output} =  python3 play.py --amount 0 --myip=127.0.0.2 --myport=17900 --peerip=10.30.170.173 --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-10-11T01:05:30.962419" elapsed="0.003781"/>
</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-10-11T01:05:30.960976" elapsed="0.005279"/>
</kw>
<var name="${i}">2</var>
<var name="${as_number}">65000</var>
<status status="PASS" start="2026-10-11T01:05:30.960312" elapsed="0.005976"/>
</iter>
<iter>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.966796" level="INFO">IP: 127.0.0.3</msg>
<msg time="2026-10-11T01:05:30.966846" 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-10-11T01:05:30.966552" elapsed="0.000329"/>
</kw>
<kw name="Start_Bgp_Peer">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.967780" level="INFO">${command} = python3 play.py --amount 0 --myip=127.0.0.3 --myport=17900 --peerip=10.30.170.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:30.967401" elapsed="0.000406"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.968223" level="INFO">python3 play.py --amount 0 --myip=127.0.0.3 --myport=17900 --peerip=10.30.170.173 --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-10-11T01:05:30.968010" elapsed="0.000255"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:05:30.968961" level="INFO">[?2004l[1] 5944</msg>
<msg time="2026-10-11T01:05:30.969045" level="INFO">${output} = [?2004l[1] 5944
</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-10-11T01:05:30.968437" elapsed="0.000632"/>
</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-10-11T01:05:30.967000" elapsed="0.002124"/>
</kw>
<var name="${i}">3</var>
<var name="${as_number}">64496</var>
<status status="PASS" start="2026-10-11T01:05:30.966382" elapsed="0.002776"/>
</iter>
<iter>
<kw name="Log Many" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.969686" level="INFO">IP: 127.0.0.4</msg>
<msg time="2026-10-11T01:05:30.969736" 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-10-11T01:05:30.969396" elapsed="0.000374"/>
</kw>
<kw name="Start_Bgp_Peer">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.970752" level="INFO">${command} = python3 play.py --amount 0 --myip=127.0.0.4 --myport=17900 --peerip=10.30.170.173 --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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:30.970338" elapsed="0.000442"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.971215" level="INFO">python3 play.py --amount 0 --myip=127.0.0.4 --myport=17900 --peerip=10.30.170.173 --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-10-11T01:05:30.970999" elapsed="0.000259"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:05:30.973717" level="INFO">[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt; python3 play.py --amount 0 --myip=127.0.0.3 --myport=17900 --peerip=10.30.170.173 --asnumber=64496 --peerport=1790 --port=8003 --usepeerip --debug --allf --wfr 1 &amp;&gt; play.py.090.3 &amp;</msg>
<msg time="2026-10-11T01:05:30.973805" level="INFO">${output} = [?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt; python3 play.py --amount 0 --myip=127.0.0.3 --myport=17900 --peerip=10.30.170.173 --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-10-11T01:05:30.971502" elapsed="0.002346"/>
</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-10-11T01:05:30.969890" elapsed="0.004013"/>
</kw>
<var name="${i}">4</var>
<var name="${as_number}">64496</var>
<status status="PASS" start="2026-10-11T01:05:30.969252" elapsed="0.004684"/>
</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-10-11T01:05:30.960153" elapsed="0.013814"/>
</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-10-11T01:05:30.855748" elapsed="0.118311"/>
</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-10-11T01:05:30.976041" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:05:30.975724" elapsed="0.000576"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:30.977248" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:30.977160" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.977141" elapsed="0.000169"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:30.979587" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:30.979489" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.979471" elapsed="0.000179"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.980619" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:30.980250" elapsed="0.000395"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:05:30.981065" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:05:30.980803" elapsed="0.000285"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:05:30.981128" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:30.981254" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:05:30.979860" elapsed="0.001417"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:30.983837" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:30.983752" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.983734" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:30.984933" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:30.984850" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:30.984834" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:30.985508" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:05:30.985153" elapsed="0.000382"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:30.985866" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:05:30.985724" elapsed="0.000166"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:05:31.036912" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:05:30.986394" elapsed="0.050666"/>
</kw>
<msg time="2026-10-11T01:05:31.037237" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:05:31.037280" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:30.986055" elapsed="0.051262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:05:31.108032" 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-10-11T01:05:31.037973" elapsed="0.070230"/>
</kw>
<msg time="2026-10-11T01:05:31.108357" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:05:31.108399" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:31.037582" elapsed="0.070888"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:31.108818" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:31.108576" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:31.108550" elapsed="0.000344"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:31.109320" 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-10-11T01:05:31.109083" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:31.109717" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:31.109491" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:31.109471" elapsed="0.000319"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:05:31.109825" 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-10-11T01:05:31.112524" elapsed="0.000314"/>
</kw>
<msg time="2026-10-11T01:05:31.112899" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:31.111337" elapsed="0.001699"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:31.113440" elapsed="0.000091"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:31.113830" 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-10-11T01:05:31.110724" elapsed="0.003298"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:05:31.110181" elapsed="0.003905"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:05:30.984597" elapsed="0.129565"/>
</kw>
<msg time="2026-10-11T01:05:31.114254" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:31.114308" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:30.984052" elapsed="0.130295"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:05:31.114583" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-11T01:05:31.114464" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:31.114399" elapsed="0.000267"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:31.115001" 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-10-11T01:05:31.115311" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:05:31.115377" 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-10-11T01:05:30.983450" elapsed="0.132051"/>
</kw>
<msg time="2026-10-11T01:05:31.115607" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:31.115650" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:30.981634" elapsed="0.134054"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:31.115990" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:31.115758" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:31.115741" elapsed="0.000323"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:05:30.981473" elapsed="0.134613"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:05:30.981321" elapsed="0.134793"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:05:30.979179" elapsed="0.136986"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:05:30.976903" elapsed="0.139348"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:30.976483" elapsed="0.139812"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:05:30.975276" elapsed="0.141068"/>
</kw>
<kw name="Play_To_Odl_Non_Removal_BgpRpcClient2">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:31.120595" 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-10-11T01:05:31.120756" 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-10-11T01:05:31.120425" elapsed="0.000355"/>
</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-10-11T01:05:31.120927" elapsed="0.002922"/>
</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-10-11T01:05:31.120053" elapsed="0.003856"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:31.124592" 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-10-11T01:05:31.124096" elapsed="0.000525"/>
</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-10-11T01:05:31.140828" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:31.140507" elapsed="0.000348"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:31.141579" 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-10-11T01:05:31.141348" elapsed="0.000306">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-10-11T01:05:31.141740" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:31.141021" elapsed="0.000742"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:31.142251" 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-10-11T01:05:31.141942" elapsed="0.000334"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:31.142584" 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-10-11T01:05:31.142705" 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-10-11T01:05:31.142462" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:31.143146" 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-10-11T01:05:31.142929" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:31.144120" 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-10-11T01:05:31.143890" elapsed="0.000271"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:31.144620" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:31.144340" elapsed="0.000304"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:31.145246" 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-10-11T01:05:31.144974" elapsed="0.000296"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:31.146113" 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-10-11T01:05:31.145806" elapsed="0.000332"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:31.146216" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:05:31.146345" 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-10-11T01:05:31.145470" elapsed="0.000899"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:31.146591" elapsed="0.000195"/>
</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-10-11T01:05:31.144836" elapsed="0.001988"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:31.147335" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:31.147064" elapsed="0.000296"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:31.148193" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:31.147895" elapsed="0.000322"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:31.148261" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:31.148384" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:31.147580" 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-10-11T01:05:31.148630" elapsed="0.000174"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:31.146926" elapsed="0.001915"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:31.144691" elapsed="0.004182"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:31.148910" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:31.149039" 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-10-11T01:05:31.143524" elapsed="0.005540"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:31.143251" elapsed="0.005842"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:31.149269" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:31.149115" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:31.143233" elapsed="0.006105"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:31.150081" 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-10-11T01:05:31.149556" elapsed="0.000552"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:31.150151" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:31.139977" elapsed="0.010274"/>
</kw>
<msg time="2026-10-11T01:05:31.150300" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:31.135284" elapsed="0.015059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:31.154884" 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/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-10-11T01:05:31.159079" 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/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-10-11T01:05:31.163307" elapsed="0.000053"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:31.163554" 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-10-11T01:05:31.163743" 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-10-11T01:05:31.164091" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:31.163937" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:31.163923" 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-10-11T01:05:31.164335" 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-10-11T01:05:31.164574" 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-10-11T01:05:31.164752" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:31.163898" elapsed="0.000902"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:31.163809" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:31.164981" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:31.165048" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:31.165158" 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-10-11T01:05:31.134688" elapsed="0.030495"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:31.166318" 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-10-11T01:05:31.166124" elapsed="0.000254">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-10-11T01:05:31.166478" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:31.165795" elapsed="0.000707"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:31.166804" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:31.166578" elapsed="0.000277"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:31.167321" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:31.167056" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:31.166877" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:31.166561" elapsed="0.000836"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:31.167931" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:31.167591" elapsed="0.000364"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:31.167998" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:31.168122" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:31.165469" elapsed="0.002676"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:31.169243" 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-10-11T01:05:31.169054" elapsed="0.000248">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-10-11T01:05:31.169434" 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-10-11T01:05:31.168732" elapsed="0.000726"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:05:31.169637" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:05:31.169523" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:31.169506" elapsed="0.000207"/>
</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-10-11T01:05:31.169873" elapsed="0.000020"/>
</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-10-11T01:05:31.170055" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:05:31.170114" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:05:31.170237" 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-10-11T01:05:31.168396" elapsed="0.001865"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:31.171518" 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-10-11T01:05:31.171279" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:31.171990" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:31.171775" elapsed="0.000255"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:31.177133" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node04zxcc0fk4bkfg607mewx0lv525.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:31.177276" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:05:31.177368" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:31.172322" elapsed="0.005436">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:31.172089" elapsed="0.005747">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:31.178034" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:31.177868" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-10-11T01:05:31.172072" elapsed="0.006044">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:31.178481" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:31.178619" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:31.178584" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:31.178568" elapsed="0.000109"/>
</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-10-11T01:05:31.178825" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:05:31.178888" 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-10-11T01:05:31.170574" elapsed="0.008410">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:31.179081" 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-10-11T01:05:31.127189" elapsed="0.051981">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:31.179434" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:31.179254" elapsed="0.000246"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:31.179238" elapsed="0.000285"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:31.179565" 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-10-11T01:05:31.126564" elapsed="0.053091">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:33.215179" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:33.214454" elapsed="0.000790"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:33.216951" 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-10-11T01:05:33.216487" elapsed="0.000609">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-10-11T01:05:33.217287" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:33.215665" elapsed="0.001674"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:33.218521" 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-10-11T01:05:33.217798" elapsed="0.000846"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:33.219290" 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-10-11T01:05:33.219632" 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-10-11T01:05:33.219038" elapsed="0.000649"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:33.220671" 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-10-11T01:05:33.220124" elapsed="0.000643"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:33.223263" 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-10-11T01:05:33.222739" elapsed="0.000619"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:33.224381" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:33.223815" elapsed="0.000650"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:33.225516" 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-10-11T01:05:33.225118" elapsed="0.000443"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:33.226828" 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-10-11T01:05:33.226321" elapsed="0.000543"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:33.226931" elapsed="0.000047"/>
</return>
<msg time="2026-10-11T01:05:33.227120" 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-10-11T01:05:33.225804" 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-10-11T01:05:33.227392" elapsed="0.000290"/>
</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-10-11T01:05:33.224922" elapsed="0.002812"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:33.228464" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:33.228063" elapsed="0.000436"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:33.229643" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:33.229186" elapsed="0.000491"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:33.229739" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T01:05:33.229912" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:33.228749" 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-10-11T01:05:33.230177" elapsed="0.000254"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:33.227875" elapsed="0.002610"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:33.224594" elapsed="0.005949"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:33.230597" elapsed="0.000036"/>
</return>
<msg time="2026-10-11T01:05:33.230776" 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-10-11T01:05:33.221514" elapsed="0.009295"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:33.220915" elapsed="0.009934"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:33.231094" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:33.230881" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:33.220872" elapsed="0.010319"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:33.232184" 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-10-11T01:05:33.231448" elapsed="0.000773"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:33.232282" 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/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-10-11T01:05:33.213243" elapsed="0.019204"/>
</kw>
<msg time="2026-10-11T01:05:33.232516" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:33.203154" elapsed="0.029438"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:33.238469" 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/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-10-11T01:05:33.244314" 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/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-10-11T01:05:33.250215" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:33.250492" 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-10-11T01:05:33.250783" 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-10-11T01:05:33.251265" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:33.251107" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:33.251090" 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-10-11T01:05:33.251510" 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-10-11T01:05:33.251707" 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-10-11T01:05:33.251874" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:33.251047" elapsed="0.000875"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:33.250895" elapsed="0.001050"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:33.252098" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:33.252164" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:33.252273" 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-10-11T01:05:33.201744" elapsed="0.050554"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:33.253434" 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-10-11T01:05:33.253233" elapsed="0.000262">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-10-11T01:05:33.253590" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:33.252905" elapsed="0.000708"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:33.253902" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:33.253676" elapsed="0.000276"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:33.254630" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:33.254167" elapsed="0.000488"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:33.253974" elapsed="0.000714"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:33.253659" elapsed="0.001049"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:33.255209" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:33.254873" elapsed="0.000360"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:33.255278" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:33.255401" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:33.252596" elapsed="0.002846"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:33.256548" 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-10-11T01:05:33.256339" elapsed="0.000299">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-10-11T01:05:33.256724" 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-10-11T01:05:33.256018" elapsed="0.000729"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:05:33.256908" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-11T01:05:33.256810" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:33.256793" elapsed="0.000189"/>
</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-10-11T01:05:33.257141" elapsed="0.000019"/>
</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-10-11T01:05:33.257320" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:05:33.257378" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:05:33.257518" 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-10-11T01:05:33.255714" elapsed="0.001839"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:33.258782" 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-10-11T01:05:33.258555" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:33.259235" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:33.259020" elapsed="0.000254"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:33.266197" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node04zxcc0fk4bkfg607mewx0lv525.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:33.266334" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:05:33.266442" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:33.259591" elapsed="0.007218">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:33.259333" elapsed="0.007553">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:33.267075" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:33.266917" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-10-11T01:05:33.259317" elapsed="0.007837">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:33.267506" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:33.267640" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:33.267607" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:33.267591" elapsed="0.000105"/>
</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-10-11T01:05:33.267846" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:05:33.267909" 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-10-11T01:05:33.257836" elapsed="0.010167">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:33.268097" 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-10-11T01:05:33.184948" elapsed="0.083236">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:33.268445" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:33.268266" elapsed="0.000244"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:33.268251" elapsed="0.000295"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:33.268577" elapsed="0.000013"/>
</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-10-11T01:05:33.183331" elapsed="0.085331">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:35.305030" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:35.304266" elapsed="0.000830"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:35.306932" 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-10-11T01:05:35.306401" elapsed="0.000681">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-10-11T01:05:35.307273" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:35.305509" elapsed="0.001814"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:35.308508" 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-10-11T01:05:35.307779" elapsed="0.000807"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:35.309226" 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-10-11T01:05:35.309569" 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-10-11T01:05:35.308972" elapsed="0.000653"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:35.310616" 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-10-11T01:05:35.310067" elapsed="0.000649"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:35.312840" 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-10-11T01:05:35.312264" elapsed="0.000669"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:35.313961" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:35.313340" elapsed="0.000675"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:35.315397" 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-10-11T01:05:35.314797" elapsed="0.000686"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:35.317513" 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-10-11T01:05:35.316741" elapsed="0.000863"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:35.317711" elapsed="0.000074"/>
</return>
<msg time="2026-10-11T01:05:35.318015" 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-10-11T01:05:35.315985" elapsed="0.002084"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:35.318509" elapsed="0.000432"/>
</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-10-11T01:05:35.314470" elapsed="0.004556"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:35.323210" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:35.319646" elapsed="0.003622"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:35.325153" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:35.324454" elapsed="0.000756"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:35.325312" elapsed="0.000064"/>
</return>
<msg time="2026-10-11T01:05:35.325782" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:35.323714" elapsed="0.002127"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:35.326232" elapsed="0.000480"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:35.319249" elapsed="0.007557"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:35.314120" elapsed="0.012758"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:35.326965" elapsed="0.000072"/>
</return>
<msg time="2026-10-11T01:05:35.327306" 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-10-11T01:05:35.311469" elapsed="0.015892"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:35.310865" elapsed="0.016618"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:35.327929" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:35.327572" elapsed="0.000476"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:35.310821" elapsed="0.017269"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:35.329480" 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-10-11T01:05:35.328558" elapsed="0.000973"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:35.329598" 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/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-10-11T01:05:35.303068" elapsed="0.026673"/>
</kw>
<msg time="2026-10-11T01:05:35.329812" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:35.292909" elapsed="0.036967"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:35.335835" 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/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-10-11T01:05:35.341710" 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/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-10-11T01:05:35.347652" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:35.347913" 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-10-11T01:05:35.348175" 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-10-11T01:05:35.348698" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:35.348470" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:35.348448" elapsed="0.000352"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:35.349025" 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-10-11T01:05:35.349281" 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-10-11T01:05:35.349550" elapsed="0.000027"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:35.348392" elapsed="0.001228"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:35.348268" elapsed="0.001385"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:35.349877" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:35.349971" elapsed="0.000020"/>
</return>
<msg time="2026-10-11T01:05:35.350125" 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-10-11T01:05:35.291454" elapsed="0.058706"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:35.351763" 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-10-11T01:05:35.351483" elapsed="0.000365">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-10-11T01:05:35.351965" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:35.351001" elapsed="0.000996"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:35.352402" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:35.352086" elapsed="0.000409"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:35.353176" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:35.352800" elapsed="0.000410"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:35.352539" elapsed="0.000717"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:35.352063" elapsed="0.001220"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:35.354019" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:35.353545" elapsed="0.000507"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:35.354116" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T01:05:35.354288" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:35.350569" elapsed="0.003750"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:35.355779" 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-10-11T01:05:35.355591" elapsed="0.000279">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-10-11T01:05:35.355956" 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-10-11T01:05:35.355218" elapsed="0.000761"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:05:35.356141" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:05:35.356042" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:35.356025" elapsed="0.000192"/>
</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-10-11T01:05:35.356375" elapsed="0.000020"/>
</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-10-11T01:05:35.356582" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:05:35.356642" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:05:35.356768" 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-10-11T01:05:35.354721" elapsed="0.002070"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:35.358217" 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-10-11T01:05:35.357990" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:35.358705" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:35.358471" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:35.364603" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node04zxcc0fk4bkfg607mewx0lv525.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:35.364749" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:05:35.364847" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:35.359037" elapsed="0.006161">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:35.358805" elapsed="0.006470">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:35.365484" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:35.365306" elapsed="0.000250"/>
</branch>
<status status="FAIL" start="2026-10-11T01:05:35.358788" elapsed="0.006790">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:35.365919" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:35.366038" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:35.366005" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:35.365990" elapsed="0.000106"/>
</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-10-11T01:05:35.366240" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:05:35.366302" 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-10-11T01:05:35.357262" elapsed="0.009135">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:35.366509" elapsed="0.000028"/>
</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-10-11T01:05:35.274572" elapsed="0.092040">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:35.366859" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:35.366695" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:35.366679" elapsed="0.000267"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:35.366976" 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-10-11T01:05:35.272954" elapsed="0.094110">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:35.367153" 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.173: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-10-11T01:05:31.124817" elapsed="4.242426">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.173: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-10-11T01:05:30.974459" elapsed="4.392935">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.173: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-10-11T01:05:35.369166" elapsed="0.000430"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:05:35.368913" elapsed="0.000737"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:35.370725" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:35.370634" elapsed="0.000134"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:35.370614" elapsed="0.000174"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:35.372986" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:35.372901" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:35.372884" elapsed="0.000165"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:35.373980" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:35.373655" elapsed="0.000350"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:05:35.374440" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:05:35.374163" elapsed="0.000302"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:05:35.374505" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T01:05:35.374645" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:05:35.373263" elapsed="0.001405"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:35.377250" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:35.377151" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:35.377127" elapsed="0.000188"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:35.378393" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:35.378309" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:35.378291" elapsed="0.000200"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:35.378836" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:05:35.378659" elapsed="0.000203"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:35.379182" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:05:35.379038" elapsed="0.000167"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:05:35.412154" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:05:35.379750" elapsed="0.032539"/>
</kw>
<msg time="2026-10-11T01:05:35.412506" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:05:35.412567" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:35.379368" elapsed="0.033236"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:05:35.467021" 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-10-11T01:05:35.413206" elapsed="0.053935"/>
</kw>
<msg time="2026-10-11T01:05:35.467290" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:05:35.467331" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:35.412811" elapsed="0.054555"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:35.467726" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:35.467474" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:35.467445" elapsed="0.000358"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:35.468229" 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-10-11T01:05:35.467994" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:35.468619" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:35.468371" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:35.468354" elapsed="0.000338"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:05:35.468726" 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-10-11T01:05:35.471642" elapsed="0.000124"/>
</kw>
<msg time="2026-10-11T01:05:35.471827" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:35.470230" 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-10-11T01:05:35.472281" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:35.472679" 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-10-11T01:05:35.469603" elapsed="0.003270"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:05:35.469063" elapsed="0.003871"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:05:35.378050" elapsed="0.094960"/>
</kw>
<msg time="2026-10-11T01:05:35.473094" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:35.473135" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:35.377500" elapsed="0.095714"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:05:35.473375" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T01:05:35.473286" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:35.473268" 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-10-11T01:05:35.473927" 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-10-11T01:05:35.474240" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:05:35.474306" 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-10-11T01:05:35.376854" elapsed="0.097543"/>
</kw>
<msg time="2026-10-11T01:05:35.474547" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:35.474589" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:35.375039" elapsed="0.099586"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:35.474946" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:35.474695" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:35.474678" elapsed="0.000339"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:05:35.374889" elapsed="0.100151"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:05:35.374713" elapsed="0.100356"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:05:35.372603" elapsed="0.102515"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:05:35.370217" elapsed="0.104954"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:35.369809" elapsed="0.105508"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:05:35.368550" elapsed="0.106845"/>
</kw>
<kw name="Play_To_Odl_Non_Removal_BgpRpcClient3">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:35.479593" 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-10-11T01:05:35.479746" 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-10-11T01:05:35.479427" elapsed="0.000344"/>
</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-10-11T01:05:35.479920" elapsed="0.003151"/>
</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-10-11T01:05:35.479051" elapsed="0.004086"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:35.483782" 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-10-11T01:05:35.483326" elapsed="0.000485"/>
</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-10-11T01:05:35.499921" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:35.499615" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:35.500657" 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-10-11T01:05:35.500455" elapsed="0.000273">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-10-11T01:05:35.500813" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:35.500115" elapsed="0.000721"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:35.501365" 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-10-11T01:05:35.501051" elapsed="0.000340"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:35.501704" 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-10-11T01:05:35.501819" 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-10-11T01:05:35.501592" elapsed="0.000252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:35.502270" 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-10-11T01:05:35.502049" elapsed="0.000264"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:35.503242" 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-10-11T01:05:35.503012" elapsed="0.000271"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:35.503754" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:35.503494" elapsed="0.000284"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:35.504377" 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-10-11T01:05:35.504109" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:35.505225" 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-10-11T01:05:35.504920" elapsed="0.000330"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:35.505296" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:35.505448" 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-10-11T01:05:35.504600" 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-10-11T01:05:35.505668" elapsed="0.000188"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:05:35.503970" elapsed="0.001924"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:35.506444" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:35.506134" elapsed="0.000338"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:35.507277" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:35.506974" elapsed="0.000329"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:35.507347" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:35.507506" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:35.506658" elapsed="0.000886"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:35.507715" elapsed="0.000172"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:35.505996" elapsed="0.001932"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:35.503826" elapsed="0.004134"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:35.507999" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:05:35.508128" 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-10-11T01:05:35.502662" elapsed="0.005490"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:35.502376" elapsed="0.005805"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:35.508359" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:35.508203" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:35.502359" elapsed="0.006105"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:35.509157" 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-10-11T01:05:35.508643" elapsed="0.000541"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:35.509228" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:35.499068" elapsed="0.010261"/>
</kw>
<msg time="2026-10-11T01:05:35.509448" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:35.494382" elapsed="0.015118"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:35.513931" 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/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-10-11T01:05:35.518189" 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/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-10-11T01:05:35.522391" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:35.522602" 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-10-11T01:05:35.522790" 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-10-11T01:05:35.523138" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:35.522985" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:35.522970" 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-10-11T01:05:35.523373" 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-10-11T01:05:35.523585" 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-10-11T01:05:35.523755" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:35.522945" elapsed="0.000858"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:35.522857" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:35.523987" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:35.524052" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:35.524161" 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-10-11T01:05:35.493785" elapsed="0.030401"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:35.525302" 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-10-11T01:05:35.525116" elapsed="0.000246">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-10-11T01:05:35.525496" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:35.524785" elapsed="0.000745"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:35.525825" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:35.525597" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:35.526344" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:35.526080" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:35.525899" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:35.525579" elapsed="0.000858"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:35.526958" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:35.526618" elapsed="0.000364"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:35.527027" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:35.527151" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:35.524468" elapsed="0.002707"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:35.528312" 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-10-11T01:05:35.528124" elapsed="0.000248">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-10-11T01:05:35.528485" 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-10-11T01:05:35.527787" elapsed="0.000723"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:05:35.528687" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:05:35.528587" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:35.528570" elapsed="0.000194"/>
</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-10-11T01:05:35.528924" elapsed="0.000019"/>
</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-10-11T01:05:35.529104" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:05:35.529162" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:05:35.529286" 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-10-11T01:05:35.527454" elapsed="0.001856"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:35.530576" 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-10-11T01:05:35.530322" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:35.531032" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:35.530815" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:35.537243" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node04zxcc0fk4bkfg607mewx0lv525.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:35.537387" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:05:35.537513" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:35.531364" elapsed="0.006522">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:35.531132" elapsed="0.006862">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:35.538189" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:35.538028" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-10-11T01:05:35.531115" elapsed="0.007155">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:35.538653" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:35.538775" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:35.538742" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:35.538726" elapsed="0.000106"/>
</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-10-11T01:05:35.538983" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:05:35.539046" 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-10-11T01:05:35.529621" elapsed="0.009520">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:35.539206" elapsed="0.000014"/>
</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-10-11T01:05:35.486368" elapsed="0.052921">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:35.539561" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:35.539369" elapsed="0.000258"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:35.539354" elapsed="0.000296"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:35.539680" elapsed="0.000013"/>
</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-10-11T01:05:35.485744" elapsed="0.054023">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:37.575570" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:37.574667" elapsed="0.000976"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:37.577243" 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-10-11T01:05:37.576807" elapsed="0.000585">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-10-11T01:05:37.577669" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:37.576024" elapsed="0.001697"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.578868" 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-10-11T01:05:37.578120" elapsed="0.000905"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:37.579728" 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-10-11T01:05:37.580024" 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-10-11T01:05:37.579448" elapsed="0.000631"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.581070" 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-10-11T01:05:37.580573" elapsed="0.000595"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.583845" 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-10-11T01:05:37.583210" elapsed="0.000731"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.584985" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:37.584351" elapsed="0.000689"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.586465" 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-10-11T01:05:37.585834" elapsed="0.000718"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:37.588450" 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-10-11T01:05:37.587695" elapsed="0.000857"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:37.588667" elapsed="0.000076"/>
</return>
<msg time="2026-10-11T01:05:37.588973" 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-10-11T01:05:37.586940" elapsed="0.002084"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:37.589442" elapsed="0.000442"/>
</kw>
<var name="${key}">PATH</var>
<var name="${value}">loc-rib</var>
<status status="PASS" start="2026-10-11T01:05:37.585504" elapsed="0.004463"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.591204" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:37.590584" elapsed="0.000674"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:37.593139" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:37.592460" elapsed="0.000734"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:37.593294" elapsed="0.000061"/>
</return>
<msg time="2026-10-11T01:05:37.593663" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:37.591730" elapsed="0.001988"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:37.594104" elapsed="0.000453"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:37.590193" elapsed="0.004451"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:37.585148" elapsed="0.009566"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:37.594800" elapsed="0.000057"/>
</return>
<msg time="2026-10-11T01:05:37.595085" 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-10-11T01:05:37.581941" elapsed="0.013197"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:37.581315" elapsed="0.013887"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:37.595693" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:37.595252" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:37.581271" elapsed="0.014586"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.597337" 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-10-11T01:05:37.596229" elapsed="0.001145"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:37.597457" 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_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-10-11T01:05:37.573465" elapsed="0.024148"/>
</kw>
<msg time="2026-10-11T01:05:37.597728" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:37.563240" elapsed="0.034562"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:37.603666" 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_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-10-11T01:05:37.609574" 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-10-11T01:05:37.615378" elapsed="0.000049"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:37.615669" 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-10-11T01:05:37.615930" 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-10-11T01:05:37.616424" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:37.616196" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:37.616178" 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-10-11T01:05:37.616768" 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-10-11T01:05:37.617021" 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-10-11T01:05:37.617253" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:37.616142" elapsed="0.001177"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:37.616022" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:37.617602" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:37.617695" elapsed="0.000020"/>
</return>
<msg time="2026-10-11T01:05:37.617844" 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-10-11T01:05:37.561827" elapsed="0.056052"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:37.619532" 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-10-11T01:05:37.619204" elapsed="0.000418">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-10-11T01:05:37.619805" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:37.618722" elapsed="0.001118"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:37.620251" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:37.619932" elapsed="0.000392"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.621290" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:37.620669" elapsed="0.000656"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:37.620354" elapsed="0.001019"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:37.619908" elapsed="0.001493"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.622177" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:37.621694" elapsed="0.000516"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:37.622274" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T01:05:37.622470" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:37.618254" elapsed="0.004250"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:37.623897" 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-10-11T01:05:37.623695" elapsed="0.000263">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-10-11T01:05:37.624043" 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-10-11T01:05:37.623344" elapsed="0.000722"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:05:37.624228" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-11T01:05:37.624128" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:37.624111" elapsed="0.000193"/>
</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-10-11T01:05:37.624490" elapsed="0.000032"/>
</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-10-11T01:05:37.624695" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:05:37.624753" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:05:37.624876" 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-10-11T01:05:37.622878" elapsed="0.002021"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.626121" 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-10-11T01:05:37.625900" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.626599" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:37.626358" 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-10-11T01:05:37.632589" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node04zxcc0fk4bkfg607mewx0lv525.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:37.632737" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:05:37.632827" 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-10-11T01:05:37.626929" elapsed="0.005924"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:37.626699" elapsed="0.006196"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:37.633097" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:37.632921" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:37.626682" elapsed="0.006532"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.634545" 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-10-11T01:05:37.634182" elapsed="0.000409"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:37.633938" elapsed="0.000685"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:37.633921" elapsed="0.000725"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.635217" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:37.634948" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:37.634696" elapsed="0.000595"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:37.634681" elapsed="0.000632"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.635882" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:37.635530" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:37.636192" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:37.635972" elapsed="0.000272"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.636731" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:37.636454" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:37.636266" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:37.635955" elapsed="0.000852"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.637322" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:37.636992" elapsed="0.000355"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:37.637653" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:37.637423" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.638152" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:37.637896" elapsed="0.000280"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:37.637727" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:37.637392" elapsed="0.000835"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:37.638373" elapsed="0.000452"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:37.639221" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:37.638993" elapsed="0.000253"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:37.639403" elapsed="0.000247"/>
</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-10-11T01:05:37.633591" elapsed="0.006116"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:37.639849" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:37.639768" elapsed="0.000120"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:37.639752" elapsed="0.000156"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:37.640692" 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-10-11T01:05:37.640056" elapsed="0.000663"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:05:37.640766" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:37.640893" 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-10-11T01:05:37.625181" elapsed="0.015736"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:37.640971" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:05:37.641124" 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-10-11T01:05:37.545008" elapsed="0.096140"/>
</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-10-11T01:05:37.651740" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:37.651418" elapsed="0.000348"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:37.652431" 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-10-11T01:05:37.652245" elapsed="0.000246">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-10-11T01:05:37.652587" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:37.651928" elapsed="0.000682"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.653090" 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-10-11T01:05:37.652786" elapsed="0.000329"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:37.653400" 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-10-11T01:05:37.653549" 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-10-11T01:05:37.653293" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.653990" 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-10-11T01:05:37.653774" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:05:37.654345" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:37.654094" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.654861" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:37.654600" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:37.654434" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:37.654077" elapsed="0.000860"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.655494" 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-10-11T01:05:37.655100" elapsed="0.000438"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:37.655583" 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/rib.vanadium/${file_name} exists. If 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-10-11T01:05:37.650894" elapsed="0.004789"/>
</kw>
<msg time="2026-10-11T01:05:37.655735" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:37.646473" elapsed="0.009306"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:37.660338" 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/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-10-11T01:05:37.664564" 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/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-10-11T01:05:37.668776" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:37.668964" 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-10-11T01:05:37.669150" 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-10-11T01:05:37.669521" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:37.669345" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:37.669331" 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-10-11T01:05:37.669756" 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-10-11T01:05:37.669940" 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-10-11T01:05:37.670108" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:37.669306" elapsed="0.000849"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:37.669216" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:37.670333" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:37.670398" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:37.670551" 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-10-11T01:05:37.645760" elapsed="0.024817"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:37.670750" elapsed="0.000318"/>
</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-10-11T01:05:37.672091" 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-10-11T01:05:37.671738" elapsed="0.000380"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:37.672640" 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-10-11T01:05:37.672272" 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-10-11T01:05:37.672885" elapsed="0.000282"/>
</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-10-11T01:05:37.671339" elapsed="0.001882"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:37.671137" 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-10-11T01:05:37.673495" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:37.673273" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:37.671121" elapsed="0.002466"/>
</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-10-11T01:05:37.642109" elapsed="0.031522"/>
</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-10-11T01:05:37.641444" elapsed="0.032252"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:37.641221" elapsed="0.032514"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:37.641205" elapsed="0.032551"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:37.673787" elapsed="0.000027"/>
</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-10-11T01:05:37.543450" elapsed="0.130439"/>
</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-10-11T01:05:35.484004" elapsed="2.189939"/>
</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-10-11T01:05:35.367914" elapsed="2.306148"/>
</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-10-11T01:05:37.676033" elapsed="0.000372"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:05:37.675632" elapsed="0.000855"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:37.677398" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:37.677313" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:37.677295" elapsed="0.000182"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:37.679673" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:37.679588" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:37.679571" elapsed="0.000164"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.680709" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:37.680306" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.681166" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:05:37.680898" elapsed="0.000293"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:05:37.681231" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:37.681361" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:05:37.679947" elapsed="0.001437"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:37.684004" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:37.683918" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:37.683901" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:37.685125" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:37.685043" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:37.685026" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:37.685564" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:05:37.685343" elapsed="0.000248"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:37.685909" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:05:37.685764" elapsed="0.000169"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:05:37.721735" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:05:37.686505" elapsed="0.035374"/>
</kw>
<msg time="2026-10-11T01:05:37.722071" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:05:37.722128" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:37.686132" elapsed="0.036042"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:05:37.790973" 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-10-11T01:05:37.722889" elapsed="0.068214"/>
</kw>
<msg time="2026-10-11T01:05:37.791253" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:05:37.791294" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:37.722427" elapsed="0.068903"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:37.791703" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:37.791431" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:37.791387" elapsed="0.000393"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.792213" 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-10-11T01:05:37.791978" elapsed="0.000321"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:37.792609" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:37.792359" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:37.792342" elapsed="0.000340"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:05:37.792716" 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-10-11T01:05:37.797347" elapsed="0.000200"/>
</kw>
<msg time="2026-10-11T01:05:37.797610" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:37.794215" elapsed="0.003531"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:37.798058" elapsed="0.000073"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:37.798400" 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-10-11T01:05:37.793596" elapsed="0.005047"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:05:37.793052" elapsed="0.005653"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:05:37.684781" elapsed="0.113999"/>
</kw>
<msg time="2026-10-11T01:05:37.798865" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:37.798906" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:37.684223" elapsed="0.114719"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:05:37.799101" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-11T01:05:37.799012" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:37.798994" elapsed="0.000186"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:37.799612" 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-10-11T01:05:37.799924" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:05:37.800034" 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-10-11T01:05:37.683630" elapsed="0.116495"/>
</kw>
<msg time="2026-10-11T01:05:37.800211" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:37.800253" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:37.681771" elapsed="0.118518"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:37.800691" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:37.800357" elapsed="0.000386"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:37.800341" elapsed="0.000426"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:05:37.681620" elapsed="0.119169"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:05:37.681459" elapsed="0.119359"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:05:37.679249" elapsed="0.121619"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:05:37.677063" elapsed="0.123860"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:37.676662" elapsed="0.124302"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:05:37.675231" elapsed="0.125780"/>
</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-10-11T01:05:37.816849" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:37.816546" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:37.817591" 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-10-11T01:05:37.817364" elapsed="0.000297">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-10-11T01:05:37.817746" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:37.817041" elapsed="0.000727"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.818252" 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-10-11T01:05:37.817945" elapsed="0.000332"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:37.818589" 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-10-11T01:05:37.818729" 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-10-11T01:05:37.818461" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.819164" 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-10-11T01:05:37.818948" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.820286" 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-10-11T01:05:37.819890" elapsed="0.000438"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.820800" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:37.820540" elapsed="0.000284"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.821435" 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-10-11T01:05:37.821151" elapsed="0.000309"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:37.822262" 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-10-11T01:05:37.821958" elapsed="0.000358"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:37.822363" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:05:37.822561" 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-10-11T01:05:37.821644" 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-10-11T01:05:37.822761" elapsed="0.000188"/>
</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-10-11T01:05:37.821014" elapsed="0.001972"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.823536" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:37.823223" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:37.824340" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:37.824046" elapsed="0.000318"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:37.824429" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T01:05:37.824587" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:37.823735" elapsed="0.000876"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:37.824780" elapsed="0.000168"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:37.823087" elapsed="0.001897"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:37.820869" elapsed="0.004146"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:37.825052" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:37.825182" 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-10-11T01:05:37.819546" elapsed="0.005660"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:37.819267" elapsed="0.005968"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:37.825440" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:37.825257" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:37.819250" elapsed="0.006282"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.826230" 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-10-11T01:05:37.825699" elapsed="0.000558"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:37.826302" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:37.816016" elapsed="0.010387"/>
</kw>
<msg time="2026-10-11T01:05:37.826488" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:37.811639" elapsed="0.015715"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:37.831926" 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/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-10-11T01:05:37.836155" 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/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-10-11T01:05:37.840333" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:37.840547" 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-10-11T01:05:37.840735" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:37.841078" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:37.840928" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:37.840915" 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-10-11T01:05:37.841309" 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-10-11T01:05:37.841507" 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-10-11T01:05:37.841693" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:37.840889" elapsed="0.000852"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:37.840801" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:37.841919" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:37.841983" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:37.842092" 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-10-11T01:05:37.811002" elapsed="0.031115"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:37.843229" 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-10-11T01:05:37.843045" elapsed="0.000243">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-10-11T01:05:37.843371" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:37.842717" elapsed="0.000677"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:37.843864" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:37.843473" elapsed="0.000442"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.844380" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:37.844118" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:37.843937" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:37.843455" elapsed="0.001018"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.844986" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:37.844651" elapsed="0.000359"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:37.845055" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:37.845178" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:37.842383" elapsed="0.002817"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:37.846483" 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-10-11T01:05:37.846285" elapsed="0.000301">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-10-11T01:05:37.846673" 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-10-11T01:05:37.845963" elapsed="0.000732"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:05:37.846859" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:05:37.846759" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:37.846742" elapsed="0.000193"/>
</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-10-11T01:05:37.847093" elapsed="0.000020"/>
</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-10-11T01:05:37.847273" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:05:37.847331" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:05:37.847471" 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-10-11T01:05:37.845656" elapsed="0.001838"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.848727" 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-10-11T01:05:37.848493" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:37.849179" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:37.848964" elapsed="0.000254"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:37.859110" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node04zxcc0fk4bkfg607mewx0lv525.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:37.859255" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:05:37.859352" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:37.849536" elapsed="0.010196">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:37.849278" elapsed="0.010530">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:37.859998" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:37.859839" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-10-11T01:05:37.849261" elapsed="0.010818">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:37.860431" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:37.860570" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:37.860536" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:37.860503" 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-10-11T01:05:37.860778" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:05:37.860841" 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-10-11T01:05:37.847787" elapsed="0.013153">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:37.861037" 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-10-11T01:05:37.803616" elapsed="0.057510">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:37.861373" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:37.861209" elapsed="0.000248"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:37.861193" elapsed="0.000287"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:37.861563" elapsed="0.000015"/>
</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-10-11T01:05:37.802980" elapsed="0.058673">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:39.897608" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:39.896851" elapsed="0.000825"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:39.899276" 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-10-11T01:05:39.898832" elapsed="0.000621">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-10-11T01:05:39.899681" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:39.898054" elapsed="0.001678"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:39.900878" 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-10-11T01:05:39.900132" elapsed="0.000804"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:39.901619" 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-10-11T01:05:39.901966" 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-10-11T01:05:39.901317" elapsed="0.000704"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:39.903017" 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-10-11T01:05:39.902519" elapsed="0.000594"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:39.905223" 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-10-11T01:05:39.904706" elapsed="0.000610"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:39.906340" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:39.905770" elapsed="0.000624"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:39.907583" 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-10-11T01:05:39.907169" elapsed="0.000449"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:39.908862" 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-10-11T01:05:39.908365" elapsed="0.000533"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:39.908965" elapsed="0.000046"/>
</return>
<msg time="2026-10-11T01:05:39.909154" 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-10-11T01:05:39.907857" 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-10-11T01:05:39.909452" elapsed="0.000275"/>
</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-10-11T01:05:39.906881" elapsed="0.002900"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:39.910752" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:39.910113" elapsed="0.000674"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:39.911937" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:39.911498" elapsed="0.000474"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:39.912036" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T01:05:39.912215" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:39.911028" elapsed="0.001220"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:39.912535" elapsed="0.000238"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:39.909923" elapsed="0.002902"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:39.906555" elapsed="0.006314"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:39.912922" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T01:05:39.913105" 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-10-11T01:05:39.903884" elapsed="0.009254"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:39.903262" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:39.913446" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:39.913211" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:39.903219" elapsed="0.010342"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:39.914543" 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-10-11T01:05:39.913792" elapsed="0.000791"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:39.914645" 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/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-10-11T01:05:39.895664" elapsed="0.019120"/>
</kw>
<msg time="2026-10-11T01:05:39.914853" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:39.885495" elapsed="0.029421"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:39.920831" 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/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-10-11T01:05:39.926716" 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/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-10-11T01:05:39.932604" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:39.932792" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:39.932978" 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-10-11T01:05:39.933323" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:39.933172" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:39.933158" 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-10-11T01:05:39.933580" 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-10-11T01:05:39.933764" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:39.933933" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:39.933133" elapsed="0.000848"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:39.933044" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:39.934165" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:39.934231" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:39.934342" 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-10-11T01:05:39.884058" elapsed="0.050310"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:39.935512" 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-10-11T01:05:39.935301" elapsed="0.000272">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-10-11T01:05:39.935657" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:39.934971" elapsed="0.000709"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:39.935969" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:39.935743" elapsed="0.000277"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:39.936523" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:39.936233" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:39.936041" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:39.935726" elapsed="0.000875"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:39.937102" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:39.936767" elapsed="0.000359"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:39.937171" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:39.937295" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:39.934665" elapsed="0.002652"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:39.938430" 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-10-11T01:05:39.938225" elapsed="0.000315">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-10-11T01:05:39.938627" 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-10-11T01:05:39.937902" elapsed="0.000748"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:05:39.938811" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:05:39.938713" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:39.938696" elapsed="0.000189"/>
</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-10-11T01:05:39.939042" elapsed="0.000019"/>
</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-10-11T01:05:39.939220" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:05:39.939278" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:05:39.939416" 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-10-11T01:05:39.937597" elapsed="0.001844"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:39.940894" 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-10-11T01:05:39.940670" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:39.941350" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:39.941133" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:39.947721" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node04zxcc0fk4bkfg607mewx0lv525.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:39.947857" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:05:39.947947" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:39.941711" elapsed="0.006584">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:39.941467" elapsed="0.006905">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:39.948591" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:39.948403" elapsed="0.000248"/>
</branch>
<status status="FAIL" start="2026-10-11T01:05:39.941449" elapsed="0.007224">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:39.949015" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:39.949134" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:39.949101" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:39.949085" elapsed="0.000107"/>
</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-10-11T01:05:39.949340" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:05:39.949402" elapsed="0.000028"/>
</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-10-11T01:05:39.939933" elapsed="0.009591">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:39.949622" 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-10-11T01:05:39.867341" elapsed="0.082369">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:39.949959" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:39.949794" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:39.949778" elapsed="0.000268"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:39.950077" elapsed="0.000014"/>
</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-10-11T01:05:39.865809" elapsed="0.084356">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:41.986221" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:41.985507" elapsed="0.000781"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:41.988803" 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-10-11T01:05:41.988289" elapsed="0.000661">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-10-11T01:05:41.989139" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:41.987543" elapsed="0.001646"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:41.990333" 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-10-11T01:05:41.989642" elapsed="0.000747"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:41.991078" 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-10-11T01:05:41.991373" 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-10-11T01:05:41.990826" elapsed="0.000632"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:41.992453" 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-10-11T01:05:41.991929" elapsed="0.000644"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:41.994525" 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-10-11T01:05:41.994151" elapsed="0.000435"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:41.995192" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:41.994838" elapsed="0.000388"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:41.996101" 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-10-11T01:05:41.995726" elapsed="0.000408"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:41.997383" 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-10-11T01:05:41.996923" elapsed="0.000524"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:41.997529" elapsed="0.000048"/>
</return>
<msg time="2026-10-11T01:05:41.997720" 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-10-11T01:05:41.996370" elapsed="0.001382"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:41.997990" elapsed="0.000249"/>
</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-10-11T01:05:41.995532" elapsed="0.002758"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:41.999038" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:41.998664" elapsed="0.000407"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:42.000223" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:41.999810" elapsed="0.000447"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:42.000318" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T01:05:42.000545" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:41.999307" 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-10-11T01:05:42.000816" elapsed="0.000231"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:41.998454" elapsed="0.002643"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:41.995292" elapsed="0.005848"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:42.001194" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T01:05:42.001372" 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-10-11T01:05:41.993294" elapsed="0.008133"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:41.992721" elapsed="0.008749"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:42.001744" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:42.001527" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:41.992677" elapsed="0.009165"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:42.002838" 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-10-11T01:05:42.002073" elapsed="0.000802"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:42.002936" 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/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-10-11T01:05:41.984247" elapsed="0.018831"/>
</kw>
<msg time="2026-10-11T01:05:42.003147" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:41.973645" elapsed="0.029564"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:42.009374" elapsed="0.000050"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:42.015510" 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/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-10-11T01:05:42.021485" elapsed="0.000055"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:42.021769" 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-10-11T01:05:42.022031" 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-10-11T01:05:42.022567" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:42.022303" elapsed="0.000337"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:42.022283" elapsed="0.000388"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:42.022895" 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-10-11T01:05:42.023150" 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-10-11T01:05:42.023386" elapsed="0.000044"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:42.022246" elapsed="0.001228"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:42.022123" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:42.023743" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:42.023835" elapsed="0.000021"/>
</return>
<msg time="2026-10-11T01:05:42.023990" 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-10-11T01:05:41.972180" elapsed="0.051844"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:42.025615" 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-10-11T01:05:42.025318" elapsed="0.000381">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-10-11T01:05:42.025814" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:42.024858" 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-10-11T01:05:42.026246" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:42.025933" elapsed="0.000383"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:42.027012" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:42.026645" elapsed="0.000401"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:42.026347" elapsed="0.000744"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:42.025910" elapsed="0.001209"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:42.027860" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:42.027350" elapsed="0.000543"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:42.027957" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T01:05:42.028128" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:42.024392" elapsed="0.003768"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:42.029719" 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-10-11T01:05:42.029445" elapsed="0.000400">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-10-11T01:05:42.029965" 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-10-11T01:05:42.028973" elapsed="0.001024"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:05:42.030224" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-10-11T01:05:42.030086" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:42.030061" 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-10-11T01:05:42.030590" 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-10-11T01:05:42.030843" elapsed="0.000026"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:05:42.030925" elapsed="0.000019"/>
</return>
<msg time="2026-10-11T01:05:42.031098" 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-10-11T01:05:42.028549" elapsed="0.002582"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:42.032883" 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-10-11T01:05:42.032570" elapsed="0.000373"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:42.033573" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:42.033214" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:42.042107" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node04zxcc0fk4bkfg607mewx0lv525.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:42.042289" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:05:42.042440" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:42.034036" elapsed="0.008893">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:42.033714" elapsed="0.009320">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:42.043299" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:42.043078" elapsed="0.000303"/>
</branch>
<status status="FAIL" start="2026-10-11T01:05:42.033691" elapsed="0.009741">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:42.043922" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:42.044090" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:42.044044" elapsed="0.000099"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:42.044021" elapsed="0.000150"/>
</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-10-11T01:05:42.044373" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:05:42.044482" elapsed="0.000056"/>
</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-10-11T01:05:42.031558" elapsed="0.013095">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:42.044787" 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-10-11T01:05:41.955449" elapsed="0.089462">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:42.045258" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:42.045027" elapsed="0.000320"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:42.045004" elapsed="0.000375"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:42.045443" elapsed="0.000020"/>
</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-10-11T01:05:41.953869" elapsed="0.091724">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:42.045718" 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.173: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-10-11T01:05:37.801202" elapsed="4.244641">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.173: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-10-11T01:05:37.674567" elapsed="4.371476">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.173: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-10-11T01:05:42.048983" elapsed="0.000307"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:05:42.048514" elapsed="0.000849"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:42.050699" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:42.050576" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:42.050551" 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-10-11T01:05:42.054042" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:42.053929" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:42.053906" elapsed="0.000223"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:42.055427" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:42.054961" elapsed="0.000503"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:05:42.056058" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:05:42.055696" elapsed="0.000395"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:05:42.056147" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T01:05:42.056322" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:05:42.054442" elapsed="0.001912"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:42.060337" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:42.060147" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:42.060121" elapsed="0.000337"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:42.062064" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:42.061927" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:42.061902" elapsed="0.000271"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:42.062629" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:05:42.062428" elapsed="0.000227"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:42.062970" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:05:42.062828" elapsed="0.000166"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:05:42.098710" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:05:42.063523" elapsed="0.035283"/>
</kw>
<msg time="2026-10-11T01:05:42.098956" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:05:42.098997" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:42.063157" elapsed="0.035876"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:05:42.162984" 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-10-11T01:05:42.099575" elapsed="0.063524"/>
</kw>
<msg time="2026-10-11T01:05:42.163248" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:05:42.163289" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:42.099203" elapsed="0.064120"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:42.163658" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:42.163391" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:42.163373" elapsed="0.000357"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:42.164146" 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-10-11T01:05:42.163919" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:42.164511" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:42.164284" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:42.164268" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:05:42.164613" 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-10-11T01:05:42.167171" elapsed="0.000117"/>
</kw>
<msg time="2026-10-11T01:05:42.167346" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:42.166011" elapsed="0.001576"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:42.167905" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:42.168267" 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-10-11T01:05:42.165393" elapsed="0.003212"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:05:42.164924" elapsed="0.003751"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:05:42.061564" elapsed="0.107185"/>
</kw>
<msg time="2026-10-11T01:05:42.168832" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:42.168873" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:42.060721" elapsed="0.108188"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:05:42.169095" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:05:42.169009" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:42.168991" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:42.169566" 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-10-11T01:05:42.169871" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:05:42.169935" 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-10-11T01:05:42.059704" elapsed="0.110317"/>
</kw>
<msg time="2026-10-11T01:05:42.170105" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:42.170144" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:42.056876" elapsed="0.113302"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:42.170552" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:42.170244" elapsed="0.000359"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:42.170229" elapsed="0.000395"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:05:42.056669" elapsed="0.113977"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:05:42.056439" elapsed="0.114237"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:05:42.053520" elapsed="0.117206"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:05:42.050190" elapsed="0.120587"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:42.049628" elapsed="0.121190"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:05:42.047980" elapsed="0.122886"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:42.171175" 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-10-11T01:05:42.171323" 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-10-11T01:05:42.171043" elapsed="0.000305"/>
</kw>
<kw name="Remove String" owner="String">
<msg time="2026-10-11T01:05:42.171721" 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-10-11T01:05:42.171542" elapsed="0.000204"/>
</kw>
<kw name="Check_For_L3VPN_Odl_Avertisement">
<for flavor="IN ZIP">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:42.172866" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:42.172383" elapsed="0.000508"/>
</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-10-11T01:05:42.176948" level="INFO">${update} = ffffffffffffffffffffffffffffffff001d0200000006800f03000105</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:05:42.173800" elapsed="0.003176"/>
</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-10-11T01:05:42.177275" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:42.177044" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:42.177024" elapsed="0.000329"/>
</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-10-11T01:05:42.177634" elapsed="0.000283"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:42.177401" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:42.177387" elapsed="0.000588"/>
</if>
<arg>${announce_hex}</arg>
<arg>${option}</arg>
<doc>Returns hex update message and compares it to hex.</doc>
<status status="PASS" start="2026-10-11T01:05:42.173468" elapsed="0.004550"/>
</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-10-11T01:05:42.173062" elapsed="0.005001"/>
</kw>
<var name="${i}">2</var>
<var name="${option}">false</var>
<status status="PASS" start="2026-10-11T01:05:42.172241" elapsed="0.005854"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:42.178671" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:42.178373" elapsed="0.000324"/>
</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-10-11T01:05:42.182565" level="INFO">${update} = ffffffffffffffffffffffffffffffff001d0200000006800f03000201</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:05:42.179798" elapsed="0.002795"/>
</kw>
<if>
<branch type="IF" condition="&quot;${option}&quot; == &quot;true&quot;">
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<msg time="2026-10-11T01:05:42.183193" level="FAIL">ffffffffffffffffffffffffffffffff001d0200000006800f03000201 != 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-10-11T01:05:42.182859" elapsed="0.000403">ffffffffffffffffffffffffffffffff001d0200000006800f03000201 != ffffffffffffffffffffffffffffffff0052020000003b4001010040020602010000fbf0800e200001800c00000000000000000a00fffe007005dc510001010203040001010101c010080002fbf000000065</status>
</kw>
<status status="FAIL" start="2026-10-11T01:05:42.182655" elapsed="0.000673">ffffffffffffffffffffffffffffffff001d0200000006800f03000201 != ffffffffffffffffffffffffffffffff0052020000003b4001010040020602010000fbf0800e200001800c00000000000000000a00fffe007005dc510001010203040001010101c010080002fbf000000065</status>
</branch>
<status status="FAIL" start="2026-10-11T01:05:42.182638" elapsed="0.000719">ffffffffffffffffffffffffffffffff001d0200000006800f03000201 != 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-10-11T01:05:42.183604" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:42.183438" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:42.183403" elapsed="0.000273"/>
</if>
<arg>${announce_hex}</arg>
<arg>${option}</arg>
<doc>Returns hex update message and compares it to hex.</doc>
<status status="FAIL" start="2026-10-11T01:05:42.179255" elapsed="0.004497">ffffffffffffffffffffffffffffffff001d0200000006800f03000201 != 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-10-11T01:05:42.178866" elapsed="0.004931">ffffffffffffffffffffffffffffffff001d0200000006800f03000201 != ffffffffffffffffffffffffffffffff0052020000003b4001010040020602010000fbf0800e200001800c00000000000000000a00fffe007005dc510001010203040001010101c010080002fbf000000065</status>
</kw>
<var name="${i}">3</var>
<var name="${option}">true</var>
<status status="FAIL" start="2026-10-11T01:05:42.178228" elapsed="0.005621">ffffffffffffffffffffffffffffffff001d0200000006800f03000201 != 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-10-11T01:05:42.172088" elapsed="0.011815">ffffffffffffffffffffffffffffffff001d0200000006800f03000201 != 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-10-11T01:05:42.171894" elapsed="0.012091">ffffffffffffffffffffffffffffffff001d0200000006800f03000201 != 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-10-11T01:05:42.046752" elapsed="0.137358">ffffffffffffffffffffffffffffffff001d0200000006800f03000201 != 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-10-11T01:05:42.186222" elapsed="0.000218"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:05:42.185958" 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-10-11T01:05:42.187394" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:42.187307" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:42.187289" elapsed="0.000187"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:42.189683" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:42.189600" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:42.189583" elapsed="0.000160"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:42.190670" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:42.190316" elapsed="0.000380"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:05:42.191112" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:05:42.190853" elapsed="0.000282"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:05:42.191176" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:42.191301" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:05:42.189955" elapsed="0.001369"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:42.193908" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:42.193825" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:42.193807" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:42.195006" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:42.194923" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:42.194906" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:42.195389" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:05:42.195222" elapsed="0.000209"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:42.195746" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:05:42.195612" elapsed="0.000157"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:05:42.238262" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:05:42.196263" elapsed="0.042105"/>
</kw>
<msg time="2026-10-11T01:05:42.238548" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:05:42.238590" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:42.195930" elapsed="0.042694"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:05:42.287202" 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-10-11T01:05:42.239134" elapsed="0.048207"/>
</kw>
<msg time="2026-10-11T01:05:42.287538" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:05:42.287580" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:42.238795" elapsed="0.048820"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:42.287937" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:42.287695" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:42.287671" elapsed="0.000340"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:42.288471" 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-10-11T01:05:42.288198" elapsed="0.000361"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:42.288821" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:42.288619" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:42.288602" elapsed="0.000290"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:05:42.288926" 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-10-11T01:05:42.293381" elapsed="0.000156"/>
</kw>
<msg time="2026-10-11T01:05:42.293601" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:42.290368" elapsed="0.003369"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:42.294052" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:42.294395" elapsed="0.000160"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:05:42.289767" elapsed="0.004903"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:05:42.289248" elapsed="0.005482"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:05:42.194670" elapsed="0.100134"/>
</kw>
<msg time="2026-10-11T01:05:42.294887" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:42.294928" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:42.194125" elapsed="0.100969"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:05:42.295263" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:05:42.295173" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:42.295154" elapsed="0.000187"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:42.295714" 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-10-11T01:05:42.296018" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:05:42.296083" 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-10-11T01:05:42.193541" elapsed="0.102628"/>
</kw>
<msg time="2026-10-11T01:05:42.296253" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:42.296293" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:42.191720" elapsed="0.104609"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:42.296685" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:42.296396" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:42.296380" elapsed="0.000377"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:05:42.191572" elapsed="0.105207"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:05:42.191401" elapsed="0.105407"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:05:42.189283" elapsed="0.107573"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:05:42.187054" elapsed="0.109852"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:42.186656" elapsed="0.110289"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:05:42.185350" elapsed="0.111643"/>
</kw>
<kw name="Play_To_Odl_Non_Removal_BgpRpcClient4">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:42.300941" 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-10-11T01:05:42.301088" 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-10-11T01:05:42.300791" elapsed="0.000321"/>
</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-10-11T01:05:42.301261" elapsed="0.003447"/>
</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-10-11T01:05:42.300418" elapsed="0.004349"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:42.305393" 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-10-11T01:05:42.304952" elapsed="0.000489"/>
</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-10-11T01:05:42.321552" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:42.321221" elapsed="0.000359"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:42.322264" 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-10-11T01:05:42.322071" elapsed="0.000263">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-10-11T01:05:42.322433" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:42.321745" elapsed="0.000752"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:42.322993" 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-10-11T01:05:42.322683" elapsed="0.000335"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:42.323297" 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-10-11T01:05:42.323427" 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-10-11T01:05:42.323189" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:42.323882" 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-10-11T01:05:42.323663" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:42.324839" 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-10-11T01:05:42.324607" elapsed="0.000274"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:42.325305" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:42.325060" elapsed="0.000269"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:42.325949" 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-10-11T01:05:42.325683" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:42.326783" 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-10-11T01:05:42.326470" elapsed="0.000338"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:42.326853" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:42.326979" 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-10-11T01:05:42.326143" 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-10-11T01:05:42.327172" elapsed="0.000181"/>
</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-10-11T01:05:42.325546" elapsed="0.001844"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:42.327921" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:42.327655" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:42.328746" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:42.328439" elapsed="0.000331"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:42.328814" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:42.328937" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:42.328113" 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-10-11T01:05:42.329126" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:42.327520" elapsed="0.001807"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:42.325375" elapsed="0.003983"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:42.329395" elapsed="0.000046"/>
</return>
<msg time="2026-10-11T01:05:42.329557" 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-10-11T01:05:42.324239" elapsed="0.005343"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:42.323987" elapsed="0.005623"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:42.329786" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:42.329632" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:42.323968" elapsed="0.005887"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:42.330566" 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-10-11T01:05:42.330019" elapsed="0.000574"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:42.330637" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:42.320711" elapsed="0.010060"/>
</kw>
<msg time="2026-10-11T01:05:42.330821" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:42.316081" elapsed="0.014783"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:42.335270" 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/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-10-11T01:05:42.339507" 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/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-10-11T01:05:42.343719" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:42.343908" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:42.344101" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:42.344459" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:42.344294" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:42.344281" 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-10-11T01:05:42.344705" 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-10-11T01:05:42.344890" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:42.345057" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:42.344256" elapsed="0.000849"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:42.344167" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:42.345285" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:42.345351" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:42.345476" 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-10-11T01:05:42.315471" elapsed="0.030042"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:42.346665" 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-10-11T01:05:42.346465" elapsed="0.000259">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-10-11T01:05:42.346807" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:42.346119" elapsed="0.000711"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:42.347117" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:42.346892" elapsed="0.000275"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:42.347662" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:42.347369" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:42.347189" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:42.346876" elapsed="0.000861"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:42.348238" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:42.347903" elapsed="0.000359"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:42.348307" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:42.348447" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:42.345812" elapsed="0.002659"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:42.349570" 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-10-11T01:05:42.349358" elapsed="0.000272">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-10-11T01:05:42.349713" 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-10-11T01:05:42.349037" elapsed="0.000698"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:05:42.349894" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:05:42.349797" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:42.349780" elapsed="0.000189"/>
</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-10-11T01:05:42.350127" elapsed="0.000019"/>
</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-10-11T01:05:42.350304" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:05:42.350362" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:05:42.350512" 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-10-11T01:05:42.348733" elapsed="0.001803"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:42.351758" 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-10-11T01:05:42.351533" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:42.352213" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:42.351996" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:42.358712" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node04zxcc0fk4bkfg607mewx0lv525.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:42.358857" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:05:42.358986" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:42.352569" elapsed="0.006775">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:42.352312" elapsed="0.007124">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:42.359642" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:42.359468" elapsed="0.000246"/>
</branch>
<status status="FAIL" start="2026-10-11T01:05:42.352295" elapsed="0.007441">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:42.360074" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:42.360193" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:42.360160" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:42.360144" elapsed="0.000105"/>
</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-10-11T01:05:42.360394" elapsed="0.000055"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:05:42.360508" 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-10-11T01:05:42.350814" elapsed="0.009792">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:42.360669" elapsed="0.000014"/>
</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-10-11T01:05:42.308030" elapsed="0.052723">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:42.361001" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:42.360834" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:42.360818" elapsed="0.000267"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:42.361115" elapsed="0.000013"/>
</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-10-11T01:05:42.307311" elapsed="0.053891">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:05:44.377724" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:44.377355" elapsed="0.000404"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:44.378544" 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-10-11T01:05:44.378288" elapsed="0.000402">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-10-11T01:05:44.378783" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:44.377937" elapsed="0.000871"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.379335" 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-10-11T01:05:44.378993" elapsed="0.000369"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:44.379692" 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-10-11T01:05:44.379845" 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-10-11T01:05:44.379568" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.380317" 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-10-11T01:05:44.380076" 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-10-11T01:05:44.381578" 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-10-11T01:05:44.381096" elapsed="0.000528"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.382081" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:44.381814" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.382776" 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-10-11T01:05:44.382494" elapsed="0.000308"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:44.383705" 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-10-11T01:05:44.383303" elapsed="0.000429"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:44.383781" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T01:05:44.383921" 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-10-11T01:05:44.382979" 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-10-11T01:05:44.384120" elapsed="0.000188"/>
</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-10-11T01:05:44.382324" elapsed="0.002030"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.384916" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:44.384645" elapsed="0.000295"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:44.385793" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:44.385471" elapsed="0.000348"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:44.385863" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:44.385990" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:44.385115" elapsed="0.000898"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:44.386183" elapsed="0.000168"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:44.384494" elapsed="0.001899"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:44.382160" elapsed="0.004290"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:44.386515" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:44.386648" 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-10-11T01:05:44.380738" elapsed="0.005935"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:44.380456" elapsed="0.006246"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:44.386882" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:44.386725" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.380433" elapsed="0.006517"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.387738" 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-10-11T01:05:44.387117" elapsed="0.000650"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:44.387811" 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_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-10-11T01:05:44.376821" elapsed="0.011091"/>
</kw>
<msg time="2026-10-11T01:05:44.387963" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:44.372219" elapsed="0.015790"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:44.392310" 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/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-10-11T01:05:44.396678" 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/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-10-11T01:05:44.400914" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:44.401104" 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-10-11T01:05:44.401290" 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-10-11T01:05:44.401679" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:44.401523" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:44.401508" 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-10-11T01:05:44.401929" 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-10-11T01:05:44.402113" 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-10-11T01:05:44.402281" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:44.401460" elapsed="0.000870"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:44.401357" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:44.402538" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:44.402607" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:05:44.402719" 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-10-11T01:05:44.371573" elapsed="0.031174"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:44.403951" 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-10-11T01:05:44.403745" elapsed="0.000267">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-10-11T01:05:44.404096" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:44.403380" elapsed="0.000739"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:44.404429" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:44.404182" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.405001" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:44.404716" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:44.404520" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.404165" elapsed="0.000914"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.405620" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:44.405248" elapsed="0.000397"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:05:44.405690" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:44.405820" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:05:44.403067" elapsed="0.002786"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:44.407182" 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-10-11T01:05:44.406990" elapsed="0.000253">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-10-11T01:05:44.407329" 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-10-11T01:05:44.406644" elapsed="0.000708"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:05:44.407552" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:05:44.407434" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.407399" elapsed="0.000230"/>
</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-10-11T01:05:44.407792" elapsed="0.000020"/>
</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-10-11T01:05:44.407991" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:05:44.408054" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:05:44.408180" 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-10-11T01:05:44.406300" elapsed="0.001904"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.409495" 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-10-11T01:05:44.409242" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.409968" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:44.409737" elapsed="0.000272"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:44.417037" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node04zxcc0fk4bkfg607mewx0lv525.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:44.417228" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:05:44.417322" 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-10-11T01:05:44.410307" elapsed="0.007040"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:44.410070" elapsed="0.007318"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:44.417612" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:44.417432" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.410053" elapsed="0.007640"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.419005" 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-10-11T01:05:44.418665" elapsed="0.000387"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:44.418383" elapsed="0.000706"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.418366" elapsed="0.000759"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.419745" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:44.419449" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:44.419181" elapsed="0.000638"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.419165" elapsed="0.000677"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.420426" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:44.420032" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:44.420768" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:44.420538" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.421307" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:44.421022" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:44.420846" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.420520" elapsed="0.000866"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.421947" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:44.421601" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:44.422276" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:44.422038" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.422831" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:44.422561" elapsed="0.000295"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:44.422353" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.422021" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:44.423058" elapsed="0.000305"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:44.423795" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:44.423564" elapsed="0.000256"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:44.423978" elapsed="0.000220"/>
</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-10-11T01:05:44.418024" elapsed="0.006245"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:44.424436" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:44.424334" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.424317" elapsed="0.000199"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:44.425438" 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-10-11T01:05:44.424665" elapsed="0.000849"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:05:44.425566" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:44.425698" 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-10-11T01:05:44.408519" elapsed="0.017204"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:44.425778" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:05:44.425901" 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-10-11T01:05:44.363999" elapsed="0.061926"/>
</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-10-11T01:05:44.436772" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:44.436433" elapsed="0.000367"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:44.437494" 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-10-11T01:05:44.437290" elapsed="0.000278">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-10-11T01:05:44.437657" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:44.436965" elapsed="0.000714"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.438171" 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-10-11T01:05:44.437860" elapsed="0.000337"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:44.438512" 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-10-11T01:05:44.438647" 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-10-11T01:05:44.438369" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.439098" 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-10-11T01:05:44.438876" elapsed="0.000267"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:05:44.439491" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:44.439205" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.440004" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:44.439738" elapsed="0.000292"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:44.439573" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.439187" elapsed="0.000895"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.440686" 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-10-11T01:05:44.440250" elapsed="0.000465"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:44.440759" 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_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-10-11T01:05:44.435897" elapsed="0.005001"/>
</kw>
<msg time="2026-10-11T01:05:44.440951" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:44.431359" elapsed="0.009637"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_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-10-11T01:05:44.445454" 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_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-10-11T01:05:44.449761" 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/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-10-11T01:05:44.454055" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:44.454246" 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-10-11T01:05:44.454452" 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-10-11T01:05:44.454819" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:44.454663" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:44.454649" 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-10-11T01:05:44.455075" 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-10-11T01:05:44.455269" 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-10-11T01:05:44.455458" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:44.454623" elapsed="0.000904"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:44.454532" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:44.455716" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:44.455782" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:44.455907" 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-10-11T01:05:44.430654" elapsed="0.025284"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:44.456157" elapsed="0.000360"/>
</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-10-11T01:05:44.457574" 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-10-11T01:05:44.457188" elapsed="0.000415"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:05:44.458116" 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-10-11T01:05:44.457760" elapsed="0.000383"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${expected_normalized}</arg>
<arg>${actual_normalized}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-10-11T01:05:44.458335" elapsed="0.000315"/>
</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-10-11T01:05:44.456797" elapsed="0.001909"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:44.456589" 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-10-11T01:05:44.458942" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:44.458760" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.456572" elapsed="0.002445"/>
</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-10-11T01:05:44.426921" elapsed="0.032149"/>
</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-10-11T01:05:44.426213" elapsed="0.032923"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:44.425999" elapsed="0.033177"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.425983" elapsed="0.033214"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:44.459227" elapsed="0.000026"/>
</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-10-11T01:05:44.363157" elapsed="0.096172"/>
</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-10-11T01:05:42.305645" elapsed="2.153739"/>
</kw>
<kw name="Play Get" owner="BgpRpcClient4">
<msg time="2026-10-11T01:05:44.462827" level="INFO">${update} = ffffffffffffffffffffffffffffffff001d0200000006800f03000105</msg>
<var>${update}</var>
<doc>Gets the last received (update) mesage as hex string.</doc>
<status status="PASS" start="2026-10-11T01:05:44.459575" elapsed="0.003280"/>
</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-10-11T01:05:42.184566" elapsed="2.278394"/>
</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-10-11T01:05:44.464915" elapsed="0.000391"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:05:44.464557" elapsed="0.000801"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:44.466310" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:44.466218" elapsed="0.000134"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.466199" elapsed="0.000173"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:44.468641" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:44.468555" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.468537" elapsed="0.000168"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.469661" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:44.469296" elapsed="0.000391"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.470115" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:05:44.469845" elapsed="0.000295"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:05:44.470182" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:44.470324" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:05:44.468920" elapsed="0.001428"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:44.472991" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:44.472905" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.472888" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:44.474137" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:44.474052" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.474034" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:44.474576" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:05:44.474362" elapsed="0.000240"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:44.474918" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:05:44.474775" elapsed="0.000167"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:05:44.508570" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:05:44.475472" elapsed="0.033195"/>
</kw>
<msg time="2026-10-11T01:05:44.508819" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:05:44.508860" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:44.475103" elapsed="0.033792"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:05:44.551919" 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-10-11T01:05:44.509451" elapsed="0.042573"/>
</kw>
<msg time="2026-10-11T01:05:44.552174" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:05:44.552215" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:44.509068" elapsed="0.043182"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:44.552562" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:44.552316" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.552299" elapsed="0.000337"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.553045" 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-10-11T01:05:44.552821" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:44.553375" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:44.553174" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.553158" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:05:44.553508" 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-10-11T01:05:44.556177" elapsed="0.000329"/>
</kw>
<msg time="2026-10-11T01:05:44.556575" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:44.554971" elapsed="0.001766"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:44.557144" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:44.557527" 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-10-11T01:05:44.554306" elapsed="0.003411"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:05:44.553797" elapsed="0.003979"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:05:44.473791" elapsed="0.084059"/>
</kw>
<msg time="2026-10-11T01:05:44.557936" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:44.557977" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:44.473211" elapsed="0.084844"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:05:44.558222" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:05:44.558132" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.558112" elapsed="0.000188"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:44.558674" 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-10-11T01:05:44.558986" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:05:44.559051" 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-10-11T01:05:44.472615" elapsed="0.086522"/>
</kw>
<msg time="2026-10-11T01:05:44.559223" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:44.559264" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:44.470763" elapsed="0.088537"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:44.559715" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:44.559368" elapsed="0.000397"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.559352" elapsed="0.000435"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:05:44.470613" elapsed="0.089196"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:05:44.470451" elapsed="0.089388"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:05:44.468219" elapsed="0.091669"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:05:44.465952" elapsed="0.093988"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:44.465549" elapsed="0.094433"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:05:44.464115" elapsed="0.095916"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient3">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:05:44.560186" elapsed="0.002859"/>
</kw>
<kw name="Play_To_Odl_Routes_Removal_Template_BgpRpcClient3">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:44.567062" 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-10-11T01:05:44.567199" 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-10-11T01:05:44.566909" elapsed="0.000315"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient3">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:05:44.567370" elapsed="0.002266"/>
</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-10-11T01:05:44.569794" elapsed="0.002711"/>
</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-10-11T01:05:44.566550" elapsed="0.006021"/>
</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-10-11T01:05:44.463439" elapsed="0.109228"/>
</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-10-11T01:05:44.574500" elapsed="0.000296"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:05:44.574206" elapsed="0.000642"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:44.575780" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:44.575693" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.575675" elapsed="0.000168"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:44.578033" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:44.577950" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.577934" elapsed="0.000166"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.579024" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:44.578700" elapsed="0.000349"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.579535" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:05:44.579240" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:05:44.579600" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:44.579726" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:05:44.578312" elapsed="0.001436"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:44.582260" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:44.582176" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.582159" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:44.583359" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:44.583276" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.583259" elapsed="0.000182"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:44.583779" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:05:44.583608" elapsed="0.000195"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:44.584102" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:05:44.583968" elapsed="0.000157"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:05:44.624857" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:05:44.584659" elapsed="0.040308"/>
</kw>
<msg time="2026-10-11T01:05:44.625115" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:05:44.625156" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:44.584285" elapsed="0.040906"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:05:44.710665" 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-10-11T01:05:44.625741" elapsed="0.085030"/>
</kw>
<msg time="2026-10-11T01:05:44.710917" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:05:44.710957" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:44.625363" elapsed="0.085629"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:44.711270" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:44.711061" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.711043" elapsed="0.000297"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.711788" 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-10-11T01:05:44.711559" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:44.712122" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:44.711920" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.711904" elapsed="0.000288"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:05:44.712222" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:05:44.715057" elapsed="0.000279"/>
</kw>
<msg time="2026-10-11T01:05:44.715428" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:44.713733" elapsed="0.001861"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:44.715979" elapsed="0.000084"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:44.716742" 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-10-11T01:05:44.713042" elapsed="0.003934"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:05:44.712572" 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-10-11T01:05:44.583022" elapsed="0.134118"/>
</kw>
<msg time="2026-10-11T01:05:44.717230" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:44.717273" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:44.582504" elapsed="0.134810"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:05:44.717600" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-10-11T01:05:44.717396" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.717375" elapsed="0.000316"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:44.718075" 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-10-11T01:05:44.718391" elapsed="0.000077"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:05:44.718526" 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-10-11T01:05:44.581893" elapsed="0.136721"/>
</kw>
<msg time="2026-10-11T01:05:44.718697" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:44.718736" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:44.580084" elapsed="0.138687"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:44.719073" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:44.718838" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.718822" elapsed="0.000324"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:05:44.579936" elapsed="0.139232"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:05:44.579796" elapsed="0.139398"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:05:44.577658" elapsed="0.141584"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:05:44.575402" elapsed="0.143890"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:44.575004" elapsed="0.144327"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:05:44.573671" elapsed="0.145706"/>
</kw>
<kw name="Play_To_Odl_Routes_Removal_Template_BgpRpcClient2">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:44.723340" 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-10-11T01:05:44.723508" 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-10-11T01:05:44.723197" elapsed="0.000337"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient2">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:05:44.723679" elapsed="0.002708"/>
</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-10-11T01:05:44.726567" elapsed="0.002146"/>
</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-10-11T01:05:44.722838" elapsed="0.005940"/>
</kw>
<kw name="Play_To_Odl_Routes_Removal_Template_BgpRpcClient4">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:44.732683" 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-10-11T01:05:44.732800" 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-10-11T01:05:44.732541" elapsed="0.000283"/>
</kw>
<kw name="Play Clean" owner="BgpRpcClient4">
<doc>Cleans the message (update) on the server.</doc>
<status status="PASS" start="2026-10-11T01:05:44.733006" elapsed="0.002673"/>
</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-10-11T01:05:44.735831" elapsed="0.002122"/>
</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-10-11T01:05:44.732151" elapsed="0.005860"/>
</kw>
<doc>Removes rt arguments from odl.</doc>
<status status="PASS" start="2026-10-11T01:05:44.573092" elapsed="0.165010"/>
</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-10-11T01:05:44.739585" elapsed="0.000204"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:05:44.739167" elapsed="0.000671"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:44.740834" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:44.740748" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.740731" elapsed="0.000166"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:44.744712" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:44.744628" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.744611" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.745707" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:44.745352" elapsed="0.000380"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.746146" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:05:44.745887" elapsed="0.000283"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:05:44.746210" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:44.746335" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:05:44.744984" elapsed="0.001374"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:44.748879" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:44.748795" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.748778" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:44.749978" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:44.749895" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.749878" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:44.750357" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:05:44.750190" elapsed="0.000191"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:44.750714" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:05:44.750579" elapsed="0.000159"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:05:44.784924" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:05:44.751228" elapsed="0.033825"/>
</kw>
<msg time="2026-10-11T01:05:44.785227" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:05:44.785268" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:44.750898" elapsed="0.034404"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:05:44.836189" 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-10-11T01:05:44.785930" elapsed="0.050365"/>
</kw>
<msg time="2026-10-11T01:05:44.836460" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:05:44.836515" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:44.785537" elapsed="0.051014"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:44.836903" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:44.836627" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.836605" elapsed="0.000373"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.837397" 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-10-11T01:05:44.837163" elapsed="0.000334"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:44.837763" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:44.837558" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.837542" elapsed="0.000292"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:05:44.837868" 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-10-11T01:05:44.840534" elapsed="0.000262"/>
</kw>
<msg time="2026-10-11T01:05:44.840856" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:44.839321" elapsed="0.001675"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:44.841306" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:44.841687" 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-10-11T01:05:44.838722" elapsed="0.003237"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:05:44.838204" elapsed="0.003835"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:05:44.749639" elapsed="0.092476"/>
</kw>
<msg time="2026-10-11T01:05:44.842196" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:44.842236" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:44.749097" elapsed="0.093175"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:05:44.842462" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-10-11T01:05:44.842340" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.842322" elapsed="0.000244"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:44.842895" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:44.843202" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:05:44.843265" 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-10-11T01:05:44.748510" elapsed="0.094839"/>
</kw>
<msg time="2026-10-11T01:05:44.843451" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:44.843502" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:44.746715" elapsed="0.096824"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:44.843830" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:44.843606" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.843591" elapsed="0.000309"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:05:44.746569" elapsed="0.097353"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:05:44.746402" elapsed="0.097549"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:05:44.744303" elapsed="0.099696"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:05:44.740465" elapsed="0.103586"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:44.739991" elapsed="0.104103"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:05:44.738819" elapsed="0.105323"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:05:44.847645" level="INFO">Executing command 'cat play.py.090.2'.</msg>
<msg time="2026-10-11T01:05:44.862823" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:05:44.862911" level="INFO">${output_log} = 2026-10-11 01:05:31,080 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 01:05:31,081 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.2
2026-10-11 01:05:31,081 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-10-11T01:05:44.847529" elapsed="0.015406"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.863362" level="INFO">2026-10-11 01:05:31,080 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 01:05:31,081 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.2
2026-10-11 01:05:31,081 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 01:05:31,081 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 01:05:31,081 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 01:05:31,081 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 01:05:31,090 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 01:05:31,090 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00d90104fbf0005ac0000202bc02ba41040000fbf0060002000104000100010104000100040104000100850104000200040104000100810104000100840104000200810104000200800104000100860104000200860104000200850104000200050104000100800104000100050104400400470104001900460104000200014046003c00010500000286000001810040044700000204000002800000020500000281000001010000018500000184000001860000194600000201000002850000010400000180004700
2026-10-11 01:05:31,091 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 01:05:31,091 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-10-11 01:05:31,091 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-10-11 01:05:31,091 INFO BGP-Thread-1 (job):   My Autonomous System number: 65000
2026-10-11 01:05:31,091 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 01:05:31,091 INFO BGP-Thread-1 (job):   My BGP Identifier: 2130706434
2026-10-11 01:05:31,091 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 01:05:31,091 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 01:05:31,091 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 01:05:31,091 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 01:05:31,091 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 01:05:31,091 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 01:05:31,091 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-10-11 01:05:31,091 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-10-11 01:05:31,091 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 01:05:31,091 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 01:05:31,091 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 01:05:31,091 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 01:05:31,091 DEBUG BGP-Thread-1 (job):   Length=125 (0x007d)
2026-10-11 01:05:31,091 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 01:05:31,091 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 01:05:31,091 DEBUG BGP-Thread-1 (job):   My Autonomous System=65000 (0xfde8)
2026-10-11 01:05:31,091 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 01:05:31,091 DEBUG BGP-Thread-1 (job):   BGP Identifier=2130706434 (0x7f000002)
2026-10-11 01:05:31,091 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=96 (0x60)
2026-10-11 01:05:31,091 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x02060104000100010206010400020001020601044004004702060104001900460206010400010005020601040002000502060104000100810206010400020081020601040001008002060104000200800206010400010084020641040000fde8
2026-10-11 01:05:31,091 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff007d0104fde800b47f0000026002060104000100010206010400020001020601044004004702060104001900460206010400010005020601040002000502060104000100810206010400020081020601040001008002060104000200800206010400010084020641040000fde8'
2026-10-11 01:05:31,091 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff007d0104fde800b47f0000026002060104000100010206010400020001020601044004004702060104001900460206010400010005020601040002000502060104000100810206010400020081020601040001008002060104000200800206010400010084020641040000fde8
2026-10-11 01:05:31,099 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 01:05:31,114 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000201
2026-10-11 01:05:31,114 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,114 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,114 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:05:31,114 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,114 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,114 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,114 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,114 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,114 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,114 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,114 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,114 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,114 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000180
2026-10-11 01:05:31,114 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,114 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,114 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:05:31,114 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,114 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,114 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,114 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,114 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,114 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,114 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,114 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,114 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,115 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03001946
2026-10-11 01:05:31,115 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,115 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,115 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:05:31,115 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,115 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,115 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,115 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,115 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,115 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,115 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,115 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,115 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,115 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000184
2026-10-11 01:05:31,115 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,115 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,115 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:05:31,115 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,115 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,115 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,115 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,115 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,115 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,115 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,115 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,115 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000281
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000205
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,116 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000280
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03400447
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000181
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,117 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,118 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,118 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,118 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,118 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,118 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,118 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,118 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,118 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000105
2026-10-11 01:05:31,118 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,118 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,118 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:05:31,118 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,118 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,118 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,118 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,118 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,118 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,118 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,118 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,118 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,118 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:31,118 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:31,118 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:31] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:32,119 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:32,120 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.001s
2026-10-11 01:05:32,120 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff0052020000003b4001010040020602010000fbf0800e200001800c00000000000000000a00fffe007005dc510001010203040001010101c010080002fbf000000065
2026-10-11 01:05:32,121 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:32,122 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:32,122 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:33,123 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:33,124 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 2.002s
2026-10-11 01:05:33,124 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:33,124 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:33,124 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:34,125 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:34,126 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 3.003s
2026-10-11 01:05:34,126 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:34,126 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:34,126 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:35,127 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:35,127 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 4.004s
2026-10-11 01:05:35,127 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:35,127 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:35,128 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:36,129 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:36,129 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 5.006s
2026-10-11 01:05:36,129 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:36,129 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:36,129 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:37,131 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:37,131 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.007s
2026-10-11 01:05:37,131 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:37,131 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:37,131 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:38,132 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:38,133 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 7.008s
2026-10-11 01:05:38,133 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:38,133 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:38,133 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:39,134 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:39,134 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.009s
2026-10-11 01:05:39,134 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:39,135 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:39,135 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:40,136 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:40,136 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 9.010s
2026-10-11 01:05:40,136 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:40,136 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:40,136 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:41,138 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:41,138 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.011s
2026-10-11 01:05:41,138 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:41,138 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:41,138 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:42,139 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:42,140 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 11.012s
2026-10-11 01:05:42,140 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:42,140 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:42,140 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:42] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:43,141 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:43,142 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 12.013s
2026-10-11 01:05:43,142 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:43,142 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:43,142 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:44,143 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:44,143 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 13.014s
2026-10-11 01:05:44,143 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:44,144 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:44,144 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:44] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:44] "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-10-11T01:05:44.863136" elapsed="0.000510"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:44.864149" 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-10-11T01:05:44.863837" elapsed="0.000364"/>
</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-10-11T01:05:44.847154" elapsed="0.017100"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:05:44.867620" level="INFO">Executing command 'cat play.py.090.3'.</msg>
<msg time="2026-10-11T01:05:44.912284" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:05:44.912402" level="INFO">${output_log} = 2026-10-11 01:05:31,085 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 01:05:31,086 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.3
2026-10-11 01:05:31,086 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-10-11T01:05:44.867509" elapsed="0.044954"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.913072" level="INFO">2026-10-11 01:05:31,085 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 01:05:31,086 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.3
2026-10-11 01:05:31,086 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 01:05:31,086 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 01:05:31,086 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 01:05:31,086 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 01:05:31,088 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 01:05:31,088 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00d90104fbf000b4c0000202bc02ba41040000fbf0060002000104000100010104000100040104000100850104000200040104000100810104000100840104000200810104000200800104000100860104000200860104000200850104000200050104000100800104000100050104400400470104001900460104000200014046003c00010500000286000001810040044700000204000002800000020500000281000001010000018500000184000001860000194600000201000002850000010400000180004700
2026-10-11 01:05:31,088 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 01:05:31,088 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-10-11 01:05:31,088 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-10-11 01:05:31,088 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 01:05:31,088 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 01:05:31,088 INFO BGP-Thread-1 (job):   My BGP Identifier: 2130706435
2026-10-11 01:05:31,088 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 01:05:31,088 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 01:05:31,088 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 01:05:31,088 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 01:05:31,088 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 01:05:31,089 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 01:05:31,089 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-10-11 01:05:31,089 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-10-11 01:05:31,089 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 01:05:31,089 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 01:05:31,089 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 01:05:31,089 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 01:05:31,089 DEBUG BGP-Thread-1 (job):   Length=125 (0x007d)
2026-10-11 01:05:31,089 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 01:05:31,089 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 01:05:31,089 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-10-11 01:05:31,089 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 01:05:31,089 DEBUG BGP-Thread-1 (job):   BGP Identifier=2130706435 (0x7f000003)
2026-10-11 01:05:31,089 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=96 (0x60)
2026-10-11 01:05:31,089 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x02060104000100010206010400020001020601044004004702060104001900460206010400010005020601040002000502060104000100810206010400020081020601040001008002060104000200800206010400010084020641040000fbf0
2026-10-11 01:05:31,089 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff007d0104fbf000b47f0000036002060104000100010206010400020001020601044004004702060104001900460206010400010005020601040002000502060104000100810206010400020081020601040001008002060104000200800206010400010084020641040000fbf0'
2026-10-11 01:05:31,090 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff007d0104fbf000b47f0000036002060104000100010206010400020001020601044004004702060104001900460206010400010005020601040002000502060104000100810206010400020081020601040001008002060104000200800206010400010084020641040000fbf0
2026-10-11 01:05:31,090 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 01:05:31,090 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 01:05:31,090 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 01:05:31,091 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 01:05:31,091 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 01:05:31,091 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 01:05:31,091 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 01:05:31,091 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 01:05:31,091 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 01:05:31,091 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 01:05:31,091 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 01:05:31,091 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:31,091 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:31,091 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:31,097 INFO BGP-Thread-1 (job): ... idle for 0.006s
2026-10-11 01:05:31,097 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.006s
2026-10-11 01:05:31,098 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000105
2026-10-11 01:05:31,098 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,098 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,098 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:05:31,098 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,098 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,098 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,098 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,098 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,098 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,098 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,098 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,098 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,098 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000181
2026-10-11 01:05:31,099 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,099 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,099 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:05:31,099 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,099 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,099 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,099 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,099 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,099 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,099 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,099 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,099 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,099 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03400447
2026-10-11 01:05:31,099 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,099 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,099 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:05:31,099 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,099 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,099 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,099 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,099 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,099 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,099 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,099 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000280
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000205
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,100 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,101 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,101 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,101 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,101 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000281
2026-10-11 01:05:31,101 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,101 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,101 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:05:31,101 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,101 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,101 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,101 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,103 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,103 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,103 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,103 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,103 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,104 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 01:05:31,104 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,104 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,104 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 01:05:31,104 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,104 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,104 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,104 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,105 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,105 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,105 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,105 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,105 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,106 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000184
2026-10-11 01:05:31,106 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,106 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,106 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:05:31,106 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,106 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,106 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,106 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,106 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,106 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,107 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,107 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,107 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,107 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03001946
2026-10-11 01:05:31,107 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,107 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,107 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:05:31,107 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,107 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,107 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,107 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,107 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,107 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,107 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,107 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,107 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,107 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000180
2026-10-11 01:05:31,107 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,107 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,108 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:05:31,108 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,108 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,108 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,108 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,108 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,108 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,108 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,108 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,108 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,108 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000201
2026-10-11 01:05:31,108 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,108 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,108 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:05:31,108 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,108 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,108 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,108 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,108 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,108 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,108 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,108 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,108 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,109 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:31,109 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:31,109 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:32,109 INFO BGP-Thread-1 (job): ... idle for 1.000s
2026-10-11 01:05:32,109 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.006s
2026-10-11 01:05:32,109 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:32,109 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:32,110 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:33,110 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:33,111 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 2.007s
2026-10-11 01:05:33,111 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:33,111 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:33,111 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:34,112 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:34,112 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 3.008s
2026-10-11 01:05:34,113 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:34,113 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:34,113 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:35,114 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:35,114 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 4.009s
2026-10-11 01:05:35,114 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:35,114 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:35,114 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:35] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:36,115 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:36,117 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 5.010s
2026-10-11 01:05:36,117 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0002fbf000000065
2026-10-11 01:05:36,117 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:36,117 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:36,117 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:37,118 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:37,119 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.011s
2026-10-11 01:05:37,119 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:37,119 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:37,119 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:38,120 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:38,120 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 7.012s
2026-10-11 01:05:38,121 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:38,121 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:38,121 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:39,122 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:39,122 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.013s
2026-10-11 01:05:39,122 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:39,122 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:39,122 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:40,124 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:40,124 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 9.015s
2026-10-11 01:05:40,124 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:40,124 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:40,124 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:41,126 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:41,127 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.016s
2026-10-11 01:05:41,127 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:41,127 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:41,127 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:42,128 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:42,128 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 11.016s
2026-10-11 01:05:42,128 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:42,128 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:42,129 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:42] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:43,130 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:43,130 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 12.018s
2026-10-11 01:05:43,130 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:43,130 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:43,130 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:44,132 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:44,132 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 13.019s
2026-10-11 01:05:44,132 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:44,132 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:44,132 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:44] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:44] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:44] "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-10-11T01:05:44.912761" elapsed="0.000682"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:44.914046" 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-10-11T01:05:44.913717" elapsed="0.000399"/>
</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-10-11T01:05:44.867135" elapsed="0.047055"/>
</kw>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:05:44.918829" level="INFO">Executing command 'cat play.py.090.4'.</msg>
<msg time="2026-10-11T01:05:44.965145" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:05:44.965333" level="INFO">${output_log} = 2026-10-11 01:05:31,119 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 01:05:31,119 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.4
2026-10-11 01:05:31,120 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-10-11T01:05:44.918676" elapsed="0.046710"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.966393" level="INFO">2026-10-11 01:05:31,119 INFO BGP-Thread-1 (job): Connecting in the talking mode.
2026-10-11 01:05:31,119 DEBUG BGP-Thread-1 (job): Local IP address: 127.0.0.4
2026-10-11 01:05:31,120 DEBUG BGP-Thread-1 (job): Local port: 17900
2026-10-11 01:05:31,120 DEBUG BGP-Thread-1 (job): Remote IP address: 10.30.170.173
2026-10-11 01:05:31,120 DEBUG BGP-Thread-1 (job): Remote port: 1790
2026-10-11 01:05:31,120 INFO BGP-Thread-1 (job): Connected to ODL.
2026-10-11 01:05:31,121 INFO BGP-Thread-1 (job): Open message received.
2026-10-11 01:05:31,121 INFO BGP-Thread-1 (job): ffffffffffffffffffffffffffffffff00d90104fbf000b4c0000202bc02ba41040000fbf0060002000104000100010104000100040104000100850104000200040104000100810104000100840104000200810104000200800104000100860104000200860104000200850104000200050104000100800104000100050104400400470104001900460104000200014046003c00010500000286000001810040044700000204000002800000020500000281000001010000018500000184000001860000194600000201000002850000010400000180004700
2026-10-11 01:05:31,121 INFO BGP-Thread-1 (job): Generator initialisation
2026-10-11 01:05:31,121 INFO BGP-Thread-1 (job):   Target total number of prefixes to be introduced: 0
2026-10-11 01:05:31,121 INFO BGP-Thread-1 (job):   Prefix base: 8.0.1.0/28
2026-10-11 01:05:31,121 INFO BGP-Thread-1 (job):   My Autonomous System number: 64496
2026-10-11 01:05:31,121 INFO BGP-Thread-1 (job):   My Hold Time: 180
2026-10-11 01:05:31,121 INFO BGP-Thread-1 (job):   My BGP Identifier: 2130706436
2026-10-11 01:05:31,121 INFO BGP-Thread-1 (job):   Next Hop: 192.0.2.1
2026-10-11 01:05:31,121 INFO BGP-Thread-1 (job):   Originator ID: None
2026-10-11 01:05:31,121 INFO BGP-Thread-1 (job):   Cluster list: None
2026-10-11 01:05:31,121 INFO BGP-Thread-1 (job):   Prefix count to be inserted at once: 1
2026-10-11 01:05:31,122 INFO BGP-Thread-1 (job):   Prefix count to be withdrawn at once: 0
2026-10-11 01:05:31,122 INFO BGP-Thread-1 (job):   Fast pre-fill up to 0 prefixes
2026-10-11 01:05:31,122 INFO BGP-Thread-1 (job):   Remaining number of prefixes to be processed in parallel with withdrawals: 0
2026-10-11 01:05:31,122 DEBUG BGP-Thread-1 (job):   Prefix index range used after pre-fill procedure [0, -1]
2026-10-11 01:05:31,122 INFO BGP-Thread-1 (job):   Two separate UPDATEs will be generated for each NLRI &amp; WITHDRAWN lists
2026-10-11 01:05:31,122 INFO BGP-Thread-1 (job):   Let's go ...

2026-10-11 01:05:31,122 DEBUG BGP-Thread-1 (job): OPEN message encoding
2026-10-11 01:05:31,122 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 01:05:31,122 DEBUG BGP-Thread-1 (job):   Length=125 (0x007d)
2026-10-11 01:05:31,122 DEBUG BGP-Thread-1 (job):   Type=1 (0x01)
2026-10-11 01:05:31,122 DEBUG BGP-Thread-1 (job):   Version=4 (0x04)
2026-10-11 01:05:31,122 DEBUG BGP-Thread-1 (job):   My Autonomous System=64496 (0xfbf0)
2026-10-11 01:05:31,122 DEBUG BGP-Thread-1 (job):   Hold Time=180 (0x00b4)
2026-10-11 01:05:31,122 DEBUG BGP-Thread-1 (job):   BGP Identifier=2130706436 (0x7f000004)
2026-10-11 01:05:31,122 DEBUG BGP-Thread-1 (job):   Optional Parameters Length=96 (0x60)
2026-10-11 01:05:31,122 DEBUG BGP-Thread-1 (job):   Optional Parameters=0x02060104000100010206010400020001020601044004004702060104001900460206010400010005020601040002000502060104000100810206010400020081020601040001008002060104000200800206010400010084020641040000fbf0
2026-10-11 01:05:31,122 DEBUG BGP-Thread-1 (job): OPEN message encoded: 0xb'ffffffffffffffffffffffffffffffff007d0104fbf000b47f0000046002060104000100010206010400020001020601044004004702060104001900460206010400010005020601040002000502060104000100810206010400020081020601040001008002060104000200800206010400010084020641040000fbf0'
2026-10-11 01:05:31,122 DEBUG BGP-Thread-1 (job): Sending the OPEN message: ffffffffffffffffffffffffffffffff007d0104fbf000b47f0000046002060104000100010206010400020001020601044004004702060104001900460206010400010005020601040002000502060104000100810206010400020081020601040001008002060104000200800206010400010084020641040000fbf0
2026-10-11 01:05:31,123 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 01:05:31,123 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 01:05:31,123 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 01:05:31,123 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 01:05:31,123 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 01:05:31,123 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoding
2026-10-11 01:05:31,123 DEBUG BGP-Thread-1 (job):   Marker=0xffffffffffffffffffffffffffffffff
2026-10-11 01:05:31,123 DEBUG BGP-Thread-1 (job):   Length=19 (0x0013)
2026-10-11 01:05:31,123 DEBUG BGP-Thread-1 (job):   Type=4 (0x04)
2026-10-11 01:05:31,123 DEBUG BGP-Thread-1 (job): KEEP ALIVE message encoded: 0xffffffffffffffffffffffffffffffff001304
2026-10-11 01:05:31,123 DEBUG BGP-Thread-1 (job): Sending a KEEP ALIVE message: ffffffffffffffffffffffffffffffff001304
2026-10-11 01:05:31,124 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:31,124 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:31,124 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:31,128 INFO BGP-Thread-1 (job): ... idle for 0.004s
2026-10-11 01:05:31,128 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 0.004s
2026-10-11 01:05:31,128 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000281
2026-10-11 01:05:31,128 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,128 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,129 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:05:31,129 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,129 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,129 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,129 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,129 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,129 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,129 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,129 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,129 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,129 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff00170200000000
2026-10-11 01:05:31,129 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,129 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,129 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'0017' (23)
2026-10-11 01:05:31,129 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,129 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,129 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,129 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,129 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,129 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,129 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,129 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,129 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,130 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000205
2026-10-11 01:05:31,130 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,130 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,130 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:05:31,130 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,130 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,130 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,130 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,130 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,130 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,130 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,130 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,130 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,130 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000184
2026-10-11 01:05:31,130 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,130 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,130 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:05:31,130 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,130 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,130 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,130 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,130 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,130 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,130 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,131 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,131 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,131 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000280
2026-10-11 01:05:31,131 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,131 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,131 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:05:31,131 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,131 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,131 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,131 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,131 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,131 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,131 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,131 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,131 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,131 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000181
2026-10-11 01:05:31,131 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,131 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,131 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:05:31,131 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,131 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,131 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,131 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,131 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,132 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,132 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,132 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,132 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,132 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03400447
2026-10-11 01:05:31,132 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,132 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,132 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:05:31,132 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,132 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,132 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,132 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,132 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,132 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,132 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,132 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,132 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,132 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03001946
2026-10-11 01:05:31,133 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,133 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,133 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:05:31,133 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,133 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,133 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,133 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,133 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,133 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,133 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,133 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,133 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,133 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000201
2026-10-11 01:05:31,133 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,133 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,133 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:05:31,133 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,133 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,133 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,133 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,133 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,133 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,133 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,133 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,134 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,134 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000180
2026-10-11 01:05:31,134 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,134 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,134 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:05:31,134 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,134 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,134 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,134 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,134 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,134 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,134 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,134 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,134 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,134 DEBUG BGP-Thread-1 (job): UPDATE message received: 0xffffffffffffffffffffffffffffffff001d0200000006800f03000105
2026-10-11 01:05:31,134 DEBUG BGP-Thread-1 (job): Decoding update message:
2026-10-11 01:05:31,134 DEBUG BGP-Thread-1 (job): Message header marker: 0xb'ffffffffffffffffffffffffffffffff'
2026-10-11 01:05:31,134 DEBUG BGP-Thread-1 (job): Message lenght: 0xb'001d' (29)
2026-10-11 01:05:31,134 DEBUG BGP-Thread-1 (job): Evpn False
2026-10-11 01:05:31,134 DEBUG BGP-Thread-1 (job): Graceful-restart 8
2026-10-11 01:05:31,134 DEBUG BGP-Thread-1 (job): Mvpn False
2026-10-11 01:05:31,134 DEBUG BGP-Thread-1 (job): L3vpn-mcast False
2026-10-11 01:05:31,134 DEBUG BGP-Thread-1 (job): L3vpn-unicast False
2026-10-11 01:05:31,135 DEBUG BGP-Thread-1 (job): Route-Target-Constrain False
2026-10-11 01:05:31,135 DEBUG BGP-Thread-1 (job): Ipv6-Unicast False
2026-10-11 01:05:31,135 DEBUG BGP-Thread-1 (job): Allf True
2026-10-11 01:05:31,135 DEBUG BGP-Thread-1 (job): Skipping update decoding
2026-10-11 01:05:31,135 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:31,135 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:31,135 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:32,135 INFO BGP-Thread-1 (job): ... idle for 1.000s
2026-10-11 01:05:32,136 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 1.004s
2026-10-11 01:05:32,136 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:32,136 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:32,136 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:33,137 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:33,137 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 2.005s
2026-10-11 01:05:33,137 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:33,137 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:33,137 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:34,139 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:34,139 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 3.006s
2026-10-11 01:05:34,139 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:34,139 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:34,139 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:35,140 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:35,140 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 4.007s
2026-10-11 01:05:35,141 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:35,141 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:35,141 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:36,142 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:36,142 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 5.008s
2026-10-11 01:05:36,142 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:36,142 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:36,142 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:37,144 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:37,144 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 6.010s
2026-10-11 01:05:37,144 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:37,144 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:37,144 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:38,145 INFO BGP-Thread-1 (job): ... idle for 1.000s
2026-10-11 01:05:38,145 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 7.010s
2026-10-11 01:05:38,145 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:38,145 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:38,145 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:39,146 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:39,147 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 8.011s
2026-10-11 01:05:39,147 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:39,147 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:39,147 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:40,148 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:40,148 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 9.012s
2026-10-11 01:05:40,148 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:40,148 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:40,149 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:41,150 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:41,150 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 10.013s
2026-10-11 01:05:41,150 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:41,150 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:41,150 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:42,152 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:42,152 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 11.014s
2026-10-11 01:05:42,152 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:42,152 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:42,152 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:42] "POST /RPC2 HTTP/1.1" 200 -
2026-10-11 01:05:43,154 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:43,154 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 12.015s
2026-10-11 01:05:43,154 INFO BGP-Thread-1 (job): Received message: ffffffffffffffffffffffffffffffff003e02000000274001010040020040050400000064800e1600018404c714a62900600000fbff0102c0000202007b
2026-10-11 01:05:43,154 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:43,154 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:43,154 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
2026-10-11 01:05:44,156 INFO BGP-Thread-1 (job): ... idle for 1.001s
2026-10-11 01:05:44,156 INFO BGP-Thread-1 (job): total_rx_idle_time_counter: 13.017s
2026-10-11 01:05:44,156 INFO BGP-Thread-1 (job): total_received_update_message_counter: 0
2026-10-11 01:05:44,156 INFO BGP-Thread-1 (job): total_received_nlri_prefix_counter: 0
2026-10-11 01:05:44,156 INFO BGP-Thread-1 (job): total_received_withdrawn_prefix_counter: 0
10.30.170.34 - - [11/Oct/2026 01:05:44] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:44] "POST /RPC2 HTTP/1.1" 200 -
10.30.170.34 - - [11/Oct/2026 01:05:44] "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-10-11T01:05:44.965893" elapsed="0.001110"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:44.967992" 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-10-11T01:05:44.967448" elapsed="0.000657"/>
</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-10-11T01:05:44.918159" elapsed="0.050064"/>
</kw>
<kw name="Kill_All_BGP_Speakers" owner="BGPSpeaker">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.969938" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:44.969322" elapsed="0.000674"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:05:44.971164" level="INFO">[?2004l[2] 5945</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:05:44.970401" elapsed="0.000865"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:05:44.972793" level="INFO">[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<msg time="2026-10-11T01:05:44.972957" level="INFO">${output} = [?2004h[jenkins@releng-26932-423-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-10-11T01:05:44.971694" elapsed="0.001316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.973981" level="INFO">[?2004h[jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:44.973466" elapsed="0.000608"/>
</kw>
<doc>Kill all play.py processes.</doc>
<status status="PASS" start="2026-10-11T01:05:44.968719" elapsed="0.005469"/>
</kw>
<doc>Abort all Python speakers.</doc>
<status status="PASS" start="2026-10-11T01:05:44.738388" elapsed="0.235995"/>
</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-10-11T01:05:44.978595" elapsed="0.000444"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:05:44.977978" elapsed="0.001172"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:44.981862" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:44.981649" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.981607" 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-10-11T01:05:44.986609" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:44.986370" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.986333" elapsed="0.000412"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.988831" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:44.988059" elapsed="0.000828"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:05:44.989879" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:05:44.989237" elapsed="0.000694"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:05:44.990023" elapsed="0.000065"/>
</return>
<msg time="2026-10-11T01:05:44.990307" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:05:44.987211" elapsed="0.003148"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:44.995397" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:44.995279" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.995255" 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-10-11T01:05:44.997000" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:44.996885" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:44.996862" elapsed="0.000224"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:44.997575" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:05:44.997298" elapsed="0.000312"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:44.998036" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:05:44.997843" elapsed="0.000225"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:05:45.051164" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:05:44.998803" elapsed="0.052457"/>
</kw>
<msg time="2026-10-11T01:05:45.051424" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:05:45.051467" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:44.998294" elapsed="0.053259"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:05:45.099910" 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-10-11T01:05:45.052069" elapsed="0.047945"/>
</kw>
<msg time="2026-10-11T01:05:45.100158" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:05:45.100199" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:45.051730" elapsed="0.048505"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:45.100539" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:45.100302" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:45.100284" elapsed="0.000328"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.101021" 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-10-11T01:05:45.100798" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:45.101355" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:45.101153" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:45.101136" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:05:45.101473" 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-10-11T01:05:45.104075" elapsed="0.000115"/>
</kw>
<msg time="2026-10-11T01:05:45.104247" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:45.102982" elapsed="0.001401"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:45.104794" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:45.105128" 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-10-11T01:05:45.102371" 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-10-11T01:05:45.101784" elapsed="0.003588"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:05:44.996531" elapsed="0.108934"/>
</kw>
<msg time="2026-10-11T01:05:45.105560" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:45.105599" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:44.995745" elapsed="0.109890"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:05:45.105786" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:05:45.105702" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:45.105685" elapsed="0.000176"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:45.106198" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:45.106615" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:05:45.106681" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T01:05:44.994883" elapsed="0.111882"/>
</kw>
<msg time="2026-10-11T01:05:45.106847" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:45.106887" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:44.991146" elapsed="0.115775"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:45.107341" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:45.107110" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:45.107090" elapsed="0.000337"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:05:44.990822" elapsed="0.116628"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:05:44.990512" elapsed="0.116975"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:05:44.985724" elapsed="0.121814"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:05:44.981016" elapsed="0.126572"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:44.979539" elapsed="0.128088"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:05:44.976968" elapsed="0.130706"/>
</kw>
<for flavor="IN ZIP">
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.108608" 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-10-11T01:05:45.108034" elapsed="0.000601"/>
</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-10-11T01:05:45.122093" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:45.121793" elapsed="0.000326"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:45.122830" 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-10-11T01:05:45.122632" elapsed="0.000269">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-10-11T01:05:45.122986" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:45.122282" elapsed="0.000726"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.123518" 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-10-11T01:05:45.123186" elapsed="0.000359"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:45.123827" 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-10-11T01:05:45.123955" 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-10-11T01:05:45.123717" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.124394" 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-10-11T01:05:45.124178" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.125579" 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-10-11T01:05:45.125128" elapsed="0.000494"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.126055" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:45.125805" elapsed="0.000274"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.126708" 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-10-11T01:05:45.126403" elapsed="0.000330"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:45.127424" 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-10-11T01:05:45.127221" elapsed="0.000228"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:45.127505" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:45.127633" 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-10-11T01:05:45.126908" elapsed="0.000748"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:45.127858" elapsed="0.000184"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-10-11T01:05:45.126269" elapsed="0.001811"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.128615" 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-10-11T01:05:45.128315" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:45.129300" 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-10-11T01:05:45.129122" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:45.129368" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:45.129520" 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-10-11T01:05:45.128810" elapsed="0.000734"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:45.129712" elapsed="0.000165"/>
</kw>
<var name="${key}">TYPE</var>
<var name="${value}">external</var>
<status status="PASS" start="2026-10-11T01:05:45.128180" elapsed="0.001734"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.130429" 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-10-11T01:05:45.130148" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:45.131128" 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-10-11T01:05:45.130947" elapsed="0.000205"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:45.131195" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:45.131318" 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-10-11T01:05:45.130636" elapsed="0.000704"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:45.131535" elapsed="0.000167"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T01:05:45.130014" elapsed="0.001725"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.132239" 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-10-11T01:05:45.131974" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:45.132947" 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-10-11T01:05:45.132771" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:45.133015" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:45.133138" 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-10-11T01:05:45.132446" elapsed="0.000715"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:45.133330" elapsed="0.000192"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T01:05:45.131840" elapsed="0.001719"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.134062" 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-10-11T01:05:45.133793" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:45.134826" 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-10-11T01:05:45.134648" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:45.134894" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:05:45.135018" 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-10-11T01:05:45.134302" elapsed="0.000738"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:45.135211" elapsed="0.000165"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T01:05:45.133659" elapsed="0.001769"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.136113" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:45.135679" elapsed="0.000459"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:45.136826" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:45.136649" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:45.136894" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:45.137016" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:45.136309" elapsed="0.000730"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:45.137207" elapsed="0.000215"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:45.135542" elapsed="0.001919"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.137977" 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-10-11T01:05:45.137706" elapsed="0.000294"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:45.138686" 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-10-11T01:05:45.138509" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:45.138754" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:45.138877" 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-10-11T01:05:45.138171" elapsed="0.000728"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:45.139067" elapsed="0.000164"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T01:05:45.137572" elapsed="0.001696"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:45.126121" elapsed="0.013178"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:45.139336" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:05:45.139491" 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-10-11T01:05:45.124781" elapsed="0.014736"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:45.124526" elapsed="0.015020"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:45.139722" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:45.139568" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:45.124508" elapsed="0.015284"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.140583" 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-10-11T01:05:45.139955" elapsed="0.000656"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:45.140655" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:05:45.121262" elapsed="0.019493"/>
</kw>
<msg time="2026-10-11T01:05:45.140804" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:45.116836" elapsed="0.024011"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:05:45.145062" 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/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-10-11T01:05:45.149230" 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/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-10-11T01:05:45.153390" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:45.153599" 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-10-11T01:05:45.153819" 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-10-11T01:05:45.154165" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:45.154014" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:45.154000" 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-10-11T01:05:45.154397" 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-10-11T01:05:45.154608" 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-10-11T01:05:45.154778" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:45.153976" elapsed="0.000850"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:45.153887" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:45.155004" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:45.155070" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:05:45.155179" 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-10-11T01:05:45.116193" elapsed="0.039011"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.156220" 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-10-11T01:05:45.155998" elapsed="0.000265"/>
</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-10-11T01:05:45.174692" level="INFO">DELETE Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node04zxcc0fk4bkfg607mewx0lv525.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:45.174738" level="INFO">DELETE Response : url=http://10.30.170.173: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-10-11T01:05:45.174835" 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-10-11T01:05:45.156584" elapsed="0.018276"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:45.156323" elapsed="0.018574"/>
</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-10-11T01:05:45.175075" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:45.174921" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:45.156306" elapsed="0.018843"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.176355" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:45.176085" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:45.175839" elapsed="0.000604"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:45.175823" elapsed="0.000643"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.177232" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:45.176769" elapsed="0.000505"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:45.176528" elapsed="0.000777"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:45.176512" elapsed="0.000816"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.177898" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:45.177544" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:45.178302" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:45.177989" elapsed="0.000368"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.178866" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:45.178587" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:45.178380" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:45.177972" elapsed="0.000972"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.179499" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:45.179128" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:45.179806" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:45.179589" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.180310" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:45.180049" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:45.179879" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:45.179572" elapsed="0.000813"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:45.180567" elapsed="0.000298"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:45.181271" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:45.181030" elapsed="0.000265"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:45.181469" elapsed="0.000232"/>
</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-10-11T01:05:45.175508" elapsed="0.006251"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:05:45.181804" elapsed="0.000034"/>
</return>
<msg time="2026-10-11T01:05:45.181988" 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-10-11T01:05:45.155458" elapsed="0.026555"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:45.182060" elapsed="0.000025"/>
</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-10-11T01:05:45.108852" elapsed="0.073306"/>
</kw>
<var name="${i}">2</var>
<var name="${type}">external</var>
<status status="PASS" start="2026-10-11T01:05:45.107869" elapsed="0.074323"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.183031" 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-10-11T01:05:45.182490" 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-10-11T01:05:45.196543" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:45.196214" elapsed="0.000356"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:45.197254" 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-10-11T01:05:45.197057" elapsed="0.000268">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-10-11T01:05:45.197423" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:45.196731" elapsed="0.000717"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.197949" 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-10-11T01:05:45.197638" elapsed="0.000336"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:45.198258" 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-10-11T01:05:45.198440" 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-10-11T01:05:45.198147" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.198900" 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-10-11T01:05:45.198679" elapsed="0.000264"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.199866" 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-10-11T01:05:45.199635" elapsed="0.000275"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.200335" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:45.200090" elapsed="0.000269"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.201136" 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-10-11T01:05:45.200711" elapsed="0.000449"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:45.201861" 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-10-11T01:05:45.201679" elapsed="0.000206"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:45.201931" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:45.202059" 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-10-11T01:05:45.201335" elapsed="0.000747"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:45.202250" elapsed="0.000185"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-10-11T01:05:45.200577" elapsed="0.001896"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.202985" 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-10-11T01:05:45.202718" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:45.203692" 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-10-11T01:05:45.203514" elapsed="0.000203"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:45.203760" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:45.203883" 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-10-11T01:05:45.203177" elapsed="0.000729"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:45.204133" elapsed="0.000169"/>
</kw>
<var name="${key}">TYPE</var>
<var name="${value}">internal</var>
<status status="PASS" start="2026-10-11T01:05:45.202585" elapsed="0.001753"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.204867" 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-10-11T01:05:45.204599" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:45.205576" 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-10-11T01:05:45.205371" elapsed="0.000230"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:45.205644" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:45.205768" 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-10-11T01:05:45.205058" elapsed="0.000733"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:45.205958" elapsed="0.000165"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T01:05:45.204453" elapsed="0.001706"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.206685" 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-10-11T01:05:45.206390" elapsed="0.000319"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:45.207362" 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-10-11T01:05:45.207187" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:45.207445" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:45.207582" 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-10-11T01:05:45.206876" elapsed="0.000729"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:45.207771" elapsed="0.000164"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T01:05:45.206257" elapsed="0.001715"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.208535" 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-10-11T01:05:45.208239" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:45.209216" 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-10-11T01:05:45.209040" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:45.209284" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:45.209424" 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-10-11T01:05:45.208729" elapsed="0.000720"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:45.209628" elapsed="0.000166"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T01:05:45.208106" elapsed="0.001726"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.210332" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:45.210065" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:45.211204" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:45.211026" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:45.211272" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:45.211395" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:45.210556" elapsed="0.000877"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:45.211611" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:45.209931" elapsed="0.001881"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.212308" 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-10-11T01:05:45.212042" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:45.213008" 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-10-11T01:05:45.212835" elapsed="0.000197"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:45.213075" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:45.213198" 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-10-11T01:05:45.212525" elapsed="0.000695"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:45.213386" elapsed="0.000195"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T01:05:45.211910" elapsed="0.001708"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:45.200418" elapsed="0.013231"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:45.213687" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:45.213817" 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-10-11T01:05:45.199257" elapsed="0.014584"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:45.199003" elapsed="0.014867"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:45.214045" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:45.213892" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:45.198986" elapsed="0.015128"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.214898" 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-10-11T01:05:45.214276" elapsed="0.000649"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:45.214968" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:05:45.195710" elapsed="0.019357"/>
</kw>
<msg time="2026-10-11T01:05:45.215116" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:45.191262" elapsed="0.023897"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:05:45.219390" 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/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-10-11T01:05:45.223641" 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/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-10-11T01:05:45.227824" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:45.228010" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:45.228197" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:45.228564" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:45.228388" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:45.228374" 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-10-11T01:05:45.228796" 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-10-11T01:05:45.228979" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:45.229146" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:45.228349" elapsed="0.000844"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:45.228262" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:45.229372" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:45.229454" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:05:45.229577" 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-10-11T01:05:45.190640" elapsed="0.038962"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.230619" 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-10-11T01:05:45.230365" 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-10-11T01:05:45.237964" level="INFO">DELETE Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node04zxcc0fk4bkfg607mewx0lv525.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:45.238010" level="INFO">DELETE Response : url=http://10.30.170.173: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-10-11T01:05:45.238122" 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-10-11T01:05:45.230952" elapsed="0.007195"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:45.230723" elapsed="0.007462"/>
</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-10-11T01:05:45.238364" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:45.238209" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:45.230706" elapsed="0.007754"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.239681" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:45.239375" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:45.239126" elapsed="0.000628"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:45.239110" elapsed="0.000667"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.240330" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:45.240065" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:45.239825" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:45.239811" elapsed="0.000630"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.241148" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:45.240636" elapsed="0.000539"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:45.241489" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:45.241243" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.242005" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:45.241739" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:45.241567" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:45.241226" elapsed="0.000858"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.242633" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:45.242268" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:45.242941" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:45.242722" elapsed="0.000271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.243471" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:45.243186" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:45.243015" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:45.242705" elapsed="0.000856"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:45.243710" elapsed="0.000293"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:45.244384" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:45.244167" elapsed="0.000256"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:45.244593" elapsed="0.000210"/>
</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-10-11T01:05:45.238795" elapsed="0.006064"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:05:45.244899" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:45.245072" 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-10-11T01:05:45.229837" elapsed="0.015259"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:45.245142" elapsed="0.000025"/>
</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-10-11T01:05:45.183279" elapsed="0.061960"/>
</kw>
<var name="${i}">3</var>
<var name="${type}">internal</var>
<status status="PASS" start="2026-10-11T01:05:45.182297" elapsed="0.062975"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.246083" 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-10-11T01:05:45.245557" elapsed="0.000553"/>
</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-10-11T01:05:45.259606" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:45.259279" elapsed="0.000353"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:05:45.260284" 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-10-11T01:05:45.260113" elapsed="0.000230">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-10-11T01:05:45.260441" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:05:45.259793" elapsed="0.000672"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.260960" 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-10-11T01:05:45.260654" elapsed="0.000330"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:05:45.261261" 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-10-11T01:05:45.261376" 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-10-11T01:05:45.261153" elapsed="0.000247"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.261850" 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-10-11T01:05:45.261633" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.262804" 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-10-11T01:05:45.262572" elapsed="0.000274"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.263268" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:05:45.263025" elapsed="0.000267"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.263906" 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-10-11T01:05:45.263642" elapsed="0.000288"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:45.264771" 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-10-11T01:05:45.264589" elapsed="0.000206"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:45.264840" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:45.264969" 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-10-11T01:05:45.264099" 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-10-11T01:05:45.265162" elapsed="0.000168"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.4</var>
<status status="PASS" start="2026-10-11T01:05:45.263506" elapsed="0.001861"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.265901" 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-10-11T01:05:45.265631" elapsed="0.000294"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:45.266615" 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-10-11T01:05:45.266426" elapsed="0.000213"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:45.266682" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:45.266806" 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-10-11T01:05:45.266094" elapsed="0.000735"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:45.266996" elapsed="0.000164"/>
</kw>
<var name="${key}">TYPE</var>
<var name="${value}">internal</var>
<status status="PASS" start="2026-10-11T01:05:45.265494" elapsed="0.001702"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.267721" 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-10-11T01:05:45.267442" elapsed="0.000304"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:45.268494" 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-10-11T01:05:45.268291" elapsed="0.000227"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:45.268562" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:45.268685" 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-10-11T01:05:45.267978" elapsed="0.000729"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:45.268875" elapsed="0.000166"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T01:05:45.267293" elapsed="0.001785"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.269608" 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-10-11T01:05:45.269309" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:45.270292" 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-10-11T01:05:45.270116" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:45.270359" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:45.270509" 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-10-11T01:05:45.269801" elapsed="0.000731"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:45.270700" elapsed="0.000165"/>
</kw>
<var name="${key}">PEER_PORT</var>
<var name="${value}">17900</var>
<status status="PASS" start="2026-10-11T01:05:45.269175" elapsed="0.001727"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.271397" 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-10-11T01:05:45.271133" elapsed="0.000303"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:45.272102" 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-10-11T01:05:45.271927" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:45.272170" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:45.272292" 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-10-11T01:05:45.271616" elapsed="0.000698"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:45.272507" elapsed="0.000167"/>
</kw>
<var name="${key}">INITIATE</var>
<var name="${value}">false</var>
<status status="PASS" start="2026-10-11T01:05:45.271000" elapsed="0.001710"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.273209" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:05:45.272941" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:45.274074" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:05:45.273744" elapsed="0.000355"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:45.274142" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:45.274265" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:05:45.273401" elapsed="0.000886"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:45.274469" elapsed="0.000179"/>
</kw>
<var name="${key}">BGP_RIB</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:05:45.272807" elapsed="0.001878"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.275184" 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-10-11T01:05:45.274917" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:05:45.275890" 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-10-11T01:05:45.275715" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:05:45.275957" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:45.276080" 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-10-11T01:05:45.275377" elapsed="0.000725"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:05:45.276270" elapsed="0.000184"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T01:05:45.274783" elapsed="0.001719"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:05:45.263334" elapsed="0.013200"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:05:45.276572" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:05:45.276702" 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-10-11T01:05:45.262202" elapsed="0.014554"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:45.261951" elapsed="0.014836"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:45.276964" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:45.276810" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:45.261935" elapsed="0.015098"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.277788" 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-10-11T01:05:45.277193" elapsed="0.000622"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:05:45.277857" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:05:45.258777" elapsed="0.019178"/>
</kw>
<msg time="2026-10-11T01:05:45.278003" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:45.254329" elapsed="0.023717"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:05:45.282235" 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/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-10-11T01:05:45.286429" 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/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-10-11T01:05:45.290617" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:45.290803" 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-10-11T01:05:45.290990" 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-10-11T01:05:45.291329" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:45.291179" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:05:45.291166" 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-10-11T01:05:45.291586" 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-10-11T01:05:45.291770" elapsed="0.000017"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:45.291936" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:05:45.291141" elapsed="0.000842"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:05:45.291055" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:45.292161" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:05:45.292257" elapsed="0.000017"/>
</return>
<msg time="2026-10-11T01:05:45.292370" 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-10-11T01:05:45.253710" elapsed="0.038685"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.293398" 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-10-11T01:05:45.293175" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:45.301290" level="INFO">DELETE Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node04zxcc0fk4bkfg607mewx0lv525.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:05:45.301335" level="INFO">DELETE Response : url=http://10.30.170.173: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-10-11T01:05:45.301430" 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-10-11T01:05:45.293757" elapsed="0.007698"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:45.293529" elapsed="0.007974"/>
</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-10-11T01:05:45.301687" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:45.301527" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:45.293512" elapsed="0.008248"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.302944" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:45.302674" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:45.302402" elapsed="0.000613"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:45.302385" elapsed="0.000653"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.303623" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:45.303325" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:45.303087" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:45.303072" elapsed="0.000645"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.305326" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:45.303900" elapsed="0.001452"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:45.305667" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:45.305432" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.306177" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:45.305913" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:45.305742" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:45.305399" elapsed="0.000853"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.306798" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:45.306448" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:45.307103" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:45.306886" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.307638" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:45.307346" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:45.307176" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:45.306869" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:45.307864" elapsed="0.000290"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:05:45.308615" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:05:45.308358" elapsed="0.000281"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:05:45.308797" elapsed="0.000211"/>
</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-10-11T01:05:45.302072" elapsed="0.006991"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:05:45.309103" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:05:45.309274" 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-10-11T01:05:45.292652" elapsed="0.016647"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:05:45.309345" elapsed="0.000024"/>
</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-10-11T01:05:45.246361" elapsed="0.063098"/>
</kw>
<var name="${i}">4</var>
<var name="${type}">internal</var>
<status status="PASS" start="2026-10-11T01:05:45.245367" elapsed="0.064138"/>
</iter>
<var>${i}</var>
<var>${type}</var>
<value>${ODL_IP_INDICES_ALL}</value>
<value>${BGP_PEER_TYPES}</value>
<status status="PASS" start="2026-10-11T01:05:45.107720" elapsed="0.201817"/>
</for>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-10-11T01:05:44.975279" elapsed="0.334366"/>
</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-10-11T01:05:45.310496" elapsed="0.000517"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:45.311238" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects </doc>
<status status="PASS" start="2026-10-11T01:05:45.311170" elapsed="0.000136"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-10-11T01:05:45.310255" elapsed="0.001098"/>
</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-10-11T01:05:29.103581" elapsed="16.207799"/>
</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-10-11T01:05:45.383063" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:05:45.381492" elapsed="0.001621"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-10-11T01:05:45.381140" elapsed="0.002038"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.385442" 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-10-11T01:05:45.384152" elapsed="0.001316"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-10-11T01:05:45.385655" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:45.385555" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:45.385535" elapsed="0.000184"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.386222" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:05:45.385895" elapsed="0.000368"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.386779" 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-10-11T01:05:45.386445" elapsed="0.000359"/>
</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-10-11T01:05:45.387310" elapsed="0.000285"/>
</kw>
<msg time="2026-10-11T01:05:45.387684" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:45.387726" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:45.386969" elapsed="0.000778"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.388254" 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-10-11T01:05:45.387925" elapsed="0.000353"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.389174" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:05:45.388928" elapsed="0.000341"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.389689" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:05:45.389430" elapsed="0.000284"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.390162" 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-10-11T01:05:45.389888" elapsed="0.000299"/>
</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-10-11T01:05:45.391074" elapsed="0.000167"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.391704" level="INFO">${member_ip} = 10.30.170.173</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:05:45.391398" elapsed="0.000331"/>
</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-10-11T01:05:45.391892" elapsed="0.000170"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.392922" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:45.392525" elapsed="0.000422"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-11T01:05:45.392993" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T01:05:45.393134" 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-10-11T01:05:45.392237" elapsed="0.000920"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:05:45.393676" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x743444384a50&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-10-11T01:05:45.393328" elapsed="0.000474"/>
</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-10-11T01:05:45.393960" elapsed="0.000147"/>
</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-10-11T01:05:45.390628" elapsed="0.003531"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:05:45.390442" elapsed="0.003757"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-10-11T01:05:45.390238" elapsed="0.003989"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.394791" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:05:45.394423" elapsed="0.000408"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.395361" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.173'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:05:45.395012" elapsed="0.000388"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.395951" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:05:45.395612" elapsed="0.000377"/>
</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-10-11T01:05:45.388547" elapsed="0.007493"/>
</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-10-11T01:05:45.383846" elapsed="0.012245"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:45.396243" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:45.396153" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:45.396135" elapsed="0.000169"/>
</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-10-11T01:05:45.397520" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:45.397169" elapsed="0.000376"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.397952" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:05:45.397694" elapsed="0.000282"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:05:45.398015" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:05:45.398141" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:05:45.396870" elapsed="0.001294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:45.399046" level="INFO">${member_ip} = 10.30.170.173</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-10-11T01:05:45.398839" elapsed="0.000232"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:45.399804" 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-10-11T01:05:45.399894" 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-10-11T01:05:45.399652" elapsed="0.000266"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:45.402750" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:45.402198" elapsed="0.000631"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:45.402180" elapsed="0.000684"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:45.403546" 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-10-11T01:05:45.403765" 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-10-11T01:05:45.403105" elapsed="0.000709"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.404850" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.173" 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-10-11T01:05:45.404109" elapsed="0.000863"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:45.406105" 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-10-11T01:05:45.405266" elapsed="0.000890"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:05:45.407922" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T01:05:45.408086" 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-10-11T01:05:45.407598" elapsed="0.000530"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:45.408466" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T01:05:45.409983" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T01:05:46.045234" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 01:05:45 UTC 2026

  System load:  0.02               Processes:             123
  Usage of /:   14.2% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.173
  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.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 01:05:30 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T01:05:45.409747" elapsed="0.635653"/>
</kw>
<msg time="2026-10-11T01:05:46.045541" 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-10-11T01:05:45.409225" elapsed="0.636497"/>
</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-10-11T01:05:45.406598" elapsed="0.639304"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:05:46.047115" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-10-11T01:05:46.060902" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-10-11T01:05:46.061123" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T01:05:46.061262" 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-10-11T01:05:46.046455" elapsed="0.014874"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:05:46.061802" elapsed="0.000667"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:46.064178" 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-10-11T01:05:46.063366" elapsed="0.001084"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T01:05:46.065044" elapsed="0.000095"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:46.064712" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:46.064670" elapsed="0.000636"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T01:05:46.065738" elapsed="0.000122"/>
</return>
<status status="PASS" start="2026-10-11T01:05:46.065440" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:46.065389" elapsed="0.000642"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T01:05:46.066110" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:46.068003" elapsed="0.000667"/>
</kw>
<kw name="Open 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-10-11T01:05:46.069118" elapsed="0.000426"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:05:46.069930" elapsed="0.000303"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:05:46.066942" elapsed="0.003384"/>
</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-10-11T01:05:45.401553" elapsed="0.669024"/>
</kw>
<msg time="2026-10-11T01:05:46.070650" 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-10-11T01:05:45.400930" elapsed="0.669790"/>
</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-10-11T01:05:45.400546" elapsed="0.670276"/>
</kw>
<msg time="2026-10-11T01:05:46.070873" 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-10-11T01:05:45.400070" elapsed="0.670879"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:46.071889" elapsed="0.000417"/>
</kw>
<kw name="Open 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-10-11T01:05:46.072606" elapsed="0.000191"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:05:46.073014" elapsed="0.000129"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:05:46.071337" elapsed="0.001871"/>
</kw>
<msg time="2026-10-11T01:05:46.073324" 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-10-11T01:05:45.399269" elapsed="0.674088"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:46.074045" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:46.073716" elapsed="0.000386"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-11T01:05:46.074156" elapsed="0.000039"/>
</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-10-11T01:05:45.398494" elapsed="0.675807"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:05:45.398308" elapsed="0.676041"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:05:45.398210" elapsed="0.676182"/>
</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-10-11T01:05:45.396531" elapsed="0.677983"/>
</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-10-11T01:05:46.074730" elapsed="0.000284"/>
</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-10-11T01:05:46.082900" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:46.082777" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:46.082752" elapsed="0.000237"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:46.083549" 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-10-11T01:05:46.083645" 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-10-11T01:05:46.083333" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:46.084092" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:46.083863" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:46.084630" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:46.084377" elapsed="0.000293"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:46.085372" 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-10-11T01:05:46.085181" elapsed="0.000329">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-10-11T01:05:46.085609" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T01:05:46.085651" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:46.084828" elapsed="0.000844"/>
</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-10-11T01:05:46.085960" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:46.085740" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:46.085723" elapsed="0.000327"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:46.086737" level="INFO">${ip_address} = 10.30.170.173</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-10-11T01:05:46.086520" elapsed="0.000242"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-10-11T01:05:46.086805" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:05:46.086928" level="INFO">${odl_ip} = 10.30.170.173</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-10-11T01:05:46.086234" elapsed="0.000718"/>
</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-10-11T01:05:46.087128" elapsed="0.000366"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:46.087806" level="INFO">index=4
host=10.30.170.173
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-10-11T01:05:46.087895" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.173
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-10-11T01:05:46.087709" elapsed="0.000210"/>
</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-10-11T01:05:46.088081" elapsed="0.000249"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-10-11T01:05:46.088766" level="INFO">Logging into '10.30.170.173:8101' as 'karaf'.</msg>
<msg time="2026-10-11T01:05:46.321168" 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-10-11T01:05:46.088561" elapsed="0.232727"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:46.322823" elapsed="0.000279"/>
</kw>
<kw name="Open 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-10-11T01:05:46.323287" elapsed="0.000169"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:05:46.323626" 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-10-11T01:05:46.322380" elapsed="0.001398"/>
</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-10-11T01:05:46.321740" elapsed="0.002081"/>
</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-10-11T01:05:46.082423" elapsed="0.241445"/>
</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-10-11T01:05:46.076341" elapsed="0.247574"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:46.075510" elapsed="0.248507"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:05:46.075266" elapsed="0.248790"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-10-11T01:05:46.075100" elapsed="0.248990"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-10-11T01:05:45.383458" elapsed="0.940689"/>
</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-10-11T01:05:46.325055" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:46.324959" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:46.324939" elapsed="0.000183"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:46.327063" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:46.326976" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:46.326958" elapsed="0.000170"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:46.328030" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:05:46.327679" elapsed="0.000378"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:05:46.328515" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:05:46.328213" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:05:46.328583" elapsed="0.000034"/>
</return>
<msg time="2026-10-11T01:05:46.328729" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:05:46.327338" elapsed="0.001420"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:46.331186" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:46.331099" elapsed="0.000135"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:46.331081" elapsed="0.000173"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:05:46.332321" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:46.332236" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:46.332218" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:05:46.332853" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:05:46.332567" elapsed="0.000312"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:46.333239" 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-10-11T01:05:46.333045" elapsed="0.000219"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:05:46.375381" 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-10-11T01:05:46.333976" elapsed="0.041583"/>
</kw>
<msg time="2026-10-11T01:05:46.375691" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:05:46.375743" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:46.333435" elapsed="0.042346"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:05:46.457775" 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-10-11T01:05:46.376500" elapsed="0.081442"/>
</kw>
<msg time="2026-10-11T01:05:46.458084" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:05:46.458126" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:46.375949" elapsed="0.082214"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:46.458522" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:46.458242" elapsed="0.000426"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:46.458219" elapsed="0.000476"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:46.459274" 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-10-11T01:05:46.458884" elapsed="0.000672"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:46.460009" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:46.459798" elapsed="0.000359"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:46.459607" elapsed="0.000576"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:05:46.460217" 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">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:46.462204" elapsed="0.000459"/>
</kw>
<kw name="Open 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-10-11T01:05:46.463021" elapsed="0.000283"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:05:46.463703" elapsed="0.000225"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:05:46.461399" elapsed="0.002614"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:05:46.460569" elapsed="0.003572"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:05:46.332029" elapsed="0.132191"/>
</kw>
<msg time="2026-10-11T01:05:46.464303" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:46.464345" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:46.331419" elapsed="0.132962"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:05:46.464581" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-10-11T01:05:46.464469" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:46.464450" 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-10-11T01:05:46.464993" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:46.465293" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:05:46.465358" 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-10-11T01:05:46.330859" elapsed="0.134688"/>
</kw>
<msg time="2026-10-11T01:05:46.465647" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:05:46.465691" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:46.329098" elapsed="0.136629"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:46.466017" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:05:46.465795" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:46.465779" elapsed="0.000308"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:05:46.328951" elapsed="0.137157"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:05:46.328807" elapsed="0.137330"/>
</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-10-11T01:05:46.326737" elapsed="0.139449"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-10-11T01:05:46.324774" elapsed="0.141461"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:46.324306" elapsed="0.141968"/>
</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-10-11T01:05:45.380785" elapsed="1.085534"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:05:46.466837" 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-10-11T01:05:46.466521" elapsed="0.000340"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:05:46.467339" level="INFO">${conn_id} = 7</msg>
<arg>${conn_id}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:05:46.467052" elapsed="0.000327"/>
</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-10-11T01:05:46.468960" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T01:05:46.469030" 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-10-11T01:05:46.468695" elapsed="0.000359"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:46.469242" elapsed="0.000313"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T01:05:46.470336" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T01:05:46.841451" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 01:05:45 UTC 2026

  System load:  0.02               Processes:             123
  Usage of /:   14.2% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.173
  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.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 01:05:45 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T01:05:46.470105" elapsed="0.371473"/>
</kw>
<msg time="2026-10-11T01:05:46.841648" 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-10-11T01:05:46.469737" elapsed="0.371979"/>
</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-10-11T01:05:46.468280" elapsed="0.373536"/>
</kw>
<msg time="2026-10-11T01:05:46.841866" 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-10-11T01:05:46.467924" elapsed="0.373985"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-10-11T01:05:46.467622" elapsed="0.374354"/>
</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-10-11T01:05:46.845570" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:46.845242" 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-10-11T01:05:46.846976" level="INFO">Executing command 'cd '.' &amp;&amp; virtualenv /tmp/defaultvenv'.</msg>
<msg time="2026-10-11T01:05:47.203850" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:05:47.204177" level="INFO">${stdout} = created virtual environment CPython3.10.12.final.0-64 in 155ms
  creator CPython3Posix(dest=/tmp/defaultvenv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=b...</msg>
<msg time="2026-10-11T01:05:47.204291" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T01:05:47.204377" 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-10-11T01:05:46.846798" elapsed="0.357695"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T01:05:47.206534" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T01:05:47.205888" elapsed="0.000751"/>
</kw>
<msg time="2026-10-11T01:05:47.206843" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T01:05:47.206938" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:05:47.204971" elapsed="0.002017"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:05:47.208298" 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-10-11T01:05:47.207446" elapsed="0.000917"/>
</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-10-11T01:05:47.210722" level="INFO">created virtual environment CPython3.10.12.final.0-64 in 155ms
  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-10-11T01:05:47.210123" elapsed="0.000704"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:47.211847" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:47.211254" elapsed="0.000680"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:05:47.212937" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:05:47.212359" elapsed="0.000672"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T01:05:47.209258" elapsed="0.003889"/>
</kw>
<status status="PASS" start="2026-10-11T01:05:47.208635" elapsed="0.004588"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:47.208585" elapsed="0.004691"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T01:05:47.213645" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:05:47.213393" elapsed="0.000461"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:47.213356" elapsed="0.000552"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T01:05:47.214189" elapsed="0.000064"/>
</return>
<status status="PASS" start="2026-10-11T01:05:47.214022" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-11T01:05:47.213988" elapsed="0.000382"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:05:47.214796" elapsed="0.000051"/>
</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-10-11T01:05:46.846275" elapsed="0.368751"/>
</kw>
<msg time="2026-10-11T01:05:47.215141" 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-10-11T01:05:46.845758" elapsed="0.369490"/>
</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-10-11T01:05:46.844732" elapsed="0.370795"/>
</kw>
<msg time="2026-10-11T01:05:47.215645" 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-10-11T01:05:46.843235" elapsed="0.372519"/>
</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-10-11T01:05:46.842901" elapsed="0.373088"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:47.216329" elapsed="0.000712"/>
</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-10-11T01:05:46.842235" elapsed="0.374945"/>
</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-10-11T01:05:47.227438" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:05:47.226737" elapsed="0.000790"/>
</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-10-11T01:05:47.231306" level="INFO">Executing command 'cd '.' &amp;&amp; source /tmp/defaultvenv/bin/activate; pip install exabgp==4.0.5; deactivate'.</msg>
<msg time="2026-10-11T01:06:11.557114" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:06:11.557670" level="INFO">${stdout} = Collecting exabgp==4.0.5
  Downloading exabgp-4.0.5-py3-none-any.whl (551 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 551.8/551.8 KB 6.5 MB/s eta 0:00:00
Installing collected packages: exabgp
Suc...</msg>
<msg time="2026-10-11T01:06:11.557775" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T01:06:11.557859" 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-10-11T01:05:47.230518" elapsed="24.327391"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T01:06:11.562822" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T01:06:11.561602" elapsed="0.001454"/>
</kw>
<msg time="2026-10-11T01:06:11.563355" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T01:06:11.563520" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:11.558635" elapsed="0.004949"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:11.566135" 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-10-11T01:06:11.564107" elapsed="0.002085"/>
</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-10-11T01:06:11.570713" level="INFO">Collecting exabgp==4.0.5
  Downloading exabgp-4.0.5-py3-none-any.whl (551 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 551.8/551.8 KB 6.5 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-10-11T01:06:11.569958" elapsed="0.000903"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:11.572479" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:11.571794" elapsed="0.000819"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:11.574176" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:11.573393" elapsed="0.000918"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T01:06:11.567971" elapsed="0.006566"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:11.566558" elapsed="0.008178"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:11.566503" elapsed="0.008292"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T01:06:11.575094" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:11.574913" elapsed="0.000384"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:11.574877" elapsed="0.000471"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T01:06:11.575802" elapsed="0.000064"/>
</return>
<status status="PASS" start="2026-10-11T01:06:11.575640" elapsed="0.000404"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:11.575604" elapsed="0.000494"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:11.576534" elapsed="0.000051"/>
</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-10-11T01:05:47.229245" elapsed="24.347565"/>
</kw>
<msg time="2026-10-11T01:06:11.576926" 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-10-11T01:05:47.227882" elapsed="24.349148"/>
</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-10-11T01:05:47.225558" elapsed="24.351652"/>
</kw>
<msg time="2026-10-11T01:06:11.577318" 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-10-11T01:05:47.222250" elapsed="24.355208"/>
</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-10-11T01:05:47.221167" elapsed="24.356472"/>
</kw>
<msg time="2026-10-11T01:06:11.577736" 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-10-11T01:05:47.219890" elapsed="24.357936"/>
</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-10-11T01:05:47.219082" elapsed="24.358908"/>
</kw>
<msg time="2026-10-11T01:06:11.578075" 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-10-11T01:05:47.218213" elapsed="24.359948"/>
</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-10-11T01:05:47.217638" elapsed="24.360677"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:06:11.579234" level="INFO">Creating Session using : alias=config-session, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x743444b097d0&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-10-11T01:06:11.578770" elapsed="0.000909"/>
</kw>
<kw name="Upload_Config_Files">
<for flavor="IN">
<iter>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T01:06:11.610398" level="INFO">[chan 3] Opened sftp connection (server version 3)</msg>
<msg time="2026-10-11T01:06:11.621600" 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-10-11T01:06:11.580985" elapsed="0.040747"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:06:11.580632" elapsed="0.041186"/>
</iter>
<iter>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T01:06:11.633494" 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-10-11T01:06:11.622446" elapsed="0.011194"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-11T01:06:11.622017" elapsed="0.011714"/>
</iter>
<iter>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T01:06:11.644953" 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-10-11T01:06:11.634520" elapsed="0.010555"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-11T01:06:11.633949" elapsed="0.011291"/>
</iter>
<iter>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T01:06:11.654941" 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-10-11T01:06:11.645839" elapsed="0.009222"/>
</kw>
<var name="${index}">4</var>
<status status="PASS" start="2026-10-11T01:06:11.645474" elapsed="0.009665"/>
</iter>
<iter>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T01:06:11.664394" 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-10-11T01:06:11.655719" elapsed="0.008831"/>
</kw>
<var name="${index}">5</var>
<status status="PASS" start="2026-10-11T01:06:11.655307" elapsed="0.009322"/>
</iter>
<iter>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T01:06:11.673448" 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-10-11T01:06:11.665146" elapsed="0.008430"/>
</kw>
<var name="${index}">6</var>
<status status="PASS" start="2026-10-11T01:06:11.664796" elapsed="0.008859"/>
</iter>
<var>${index}</var>
<value>@{NUMBERS}</value>
<status status="PASS" start="2026-10-11T01:06:11.580341" elapsed="0.093373"/>
</for>
<kw name="List Files In Directory" owner="SSHLibrary">
<msg time="2026-10-11T01:06:11.684122" 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-10-11T01:06:11.684379" 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-10-11T01:06:11.674037" elapsed="0.010435"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:11.685587" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' exa4.cfg'.</msg>
<msg time="2026-10-11T01:06:11.698248" 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-10-11T01:06:11.685258" elapsed="0.013128"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:11.699108" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exa4.cfg'.</msg>
<msg time="2026-10-11T01:06:11.752660" 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-10-11T01:06:11.698848" elapsed="0.053931"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:11.753523" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exa4.cfg'.</msg>
<msg time="2026-10-11T01:06:11.800607" 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-10-11T01:06:11.753203" elapsed="0.047523"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:11.801517" level="INFO">Executing command 'cat exa4.cfg'.</msg>
<msg time="2026-10-11T01:06:11.848517" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:06:11.848743" 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-10-11T01:06:11.801193" elapsed="0.047604"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:11.850011" 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-10-11T01:06:11.849346" elapsed="0.000763"/>
</kw>
<var name="${cfgfile}">exa4.cfg</var>
<status status="PASS" start="2026-10-11T01:06:11.684879" elapsed="0.165301"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:11.851144" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' exabgp1.cfg'.</msg>
<msg time="2026-10-11T01:06:11.896863" 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-10-11T01:06:11.850871" elapsed="0.046113"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:11.897738" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exabgp1.cfg'.</msg>
<msg time="2026-10-11T01:06:11.948518" 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-10-11T01:06:11.897475" elapsed="0.051163"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:11.949306" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exabgp1.cfg'.</msg>
<msg time="2026-10-11T01:06:11.996731" 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-10-11T01:06:11.949060" elapsed="0.047790"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:11.997603" level="INFO">Executing command 'cat exabgp1.cfg'.</msg>
<msg time="2026-10-11T01:06:12.048625" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:06:12.048834" level="INFO">${stdout} = neighbor 10.30.170.173 {
    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-10-11T01:06:11.997280" elapsed="0.051608"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:12.050021" level="INFO">neighbor 10.30.170.173 {
    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-10-11T01:06:12.049463" elapsed="0.000751"/>
</kw>
<var name="${cfgfile}">exabgp1.cfg</var>
<status status="PASS" start="2026-10-11T01:06:11.850479" elapsed="0.199806"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:12.051225" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' exabgp2.cfg'.</msg>
<msg time="2026-10-11T01:06:12.096943" 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-10-11T01:06:12.050952" elapsed="0.046111"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:12.097816" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exabgp2.cfg'.</msg>
<msg time="2026-10-11T01:06:12.148677" 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-10-11T01:06:12.097561" elapsed="0.051237"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:12.149546" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exabgp2.cfg'.</msg>
<msg time="2026-10-11T01:06:12.200685" 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-10-11T01:06:12.149221" elapsed="0.051584"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:12.201556" level="INFO">Executing command 'cat exabgp2.cfg'.</msg>
<msg time="2026-10-11T01:06:12.253063" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:06:12.253288" level="INFO">${stdout} = neighbor 10.30.170.173 {
    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-10-11T01:06:12.201230" elapsed="0.052116"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:12.254574" level="INFO">neighbor 10.30.170.173 {
    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-10-11T01:06:12.253942" elapsed="0.000737"/>
</kw>
<var name="${cfgfile}">exabgp2.cfg</var>
<status status="PASS" start="2026-10-11T01:06:12.050567" elapsed="0.204184"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:12.255700" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' exabgp3.cfg'.</msg>
<msg time="2026-10-11T01:06:12.304659" 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-10-11T01:06:12.255394" elapsed="0.049389"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:12.305557" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exabgp3.cfg'.</msg>
<msg time="2026-10-11T01:06:12.352563" 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-10-11T01:06:12.305213" elapsed="0.047472"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:12.353379" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exabgp3.cfg'.</msg>
<msg time="2026-10-11T01:06:12.404515" 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-10-11T01:06:12.353106" elapsed="0.051534"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:12.405310" level="INFO">Executing command 'cat exabgp3.cfg'.</msg>
<msg time="2026-10-11T01:06:12.452633" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:06:12.452835" level="INFO">${stdout} = neighbor 10.30.170.173 {
    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-10-11T01:06:12.405063" elapsed="0.047826"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:12.454019" level="INFO">neighbor 10.30.170.173 {
    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-10-11T01:06:12.453460" elapsed="0.000661"/>
</kw>
<var name="${cfgfile}">exabgp3.cfg</var>
<status status="PASS" start="2026-10-11T01:06:12.254986" elapsed="0.199205"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:12.455166" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' exabgp4.cfg'.</msg>
<msg time="2026-10-11T01:06:12.500586" 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-10-11T01:06:12.454850" elapsed="0.045899"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:12.501894" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exabgp4.cfg'.</msg>
<msg time="2026-10-11T01:06:12.548747" 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-10-11T01:06:12.501531" elapsed="0.047347"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:12.549648" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exabgp4.cfg'.</msg>
<msg time="2026-10-11T01:06:12.600567" 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-10-11T01:06:12.549317" elapsed="0.051380"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:12.601670" level="INFO">Executing command 'cat exabgp4.cfg'.</msg>
<msg time="2026-10-11T01:06:12.652912" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:06:12.653139" level="INFO">${stdout} = neighbor 10.30.170.173 {
    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-10-11T01:06:12.601329" elapsed="0.051868"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:12.654440" level="INFO">neighbor 10.30.170.173 {
    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-10-11T01:06:12.653809" elapsed="0.000737"/>
</kw>
<var name="${cfgfile}">exabgp4.cfg</var>
<status status="PASS" start="2026-10-11T01:06:12.454464" elapsed="0.200154"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:12.655566" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' exabgp5.cfg'.</msg>
<msg time="2026-10-11T01:06:12.700773" 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-10-11T01:06:12.655236" elapsed="0.045659"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:12.701681" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exabgp5.cfg'.</msg>
<msg time="2026-10-11T01:06:12.752994" 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-10-11T01:06:12.701325" elapsed="0.051802"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:12.753935" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exabgp5.cfg'.</msg>
<msg time="2026-10-11T01:06:12.804805" 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-10-11T01:06:12.753662" elapsed="0.051274"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:12.805740" level="INFO">Executing command 'cat exabgp5.cfg'.</msg>
<msg time="2026-10-11T01:06:12.861443" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:06:12.861683" level="INFO">${stdout} = neighbor 10.30.170.173 {
    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-10-11T01:06:12.805447" elapsed="0.056295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:12.862861" level="INFO">neighbor 10.30.170.173 {
    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-10-11T01:06:12.862256" elapsed="0.000708"/>
</kw>
<var name="${cfgfile}">exabgp5.cfg</var>
<status status="PASS" start="2026-10-11T01:06:12.654849" elapsed="0.208186"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:12.863974" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' exabgp6.cfg'.</msg>
<msg time="2026-10-11T01:06:12.912716" 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-10-11T01:06:12.863692" elapsed="0.049145"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:12.913605" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exabgp6.cfg'.</msg>
<msg time="2026-10-11T01:06:12.964709" 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-10-11T01:06:12.913264" elapsed="0.051566"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:12.965600" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exabgp6.cfg'.</msg>
<msg time="2026-10-11T01:06:13.016728" 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-10-11T01:06:12.965257" elapsed="0.051603"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:13.017679" level="INFO">Executing command 'cat exabgp6.cfg'.</msg>
<msg time="2026-10-11T01:06:13.064688" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:06:13.064898" level="INFO">${stdout} = neighbor 10.30.170.173 {
    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-10-11T01:06:13.017300" elapsed="0.047654"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.066095" level="INFO">neighbor 10.30.170.173 {
    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-10-11T01:06:13.065545" elapsed="0.000653"/>
</kw>
<var name="${cfgfile}">exabgp6.cfg</var>
<status status="PASS" start="2026-10-11T01:06:12.863254" elapsed="0.203013"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:13.067195" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' exabgp_graceful_restart.cfg'.</msg>
<msg time="2026-10-11T01:06:13.112675" 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-10-11T01:06:13.066922" elapsed="0.045875"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:13.113658" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exabgp_graceful_restart.cfg'.</msg>
<msg time="2026-10-11T01:06:13.160658" 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-10-11T01:06:13.113311" elapsed="0.047468"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:13.161615" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exabgp_graceful_restart.cfg'.</msg>
<msg time="2026-10-11T01:06:13.208686" 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-10-11T01:06:13.161244" elapsed="0.047563"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:13.209573" level="INFO">Executing command 'cat exabgp_graceful_restart.cfg'.</msg>
<msg time="2026-10-11T01:06:13.256687" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:06:13.256883" 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-10-11T01:06:13.209232" elapsed="0.047713"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.258138" 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-10-11T01:06:13.257516" elapsed="0.000785"/>
</kw>
<var name="${cfgfile}">exabgp_graceful_restart.cfg</var>
<status status="PASS" start="2026-10-11T01:06:13.066542" elapsed="0.191863"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:13.259519" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' exaipv4.cfg'.</msg>
<msg time="2026-10-11T01:06:13.308659" 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-10-11T01:06:13.259105" elapsed="0.049673"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:13.309559" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exaipv4.cfg'.</msg>
<msg time="2026-10-11T01:06:13.356548" 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-10-11T01:06:13.309227" elapsed="0.047440"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:13.357471" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exaipv4.cfg'.</msg>
<msg time="2026-10-11T01:06:13.404669" 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-10-11T01:06:13.357123" elapsed="0.047675"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:13.405587" level="INFO">Executing command 'cat exaipv4.cfg'.</msg>
<msg time="2026-10-11T01:06:13.452688" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:06:13.452896" level="INFO">${stdout} = neighbor 10.30.170.173 {
                  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-10-11T01:06:13.405232" elapsed="0.047722"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.454089" level="INFO">neighbor 10.30.170.173 {
                  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-10-11T01:06:13.453521" elapsed="0.000683"/>
</kw>
<var name="${cfgfile}">exaipv4.cfg</var>
<status status="PASS" start="2026-10-11T01:06:13.258679" elapsed="0.195607"/>
</iter>
<iter>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:13.455262" level="INFO">Executing command 'sed -i -e 's/ODLIP/10.30.170.173/g' exaipv6.cfg'.</msg>
<msg time="2026-10-11T01:06:13.500775" 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-10-11T01:06:13.454954" elapsed="0.045953"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:13.501696" level="INFO">Executing command 'sed -i -e 's/ROUTEREFRESH/disable/g' exaipv6.cfg'.</msg>
<msg time="2026-10-11T01:06:13.552695" 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-10-11T01:06:13.501345" elapsed="0.051472"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:13.553575" level="INFO">Executing command 'sed -i -e 's/ADDPATH/disable/g' exaipv6.cfg'.</msg>
<msg time="2026-10-11T01:06:13.604622" 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-10-11T01:06:13.553242" elapsed="0.051500"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:13.605488" level="INFO">Executing command 'cat exaipv6.cfg'.</msg>
<msg time="2026-10-11T01:06:13.652812" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:06:13.653021" 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-10-11T01:06:13.605166" elapsed="0.047912"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.654195" 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-10-11T01:06:13.653646" elapsed="0.000649"/>
</kw>
<var name="${cfgfile}">exaipv6.cfg</var>
<status status="PASS" start="2026-10-11T01:06:13.454564" elapsed="0.199827"/>
</iter>
<var>${cfgfile}</var>
<value>@{cfgfiles}</value>
<status status="PASS" start="2026-10-11T01:06:11.684598" elapsed="1.969894"/>
</for>
<doc>Uploads exabgp config files and replaces variables within those
config files with desired values.</doc>
<status status="PASS" start="2026-10-11T01:06:11.580112" elapsed="2.074595"/>
</kw>
<doc>Suite setup keyword.</doc>
<status status="PASS" start="2026-10-11T01:05:45.380488" elapsed="28.274327"/>
</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-10-11T01:06:13.657821" elapsed="0.003096"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:06:13.657172" elapsed="0.003866"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:06:13.663245" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:13.663025" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:13.662981" elapsed="0.000481"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:06:13.668099" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:13.667909" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:13.667869" elapsed="0.000372"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.670369" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:06:13.669602" elapsed="0.000855"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.671446" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:06:13.670796" elapsed="0.000707"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:06:13.671595" elapsed="0.000071"/>
</return>
<msg time="2026-10-11T01:06:13.671889" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:06:13.668749" elapsed="0.003191"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:06:13.677839" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:13.677643" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:13.677601" elapsed="0.000382"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:06:13.680648" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:13.680393" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:13.680331" elapsed="0.000457"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:06:13.681646" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:06:13.681194" elapsed="0.000508"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:06:13.682391" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:06:13.682062" elapsed="0.000409"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:06:13.724056" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:06:13.683595" elapsed="0.040601"/>
</kw>
<msg time="2026-10-11T01:06:13.724465" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:06:13.724527" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:13.682818" elapsed="0.041759"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:06:13.758878" 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-10-11T01:06:13.725296" elapsed="0.033678"/>
</kw>
<msg time="2026-10-11T01:06:13.759123" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:06:13.759163" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:13.724815" elapsed="0.034383"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:13.759518" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:13.759266" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:13.759248" elapsed="0.000345"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.760004" 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-10-11T01:06:13.759775" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:13.760561" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:13.760184" elapsed="0.000429"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:13.760167" elapsed="0.000468"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:06:13.760665" 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-10-11T01:06:13.763253" elapsed="0.000128"/>
</kw>
<msg time="2026-10-11T01:06:13.763466" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:13.762042" elapsed="0.001569"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:13.763939" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:13.764430" 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-10-11T01:06:13.761465" elapsed="0.003158"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:06:13.760965" elapsed="0.003718"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:06:13.679796" elapsed="0.084961"/>
</kw>
<msg time="2026-10-11T01:06:13.764839" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:06:13.764879" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:13.678395" elapsed="0.086519"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:06:13.765067" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:06:13.764982" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:13.764965" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:13.765497" 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-10-11T01:06:13.765797" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:06:13.765861" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T01:06:13.676874" elapsed="0.089072"/>
</kw>
<msg time="2026-10-11T01:06:13.766029" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:06:13.766069" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:13.672716" elapsed="0.093389"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:13.766415" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:13.766171" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:13.766156" elapsed="0.000331"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:06:13.672375" elapsed="0.094134"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:06:13.672045" elapsed="0.094495"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:06:13.666994" elapsed="0.099596"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:06:13.662403" elapsed="0.104237"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:13.661451" elapsed="0.105229"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:06:13.656334" elapsed="0.110396"/>
</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-10-11T01:06:13.782399" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:13.782079" elapsed="0.000390"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:13.783174" 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-10-11T01:06:13.782951" elapsed="0.000299">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-10-11T01:06:13.783336" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:13.782630" elapsed="0.000742"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.783870" 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-10-11T01:06:13.783559" elapsed="0.000336"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:13.784171" 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-10-11T01:06:13.784315" 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-10-11T01:06:13.784061" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.784777" 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-10-11T01:06:13.784558" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.785732" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:13.785502" elapsed="0.000272"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.786198" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:06:13.785946" elapsed="0.000276"/>
</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-10-11T01:06:13.786543" 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-10-11T01:06:13.786729" elapsed="0.000022"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T01:06:13.786909" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T01:06:13.786398" elapsed="0.000563"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T01:06:13.786268" elapsed="0.000719"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:06:13.787025" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:13.787155" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:06:13.785135" elapsed="0.002044"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:13.784881" elapsed="0.002326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:13.787384" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:13.787229" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:13.784863" elapsed="0.002606"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.788016" 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-10-11T01:06:13.787629" elapsed="0.000413"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:06:13.788084" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:13.781573" elapsed="0.006611"/>
</kw>
<msg time="2026-10-11T01:06:13.788231" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:13.777336" elapsed="0.010938"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:13.792446" 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/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-10-11T01:06:13.796477" 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/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-10-11T01:06:13.800476" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:13.800656" 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-10-11T01:06:13.800837" 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-10-11T01:06:13.801172" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:13.801030" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:13.801016" 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-10-11T01:06:13.801422" 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-10-11T01:06:13.801600" 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-10-11T01:06:13.801760" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:06:13.800990" elapsed="0.000817"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:06:13.800903" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:13.801993" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:13.802060" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:06:13.802166" 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-10-11T01:06:13.776739" elapsed="0.025451"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:13.803304" 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-10-11T01:06:13.803111" elapsed="0.000278">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-10-11T01:06:13.803489" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:13.802785" elapsed="0.000727"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:13.803791" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:13.803574" elapsed="0.000269"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.804286" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:13.804025" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:13.803865" elapsed="0.000476"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:13.803558" elapsed="0.000818"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.804886" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:06:13.804549" elapsed="0.000360"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:06:13.804953" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:13.805108" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:06:13.802488" elapsed="0.002643"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:13.806199" 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-10-11T01:06:13.806013" elapsed="0.000244">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-10-11T01:06:13.806341" 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-10-11T01:06:13.805700" elapsed="0.000675"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:06:13.806551" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:06:13.806453" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:13.806436" elapsed="0.000192"/>
</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-10-11T01:06:13.806779" elapsed="0.000020"/>
</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-10-11T01:06:13.806956" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:06:13.807015" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:06:13.807136" 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-10-11T01:06:13.805390" elapsed="0.001769"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.808391" 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-10-11T01:06:13.808154" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.808851" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:13.808635" elapsed="0.000256"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:06:13.822396" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:06:13.822561" level="INFO">GET Response : url=http://10.30.170.173:8181/rests/data/network-topology:network-topology/topology=example-ipv4-topology 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node0i3mo6pz4qpz73djuaqc1rypd26.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Sat, 10-Oct-2026 01:06:13 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-10-11T01:06:13.822747" 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-10-11T01:06:13.809176" elapsed="0.013598"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:13.808951" elapsed="0.013862"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:13.822989" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:13.822838" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:13.808934" elapsed="0.014133"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.824417" 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-10-11T01:06:13.824062" elapsed="0.000403"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:13.823816" elapsed="0.000682"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:13.823799" elapsed="0.000722"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.825079" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:13.824809" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:13.824571" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:13.824556" elapsed="0.000617"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.825727" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:13.825345" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:13.826030" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:13.825817" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.826591" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:13.826296" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:13.826136" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:13.825800" elapsed="0.000870"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.827177" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:13.826840" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:13.827512" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:13.827264" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.828003" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:13.827743" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:13.827587" elapsed="0.000472"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:13.827248" elapsed="0.000831"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:13.828218" elapsed="0.000320"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:06:13.828935" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:13.828696" elapsed="0.000266"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:06:13.829110" elapsed="0.000212"/>
</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-10-11T01:06:13.823400" elapsed="0.005994"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:13.829553" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:13.829471" elapsed="0.000122"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:13.829454" elapsed="0.000159"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:06:13.830246" 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-10-11T01:06:13.829752" elapsed="0.000522"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:06:13.830319" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:06:13.830476" 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-10-11T01:06:13.807462" elapsed="0.023039"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:06:13.830556" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:06:13.830679" 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-10-11T01:06:13.769510" elapsed="0.061193"/>
</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-10-11T01:06:13.841216" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:13.840913" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:13.841976" 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-10-11T01:06:13.841759" elapsed="0.000335">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-10-11T01:06:13.842252" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:13.841431" elapsed="0.000844"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.842834" 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-10-11T01:06:13.842521" elapsed="0.000338"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:13.843131" 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-10-11T01:06:13.843253" 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-10-11T01:06:13.843022" elapsed="0.000256"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.843720" 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-10-11T01:06:13.843498" elapsed="0.000265"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:06:13.844124" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:13.843825" elapsed="0.000353"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.844819" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:13.844345" elapsed="0.000499"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:13.844201" elapsed="0.000675"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:13.843807" elapsed="0.001090"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.845452" 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-10-11T01:06:13.845056" elapsed="0.000424"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:06:13.845523" 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/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-10-11T01:06:13.840401" elapsed="0.005223"/>
</kw>
<msg time="2026-10-11T01:06:13.845672" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:13.836142" elapsed="0.009574"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:13.849733" 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/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-10-11T01:06:13.853819" 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/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-10-11T01:06:13.857914" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:13.858094" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:13.858331" 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-10-11T01:06:13.858701" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:13.858558" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:13.858545" 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-10-11T01:06:13.858924" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:13.859098" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:13.859257" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:06:13.858519" elapsed="0.000785"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:06:13.858426" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:13.859503" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:13.859570" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:06:13.859675" 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-10-11T01:06:13.835443" elapsed="0.024257"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:13.859863" elapsed="0.000317"/>
</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-10-11T01:06:13.861086" 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-10-11T01:06:13.860835" elapsed="0.000277"/>
</kw>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:06:13.861533" 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-10-11T01:06:13.861257" 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-10-11T01:06:13.861741" elapsed="0.000280"/>
</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-10-11T01:06:13.860476" elapsed="0.001599"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:13.860249" elapsed="0.001855"/>
</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-10-11T01:06:13.862300" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:13.862128" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:13.860232" elapsed="0.002150"/>
</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-10-11T01:06:13.831666" elapsed="0.030772"/>
</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-10-11T01:06:13.830980" elapsed="0.031524"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:13.830776" elapsed="0.031769"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:13.830760" elapsed="0.031806"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:06:13.862596" elapsed="0.000025"/>
</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-10-11T01:06:13.768882" elapsed="0.093812"/>
</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-10-11T01:06:13.767148" elapsed="0.095594"/>
</kw>
<doc>Checks that example-ipv4-topology is ready, and therefore full rib is ready to be configured.</doc>
<status status="PASS" start="2026-10-11T01:06:13.766857" elapsed="0.095975"/>
</kw>
<doc>Checks empty example-ipv4-topology ready.</doc>
<status status="PASS" start="2026-10-11T01:06:13.654951" elapsed="0.207977"/>
</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-10-11T01:06:13.864535" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:06:13.864132" elapsed="0.000660"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:06:13.865777" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:13.865676" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:13.865585" 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-10-11T01:06:13.868022" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:13.867936" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:13.867917" elapsed="0.000166"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.868989" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:06:13.868669" elapsed="0.000345"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.869447" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:06:13.869162" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:06:13.869512" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:06:13.869637" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:06:13.868285" elapsed="0.001374"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:06:13.872085" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:13.872002" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:13.871984" elapsed="0.000162"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:06:13.873183" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:13.873098" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:13.873082" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:06:13.873655" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:06:13.873468" elapsed="0.000213"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:06:13.874001" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:06:13.873857" elapsed="0.000169"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:06:13.913102" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:06:13.874583" elapsed="0.038651"/>
</kw>
<msg time="2026-10-11T01:06:13.913442" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:06:13.913486" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:13.874189" elapsed="0.039333"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:06:13.945690" 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-10-11T01:06:13.914103" elapsed="0.031684"/>
</kw>
<msg time="2026-10-11T01:06:13.945933" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:06:13.945975" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:13.913720" elapsed="0.032290"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:13.946308" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:13.946087" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:13.946065" elapsed="0.000332"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.946840" 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-10-11T01:06:13.946608" elapsed="0.000345"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:13.947212" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:13.947014" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:13.946997" elapsed="0.000286"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:06:13.947317" 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-10-11T01:06:13.950050" elapsed="0.000121"/>
</kw>
<msg time="2026-10-11T01:06:13.950228" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:13.948753" elapsed="0.001629"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:13.950707" elapsed="0.000075"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:13.951147" 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-10-11T01:06:13.948134" elapsed="0.003203"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:06:13.947652" elapsed="0.003938"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:06:13.872841" elapsed="0.078826"/>
</kw>
<msg time="2026-10-11T01:06:13.951750" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:06:13.951790" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:13.872294" elapsed="0.079533"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:06:13.951985" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:06:13.951895" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:13.951878" elapsed="0.000183"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:13.952426" 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-10-11T01:06:13.952754" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:06:13.952824" 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-10-11T01:06:13.871718" elapsed="0.081199"/>
</kw>
<msg time="2026-10-11T01:06:13.953009" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:06:13.953055" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:13.869978" elapsed="0.083115"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:13.953446" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:13.953168" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:13.953151" elapsed="0.000377"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:06:13.869841" elapsed="0.083710"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:06:13.869704" elapsed="0.083877"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:06:13.867640" elapsed="0.085992"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:06:13.865324" elapsed="0.088360"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:13.864937" elapsed="0.088788"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:06:13.863775" elapsed="0.090001"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.954531" level="INFO">&amp;{mapping} = { RIB_INSTANCE_NAME=example-bgp-rib | APP_PEER_ID=10.30.170.173 | BGP_RIB_OPENCONFIG=example-bgp-rib | IP=10.30.170.173 }</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-10-11T01:06:13.953958" elapsed="0.000601"/>
</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-10-11T01:06:13.964942" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:13.964638" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:13.965685" 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-10-11T01:06:13.965467" elapsed="0.000288">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-10-11T01:06:13.965839" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:13.965123" elapsed="0.000738"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.966370" 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-10-11T01:06:13.966031" elapsed="0.000365"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:13.966682" 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-10-11T01:06:13.966830" 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-10-11T01:06:13.966573" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.967266" 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-10-11T01:06:13.967048" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.968392" level="INFO">mapping: {'RIB_INSTANCE_NAME': 'example-bgp-rib', 'APP_PEER_ID': '10.30.170.173', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.173'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:13.967982" elapsed="0.000467"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.968876" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:06:13.968624" elapsed="0.000276"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.969522" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:13.969223" elapsed="0.000323"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:13.970213" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:13.970024" elapsed="0.000213"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:13.970281" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:13.970432" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:13.969716" elapsed="0.000740"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:13.970618" elapsed="0.000182"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:06:13.969094" elapsed="0.001743"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.971328" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:13.971061" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:13.972031" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:13.971855" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:13.972097" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:13.972220" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:13.971549" elapsed="0.000694"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:13.972429" elapsed="0.000167"/>
</kw>
<var name="${key}">APP_PEER_ID</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:06:13.970935" elapsed="0.001697"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.973117" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:13.972854" elapsed="0.000318"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:13.973850" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:13.973673" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:13.973919" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:13.974042" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:13.973340" elapsed="0.000724"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:13.974221" elapsed="0.000176"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:06:13.972729" elapsed="0.001718"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.974940" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:13.974674" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:13.975642" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:13.975463" elapsed="0.000203"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:13.975710" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:13.975833" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:13.975131" elapsed="0.000725"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:13.976016" elapsed="0.000164"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:06:13.974547" elapsed="0.001669"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:06:13.968947" elapsed="0.007300"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:06:13.976284" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:06:13.976437" level="INFO">${mapping_to_use} = {'RIB_INSTANCE_NAME': 'example-bgp-rib', 'APP_PEER_ID': '10.30.170.173', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.173'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:06:13.967646" elapsed="0.008816"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:13.967383" elapsed="0.009108"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:13.976658" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:13.976514" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:13.967365" elapsed="0.009361"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:13.977452" 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-10-11T01:06:13.976880" elapsed="0.000599"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:06:13.977521" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:13.964109" elapsed="0.013510"/>
</kw>
<msg time="2026-10-11T01:06:13.977668" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:13.959892" elapsed="0.017819"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:13.981867" 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/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-10-11T01:06:13.985896" 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/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-10-11T01:06:13.989914" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:13.990095" 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-10-11T01:06:13.990273" 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-10-11T01:06:13.990634" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:13.990492" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:13.990477" 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-10-11T01:06:13.990859" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:13.991036" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:13.991198" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:06:13.990451" elapsed="0.000795"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:06:13.990338" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:13.991446" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:13.991515" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:06:13.991623" 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-10-11T01:06:13.959239" elapsed="0.032409"/>
</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-10-11T01:06:14.000366" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.000049" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.001045" 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-10-11T01:06:14.000875" elapsed="0.000229">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-10-11T01:06:14.001187" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:14.000562" elapsed="0.000647"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.001710" 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-10-11T01:06:14.001390" elapsed="0.000345"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.002005" 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-10-11T01:06:14.002123" 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-10-11T01:06:14.001898" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.002585" 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-10-11T01:06:14.002337" 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-10-11T01:06:14.002973" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.002725" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.003486" level="INFO">${mapping_to_use} = {'RIB_INSTANCE_NAME': 'example-bgp-rib', 'APP_PEER_ID': '10.30.170.173', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.173'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.003191" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.003048" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.002708" elapsed="0.000856"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.004241" level="INFO">${final_text} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.173&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-10-11T01:06:14.003722" elapsed="0.000547"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:06:14.004313" 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-10-11T01:06:13.999552" elapsed="0.004923"/>
</kw>
<msg time="2026-10-11T01:06:14.004524" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:13.995316" elapsed="0.009250"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:14.008688" 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/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-10-11T01:06:14.012676" 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/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-10-11T01:06:14.016695" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.016878" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.017057" 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-10-11T01:06:14.017401" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.017247" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:14.017234" 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-10-11T01:06:14.017643" 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-10-11T01:06:14.017886" 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-10-11T01:06:14.018060" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:06:14.017209" elapsed="0.000899"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.017122" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.018313" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.018392" elapsed="0.000033"/>
</return>
<msg time="2026-10-11T01:06:14.018520" level="INFO">${data} = &lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.173&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-10-11T01:06:13.994633" elapsed="0.023914"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.019727" 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-10-11T01:06:14.019516" elapsed="0.000272">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-10-11T01:06:14.019871" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:14.019115" 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-10-11T01:06:14.020178" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.019957" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.020706" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.020437" elapsed="0.000295"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.020252" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.019940" elapsed="0.000844"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.021276" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:06:14.020941" elapsed="0.000359"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:06:14.021345" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T01:06:14.021500" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:06:14.018820" elapsed="0.002703"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.022835" 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-10-11T01:06:14.022614" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.023277" level="INFO">&lt;neighbor xmlns="urn:opendaylight:params:xml:ns:yang:bgp:openconfig-extensions"&gt;
    &lt;neighbor-address&gt;10.30.170.173&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-10-11T01:06:14.023066" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.023757" 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-10-11T01:06:14.023538" elapsed="0.000259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.024194" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:14.023982" elapsed="0.000252"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:06:14.024955" 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-10-11T01:06:14.024792" elapsed="0.000188"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:06:14.025273" 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-10-11T01:06:14.025130" elapsed="0.000166"/>
</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-10-11T01:06:14.025482" elapsed="0.000156"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.026054" 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-10-11T01:06:14.025835" elapsed="0.000258"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:06:14.026131" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:06:14.026256" 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-10-11T01:06:14.024439" elapsed="0.001870"/>
</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-10-11T01:06:14.043256" level="INFO">POST Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0i3mo6pz4qpz73djuaqc1rypd26.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.173&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-10-11T01:06:14.043312" level="INFO">POST Response : url=http://10.30.170.173: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.173: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.173', 'Content-Length': '0'} 
 body=None 
 </msg>
<msg time="2026-10-11T01:06:14.043439" 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-10-11T01:06:14.026649" elapsed="0.016816"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.026417" elapsed="0.017089"/>
</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-10-11T01:06:14.043682" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.043530" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.026387" elapsed="0.017375"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.044991" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:14.044716" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.044475" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.044458" elapsed="0.000626"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.045665" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:14.045378" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.045133" elapsed="0.000605"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.045118" elapsed="0.000643"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.046283" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:14.045935" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.046609" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.046385" elapsed="0.000276"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.047100" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.046838" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.046682" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.046368" elapsed="0.000808"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.047710" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:14.047361" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.047999" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.047797" elapsed="0.000253"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.048538" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.048227" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.048071" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.047781" elapsed="0.000832"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:14.048753" elapsed="0.000287"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:06:14.049452" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:14.049198" elapsed="0.000279"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.049627" elapsed="0.000253"/>
</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-10-11T01:06:14.044089" elapsed="0.005881"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:06:14.050120" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T01:06:14.050036" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.050020" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.050338" elapsed="0.000129"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.050510" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:06:14.050669" 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-10-11T01:06:14.021817" elapsed="0.028876"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:06:14.050754" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:06:14.050874" 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-10-11T01:06:13.955497" elapsed="0.095399"/>
</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-10-11T01:06:14.051180" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.050984" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.050969" elapsed="0.000292"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:06:14.051290" elapsed="0.000023"/>
</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-10-11T01:06:13.954835" elapsed="0.096564"/>
</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-10-11T01:06:14.061823" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.061520" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.062540" 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-10-11T01:06:14.062324" elapsed="0.000276">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-10-11T01:06:14.062683" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:14.062011" elapsed="0.000695"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.063184" 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-10-11T01:06:14.062877" elapsed="0.000332"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.063511" 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-10-11T01:06:14.063644" 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-10-11T01:06:14.063385" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.064073" 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-10-11T01:06:14.063857" elapsed="0.000256"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.065013" level="INFO">mapping: {'RIB_INSTANCE_NAME': 'example-bgp-rib', 'APP_PEER_ID': '10.30.170.173', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.173'}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:14.064784" elapsed="0.000314"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.065554" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.065275" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.066159" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:14.065891" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.066864" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.066686" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.066933" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:14.067058" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:14.066362" elapsed="0.000719"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.067241" elapsed="0.000191"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:06:14.065763" elapsed="0.001707"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.067960" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:14.067696" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.068656" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.068479" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.068725" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:14.068848" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:14.068149" elapsed="0.000721"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.069028" elapsed="0.000162"/>
</kw>
<var name="${key}">APP_PEER_ID</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:06:14.067571" elapsed="0.001655"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.069888" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:14.069477" elapsed="0.000435"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.070733" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.070556" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.070801" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:14.070924" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:14.070077" 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-10-11T01:06:14.071106" elapsed="0.000162"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:06:14.069325" elapsed="0.001979"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.071824" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:14.071559" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.072522" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.072314" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.072589" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:14.072712" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:14.072011" elapsed="0.000723"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.072893" elapsed="0.000163"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:06:14.071431" elapsed="0.001661"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:06:14.065622" elapsed="0.007501"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:06:14.073161" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:06:14.073288" level="INFO">${mapping_to_use} = {'RIB_INSTANCE_NAME': 'example-bgp-rib', 'APP_PEER_ID': '10.30.170.173', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.173'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:06:14.064446" elapsed="0.008866"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.064173" elapsed="0.009168"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.073546" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.073379" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.064156" elapsed="0.009492"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.074326" level="INFO">${final_text} = rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:06:14.073808" elapsed="0.000561"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:06:14.074482" 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-10-11T01:06:14.060987" elapsed="0.013605"/>
</kw>
<msg time="2026-10-11T01:06:14.074640" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:14.056763" elapsed="0.017921"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:14.078670" 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/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-10-11T01:06:14.082661" 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/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-10-11T01:06:14.086616" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.086794" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.086976" 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-10-11T01:06:14.087304" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.087164" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:14.087150" 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-10-11T01:06:14.087557" 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-10-11T01:06:14.087734" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.087892" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:06:14.087125" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.087039" elapsed="0.000923"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.088109" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.088175" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:06:14.088281" level="INFO">${uri} = rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:06:14.056145" elapsed="0.032161"/>
</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-10-11T01:06:14.097473" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.097125" elapsed="0.000378"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.098168" 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-10-11T01:06:14.097980" elapsed="0.000251">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-10-11T01:06:14.098315" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:14.097662" elapsed="0.000676"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.098847" 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-10-11T01:06:14.098536" elapsed="0.000337"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.099148" 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-10-11T01:06:14.099283" 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-10-11T01:06:14.099037" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.099752" 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-10-11T01:06:14.099532" elapsed="0.000269"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:06:14.100113" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.099865" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.100633" level="INFO">${mapping_to_use} = {'RIB_INSTANCE_NAME': 'example-bgp-rib', 'APP_PEER_ID': '10.30.170.173', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib', 'IP': '10.30.170.173'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.100334" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.100190" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.099846" elapsed="0.000866"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.101269" 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-10-11T01:06:14.100872" elapsed="0.000425"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:06:14.101343" 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/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-10-11T01:06:14.096625" elapsed="0.004852"/>
</kw>
<msg time="2026-10-11T01:06:14.101527" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:14.092150" elapsed="0.009421"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:14.105573" 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/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-10-11T01:06:14.109600" 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/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-10-11T01:06:14.113579" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.113757" 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-10-11T01:06:14.113935" 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-10-11T01:06:14.114271" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.114128" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:14.114115" 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-10-11T01:06:14.114887" 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-10-11T01:06:14.115065" 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-10-11T01:06:14.115227" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:06:14.114090" elapsed="0.001184"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.114002" elapsed="0.001297"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.115474" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.115544" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:06:14.115653" 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-10-11T01:06:14.091423" elapsed="0.024257"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.116793" 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-10-11T01:06:14.116599" elapsed="0.000254">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-10-11T01:06:14.116938" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:14.116250" elapsed="0.000714"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.117244" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.117027" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.117779" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.117515" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.117317" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.117010" elapsed="0.000846"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.118368" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:06:14.118017" elapsed="0.000376"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:06:14.118483" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:14.118610" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:06:14.115951" elapsed="0.002683"/>
</kw>
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.120118" level="INFO">rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:06:14.119730" elapsed="0.000432"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.120598" 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-10-11T01:06:14.120364" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.121054" 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-10-11T01:06:14.120834" elapsed="0.000261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.121527" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:14.121281" elapsed="0.000286"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:06:14.122264" 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-10-11T01:06:14.122102" elapsed="0.000186"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:06:14.122615" 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-10-11T01:06:14.122468" elapsed="0.000171"/>
</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-10-11T01:06:14.122798" elapsed="0.000163"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.123384" 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-10-11T01:06:14.123150" elapsed="0.000289"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:06:14.123479" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:14.123608" 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-10-11T01:06:14.121746" elapsed="0.001885"/>
</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-10-11T01:06:14.134253" level="INFO">POST Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0i3mo6pz4qpz73djuaqc1rypd26.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-10-11T01:06:14.134310" level="INFO">POST Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:06:14.134429" 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-10-11T01:06:14.123920" elapsed="0.010535"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.123694" elapsed="0.010802"/>
</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-10-11T01:06:14.134672" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.134520" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.123678" elapsed="0.011072"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.135963" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:14.135693" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.135457" elapsed="0.000577"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.135439" elapsed="0.000617"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.136669" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:14.136385" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.136136" elapsed="0.000606"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.136120" elapsed="0.000645"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.137284" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:14.136937" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.137631" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.137419" elapsed="0.000265"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.138134" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.137863" elapsed="0.000296"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.137707" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.137385" elapsed="0.000830"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.138749" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:14.138397" elapsed="0.000377"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.139040" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.138837" elapsed="0.000255"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.139561" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.139269" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.139113" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.138820" elapsed="0.000819"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:14.139780" elapsed="0.000291"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:06:14.140481" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:14.140228" elapsed="0.000278"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.140658" elapsed="0.000212"/>
</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-10-11T01:06:14.135072" elapsed="0.005860"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:06:14.141080" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:06:14.140998" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.140981" elapsed="0.000176"/>
</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-10-11T01:06:14.141296" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.141370" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:06:14.141547" 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-10-11T01:06:14.118925" elapsed="0.022646"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:06:14.141631" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:06:14.141755" 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-10-11T01:06:14.052250" elapsed="0.089529"/>
</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-10-11T01:06:14.142068" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.141870" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.141853" elapsed="0.000297"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:06:14.142182" elapsed="0.000023"/>
</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-10-11T01:06:14.051640" elapsed="0.090671"/>
</kw>
<doc>Configures bgp application peer, and configures it's routes.</doc>
<status status="PASS" start="2026-10-11T01:06:13.863310" elapsed="0.279133"/>
</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-10-11T01:06:14.144363" elapsed="0.000222"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:06:14.144092" 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-10-11T01:06:14.145656" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:14.145568" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.145550" elapsed="0.000170"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.147664" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:14.147581" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.147564" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.148653" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:06:14.148282" elapsed="0.000396"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.149085" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:06:14.148828" elapsed="0.000281"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:06:14.149149" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:14.149274" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:06:14.147930" elapsed="0.001367"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.151762" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:14.151679" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.151661" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.152903" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:14.152820" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.152803" elapsed="0.000167"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:06:14.153279" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.153112" elapsed="0.000192"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:06:14.153635" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:06:14.153493" elapsed="0.000166"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:06:14.191462" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:06:14.154134" elapsed="0.037426"/>
</kw>
<msg time="2026-10-11T01:06:14.191714" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:06:14.191755" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:14.153812" elapsed="0.037979"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:06:14.234722" 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-10-11T01:06:14.192464" elapsed="0.042371"/>
</kw>
<msg time="2026-10-11T01:06:14.234993" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:06:14.235036" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:14.191958" elapsed="0.043114"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.235372" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.235145" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.235125" elapsed="0.000349"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.235923" 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-10-11T01:06:14.235687" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.236255" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.236053" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.236037" elapsed="0.000291"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:06:14.236374" 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-10-11T01:06:14.238897" elapsed="0.000124"/>
</kw>
<msg time="2026-10-11T01:06:14.239079" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:14.237752" 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-10-11T01:06:14.239572" elapsed="0.000077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.240011" 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-10-11T01:06:14.237131" 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-10-11T01:06:14.236664" elapsed="0.003610"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:06:14.152564" elapsed="0.087798"/>
</kw>
<msg time="2026-10-11T01:06:14.240466" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:06:14.240508" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:14.151973" elapsed="0.088572"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:06:14.240701" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:06:14.240614" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.240596" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.241098" 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-10-11T01:06:14.241429" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.241494" 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-10-11T01:06:14.151379" elapsed="0.090200"/>
</kw>
<msg time="2026-10-11T01:06:14.241663" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:06:14.241704" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:14.149648" elapsed="0.092092"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.242027" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.241807" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.241792" elapsed="0.000305"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:06:14.149510" elapsed="0.092610"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:06:14.149344" elapsed="0.092803"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:06:14.147263" elapsed="0.094932"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:06:14.145281" elapsed="0.096964"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:14.144875" elapsed="0.097412"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:06:14.143362" elapsed="0.098973"/>
</kw>
<for flavor="IN ZIP">
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.243223" 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-10-11T01:06:14.242739" elapsed="0.000542"/>
</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-10-11T01:06:14.253782" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.253476" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.254503" 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-10-11T01:06:14.254287" elapsed="0.000279">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-10-11T01:06:14.254652" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:14.253967" elapsed="0.000709"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.255162" 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-10-11T01:06:14.254848" elapsed="0.000340"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.255492" 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-10-11T01:06:14.255623" 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-10-11T01:06:14.255365" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.256064" 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-10-11T01:06:14.255844" elapsed="0.000264"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.257024" 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-10-11T01:06:14.256791" elapsed="0.000276"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.257519" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.257241" elapsed="0.000302"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.258131" 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-10-11T01:06:14.257859" elapsed="0.000297"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.259013" 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-10-11T01:06:14.258662" elapsed="0.000377"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.259085" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:14.259210" 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-10-11T01:06:14.258323" elapsed="0.000910"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.259433" elapsed="0.000174"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T01:06:14.257728" elapsed="0.001915"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.260135" 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-10-11T01:06:14.259870" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.261027" 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-10-11T01:06:14.260684" elapsed="0.000367"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.261096" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:14.261220" 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-10-11T01:06:14.260327" elapsed="0.000916"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.261466" elapsed="0.000170"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T01:06:14.259742" elapsed="0.001932"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.262371" 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-10-11T01:06:14.261935" elapsed="0.000462"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.263233" 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-10-11T01:06:14.262892" elapsed="0.000365"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.263301" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:14.263460" 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-10-11T01:06:14.262582" elapsed="0.000901"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.263645" elapsed="0.000166"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T01:06:14.261806" elapsed="0.002042"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.264360" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:14.264079" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.265212" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.264873" elapsed="0.000364"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.265281" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:14.265445" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:14.264568" elapsed="0.000902"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.265631" elapsed="0.000165"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:06:14.263950" elapsed="0.001882"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.266322" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:14.266058" elapsed="0.000300"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.267201" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.266858" elapsed="0.000368"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.267269" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:14.267420" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:14.266551" 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-10-11T01:06:14.267604" elapsed="0.000163"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:06:14.265931" elapsed="0.001872"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:06:14.257587" elapsed="0.010249"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:06:14.267873" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:06:14.267999" 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-10-11T01:06:14.256446" elapsed="0.011578"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.256170" elapsed="0.011883"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.268222" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.268075" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.256152" elapsed="0.012138"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.269032" 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-10-11T01:06:14.268473" elapsed="0.000586"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:06:14.269102" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:14.252939" elapsed="0.016262"/>
</kw>
<msg time="2026-10-11T01:06:14.269249" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:14.248700" elapsed="0.020592"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:14.273371" 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/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-10-11T01:06:14.277588" 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/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-10-11T01:06:14.281555" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.281736" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.281915" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.282248" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.282106" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:14.282093" 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-10-11T01:06:14.282502" 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-10-11T01:06:14.282681" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.282841" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:06:14.282067" elapsed="0.000821"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.281979" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.283059" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.283124" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:06:14.283233" 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-10-11T01:06:14.248063" elapsed="0.035194"/>
</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-10-11T01:06:14.292037" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.291735" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.292748" 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-10-11T01:06:14.292576" elapsed="0.000232">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-10-11T01:06:14.292890" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:14.292216" elapsed="0.000697"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.293459" 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-10-11T01:06:14.293114" elapsed="0.000371"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.293756" 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-10-11T01:06:14.293878" 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-10-11T01:06:14.293648" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.294311" 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-10-11T01:06:14.294095" 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-10-11T01:06:14.294720" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.294473" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.295200" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.294936" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.294795" elapsed="0.000462"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.294455" elapsed="0.000821"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.296162" 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-10-11T01:06:14.295460" elapsed="0.000730"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:06:14.296234" 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/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-10-11T01:06:14.291196" elapsed="0.005139"/>
</kw>
<msg time="2026-10-11T01:06:14.296418" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:14.286963" elapsed="0.009500"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:14.300597" 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/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-10-11T01:06:14.304597" 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/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-10-11T01:06:14.308670" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.308849" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.309026" 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-10-11T01:06:14.309368" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.309214" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:14.309201" 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-10-11T01:06:14.309611" 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-10-11T01:06:14.309789" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.309948" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:06:14.309176" elapsed="0.000818"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.309090" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.310165" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.310230" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:06:14.310377" 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-10-11T01:06:14.286238" elapsed="0.024178"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.311521" 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-10-11T01:06:14.311302" elapsed="0.000279">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-10-11T01:06:14.311664" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:14.310983" elapsed="0.000703"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.311966" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.311749" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.312490" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.312197" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.312038" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.311733" elapsed="0.000834"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.313060" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:06:14.312726" elapsed="0.000358"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:06:14.313159" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:06:14.313287" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:06:14.310687" elapsed="0.002622"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.314578" 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-10-11T01:06:14.314309" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.315022" 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-10-11T01:06:14.314807" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.315532" 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-10-11T01:06:14.315280" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.315974" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:14.315759" elapsed="0.000255"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:06:14.316729" 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-10-11T01:06:14.316573" elapsed="0.000181"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:06:14.317044" 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-10-11T01:06:14.316903" elapsed="0.000165"/>
</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-10-11T01:06:14.317226" elapsed="0.000168"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.317821" 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-10-11T01:06:14.317601" elapsed="0.000260"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:06:14.317898" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:06:14.318024" 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-10-11T01:06:14.316191" elapsed="0.001856"/>
</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-10-11T01:06:14.332978" level="INFO">PUT Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0i3mo6pz4qpz73djuaqc1rypd26.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-10-11T01:06:14.333082" level="INFO">PUT Response : url=http://10.30.170.173: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-10-11T01:06:14.333165" 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-10-11T01:06:14.318334" elapsed="0.014854"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.318108" elapsed="0.015121"/>
</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-10-11T01:06:14.333437" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.333253" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.318092" elapsed="0.015427"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.334664" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:14.334373" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.334124" elapsed="0.000610"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.334107" elapsed="0.000650"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.335303" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:14.335039" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.334806" elapsed="0.000583"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.334791" elapsed="0.000635"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.335939" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:14.335599" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.336235" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.336032" elapsed="0.000254"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.336771" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.336508" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.336308" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.336016" elapsed="0.000832"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.337372" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:14.337017" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.337681" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.337476" elapsed="0.000256"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.338168" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.337909" elapsed="0.000283"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.337754" elapsed="0.000469"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.337459" elapsed="0.000784"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:14.338479" elapsed="0.000288"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:06:14.339220" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:14.338994" elapsed="0.000250"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.339424" elapsed="0.000215"/>
</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-10-11T01:06:14.333835" elapsed="0.005859"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:06:14.339833" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:06:14.339752" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.339736" elapsed="0.000174"/>
</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-10-11T01:06:14.340050" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.340109" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:06:14.340265" 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-10-11T01:06:14.313635" elapsed="0.026655"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:06:14.340393" elapsed="0.000042"/>
</return>
<msg time="2026-10-11T01:06:14.340537" 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-10-11T01:06:14.244163" elapsed="0.096396"/>
</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-10-11T01:06:14.340844" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.340644" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.340629" elapsed="0.000297"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:06:14.340956" elapsed="0.000023"/>
</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-10-11T01:06:14.243564" elapsed="0.097489"/>
</kw>
<var name="${index}">1</var>
<var name="${peer_type}">ibgp_peer</var>
<status status="PASS" start="2026-10-11T01:06:14.242559" elapsed="0.098529"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.341855" 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-10-11T01:06:14.341371" elapsed="0.000511"/>
</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-10-11T01:06:14.353139" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.352835" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.353840" 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-10-11T01:06:14.353668" elapsed="0.000232">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-10-11T01:06:14.353983" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:14.353323" elapsed="0.000682"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.354512" 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-10-11T01:06:14.354175" elapsed="0.000363"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.354810" 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-10-11T01:06:14.354926" 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-10-11T01:06:14.354702" elapsed="0.000249"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.355372" 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-10-11T01:06:14.355141" 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-10-11T01:06:14.356309" 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-10-11T01:06:14.356078" elapsed="0.000285"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.356799" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.356551" elapsed="0.000272"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.357426" 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-10-11T01:06:14.357133" elapsed="0.000318"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.358275" 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-10-11T01:06:14.357923" elapsed="0.000377"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.358359" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:06:14.358547" 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-10-11T01:06:14.357618" 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-10-11T01:06:14.358731" elapsed="0.000169"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-10-11T01:06:14.357006" elapsed="0.001931"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.359478" 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-10-11T01:06:14.359163" elapsed="0.000339"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.360325" 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-10-11T01:06:14.359977" elapsed="0.000388"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.360426" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:06:14.360554" 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-10-11T01:06:14.359671" elapsed="0.000907"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.360741" elapsed="0.000165"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T01:06:14.359036" elapsed="0.001908"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.361615" 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-10-11T01:06:14.361169" elapsed="0.000470"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.362498" 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-10-11T01:06:14.362116" elapsed="0.000408"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.362568" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:14.362693" 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-10-11T01:06:14.361809" elapsed="0.000906"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.362876" elapsed="0.000164"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T01:06:14.361043" elapsed="0.002033"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.363610" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:14.363301" elapsed="0.000334"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.364478" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.364107" elapsed="0.000396"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.364547" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:14.364672" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:14.363803" elapsed="0.000891"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.364855" elapsed="0.000163"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:06:14.363175" elapsed="0.001880"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.365571" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:14.365278" elapsed="0.000317"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.366444" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.366064" elapsed="0.000406"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.366514" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:14.366638" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:14.365760" elapsed="0.000900"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.366821" elapsed="0.000164"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:06:14.365152" elapsed="0.001870"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:06:14.356864" elapsed="0.010190"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:06:14.367091" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:06:14.367218" 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-10-11T01:06:14.355740" elapsed="0.011502"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.355492" elapsed="0.011778"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.367486" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.367292" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.355474" elapsed="0.012119"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.368296" 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-10-11T01:06:14.367751" elapsed="0.000572"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:06:14.368383" 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/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-10-11T01:06:14.352303" elapsed="0.016196"/>
</kw>
<msg time="2026-10-11T01:06:14.368548" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:14.348079" elapsed="0.020512"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:14.372624" 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/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-10-11T01:06:14.376630" 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/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-10-11T01:06:14.380760" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.380942" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.381248" 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-10-11T01:06:14.381638" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.381493" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:14.381480" 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-10-11T01:06:14.381862" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.382038" elapsed="0.000017"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.382197" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:06:14.381453" elapsed="0.000790"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.381319" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.382443" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.382509" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:06:14.382620" 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-10-11T01:06:14.347483" elapsed="0.035194"/>
</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-10-11T01:06:14.391398" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.391079" elapsed="0.000360"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.392081" 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-10-11T01:06:14.391911" elapsed="0.000229">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-10-11T01:06:14.392224" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:14.391595" elapsed="0.000651"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.392780" 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-10-11T01:06:14.392466" elapsed="0.000340"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.393079" 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-10-11T01:06:14.393197" 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-10-11T01:06:14.392970" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.393665" 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-10-11T01:06:14.393443" 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-10-11T01:06:14.394046" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.393797" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.394559" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.394265" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.394121" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.393779" elapsed="0.000856"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.395516" 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-10-11T01:06:14.394795" elapsed="0.000775"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:06:14.395617" 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-10-11T01:06:14.390580" elapsed="0.005140"/>
</kw>
<msg time="2026-10-11T01:06:14.395778" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:14.386339" elapsed="0.009483"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:14.399939" 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/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-10-11T01:06:14.403971" 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/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-10-11T01:06:14.407936" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.408116" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.408295" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.408655" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.408513" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:14.408499" 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-10-11T01:06:14.408877" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.409057" elapsed="0.000017"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.409214" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:06:14.408473" elapsed="0.000788"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.408372" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.409457" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.409524" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:06:14.409661" 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-10-11T01:06:14.385643" elapsed="0.024045"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.410827" 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-10-11T01:06:14.410642" elapsed="0.000244">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-10-11T01:06:14.410969" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:14.410290" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.411271" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.411055" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.411799" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.411535" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.411359" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.411038" elapsed="0.000837"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.412384" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:06:14.412039" elapsed="0.000383"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:06:14.412468" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:14.412593" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:06:14.409990" elapsed="0.002626"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.413818" 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-10-11T01:06:14.413597" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.414261" 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-10-11T01:06:14.414049" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.414778" 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-10-11T01:06:14.414559" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.415217" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:14.415005" elapsed="0.000253"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:06:14.415970" 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-10-11T01:06:14.415815" elapsed="0.000180"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:06:14.416283" 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-10-11T01:06:14.416144" elapsed="0.000163"/>
</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-10-11T01:06:14.416492" elapsed="0.000156"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.417057" 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-10-11T01:06:14.416837" elapsed="0.000291"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:06:14.417168" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:14.417296" 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-10-11T01:06:14.415463" elapsed="0.001856"/>
</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-10-11T01:06:14.428154" level="INFO">PUT Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0i3mo6pz4qpz73djuaqc1rypd26.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-10-11T01:06:14.428231" level="INFO">PUT Response : url=http://10.30.170.173: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-10-11T01:06:14.428319" 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-10-11T01:06:14.417640" elapsed="0.010703"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.417396" elapsed="0.011002"/>
</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-10-11T01:06:14.428598" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.428446" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.417379" elapsed="0.011298"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.429825" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:14.429551" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.429287" elapsed="0.000609"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.429270" elapsed="0.000649"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.430529" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:14.430203" elapsed="0.000367"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.429968" elapsed="0.000633"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.429952" elapsed="0.000671"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.431134" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:14.430795" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.431454" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.431222" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.431947" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.431686" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.431529" elapsed="0.000476"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.431205" elapsed="0.000849"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.432596" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:14.432228" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.432887" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.432684" elapsed="0.000254"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.433398" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.433115" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.432960" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.432668" elapsed="0.000823"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:14.433631" elapsed="0.000291"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:06:14.434295" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:14.434079" elapsed="0.000240"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.434505" elapsed="0.000209"/>
</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-10-11T01:06:14.429000" elapsed="0.005769"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:06:14.434910" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:06:14.434828" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.434811" elapsed="0.000176"/>
</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-10-11T01:06:14.435125" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.435184" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:06:14.435341" 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-10-11T01:06:14.412900" elapsed="0.022478"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:06:14.435449" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:06:14.435571" 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-10-11T01:06:14.342739" elapsed="0.092855"/>
</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-10-11T01:06:14.435873" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.435676" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.435661" elapsed="0.000292"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:06:14.435982" elapsed="0.000023"/>
</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-10-11T01:06:14.342118" elapsed="0.093959"/>
</kw>
<var name="${index}">2</var>
<var name="${peer_type}">ibgp_peer</var>
<status status="PASS" start="2026-10-11T01:06:14.341184" elapsed="0.094927"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.436895" 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-10-11T01:06:14.436428" elapsed="0.000494"/>
</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-10-11T01:06:14.447284" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.446983" elapsed="0.000327"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.447996" 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-10-11T01:06:14.447819" elapsed="0.000272">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-10-11T01:06:14.448178" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:14.447504" elapsed="0.000697"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.448708" 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-10-11T01:06:14.448383" elapsed="0.000350"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.449005" 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-10-11T01:06:14.449126" 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-10-11T01:06:14.448897" elapsed="0.000254"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.449590" 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-10-11T01:06:14.449342" 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-10-11T01:06:14.450556" 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-10-11T01:06:14.450278" elapsed="0.000321"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.451022" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.450772" elapsed="0.000274"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.451648" 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-10-11T01:06:14.451369" elapsed="0.000304"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.452532" 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-10-11T01:06:14.452142" elapsed="0.000415"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.452602" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:14.452727" 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-10-11T01:06:14.451838" elapsed="0.000912"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.452911" elapsed="0.000171"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-10-11T01:06:14.451229" elapsed="0.001889"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.453642" 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-10-11T01:06:14.453341" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.454515" 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-10-11T01:06:14.454140" elapsed="0.000401"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.454586" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:14.454711" 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-10-11T01:06:14.453832" elapsed="0.000902"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.454895" elapsed="0.000164"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T01:06:14.453216" elapsed="0.001879"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.455764" 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-10-11T01:06:14.455321" elapsed="0.000467"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.456646" 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-10-11T01:06:14.456261" elapsed="0.000410"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.456714" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:14.456840" 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-10-11T01:06:14.455955" elapsed="0.000907"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.457023" elapsed="0.000168"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T01:06:14.455194" elapsed="0.002033"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.457801" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:14.457529" elapsed="0.000297"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.458683" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.458297" elapsed="0.000411"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.458752" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:14.458874" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:14.457991" elapsed="0.000907"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.459058" elapsed="0.000166"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:06:14.457373" elapsed="0.001888"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.459786" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:14.459517" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.460667" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.460282" elapsed="0.000410"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.460735" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:14.460859" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:14.459978" elapsed="0.000904"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.461042" elapsed="0.000163"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:06:14.459374" elapsed="0.001868"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:06:14.451089" elapsed="0.010185"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:06:14.461312" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:06:14.461494" 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-10-11T01:06:14.449940" elapsed="0.011579"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.449694" elapsed="0.011854"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.461716" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.461570" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.449677" elapsed="0.012108"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.462516" 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-10-11T01:06:14.461941" elapsed="0.000602"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:06:14.462586" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:14.446479" elapsed="0.016208"/>
</kw>
<msg time="2026-10-11T01:06:14.462734" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:14.442122" elapsed="0.020656"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:14.466798" 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/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-10-11T01:06:14.470945" 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/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-10-11T01:06:14.474962" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.475142" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.475320" 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-10-11T01:06:14.475684" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.475542" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:14.475528" 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-10-11T01:06:14.475906" 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-10-11T01:06:14.476081" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.476239" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:06:14.475502" elapsed="0.000784"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.475400" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.476483" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.476551" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:06:14.476661" 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-10-11T01:06:14.441527" elapsed="0.035158"/>
</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-10-11T01:06:14.485425" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.485097" elapsed="0.000356"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.486103" 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-10-11T01:06:14.485924" elapsed="0.000238">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-10-11T01:06:14.486245" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:14.485609" elapsed="0.000659"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.486775" 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-10-11T01:06:14.486466" elapsed="0.000334"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.487071" 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-10-11T01:06:14.487203" 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-10-11T01:06:14.486964" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.487670" 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-10-11T01:06:14.487450" 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-10-11T01:06:14.488094" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.487845" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.488607" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.488310" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.488168" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.487828" elapsed="0.000857"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.489573" 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-10-11T01:06:14.488842" elapsed="0.000760"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:06:14.489646" 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/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-10-11T01:06:14.484600" elapsed="0.005147"/>
</kw>
<msg time="2026-10-11T01:06:14.489805" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:14.480373" elapsed="0.009476"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:14.494070" 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/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-10-11T01:06:14.498035" 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/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-10-11T01:06:14.501991" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.502169" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.502371" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.502721" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.502578" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:14.502565" 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-10-11T01:06:14.502944" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.503119" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.503279" elapsed="0.000017"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:06:14.502539" elapsed="0.000786"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.502452" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.503565" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.503631" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:06:14.503767" 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-10-11T01:06:14.479652" elapsed="0.024142"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.504896" 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-10-11T01:06:14.504706" elapsed="0.000249">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-10-11T01:06:14.505037" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:14.504370" elapsed="0.000689"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.505336" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.505122" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.505858" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.505597" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.505437" elapsed="0.000476"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.505105" elapsed="0.000828"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.506483" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:06:14.506114" elapsed="0.000393"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:06:14.506552" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:14.506675" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:06:14.504061" elapsed="0.002637"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.507907" 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-10-11T01:06:14.507687" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.508357" 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-10-11T01:06:14.508136" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.508879" 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-10-11T01:06:14.508659" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.509317" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:14.509103" elapsed="0.000267"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:06:14.510073" 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-10-11T01:06:14.509918" elapsed="0.000179"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:06:14.510402" 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-10-11T01:06:14.510246" elapsed="0.000193"/>
</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-10-11T01:06:14.510598" elapsed="0.000155"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.511162" 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-10-11T01:06:14.510942" elapsed="0.000260"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:06:14.511241" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:06:14.511381" 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-10-11T01:06:14.509564" elapsed="0.001853"/>
</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-10-11T01:06:14.523950" level="INFO">PUT Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0i3mo6pz4qpz73djuaqc1rypd26.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-10-11T01:06:14.524026" level="INFO">PUT Response : url=http://10.30.170.173: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-10-11T01:06:14.524105" 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-10-11T01:06:14.511706" elapsed="0.012423"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.511482" elapsed="0.012687"/>
</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-10-11T01:06:14.524342" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.524193" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.511465" elapsed="0.013016"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.525648" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:14.525358" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.525111" elapsed="0.000609"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.525094" elapsed="0.000675"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.526328" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:14.526064" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.525823" elapsed="0.000605"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.525808" elapsed="0.000643"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.526962" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:14.526622" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.527253" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.527049" elapsed="0.000255"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.527773" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.527511" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.527326" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.527033" elapsed="0.000817"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.528368" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:14.528021" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.528675" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.528471" elapsed="0.000255"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.529164" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.528901" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.528747" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.528453" elapsed="0.000786"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:14.529393" elapsed="0.000306"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:06:14.530070" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:14.529853" elapsed="0.000241"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.530241" elapsed="0.000235"/>
</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-10-11T01:06:14.524799" elapsed="0.005732"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:06:14.530671" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:06:14.530589" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.530573" elapsed="0.000174"/>
</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-10-11T01:06:14.530885" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.530945" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:06:14.531101" 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-10-11T01:06:14.506982" elapsed="0.024143"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:06:14.531180" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:06:14.531300" 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-10-11T01:06:14.437773" elapsed="0.093549"/>
</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-10-11T01:06:14.531638" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.531438" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.531419" elapsed="0.000300"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:06:14.531749" elapsed="0.000024"/>
</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-10-11T01:06:14.437156" elapsed="0.094689"/>
</kw>
<var name="${index}">3</var>
<var name="${peer_type}">ebgp_peer</var>
<status status="PASS" start="2026-10-11T01:06:14.436205" elapsed="0.095708"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.532683" 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-10-11T01:06:14.532187" elapsed="0.000523"/>
</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-10-11T01:06:14.542976" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.542675" elapsed="0.000327"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.543666" 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-10-11T01:06:14.543493" elapsed="0.000232">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-10-11T01:06:14.543808" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:14.543156" elapsed="0.000674"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.544304" 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-10-11T01:06:14.543999" elapsed="0.000330"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.544625" 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-10-11T01:06:14.544754" 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-10-11T01:06:14.544516" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.545189" 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-10-11T01:06:14.544971" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.546140" 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-10-11T01:06:14.545908" elapsed="0.000274"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.546651" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.546387" elapsed="0.000288"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.547246" 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-10-11T01:06:14.546981" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.548117" 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-10-11T01:06:14.547768" elapsed="0.000374"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.548187" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:06:14.548314" 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-10-11T01:06:14.547463" elapsed="0.000873"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.548533" elapsed="0.000169"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.4</var>
<status status="PASS" start="2026-10-11T01:06:14.546855" elapsed="0.001885"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.549232" 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-10-11T01:06:14.548965" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.550178" 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-10-11T01:06:14.549756" elapsed="0.000447"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.550247" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:14.550386" 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-10-11T01:06:14.549449" 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-10-11T01:06:14.550621" elapsed="0.000168"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T01:06:14.548839" elapsed="0.001987"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.551493" 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-10-11T01:06:14.551053" elapsed="0.000465"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.552335" 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-10-11T01:06:14.551986" elapsed="0.000387"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.552443" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:06:14.552571" 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-10-11T01:06:14.551683" elapsed="0.000911"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.552753" elapsed="0.000166"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T01:06:14.550926" elapsed="0.002029"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.553489" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:14.553179" elapsed="0.000334"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.554323" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.553982" elapsed="0.000380"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.554421" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:06:14.554547" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:14.553678" 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-10-11T01:06:14.554731" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:06:14.553054" elapsed="0.001877"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.555451" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:14.555155" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.556294" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.555948" elapsed="0.000372"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.556377" elapsed="0.000054"/>
</return>
<msg time="2026-10-11T01:06:14.556534" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:14.555641" elapsed="0.000916"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.556717" elapsed="0.000165"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:06:14.555029" elapsed="0.001890"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:06:14.546717" elapsed="0.010233"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:06:14.556989" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:14.557119" 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-10-11T01:06:14.545570" elapsed="0.011572"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.545291" elapsed="0.011880"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.557338" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.557193" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.545274" elapsed="0.012204"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.558181" 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-10-11T01:06:14.557637" elapsed="0.000570"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:06:14.558250" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:14.542151" elapsed="0.016210"/>
</kw>
<msg time="2026-10-11T01:06:14.558460" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:14.537934" elapsed="0.020574"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:14.562529" 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/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-10-11T01:06:14.567314" 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/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-10-11T01:06:14.571304" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.571508" 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-10-11T01:06:14.571688" 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-10-11T01:06:14.572021" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.571878" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:14.571865" 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-10-11T01:06:14.572241" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.572443" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.572607" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:06:14.571840" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.571753" elapsed="0.000923"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.572821" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.572886" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:06:14.572996" 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-10-11T01:06:14.537310" elapsed="0.035711"/>
</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-10-11T01:06:14.581795" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.581489" elapsed="0.000333"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.582492" 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-10-11T01:06:14.582291" elapsed="0.000292">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-10-11T01:06:14.582668" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:14.581977" elapsed="0.000714"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.583170" 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-10-11T01:06:14.582861" elapsed="0.000335"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.583498" 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-10-11T01:06:14.583617" 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-10-11T01:06:14.583371" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.584053" 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-10-11T01:06:14.583834" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="NOT RUN" start="2026-10-11T01:06:14.584461" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.584181" elapsed="0.000334"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.584951" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.584680" elapsed="0.000297"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.584537" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.584164" elapsed="0.000866"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.585909" 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-10-11T01:06:14.585187" elapsed="0.000751"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:06:14.585982" 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/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-10-11T01:06:14.580962" elapsed="0.005122"/>
</kw>
<msg time="2026-10-11T01:06:14.586143" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:14.576719" elapsed="0.009468"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:14.590371" 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-10-11T01:06:14.594397" 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/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-10-11T01:06:14.598498" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.598690" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.598869" 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-10-11T01:06:14.599207" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.599063" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:14.599050" 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-10-11T01:06:14.599469" 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-10-11T01:06:14.599648" 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-10-11T01:06:14.599810" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:06:14.599023" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.598934" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.600029" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.600094" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:06:14.600231" 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-10-11T01:06:14.575998" elapsed="0.024260"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.601386" 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-10-11T01:06:14.601174" elapsed="0.000288">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-10-11T01:06:14.601547" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:14.600854" elapsed="0.000716"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.601849" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.601633" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.602402" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.602119" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.601957" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.601616" elapsed="0.000878"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.602992" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:06:14.602654" elapsed="0.000362"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:06:14.603061" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:14.603184" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:06:14.600555" elapsed="0.002652"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.604442" 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-10-11T01:06:14.604194" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.604889" 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-10-11T01:06:14.604675" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.605373" 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-10-11T01:06:14.605143" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.605831" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:14.605616" elapsed="0.000255"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:06:14.606586" 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-10-11T01:06:14.606426" elapsed="0.000184"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:06:14.606901" 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-10-11T01:06:14.606760" elapsed="0.000165"/>
</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-10-11T01:06:14.607083" elapsed="0.000155"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.607685" 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-10-11T01:06:14.607462" elapsed="0.000264"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:06:14.607764" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:14.607890" 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-10-11T01:06:14.606048" elapsed="0.001865"/>
</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-10-11T01:06:14.619328" level="INFO">PUT Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0i3mo6pz4qpz73djuaqc1rypd26.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-10-11T01:06:14.619471" level="INFO">PUT Response : url=http://10.30.170.173: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-10-11T01:06:14.619565" 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-10-11T01:06:14.608199" elapsed="0.011391"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.607975" elapsed="0.011656"/>
</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-10-11T01:06:14.619805" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.619655" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.607959" elapsed="0.011925"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.621060" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:14.620789" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.620555" elapsed="0.000576"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.620538" elapsed="0.000615"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.621731" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:14.621462" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.621202" elapsed="0.000606"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.621187" elapsed="0.000643"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.622341" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:14.622001" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.622667" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.622458" elapsed="0.000261"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.623163" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.622897" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.622741" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.622441" elapsed="0.000798"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.623783" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:14.623446" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.624074" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.623871" elapsed="0.000254"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.624605" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.624304" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.624146" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.623854" elapsed="0.000828"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:14.624821" elapsed="0.000289"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:06:14.625528" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:14.625266" elapsed="0.000287"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.625703" elapsed="0.000209"/>
</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-10-11T01:06:14.620198" elapsed="0.005768"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:06:14.626107" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:06:14.626025" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.626008" 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>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.626323" elapsed="0.000018"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.626418" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:06:14.626578" 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-10-11T01:06:14.603525" elapsed="0.023077"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:06:14.626694" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:06:14.626818" 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-10-11T01:06:14.533560" elapsed="0.093281"/>
</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-10-11T01:06:14.627123" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.626926" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.626910" elapsed="0.000295"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:06:14.627234" elapsed="0.000024"/>
</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-10-11T01:06:14.532946" elapsed="0.094383"/>
</kw>
<var name="${index}">4</var>
<var name="${peer_type}">ebgp_peer</var>
<status status="PASS" start="2026-10-11T01:06:14.532013" elapsed="0.095364"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.628197" 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-10-11T01:06:14.627718" elapsed="0.000507"/>
</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-10-11T01:06:14.638628" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.638286" elapsed="0.000369"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.639316" 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-10-11T01:06:14.639132" elapsed="0.000261">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-10-11T01:06:14.639493" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:14.638813" elapsed="0.000703"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.639999" 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-10-11T01:06:14.639690" elapsed="0.000334"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.640297" 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-10-11T01:06:14.640453" 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-10-11T01:06:14.640189" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.640898" 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-10-11T01:06:14.640673" elapsed="0.000267"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.641852" 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-10-11T01:06:14.641621" elapsed="0.000274"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.642313" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.642068" elapsed="0.000269"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.642950" 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-10-11T01:06:14.642683" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.643822" 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-10-11T01:06:14.643471" elapsed="0.000375"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.643924" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:06:14.644055" 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-10-11T01:06:14.643140" elapsed="0.000938"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.644240" elapsed="0.000212"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.5</var>
<status status="PASS" start="2026-10-11T01:06:14.642554" elapsed="0.001937"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.644989" 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-10-11T01:06:14.644720" elapsed="0.000294"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.645870" 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-10-11T01:06:14.645522" elapsed="0.000373"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.645940" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:14.646066" 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-10-11T01:06:14.645184" elapsed="0.000904"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.646252" elapsed="0.000194"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T01:06:14.644591" elapsed="0.001894"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.647126" 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-10-11T01:06:14.646711" elapsed="0.000440"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.648062" 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-10-11T01:06:14.647721" elapsed="0.000366"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.648132" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:14.648257" 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-10-11T01:06:14.647320" 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-10-11T01:06:14.648480" elapsed="0.000169"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T01:06:14.646584" elapsed="0.002102"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.649186" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:14.648912" elapsed="0.000298"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.650061" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.649722" elapsed="0.000364"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.650130" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:14.650253" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:14.649391" elapsed="0.000884"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.650483" elapsed="0.000166"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:06:14.648785" elapsed="0.001901"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.651178" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:14.650912" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.652059" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.651709" elapsed="0.000376"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.652129" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:14.652253" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:14.651387" elapsed="0.000888"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.652475" elapsed="0.000168"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:06:14.650785" elapsed="0.001896"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:06:14.642396" elapsed="0.010316"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:06:14.652750" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:06:14.652877" 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-10-11T01:06:14.641250" elapsed="0.011652"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.641002" elapsed="0.011928"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.653100" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.652952" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.640984" elapsed="0.012230"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.653976" 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-10-11T01:06:14.653390" elapsed="0.000613"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:06:14.654047" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:14.637781" elapsed="0.016365"/>
</kw>
<msg time="2026-10-11T01:06:14.654194" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:14.633515" 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/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-10-11T01:06:14.658264" 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/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-10-11T01:06:14.662868" 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-10-11T01:06:14.666819" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.667007" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.667185" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.667546" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.667389" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:14.667376" 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-10-11T01:06:14.667768" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.667941" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.668099" elapsed="0.000017"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:06:14.667338" elapsed="0.000808"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.667249" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.668312" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.668390" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:14.668517" 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-10-11T01:06:14.632887" elapsed="0.035685"/>
</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-10-11T01:06:14.677341" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.677033" elapsed="0.000350"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.678046" 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-10-11T01:06:14.677874" elapsed="0.000231">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-10-11T01:06:14.678190" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:14.677558" elapsed="0.000655"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.678743" 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-10-11T01:06:14.678396" elapsed="0.000373"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.679045" 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-10-11T01:06:14.679169" 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-10-11T01:06:14.678935" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.679639" 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-10-11T01:06:14.679419" 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-10-11T01:06:14.680016" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.679767" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.680546" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.680233" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.680091" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.679750" elapsed="0.000873"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.681552" 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-10-11T01:06:14.680812" elapsed="0.000769"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:06:14.681625" 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/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-10-11T01:06:14.676530" elapsed="0.005197"/>
</kw>
<msg time="2026-10-11T01:06:14.681785" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:14.672263" elapsed="0.009565"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:14.685949" 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/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-10-11T01:06:14.689922" 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/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-10-11T01:06:14.694046" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.694226" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.694429" elapsed="0.000021"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.694767" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.694623" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:14.694610" 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-10-11T01:06:14.694991" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.695165" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.695323" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:06:14.694585" elapsed="0.000798"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.694497" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.695568" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.695634" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:06:14.695771" 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-10-11T01:06:14.671564" elapsed="0.024233"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.696948" 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-10-11T01:06:14.696756" elapsed="0.000253">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-10-11T01:06:14.697091" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:14.696432" elapsed="0.000682"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.697422" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.697177" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.697919" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.697658" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.697497" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.697160" elapsed="0.000834"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.698517" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:06:14.698151" elapsed="0.000391"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:06:14.698586" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:14.698711" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:06:14.696106" elapsed="0.002628"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.699945" 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-10-11T01:06:14.699726" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.700400" 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-10-11T01:06:14.700174" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.700885" 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-10-11T01:06:14.700669" elapsed="0.000256"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.701323" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:14.701109" elapsed="0.000315"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:06:14.702116" 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-10-11T01:06:14.701960" elapsed="0.000180"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:06:14.702524" 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-10-11T01:06:14.702331" 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-10-11T01:06:14.702708" elapsed="0.000155"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.703273" 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-10-11T01:06:14.703053" elapsed="0.000261"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:06:14.703364" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:14.703510" 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-10-11T01:06:14.701607" elapsed="0.001927"/>
</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-10-11T01:06:14.715316" level="INFO">PUT Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0i3mo6pz4qpz73djuaqc1rypd26.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-10-11T01:06:14.715402" level="INFO">PUT Response : url=http://10.30.170.173: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-10-11T01:06:14.715505" 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-10-11T01:06:14.703820" elapsed="0.011709"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.703596" elapsed="0.011973"/>
</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-10-11T01:06:14.715744" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.715593" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.703579" elapsed="0.012244"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.716971" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:14.716701" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.716461" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.716444" elapsed="0.000620"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.717678" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:14.717373" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.717112" elapsed="0.000648"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.717098" elapsed="0.000685"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.718336" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:14.717967" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.718725" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.718469" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.719265" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.718978" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.718807" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.718451" elapsed="0.000912"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.719928" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:14.719562" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.720230" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.720023" elapsed="0.000259"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.720753" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.720489" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.720304" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.720005" elapsed="0.000824"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:14.720969" elapsed="0.000289"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:06:14.721659" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:14.721438" elapsed="0.000245"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.721831" elapsed="0.000210"/>
</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-10-11T01:06:14.716141" elapsed="0.005956"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:06:14.722236" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:06:14.722156" elapsed="0.000135"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.722139" elapsed="0.000174"/>
</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-10-11T01:06:14.722482" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.722543" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:06:14.722702" 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-10-11T01:06:14.699022" elapsed="0.023704"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:06:14.722781" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:06:14.722902" 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-10-11T01:06:14.629071" elapsed="0.093853"/>
</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-10-11T01:06:14.723206" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.723009" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.722993" elapsed="0.000295"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:06:14.723318" elapsed="0.000023"/>
</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-10-11T01:06:14.628489" elapsed="0.094953"/>
</kw>
<var name="${index}">5</var>
<var name="${peer_type}">rr_client_peer</var>
<status status="PASS" start="2026-10-11T01:06:14.627491" elapsed="0.095987"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.724224" 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-10-11T01:06:14.723753" elapsed="0.000497"/>
</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-10-11T01:06:14.734559" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.734228" elapsed="0.000358"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.735224" 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-10-11T01:06:14.735053" elapsed="0.000230">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-10-11T01:06:14.735419" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:14.734741" elapsed="0.000703"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.735920" 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-10-11T01:06:14.735616" elapsed="0.000329"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.736214" 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-10-11T01:06:14.736329" 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-10-11T01:06:14.736106" elapsed="0.000261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.736789" 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-10-11T01:06:14.736573" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.737736" 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-10-11T01:06:14.737505" elapsed="0.000273"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.738192" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.737949" elapsed="0.000267"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.738820" 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-10-11T01:06:14.738557" elapsed="0.000287"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.739701" 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-10-11T01:06:14.739312" elapsed="0.000414"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.739771" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:06:14.739895" 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-10-11T01:06:14.739010" elapsed="0.000908"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.740078" elapsed="0.000165"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.6</var>
<status status="PASS" start="2026-10-11T01:06:14.738428" elapsed="0.001851"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.740802" 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-10-11T01:06:14.740536" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.741672" 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-10-11T01:06:14.741296" elapsed="0.000400"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.741741" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:14.741864" 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-10-11T01:06:14.740991" elapsed="0.000895"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.742046" elapsed="0.000164"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T01:06:14.740394" elapsed="0.001853"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.742906" 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-10-11T01:06:14.742499" elapsed="0.000432"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.743783" 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-10-11T01:06:14.743439" elapsed="0.000397"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.743883" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:14.744008" 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-10-11T01:06:14.743097" 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-10-11T01:06:14.744189" elapsed="0.000177"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T01:06:14.742356" elapsed="0.002064"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.744914" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:14.744648" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.745778" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.745434" elapsed="0.000369"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.745847" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:14.745975" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:14.745103" elapsed="0.000896"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.746161" elapsed="0.000163"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:06:14.744521" elapsed="0.001868"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.746900" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:14.746632" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:14.747780" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.747430" elapsed="0.000375"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:14.747849" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:06:14.747975" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:14.747089" elapsed="0.000908"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.748158" elapsed="0.000165"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:06:14.746504" elapsed="0.001869"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:06:14.738259" elapsed="0.010180"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:06:14.748480" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:14.748611" 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-10-11T01:06:14.737140" elapsed="0.011495"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.736893" elapsed="0.011770"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.748830" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.748685" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.736875" elapsed="0.012025"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.749634" 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-10-11T01:06:14.749062" elapsed="0.000599"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:06:14.749704" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:14.733731" elapsed="0.016073"/>
</kw>
<msg time="2026-10-11T01:06:14.749853" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:14.729536" elapsed="0.020361"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:14.753911" 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/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-10-11T01:06:14.758198" 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/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-10-11T01:06:14.762174" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.762366" 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-10-11T01:06:14.762560" 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-10-11T01:06:14.762893" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.762750" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:14.762737" 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-10-11T01:06:14.763118" 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-10-11T01:06:14.763295" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.763485" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:06:14.762713" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.762626" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.763768" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.763840" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:06:14.763952" 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-10-11T01:06:14.728882" elapsed="0.035095"/>
</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-10-11T01:06:14.772707" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.772392" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.773385" 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-10-11T01:06:14.773201" elapsed="0.000262">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-10-11T01:06:14.773547" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:14.772888" elapsed="0.000682"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.774043" 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-10-11T01:06:14.773737" elapsed="0.000331"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.774337" 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-10-11T01:06:14.774510" 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-10-11T01:06:14.774230" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.774951" 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-10-11T01:06:14.774731" 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-10-11T01:06:14.775329" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.775080" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.775840" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.775574" elapsed="0.000292"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.775430" elapsed="0.000468"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.775063" elapsed="0.000855"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.776806" 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-10-11T01:06:14.776075" elapsed="0.000759"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:06:14.776878" 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/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-10-11T01:06:14.771882" elapsed="0.005098"/>
</kw>
<msg time="2026-10-11T01:06:14.777038" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:14.767675" elapsed="0.009407"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:14.781213" 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/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-10-11T01:06:14.785216" 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/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-10-11T01:06:14.789220" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.789423" 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-10-11T01:06:14.789607" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.789938" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.789797" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:14.789783" 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-10-11T01:06:14.790160" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.790334" elapsed="0.000046"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.790539" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:06:14.789758" elapsed="0.000829"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.789671" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.790756" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.790820" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:06:14.790970" 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-10-11T01:06:14.766953" elapsed="0.024045"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:14.792096" 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-10-11T01:06:14.791912" elapsed="0.000243">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-10-11T01:06:14.792238" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:14.791590" elapsed="0.000670"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.792570" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.792323" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.793065" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.792804" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.792645" elapsed="0.000476"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.792306" elapsed="0.000835"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.793692" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:06:14.793299" elapsed="0.000417"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:06:14.793761" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:14.793884" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:06:14.791264" elapsed="0.002642"/>
</kw>
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.795112" 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-10-11T01:06:14.794893" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.795631" 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-10-11T01:06:14.795388" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.796101" 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-10-11T01:06:14.795886" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.796568" level="INFO">{'Accept': 'application/xml'}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:14.796325" elapsed="0.000283"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-10-11T01:06:14.797290" 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-10-11T01:06:14.797136" elapsed="0.000178"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-10-11T01:06:14.797634" 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-10-11T01:06:14.797491" elapsed="0.000166"/>
</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-10-11T01:06:14.797815" elapsed="0.000153"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.798392" 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-10-11T01:06:14.798157" elapsed="0.000290"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-10-11T01:06:14.798486" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:14.798612" 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-10-11T01:06:14.796785" elapsed="0.001850"/>
</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-10-11T01:06:14.812090" level="INFO">PUT Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'application/xml', 'Connection': 'keep-alive', 'Content-Type': 'application/xml', 'Cookie': 'JSESSIONID=node0i3mo6pz4qpz73djuaqc1rypd26.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-10-11T01:06:14.812315" level="INFO">PUT Response : url=http://10.30.170.173: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-10-11T01:06:14.812574" 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-10-11T01:06:14.798923" elapsed="0.013702"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.798697" elapsed="0.014013"/>
</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-10-11T01:06:14.813089" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.812759" elapsed="0.000458"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.798681" elapsed="0.014558"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.814390" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:14.814100" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.813866" elapsed="0.000610"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.813849" elapsed="0.000649"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.815052" level="INFO">201</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:14.814782" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.814547" elapsed="0.000577"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.814532" elapsed="0.000614"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.815699" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:14.815316" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.815993" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.815788" elapsed="0.000257"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.816524" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.816222" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.816066" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.815772" elapsed="0.000830"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.817103" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:14.816771" elapsed="0.000357"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.817422" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.817190" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.817916" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.817654" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.817497" elapsed="0.000476"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.817174" elapsed="0.000819"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:14.818132" elapsed="0.000321"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:06:14.818828" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:14.818610" elapsed="0.000242"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.818999" elapsed="0.000208"/>
</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-10-11T01:06:14.813578" elapsed="0.005684"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:06:14.819432" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T01:06:14.819321" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.819304" 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-10-11T01:06:14.819662" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.819730" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:06:14.819902" 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-10-11T01:06:14.794189" elapsed="0.025739"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:06:14.820021" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:06:14.820154" 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-10-11T01:06:14.725099" elapsed="0.095080"/>
</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-10-11T01:06:14.820512" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.820271" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.820251" elapsed="0.000352"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:06:14.820637" 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-10-11T01:06:14.724511" elapsed="0.096231"/>
</kw>
<var name="${index}">6</var>
<var name="${peer_type}">rr_client_peer</var>
<status status="PASS" start="2026-10-11T01:06:14.723575" elapsed="0.097207"/>
</iter>
<var>${index}</var>
<var>${peer_type}</var>
<value>${NUMBERS}</value>
<value>${PEER_TYPES}</value>
<status status="PASS" start="2026-10-11T01:06:14.242396" elapsed="0.578418"/>
</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-10-11T01:06:14.142785" elapsed="0.678134"/>
</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-10-11T01:06:14.822895" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:06:14.822529" elapsed="0.000629"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.824070" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:14.823985" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.823967" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.826222" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:14.826139" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.826121" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.827223" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:06:14.826899" elapsed="0.000350"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.827835" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:06:14.827567" elapsed="0.000292"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:06:14.827901" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:14.828027" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:06:14.826541" 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-10-11T01:06:14.830519" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:14.830433" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.830401" elapsed="0.000180"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.831653" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:14.831570" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.831552" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:06:14.832027" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.831859" elapsed="0.000192"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:06:14.832358" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:06:14.832210" elapsed="0.000172"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:06:14.867852" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:06:14.832911" elapsed="0.035041"/>
</kw>
<msg time="2026-10-11T01:06:14.868104" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:06:14.868145" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:14.832553" elapsed="0.035627"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:06:14.895103" 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-10-11T01:06:14.868891" elapsed="0.026310"/>
</kw>
<msg time="2026-10-11T01:06:14.895365" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:06:14.895430" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:14.868552" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.895743" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.895537" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.895519" elapsed="0.000296"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.896216" 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-10-11T01:06:14.895990" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.896565" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.896335" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.896319" elapsed="0.000318"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:06:14.896667" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:06:14.899108" elapsed="0.000255"/>
</kw>
<msg time="2026-10-11T01:06:14.899439" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:14.898004" 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-10-11T01:06:14.899878" elapsed="0.000074"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.900213" 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-10-11T01:06:14.897432" 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-10-11T01:06:14.896939" elapsed="0.003565"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:06:14.831247" elapsed="0.069331"/>
</kw>
<msg time="2026-10-11T01:06:14.900659" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:06:14.900697" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:14.830729" elapsed="0.070003"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:06:14.900885" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:06:14.900799" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.900781" elapsed="0.000276"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.901429" 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-10-11T01:06:14.901729" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.901792" 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-10-11T01:06:14.830112" elapsed="0.071766"/>
</kw>
<msg time="2026-10-11T01:06:14.901961" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:06:14.902000" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:14.828385" elapsed="0.073650"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.902321" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.902102" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.902086" elapsed="0.000369"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:06:14.828233" elapsed="0.074245"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:06:14.828095" elapsed="0.074410"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:06:14.825844" elapsed="0.076709"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:06:14.823732" elapsed="0.078870"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:14.823305" elapsed="0.079337"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:06:14.822011" elapsed="0.080677"/>
</kw>
<kw name="Virtual_Env_Activate_On_Current_Session" owner="SSHKeywords">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:06:14.905022" 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-10-11T01:06:14.903250" elapsed="0.001825"/>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-10-11T01:06:14.910716" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<msg time="2026-10-11T01:06:14.910799" level="INFO">${output} = [?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:06:14.905247" elapsed="0.005577"/>
</kw>
<if>
<branch type="IF" condition="${log_output}==${True}">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.911380" level="INFO">[?2004l[?2004h(defaultvenv) [jenkins@releng-26932-423-0-builder-0 ~]&gt;</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:14.911133" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:14.910884" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.910867" 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-10-11T01:06:14.902913" elapsed="0.008625"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.912121" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.911831" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.912588" 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-10-11T01:06:14.912338" elapsed="0.000291"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:06:14.914671" level="INFO">env exabgp.tcp.port=1790 exabgp --debug exabgp1.cfg &gt; exa1.log &amp;</msg>
<msg time="2026-10-11T01:06:14.914754" 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-10-11T01:06:14.912779" elapsed="0.001999"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.915190" 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-10-11T01:06:14.914971" elapsed="0.000261"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:06:14.911698" elapsed="0.003564"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.915803" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.915518" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.916231" 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-10-11T01:06:14.916018" elapsed="0.000254"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:06:14.917126" level="INFO">[?2004l[1] 6179</msg>
<msg time="2026-10-11T01:06:14.917208" level="INFO">${output} = [?2004l[1] 6179
</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-10-11T01:06:14.916447" elapsed="0.000786"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.917702" level="INFO">[?2004l[1] 6179
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:14.917453" elapsed="0.000306"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-11T01:06:14.915369" elapsed="0.002421"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.918315" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.918034" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.918775" 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-10-11T01:06:14.918561" elapsed="0.000255"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:06:14.920502" level="INFO">[?2004h(defaultvenv) [jenkins@releng-26932-423-0-builder-0 ~]&gt; env exabgp.tcp.port=1790 exabgp --debug exabgp2.cfg &gt; exa2.log &amp;</msg>
<msg time="2026-10-11T01:06:14.920586" level="INFO">${output} = [?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:06:14.918963" elapsed="0.001649"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.921025" level="INFO">[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:06:14.920805" elapsed="0.000310"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-11T01:06:14.917879" elapsed="0.003268"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.921686" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.921384" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.922138" 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-10-11T01:06:14.921900" elapsed="0.000281"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:06:14.922927" level="INFO">[?2004l[2] 6180</msg>
<msg time="2026-10-11T01:06:14.923007" level="INFO">${output} = [?2004l[2] 6180
</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-10-11T01:06:14.922329" elapsed="0.000703"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.923492" level="INFO">[?2004l[2] 6180
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:14.923222" elapsed="0.000313"/>
</kw>
<var name="${index}">4</var>
<status status="PASS" start="2026-10-11T01:06:14.921238" elapsed="0.002327"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.924110" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.923803" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.924573" 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-10-11T01:06:14.924324" elapsed="0.000290"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:06:14.926791" level="INFO">[?2004h(defaultvenv) [jenkins@releng-26932-423-0-builder-0 ~]&gt; env exabgp.tcp.port=1790 exabgp --debug exabgp3.cfg &gt; exa3.log &amp;</msg>
<msg time="2026-10-11T01:06:14.926876" level="INFO">${output} = [?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:06:14.924762" elapsed="0.002139"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.927312" level="INFO">[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:06:14.927093" elapsed="0.000307"/>
</kw>
<var name="${index}">5</var>
<status status="PASS" start="2026-10-11T01:06:14.923655" elapsed="0.003797"/>
</iter>
<iter>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.928146" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:14.927676" elapsed="0.000496"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.928618" 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-10-11T01:06:14.928383" elapsed="0.000277"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:06:14.929151" level="INFO">[?2004l[3] 6181</msg>
<msg time="2026-10-11T01:06:14.929226" level="INFO">${output} = [?2004l[3] 6181
</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-10-11T01:06:14.928810" elapsed="0.000439"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.929687" level="INFO">[?2004l[3] 6181
</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:14.929468" elapsed="0.000278"/>
</kw>
<var name="${index}">6</var>
<status status="PASS" start="2026-10-11T01:06:14.927543" elapsed="0.002233"/>
</iter>
<var>${index}</var>
<value>@{NUMBERS}</value>
<status status="PASS" start="2026-10-11T01:06:14.911579" elapsed="0.018224"/>
</for>
<doc>Start 6 exabgps as processes in background, each with it's own configuration.</doc>
<status status="PASS" start="2026-10-11T01:06:14.821393" elapsed="0.108497"/>
</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-10-11T01:06:14.931901" elapsed="0.000224"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:06:14.931651" 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-10-11T01:06:14.933151" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:14.933065" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.933047" elapsed="0.000167"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.935163" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:14.935082" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.935065" elapsed="0.000160"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.936330" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:06:14.935808" elapsed="0.000576"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.936816" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:06:14.936553" elapsed="0.000287"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:06:14.936880" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:14.937008" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:06:14.935453" elapsed="0.001578"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.939740" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:14.939654" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.939636" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.940856" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:14.940773" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.940755" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:06:14.941227" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:06:14.941062" elapsed="0.000189"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:06:14.941580" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:06:14.941444" elapsed="0.000159"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:06:14.970675" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:06:14.942086" elapsed="0.028691"/>
</kw>
<msg time="2026-10-11T01:06:14.970935" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:06:14.970979" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:14.941757" elapsed="0.029259"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:06:14.992865" 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-10-11T01:06:14.971571" elapsed="0.021392"/>
</kw>
<msg time="2026-10-11T01:06:14.993112" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:06:14.993153" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:14.971187" elapsed="0.022002"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.993508" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.993259" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.993240" elapsed="0.000343"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:14.993993" 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-10-11T01:06:14.993763" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.994316" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.994116" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.994099" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:06:14.994448" 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-10-11T01:06:14.996916" elapsed="0.000117"/>
</kw>
<msg time="2026-10-11T01:06:14.997091" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:14.995788" 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-10-11T01:06:14.997683" elapsed="0.000082"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.998029" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:06:14.995182" elapsed="0.003032"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:06:14.994718" elapsed="0.003555"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:06:14.940516" elapsed="0.057849"/>
</kw>
<msg time="2026-10-11T01:06:14.998471" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:06:14.998544" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:14.939954" elapsed="0.058627"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:06:14.998739" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:06:14.998652" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.998634" elapsed="0.000183"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.999136" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:14.999465" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:06:14.999531" 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-10-11T01:06:14.939284" elapsed="0.060334"/>
</kw>
<msg time="2026-10-11T01:06:14.999703" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:06:14.999743" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:14.937440" elapsed="0.062339"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:15.000063" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:14.999846" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:14.999830" elapsed="0.000305"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:06:14.937265" elapsed="0.062892"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:06:14.937124" elapsed="0.063059"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:06:14.934793" elapsed="0.065439"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:06:14.932813" elapsed="0.067469"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:14.932323" elapsed="0.067998"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:06:14.931212" elapsed="0.069170"/>
</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-10-11T01:06:15.016992" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:15.016684" elapsed="0.000336"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:15.017880" 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-10-11T01:06:15.017677" elapsed="0.000268">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-10-11T01:06:15.018031" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:15.017323" elapsed="0.000731"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:15.018567" 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-10-11T01:06:15.018223" elapsed="0.000369"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:15.018864" 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-10-11T01:06:15.019522" 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-10-11T01:06:15.018756" elapsed="0.000792"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:15.019968" 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-10-11T01:06:15.019742" elapsed="0.000269"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:15.020973" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:15.020740" elapsed="0.000275"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:15.021478" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:06:15.021189" 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-10-11T01:06:15.021786" elapsed="0.000020"/>
</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-10-11T01:06:15.021974" elapsed="0.000022"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</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-10-11T01:06:15.022155" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-11T01:06:15.021656" elapsed="0.000550"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-11T01:06:15.021546" elapsed="0.000687"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:06:15.022272" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:15.022432" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:06:15.020382" elapsed="0.002074"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:15.020072" elapsed="0.002415"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:15.022656" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:15.022510" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:15.020054" elapsed="0.002672"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:15.023257" 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-10-11T01:06:15.022881" elapsed="0.000401"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:06:15.023326" 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/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-10-11T01:06:15.016113" elapsed="0.007341"/>
</kw>
<msg time="2026-10-11T01:06:15.023503" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:15.011750" elapsed="0.011798"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:15.027937" 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/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-10-11T01:06:15.032043" 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/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-10-11T01:06:15.036273" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:15.036482" 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-10-11T01:06:15.036664" 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-10-11T01:06:15.037003" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:15.036857" elapsed="0.000237"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:15.036843" 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-10-11T01:06:15.037273" 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-10-11T01:06:15.037480" elapsed="0.000020"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:15.037645" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:06:15.036818" elapsed="0.000876"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:06:15.036729" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:15.037867" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:15.037934" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:06:15.038041" 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-10-11T01:06:15.011134" elapsed="0.026932"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:15.039184" 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-10-11T01:06:15.038981" elapsed="0.000263">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-10-11T01:06:15.039329" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:15.038658" elapsed="0.000706"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:15.039664" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:15.039445" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:15.040158" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:15.039896" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:15.039737" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:15.039427" elapsed="0.000808"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:15.040761" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:06:15.040423" elapsed="0.000362"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:06:15.040830" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:15.040955" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:06:15.038329" elapsed="0.002648"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:15.042069" 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-10-11T01:06:15.041871" elapsed="0.000257">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-10-11T01:06:15.042213" 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-10-11T01:06:15.041553" elapsed="0.000682"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:06:15.042425" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-11T01:06:15.042299" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:15.042282" elapsed="0.000222"/>
</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-10-11T01:06:15.042656" elapsed="0.000019"/>
</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-10-11T01:06:15.042830" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:06:15.042889" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:06:15.043013" 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-10-11T01:06:15.041226" elapsed="0.001849"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:15.044305" 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-10-11T01:06:15.044081" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:15.044780" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:15.044563" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:06:15.052472" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i3mo6pz4qpz73djuaqc1rypd26.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:06:15.052679" level="INFO">GET Response : url=http://10.30.170.173: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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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.173","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-types:unicast-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-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:ipv6-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-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-10-11T01:06:15.052865" 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-10-11T01:06:15.045104" elapsed="0.007786"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:15.044880" elapsed="0.008050"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:15.053102" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:15.052954" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:15.044863" elapsed="0.008315"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:15.054515" 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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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.173","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-types:unicast-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-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:ipv6-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-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family"},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-flowspec:flowspec-subsequent-address-family","attributes":{"uptodate":false}},{"afi":"bgp-types:ipv4-address-family","safi":"bgp-mvpn:mcast-vpn-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-10-11T01:06:15.054108" elapsed="0.000628"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:15.053869" elapsed="0.000900"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:15.053851" elapsed="0.000941"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:15.055358" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:15.055079" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:15.054842" elapsed="0.000605"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:15.054827" elapsed="0.000642"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:15.055988" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:15.055639" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:15.056281" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:15.056076" elapsed="0.000258"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:15.056811" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:15.056549" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:15.056376" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:15.056060" elapsed="0.000827"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:15.057435" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:15.057057" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:15.057727" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:15.057524" elapsed="0.000254"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:15.058212" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:15.057954" elapsed="0.000282"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:15.057799" elapsed="0.000469"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:15.057507" elapsed="0.000780"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:15.058452" elapsed="0.000288"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:06:15.059123" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:15.058896" elapsed="0.000250"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:06:15.059294" elapsed="0.000239"/>
</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-10-11T01:06:15.053531" elapsed="0.006059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:15.059732" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:15.059651" elapsed="0.000121"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:15.059635" elapsed="0.000157"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-10-11T01:06:15.066001" 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-10-11T01:06:15.059927" elapsed="0.006102"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-10-11T01:06:15.066077" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:15.066207" 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-10-11T01:06:15.043372" elapsed="0.022859"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:06:15.066286" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:06:15.066433" 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-10-11T01:06:15.003863" elapsed="0.062595"/>
</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-10-11T01:06:15.066738" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:15.066534" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:15.066518" elapsed="0.000341"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:06:15.066890" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:06:15.067014" 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-10-11T01:06:15.003259" elapsed="0.063780"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:15.067501" 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.173",
     "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-10-11T01:06:15.067233" elapsed="0.000557"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:15.068493" 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-10-11T01:06:15.068112" elapsed="0.000407"/>
</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-10-11T01:06:15.083761" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:15.083460" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:15.084511" 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-10-11T01:06:15.084253" elapsed="0.000321">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-10-11T01:06:15.084658" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:15.083942" elapsed="0.000739"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:15.085158" 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-10-11T01:06:15.084852" elapsed="0.000332"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:15.085495" 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-10-11T01:06:15.085618" 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-10-11T01:06:15.085368" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:15.086049" 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-10-11T01:06:15.085832" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:15.087305" 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-10-11T01:06:15.086766" elapsed="0.000594"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:15.087918" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:06:15.087550" elapsed="0.000392"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:15.089127" 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-10-11T01:06:15.088301" elapsed="0.000902"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:15.090974" 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-10-11T01:06:15.090699" elapsed="0.000322"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:15.091135" elapsed="0.000072"/>
</return>
<msg time="2026-10-11T01:06:15.091451" 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-10-11T01:06:15.089859" elapsed="0.001670"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:15.091823" elapsed="0.000448"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T01:06:15.088120" elapsed="0.004312"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:06:15.087986" elapsed="0.004483"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:06:15.092508" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:06:15.092637" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:06:15.086428" elapsed="0.006232"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:15.086151" elapsed="0.006538"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:15.092857" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:15.092711" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:15.086133" elapsed="0.006792"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:15.093625" 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-10-11T01:06:15.093083" elapsed="0.000569"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:06:15.093736" 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/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-10-11T01:06:15.082921" elapsed="0.010917"/>
</kw>
<msg time="2026-10-11T01:06:15.093887" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:15.078731" elapsed="0.015200"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:15.098076" 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/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-10-11T01:06:15.102096" 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/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-10-11T01:06:15.106062" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:15.106240" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:15.106444" 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-10-11T01:06:15.106777" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:15.106636" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:15.106623" 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-10-11T01:06:15.106999" 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-10-11T01:06:15.107176" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:15.107337" elapsed="0.000032"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:06:15.106597" elapsed="0.000802"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:06:15.106512" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:15.107586" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:15.107652" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:06:15.107760" 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-10-11T01:06:15.078112" elapsed="0.029673"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:15.108924" 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-10-11T01:06:15.108730" elapsed="0.000253">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-10-11T01:06:15.109066" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:15.108393" elapsed="0.000696"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:15.109381" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:15.109152" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:15.109894" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:15.109632" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:15.109471" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:15.109135" elapsed="0.000834"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:15.110497" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:06:15.110126" elapsed="0.000395"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:06:15.110565" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:15.110688" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:06:15.108081" elapsed="0.002629"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:15.111946" 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-10-11T01:06:15.111594" elapsed="0.000411">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-10-11T01:06:15.112090" 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-10-11T01:06:15.111252" elapsed="0.000860"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:06:15.112274" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:06:15.112176" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:15.112159" elapsed="0.000201"/>
</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-10-11T01:06:15.112525" 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-10-11T01:06:15.112697" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:06:15.112756" elapsed="0.000014"/>
</return>
<msg time="2026-10-11T01:06:15.112879" 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-10-11T01:06:15.110954" elapsed="0.001948"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:15.114107" 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-10-11T01:06:15.113886" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:15.114584" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:15.114335" 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-10-11T01:06:15.120011" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i3mo6pz4qpz73djuaqc1rypd26.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:06:15.120119" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:06:15.120212" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:15.114905" elapsed="0.005739">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:15.114683" elapsed="0.006041">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:15.120906" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:15.120754" elapsed="0.000210"/>
</branch>
<status status="FAIL" start="2026-10-11T01:06:15.114666" elapsed="0.006319">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:15.121312" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:15.121466" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:15.121431" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:15.121400" 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-10-11T01:06:15.121661" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:06:15.121722" 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-10-11T01:06:15.113173" elapsed="0.008648">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:15.121885" 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-10-11T01:06:15.070922" elapsed="0.051048">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:15.122207" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:15.122051" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:15.122035" elapsed="0.000257"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:15.122322" elapsed="0.000013"/>
</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-10-11T01:06:15.070289" elapsed="0.052154">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:18.156614" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:18.155868" elapsed="0.000811"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:18.158302" 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-10-11T01:06:18.157794" elapsed="0.000711">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-10-11T01:06:18.158784" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:18.157032" elapsed="0.001805"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:18.159979" 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-10-11T01:06:18.159221" elapsed="0.000821"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:18.160774" 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-10-11T01:06:18.161068" 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-10-11T01:06:18.160524" elapsed="0.000600"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:18.162153" 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-10-11T01:06:18.161657" elapsed="0.000590"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:18.164840" 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-10-11T01:06:18.163858" elapsed="0.001075"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:18.166293" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:06:18.165320" elapsed="0.001055"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:18.168381" 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-10-11T01:06:18.167221" elapsed="0.001299"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:18.171034" 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-10-11T01:06:18.170647" elapsed="0.000454"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:18.171265" elapsed="0.000119"/>
</return>
<msg time="2026-10-11T01:06:18.171785" 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-10-11T01:06:18.169468" elapsed="0.002424"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:18.172304" elapsed="0.000752"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T01:06:18.166824" elapsed="0.006425"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:06:18.166513" elapsed="0.006787"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:06:18.173370" elapsed="0.000055"/>
</return>
<msg time="2026-10-11T01:06:18.173572" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:06:18.163014" elapsed="0.010591"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:18.162449" elapsed="0.011196"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:18.173883" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:18.173677" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:18.162373" elapsed="0.011606"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:18.174948" 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-10-11T01:06:18.174197" elapsed="0.000789"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:06:18.175048" 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/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-10-11T01:06:18.154677" elapsed="0.020510"/>
</kw>
<msg time="2026-10-11T01:06:18.175255" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:18.144918" elapsed="0.030400"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:18.182718" 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/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-10-11T01:06:18.188325" 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/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-10-11T01:06:18.193232" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:18.193439" 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-10-11T01:06:18.193621" 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-10-11T01:06:18.193953" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:18.193811" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:18.193798" 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-10-11T01:06:18.194177" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:18.194366" 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-10-11T01:06:18.194544" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:06:18.193773" elapsed="0.000819"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:06:18.193686" elapsed="0.000929"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:18.194763" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:18.194829" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:06:18.194938" 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-10-11T01:06:18.143528" elapsed="0.051435"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:18.196067" 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-10-11T01:06:18.195880" elapsed="0.000247">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-10-11T01:06:18.196210" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:18.195557" elapsed="0.000676"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:18.196543" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:18.196295" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:18.197046" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:18.196785" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:18.196618" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:18.196278" elapsed="0.000844"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:18.197661" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:06:18.197278" elapsed="0.000407"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:06:18.197759" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:18.197886" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:06:18.195229" elapsed="0.002680"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:18.198974" 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-10-11T01:06:18.198791" elapsed="0.000241">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-10-11T01:06:18.199115" 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-10-11T01:06:18.198476" elapsed="0.000661"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:06:18.199296" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:06:18.199199" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:18.199182" elapsed="0.000203"/>
</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-10-11T01:06:18.199550" elapsed="0.000020"/>
</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-10-11T01:06:18.199719" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:06:18.199777" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:06:18.199899" 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-10-11T01:06:18.198154" elapsed="0.001768"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:18.201131" 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-10-11T01:06:18.200909" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:18.201606" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:18.201374" elapsed="0.000272"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:06:18.208447" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i3mo6pz4qpz73djuaqc1rypd26.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:06:18.208571" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:06:18.208668" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:18.201928" elapsed="0.007075">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:18.201705" elapsed="0.007372">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:18.209258" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:18.209107" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-11T01:06:18.201688" elapsed="0.007681">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:18.209717" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:18.209869" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:18.209836" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:18.209819" elapsed="0.000107"/>
</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-10-11T01:06:18.210063" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:06:18.210125" elapsed="0.000013"/>
</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-10-11T01:06:18.200190" elapsed="0.010029">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:18.210283" elapsed="0.000014"/>
</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-10-11T01:06:18.127134" elapsed="0.083806">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:18.211183" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:18.211024" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:18.211009" elapsed="0.000258"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:18.211296" elapsed="0.000013"/>
</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-10-11T01:06:18.125669" elapsed="0.085725">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:21.245895" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:21.245125" elapsed="0.000837"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:21.247718" 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-10-11T01:06:21.247101" elapsed="0.000765">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-10-11T01:06:21.248057" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:21.246349" elapsed="0.001758"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:21.249241" 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-10-11T01:06:21.248547" elapsed="0.000751"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:21.249992" 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-10-11T01:06:21.250298" 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-10-11T01:06:21.249737" elapsed="0.000665"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:21.251440" 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-10-11T01:06:21.250894" elapsed="0.000645"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:21.254677" 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-10-11T01:06:21.253209" elapsed="0.001567"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:21.255810" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:06:21.255182" elapsed="0.000663"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:21.257564" 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-10-11T01:06:21.256395" elapsed="0.001278"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:21.260262" 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-10-11T01:06:21.259873" elapsed="0.000472"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:21.260600" elapsed="0.000110"/>
</return>
<msg time="2026-10-11T01:06:21.261014" 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-10-11T01:06:21.258687" elapsed="0.002437"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:21.261736" elapsed="0.000597"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T01:06:21.256119" elapsed="0.006407"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:06:21.255915" elapsed="0.006663"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:06:21.262633" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T01:06:21.262816" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:06:21.252291" elapsed="0.010558"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:21.251692" elapsed="0.011198"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:21.263128" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:21.262922" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:21.251645" elapsed="0.011579"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:21.264241" 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-10-11T01:06:21.263535" elapsed="0.000743"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:06:21.264354" 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/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-10-11T01:06:21.243941" elapsed="0.020580"/>
</kw>
<msg time="2026-10-11T01:06:21.264591" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:21.234158" elapsed="0.030497"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:21.270382" elapsed="0.000050"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:21.276046" 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/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-10-11T01:06:21.281832" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:21.282132" 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-10-11T01:06:21.282401" elapsed="0.000045"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:21.282896" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:21.282694" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:21.282675" elapsed="0.000322"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:21.283213" 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-10-11T01:06:21.283502" 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-10-11T01:06:21.283732" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:06:21.282639" elapsed="0.001159"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:06:21.282514" elapsed="0.001316"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:21.284038" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:21.284132" elapsed="0.000021"/>
</return>
<msg time="2026-10-11T01:06:21.284287" 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-10-11T01:06:21.232762" elapsed="0.051578"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:21.285909" 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-10-11T01:06:21.285646" elapsed="0.000348">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-10-11T01:06:21.286112" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:21.285156" elapsed="0.000989"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:21.286577" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:21.286232" elapsed="0.000420"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:21.287292" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:21.286924" elapsed="0.000442"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:21.286683" elapsed="0.000749"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:21.286209" elapsed="0.001253"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:21.288161" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:06:21.287688" elapsed="0.000509"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:06:21.288262" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T01:06:21.288474" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:06:21.284733" elapsed="0.003774"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:21.290261" 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-10-11T01:06:21.289753" elapsed="0.000611">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-10-11T01:06:21.290506" 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-10-11T01:06:21.289271" elapsed="0.001268"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:06:21.290774" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-10-11T01:06:21.290630" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:21.290606" elapsed="0.000325"/>
</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-10-11T01:06:21.291149" 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-10-11T01:06:21.291426" elapsed="0.000029"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:06:21.291513" elapsed="0.000019"/>
</return>
<msg time="2026-10-11T01:06:21.291689" 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-10-11T01:06:21.288856" elapsed="0.002865"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:21.293469" 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-10-11T01:06:21.293115" elapsed="0.000415"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:21.294100" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:21.293792" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:06:21.301111" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i3mo6pz4qpz73djuaqc1rypd26.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:06:21.301301" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:06:21.301475" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:21.294591" elapsed="0.007368">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:21.294240" elapsed="0.007825">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:21.302341" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:21.302108" elapsed="0.000337"/>
</branch>
<status status="FAIL" start="2026-10-11T01:06:21.294216" elapsed="0.008261">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:21.302948" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:21.303118" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:21.303069" elapsed="0.000107"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:21.303047" elapsed="0.000156"/>
</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-10-11T01:06:21.303429" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:06:21.303519" 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-10-11T01:06:21.292108" elapsed="0.011545">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:21.303745" 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-10-11T01:06:21.216701" elapsed="0.087167">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:21.304255" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:21.304029" elapsed="0.000335"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:21.304006" elapsed="0.000390"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:21.304459" elapsed="0.000021"/>
</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-10-11T01:06:21.215062" elapsed="0.089525">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:24.339928" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:24.339159" elapsed="0.000837"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:24.341741" 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-10-11T01:06:24.341129" elapsed="0.000760">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-10-11T01:06:24.342081" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:24.340385" elapsed="0.001746"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:24.343276" 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-10-11T01:06:24.342578" elapsed="0.000812"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:24.344067" 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-10-11T01:06:24.344386" 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-10-11T01:06:24.343809" elapsed="0.000669"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:24.345520" 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-10-11T01:06:24.344969" elapsed="0.000646"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:24.348149" 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-10-11T01:06:24.347151" elapsed="0.001092"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:24.349601" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:06:24.348698" elapsed="0.000957"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:24.352456" 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-10-11T01:06:24.350556" elapsed="0.002082"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:24.357018" 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-10-11T01:06:24.356222" elapsed="0.000903"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:24.357483" elapsed="0.000180"/>
</return>
<msg time="2026-10-11T01:06:24.358145" 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-10-11T01:06:24.354128" elapsed="0.004221"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:24.358812" elapsed="0.000652"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T01:06:24.350082" elapsed="0.009619"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:06:24.349763" elapsed="0.009992"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:06:24.359813" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T01:06:24.359996" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:06:24.346362" elapsed="0.013667"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:24.345766" elapsed="0.014304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:24.360332" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:24.360102" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:24.345720" elapsed="0.014748"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:24.361464" 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-10-11T01:06:24.360691" elapsed="0.000813"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:06:24.361567" 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/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-10-11T01:06:24.337977" elapsed="0.023728"/>
</kw>
<msg time="2026-10-11T01:06:24.361775" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:24.328068" elapsed="0.033772"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:24.367760" 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/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-10-11T01:06:24.373354" 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/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-10-11T01:06:24.378967" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:24.379222" 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-10-11T01:06:24.379508" 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-10-11T01:06:24.379984" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:24.379783" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:24.379763" elapsed="0.000321"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:24.380312" 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-10-11T01:06:24.380590" 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-10-11T01:06:24.380820" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:06:24.379727" elapsed="0.001203"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:06:24.379603" elapsed="0.001362"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:24.381177" elapsed="0.000027"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:24.381272" elapsed="0.000021"/>
</return>
<msg time="2026-10-11T01:06:24.381466" 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-10-11T01:06:24.326631" elapsed="0.054871"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:24.383048" 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-10-11T01:06:24.382784" elapsed="0.000347">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-10-11T01:06:24.383264" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:24.382290" elapsed="0.001034"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:24.383726" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:24.383459" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:24.384240" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:24.383974" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:24.383798" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:24.383428" elapsed="0.000904"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:24.384843" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:06:24.384506" elapsed="0.000360"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:06:24.384912" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:06:24.385035" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:06:24.381873" elapsed="0.003185"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:24.386139" 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-10-11T01:06:24.385945" elapsed="0.000253">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-10-11T01:06:24.386286" 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-10-11T01:06:24.385630" elapsed="0.000696"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:06:24.386506" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:06:24.386391" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:24.386374" elapsed="0.000208"/>
</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-10-11T01:06:24.386734" elapsed="0.000019"/>
</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-10-11T01:06:24.386905" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:06:24.386963" elapsed="0.000013"/>
</return>
<msg time="2026-10-11T01:06:24.387084" 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-10-11T01:06:24.385316" elapsed="0.001792"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:24.388359" 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-10-11T01:06:24.388124" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:24.388881" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:24.388659" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:06:24.396444" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i3mo6pz4qpz73djuaqc1rypd26.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:06:24.396591" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:06:24.396681" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:24.389210" elapsed="0.007823">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:24.388981" elapsed="0.008130">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:24.397294" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:24.397142" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-10-11T01:06:24.388965" elapsed="0.008423">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:24.397743" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:24.397862" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:24.397829" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:24.397813" elapsed="0.000106"/>
</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-10-11T01:06:24.398055" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:06:24.398116" elapsed="0.000013"/>
</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-10-11T01:06:24.387431" elapsed="0.010779">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:24.398275" elapsed="0.000013"/>
</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-10-11T01:06:24.310013" elapsed="0.088383">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:24.398656" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:24.398495" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:24.398479" elapsed="0.000262"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:24.398771" elapsed="0.000013"/>
</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-10-11T01:06:24.308291" elapsed="0.090566">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:27.432828" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:27.432049" elapsed="0.000840"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:27.434550" 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-10-11T01:06:27.433998" elapsed="0.000691">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-10-11T01:06:27.434881" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:27.433238" elapsed="0.001693"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.436063" 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-10-11T01:06:27.435338" elapsed="0.000781"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:27.436802" 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-10-11T01:06:27.437071" 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-10-11T01:06:27.436550" elapsed="0.000575"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.438101" 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-10-11T01:06:27.437609" elapsed="0.000584"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.441091" 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-10-11T01:06:27.440103" elapsed="0.001085"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.442594" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:06:27.441641" elapsed="0.000987"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.444348" 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-10-11T01:06:27.443153" elapsed="0.001335"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:27.446999" 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-10-11T01:06:27.446612" elapsed="0.000456"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:27.447229" elapsed="0.000127"/>
</return>
<msg time="2026-10-11T01:06:27.447759" 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-10-11T01:06:27.445392" elapsed="0.002473"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:27.448272" elapsed="0.000750"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T01:06:27.442894" elapsed="0.006298"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:06:27.442693" elapsed="0.006548"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:06:27.449311" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T01:06:27.449516" level="INFO">${mapping_to_use} = {'IP': '127.0.0.1'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:06:27.438949" elapsed="0.010600"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:27.438358" elapsed="0.011232"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:27.449829" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:27.449621" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:27.438314" elapsed="0.011611"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.450903" 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-10-11T01:06:27.450142" elapsed="0.000799"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:06:27.451049" 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/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-10-11T01:06:27.430885" elapsed="0.020309"/>
</kw>
<msg time="2026-10-11T01:06:27.451261" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:27.421062" elapsed="0.030278"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:27.456981" 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/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-10-11T01:06:27.462702" 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/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-10-11T01:06:27.468312" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:27.468582" 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-10-11T01:06:27.468832" 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-10-11T01:06:27.469313" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:27.469099" elapsed="0.000285"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:27.469081" 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-10-11T01:06:27.469649" 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-10-11T01:06:27.469893" 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-10-11T01:06:27.470116" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:06:27.469045" elapsed="0.001136"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:06:27.468922" elapsed="0.001291"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:27.470448" elapsed="0.000027"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:27.470542" elapsed="0.000021"/>
</return>
<msg time="2026-10-11T01:06:27.470696" 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-10-11T01:06:27.419693" elapsed="0.051037"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:27.472329" 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-10-11T01:06:27.472050" elapsed="0.000383">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-10-11T01:06:27.472555" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:27.471596" elapsed="0.000991"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:27.472978" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:27.472674" elapsed="0.000374"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.473720" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:27.473329" elapsed="0.000424"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:27.473080" elapsed="0.000718"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:27.472650" elapsed="0.001176"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.474551" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:06:27.474046" elapsed="0.000539"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-11T01:06:27.474647" elapsed="0.000037"/>
</return>
<msg time="2026-10-11T01:06:27.474817" level="INFO">${jmes_expression} = </msg>
<var>${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-10-11T01:06:27.471142" elapsed="0.003707"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:27.476644" 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-10-11T01:06:27.476357" elapsed="0.000370">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-10-11T01:06:27.476845" 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-10-11T01:06:27.475640" elapsed="0.001236"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-11T01:06:27.477102" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-10-11T01:06:27.476965" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:27.476942" 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-10-11T01:06:27.477453" 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-10-11T01:06:27.477696" elapsed="0.000026"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-11T01:06:27.477776" elapsed="0.000019"/>
</return>
<msg time="2026-10-11T01:06:27.477946" 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-10-11T01:06:27.475188" elapsed="0.002790"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.479701" 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-10-11T01:06:27.479365" elapsed="0.000396"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.480350" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:27.480018" elapsed="0.000423"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:06:27.486930" level="INFO">GET Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i3mo6pz4qpz73djuaqc1rypd26.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:06:27.487060" level="INFO">GET Response : url=http://10.30.170.173: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-10-11T01:06:27.487150" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:27.480815" elapsed="0.006894">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:27.480544" elapsed="0.007272">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:27.488070" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:27.487858" elapsed="0.000291"/>
</branch>
<status status="FAIL" start="2026-10-11T01:06:27.480515" elapsed="0.007664">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:27.488678" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:27.488844" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:27.488798" elapsed="0.000097"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:27.488776" elapsed="0.000146"/>
</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-10-11T01:06:27.489110" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-11T01:06:27.489194" elapsed="0.000019"/>
</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-10-11T01:06:27.478376" elapsed="0.010967">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:27.489453" 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-10-11T01:06:27.403690" elapsed="0.085884">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:27.489908" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:27.489687" elapsed="0.000309"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:27.489666" elapsed="0.000360"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:27.490067" elapsed="0.000018"/>
</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-10-11T01:06:27.402169" elapsed="0.088020">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.173: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-10-11T01:06:27.490354" 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.173: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-10-11T01:06:15.068698" elapsed="12.421826">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.173: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-10-11T01:06:15.067951" elapsed="12.422675">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.173: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-10-11T01:06:15.067837" elapsed="12.422913">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.173: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-10-11T01:06:27.491016" elapsed="0.000029"/>
</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-10-11T01:06:27.491304" elapsed="0.000028"/>
</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-10-11T01:06:15.001780" elapsed="12.489705">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.173: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-10-11T01:06:14.930597" elapsed="12.561078">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.173: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-10-11T01:06:27.493782" elapsed="0.000283"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:06:27.493437" elapsed="0.000699"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:06:27.495667" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:27.495267" elapsed="0.000462"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:27.495242" elapsed="0.000515"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:06:27.498524" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:27.498385" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:27.498360" elapsed="0.000251"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.499880" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:06:27.499403" elapsed="0.000513"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.500551" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:06:27.500124" elapsed="0.000461"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:06:27.500641" elapsed="0.000039"/>
</return>
<msg time="2026-10-11T01:06:27.500816" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:06:27.498895" elapsed="0.001952"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:06:27.503983" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:27.503897" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:27.503879" elapsed="0.000168"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:06:27.505101" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:27.505016" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:27.504999" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:06:27.505518" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:06:27.505322" elapsed="0.000220"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:06:27.505849" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:06:27.505707" elapsed="0.000166"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:06:27.542187" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:06:27.506376" elapsed="0.035941"/>
</kw>
<msg time="2026-10-11T01:06:27.542496" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:06:27.542538" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:27.506028" elapsed="0.036546"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:06:27.575689" 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-10-11T01:06:27.543120" elapsed="0.032665"/>
</kw>
<msg time="2026-10-11T01:06:27.575937" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:06:27.575978" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:27.542782" elapsed="0.033231"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:27.576306" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:27.576081" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:27.576063" elapsed="0.000318"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.576828" 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-10-11T01:06:27.576598" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:27.577151" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:27.576951" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:27.576934" elapsed="0.000288"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:06:27.577252" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:06:27.579789" elapsed="0.000116"/>
</kw>
<msg time="2026-10-11T01:06:27.579960" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:27.578744" 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-10-11T01:06:27.580441" elapsed="0.000076"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:27.580776" elapsed="0.000072"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:06:27.578020" 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-10-11T01:06:27.577557" elapsed="0.003460"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:06:27.504760" elapsed="0.076330"/>
</kw>
<msg time="2026-10-11T01:06:27.581172" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:06:27.581212" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:27.504196" elapsed="0.077052"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:06:27.581445" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-11T01:06:27.581332" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:27.581314" 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-10-11T01:06:27.581852" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:27.582151" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:06:27.582215" 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-10-11T01:06:27.503608" elapsed="0.078706"/>
</kw>
<msg time="2026-10-11T01:06:27.582399" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:06:27.582464" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:27.501353" elapsed="0.081148"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:27.582784" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:27.582569" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:27.582553" elapsed="0.000334"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:06:27.501101" elapsed="0.081808"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:06:27.500910" elapsed="0.082026"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:06:27.497938" elapsed="0.085045"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:06:27.494918" elapsed="0.088113"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:27.494354" elapsed="0.088718"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:06:27.492918" elapsed="0.090200"/>
</kw>
<kw name="Stop_All_ExaBgps" owner="ExaBgpLib">
<kw name="Read" owner="SSHLibrary">
<msg time="2026-10-11T01:06:27.583824" level="INFO">[?2004h(defaultvenv) [jenkins@releng-26932-423-0-builder-0 ~]&gt; env exabgp.tcp.port=1790 exabgp --debug exabgp4.cfg &gt; exa4.log &amp;
[?2004l[4] 6182
[?2004h(defaultvenv) [jenkins@releng-26932-423-0-builder-0 ~]&gt; env exabgp.tcp.port=1790 exabgp --debug exabgp5.cfg &gt; exa5.log &amp;
[?2004l[5] 6183
[?2004h(defaultvenv) [jenkins@releng-26932-423-0-builder-0 ~]&gt; env exabgp.tcp.port=1790 exabgp --debug exabgp6.cfg &gt; exa6.log &amp;
[?2004l[6] 6184
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:06:27.583949" level="INFO">${output} = [?2004h(defaultvenv) [jenkins@releng-26932-423-0-builder-0 ~]&gt; env exabgp.tcp.port=1790 exabgp --debug exabgp4.cfg &gt; exa4.log &amp;
[?2004l[4] 6182
[?2004h(defaultvenv) [jenkins@releng-26932-423-0-b...</msg>
<var>${output}</var>
<doc>Consumes and returns everything available on the server output.</doc>
<status status="PASS" start="2026-10-11T01:06:27.583714" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.584429" level="INFO">[?2004h(defaultvenv) [jenkins@releng-26932-423-0-builder-0 ~]&gt; env exabgp.tcp.port=1790 exabgp --debug exabgp4.cfg &gt; exa4.log &amp;
[?2004l[4] 6182
[?2004h(defaultvenv) [jenkins@releng-26932-423-0-builder-0 ~]&gt; env exabgp.tcp.port=1790 exabgp --debug exabgp5.cfg &gt; exa5.log &amp;
[?2004l[5] 6183
[?2004h(defaultvenv) [jenkins@releng-26932-423-0-builder-0 ~]&gt; env exabgp.tcp.port=1790 exabgp --debug exabgp6.cfg &gt; exa6.log &amp;
[?2004l[6] 6184
[?2004h(defaultvenv) [jenkins@releng-26932-423-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-10-11T01:06:27.584165" elapsed="0.000383"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:06:27.586824" level="INFO">ps axf | grep exabgp | grep -v grep | awk '{print "kill -9 " $1}' | sh</msg>
<msg time="2026-10-11T01:06:27.586905" 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-10-11T01:06:27.584703" elapsed="0.002226"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.587359" 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-10-11T01:06:27.587124" elapsed="0.000277"/>
</kw>
<doc>Sends kill command to stop all exabgps running</doc>
<status status="PASS" start="2026-10-11T01:06:27.583336" elapsed="0.004130"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:27.590804" level="INFO">Executing command 'cat exa1.log'.</msg>
<msg time="2026-10-11T01:06:27.603331" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:06:27.603437" 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-10-11T01:06:27.590690" elapsed="0.012771"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.603883" level="INFO"/>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:27.603660" elapsed="0.000261"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:27.604365" 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-10-11T01:06:27.604096" elapsed="0.000334"/>
</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-10-11T01:06:27.590298" elapsed="0.014188"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:06:27.587609" elapsed="0.016907"/>
</iter>
<iter>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:27.607756" level="INFO">Executing command 'cat exa2.log'.</msg>
<msg time="2026-10-11T01:06:27.655912" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:06:27.656104" 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-10-11T01:06:27.607648" elapsed="0.048506"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.656909" level="INFO"/>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:27.656594" elapsed="0.000369"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:27.657525" 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-10-11T01:06:27.657199" elapsed="0.000395"/>
</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-10-11T01:06:27.607247" elapsed="0.050422"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-11T01:06:27.604589" elapsed="0.053122"/>
</iter>
<iter>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:27.662528" level="INFO">Executing command 'cat exa3.log'.</msg>
<msg time="2026-10-11T01:06:27.708250" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:06:27.708494" 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-10-11T01:06:27.662349" elapsed="0.046198"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.709550" level="INFO"/>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:27.708977" elapsed="0.000658"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:27.710529" 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-10-11T01:06:27.710020" elapsed="0.000619"/>
</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-10-11T01:06:27.661802" elapsed="0.048956"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-11T01:06:27.657811" elapsed="0.053015"/>
</iter>
<iter>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:27.718269" level="INFO">Executing command 'cat exa4.log'.</msg>
<msg time="2026-10-11T01:06:27.756634" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:06:27.756824" 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-10-11T01:06:27.718029" elapsed="0.038846"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.757920" level="INFO"/>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:27.757342" elapsed="0.000664"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:27.758900" 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-10-11T01:06:27.758440" elapsed="0.000571"/>
</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-10-11T01:06:27.717143" elapsed="0.041985"/>
</kw>
<var name="${index}">4</var>
<status status="PASS" start="2026-10-11T01:06:27.710992" elapsed="0.048200"/>
</iter>
<iter>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:27.766656" level="INFO">Executing command 'cat exa5.log'.</msg>
<msg time="2026-10-11T01:06:27.804613" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:06:27.804873" 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-10-11T01:06:27.766379" elapsed="0.038547"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.805936" level="INFO"/>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:27.805386" elapsed="0.000637"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:27.806918" 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-10-11T01:06:27.806453" elapsed="0.000576"/>
</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-10-11T01:06:27.765513" elapsed="0.041634"/>
</kw>
<var name="${index}">5</var>
<status status="PASS" start="2026-10-11T01:06:27.759383" elapsed="0.047830"/>
</iter>
<iter>
<kw name="Store_File_To_Workspace" owner="BGPcliKeywords">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:27.814679" level="INFO">Executing command 'cat exa6.log'.</msg>
<msg time="2026-10-11T01:06:27.852614" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:06:27.852806" 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-10-11T01:06:27.814405" elapsed="0.038452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.853866" level="INFO"/>
<arg>${output_log}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:27.853318" elapsed="0.000635"/>
</kw>
<kw name="Create File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:27.854861" 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-10-11T01:06:27.854359" elapsed="0.000613"/>
</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-10-11T01:06:27.813545" elapsed="0.041545"/>
</kw>
<var name="${index}">6</var>
<status status="PASS" start="2026-10-11T01:06:27.807396" elapsed="0.047759"/>
</iter>
<var>${index}</var>
<value>@{NUMBERS}</value>
<status status="PASS" start="2026-10-11T01:06:27.587505" elapsed="0.267710"/>
</for>
<doc>Send command to kill all exabgp processes running on controller</doc>
<status status="PASS" start="2026-10-11T01:06:27.492156" elapsed="0.363306"/>
</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-10-11T01:06:27.858544" elapsed="0.000444"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:06:27.857940" elapsed="0.001160"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:06:27.861145" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:27.860952" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:27.860912" 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-10-11T01:06:27.868457" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:27.868218" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:27.868179" elapsed="0.000422"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.870672" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:06:27.869906" elapsed="0.000822"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.871699" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:06:27.871059" elapsed="0.000696"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:06:27.871845" elapsed="0.000062"/>
</return>
<msg time="2026-10-11T01:06:27.872125" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:06:27.869049" elapsed="0.003126"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:06:27.877759" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:27.877570" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:27.877530" elapsed="0.000367"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:06:27.880324" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:27.880066" elapsed="0.000391"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:27.880027" elapsed="0.000478"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:06:27.881201" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:06:27.880827" elapsed="0.000428"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:06:27.881977" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:06:27.881674" elapsed="0.000356"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:06:27.917454" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:06:27.883253" elapsed="0.034350"/>
</kw>
<msg time="2026-10-11T01:06:27.917832" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:06:27.917895" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:27.882403" elapsed="0.035547"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:06:27.964547" 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-10-11T01:06:27.918770" elapsed="0.045879"/>
</kw>
<msg time="2026-10-11T01:06:27.964797" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:06:27.964838" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:27.918197" elapsed="0.046676"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:27.965147" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:27.964941" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:27.964923" elapsed="0.000295"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.965662" 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-10-11T01:06:27.965434" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:27.965982" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:27.965787" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:27.965770" elapsed="0.000282"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:06:27.966081" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:06:27.968494" elapsed="0.000234"/>
</kw>
<msg time="2026-10-11T01:06:27.968786" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:27.967456" 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-10-11T01:06:27.969217" elapsed="0.000087"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:27.969587" 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-10-11T01:06:27.966839" 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-10-11T01:06:27.966361" elapsed="0.003468"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:06:27.879495" elapsed="0.090407"/>
</kw>
<msg time="2026-10-11T01:06:27.969982" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:06:27.970021" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:27.878226" elapsed="0.091831"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:06:27.970210" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:06:27.970124" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:27.970107" elapsed="0.000196"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:27.970651" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:27.970949" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:06:27.971012" 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-10-11T01:06:27.876881" elapsed="0.094215"/>
</kw>
<msg time="2026-10-11T01:06:27.971179" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:06:27.971251" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:27.872937" elapsed="0.098370"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:27.971623" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:27.971376" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:27.971360" elapsed="0.000333"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:06:27.872628" elapsed="0.099087"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:06:27.872276" elapsed="0.099465"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:06:27.867553" elapsed="0.104235"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:06:27.860356" elapsed="0.111480"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:27.859474" elapsed="0.112402"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:06:27.857135" elapsed="0.114787"/>
</kw>
<for flavor="IN ZIP">
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.972891" 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-10-11T01:06:27.972309" elapsed="0.000609"/>
</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-10-11T01:06:27.985815" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:27.985511" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:27.986518" 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-10-11T01:06:27.986325" elapsed="0.000256">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-10-11T01:06:27.986664" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:27.985996" elapsed="0.000691"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.987164" 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-10-11T01:06:27.986857" elapsed="0.000332"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:27.987492" 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-10-11T01:06:27.987612" 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-10-11T01:06:27.987368" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.988046" 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-10-11T01:06:27.987826" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.988998" 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-10-11T01:06:27.988764" elapsed="0.000276"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.989492" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:06:27.989213" elapsed="0.000304"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.990267" 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-10-11T01:06:27.989828" elapsed="0.000477"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:27.990983" 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-10-11T01:06:27.990800" elapsed="0.000239"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:27.991087" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:06:27.991215" 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-10-11T01:06:27.990491" elapsed="0.000747"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:27.991427" elapsed="0.000178"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.1</var>
<status status="PASS" start="2026-10-11T01:06:27.989701" elapsed="0.001942"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.992136" 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-10-11T01:06:27.991868" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:27.992837" 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-10-11T01:06:27.992660" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:27.992905" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:27.993029" 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-10-11T01:06:27.992341" elapsed="0.000710"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:27.993211" elapsed="0.000179"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T01:06:27.991742" elapsed="0.001699"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.993935" 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-10-11T01:06:27.993669" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:27.994640" 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-10-11T01:06:27.994461" elapsed="0.000204"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:27.994708" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:27.994831" 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-10-11T01:06:27.994126" elapsed="0.000728"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:27.995012" elapsed="0.000163"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T01:06:27.993541" elapsed="0.001671"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.995726" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:27.995461" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:27.996444" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:27.996219" elapsed="0.000250"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:27.996513" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:27.996637" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:27.995916" elapsed="0.000743"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:27.996819" elapsed="0.000163"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:06:27.995320" elapsed="0.001699"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:27.997540" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:27.997242" elapsed="0.000324"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:27.998211" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:27.998035" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:27.998290" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:06:27.998431" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:27.997730" elapsed="0.000725"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:27.998617" elapsed="0.000163"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:06:27.997117" elapsed="0.001699"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:06:27.989560" elapsed="0.009288"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:06:27.998885" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:06:27.999015" 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-10-11T01:06:27.988422" elapsed="0.010617"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:27.988149" elapsed="0.010953"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:27.999275" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:27.999126" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:27.988131" elapsed="0.011231"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.000095" 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-10-11T01:06:27.999533" elapsed="0.000589"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:06:28.000166" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:27.984969" elapsed="0.015296"/>
</kw>
<msg time="2026-10-11T01:06:28.000326" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:27.980769" elapsed="0.019601"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:28.004764" 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/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-10-11T01:06:28.008792" 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/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-10-11T01:06:28.012783" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.012964" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.013143" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.013505" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.013349" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:28.013335" 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-10-11T01:06:28.013734" 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-10-11T01:06:28.013913" 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-10-11T01:06:28.014074" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:06:28.013309" elapsed="0.000812"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:06:28.013207" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.014306" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:28.014416" elapsed="0.000018"/>
</return>
<msg time="2026-10-11T01:06:28.014533" 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-10-11T01:06:27.980129" elapsed="0.034429"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.015571" 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-10-11T01:06:28.015329" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:06:28.024519" level="INFO">DELETE Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i3mo6pz4qpz73djuaqc1rypd26.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:06:28.024565" level="INFO">DELETE Response : url=http://10.30.170.173: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-10-11T01:06:28.024648" 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-10-11T01:06:28.015899" elapsed="0.008772"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.015675" elapsed="0.009032"/>
</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-10-11T01:06:28.024879" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.024732" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.015658" 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-10-11T01:06:28.026172" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:28.025874" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.025637" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.025619" elapsed="0.000649"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.026853" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:28.026584" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.026332" elapsed="0.000594"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.026317" elapsed="0.000632"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.027510" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:28.027122" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.027807" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.027598" elapsed="0.000261"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.028314" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:28.028039" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.027881" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.027582" elapsed="0.000810"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.028922" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:28.028583" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.029212" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.029009" elapsed="0.000254"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.029737" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:28.029475" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.029301" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.028992" elapsed="0.000821"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:28.029954" elapsed="0.000289"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:06:28.030710" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:28.030479" elapsed="0.000255"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.030886" elapsed="0.000216"/>
</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-10-11T01:06:28.025266" elapsed="0.005892"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:06:28.031199" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:28.031385" 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-10-11T01:06:28.014793" elapsed="0.016631"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:06:28.031473" elapsed="0.000026"/>
</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-10-11T01:06:27.973125" elapsed="0.058446"/>
</kw>
<var name="${index}">1</var>
<var name="${peer_type}">ibgp_peer</var>
<status status="PASS" start="2026-10-11T01:06:27.972121" elapsed="0.059484"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.032357" 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-10-11T01:06:28.031877" 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-10-11T01:06:28.045434" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:28.045107" elapsed="0.000354"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:28.046104" 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-10-11T01:06:28.045933" elapsed="0.000230">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-10-11T01:06:28.046246" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:28.045618" elapsed="0.000650"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.046793" 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-10-11T01:06:28.046471" elapsed="0.000348"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:28.047090" 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-10-11T01:06:28.047206" 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-10-11T01:06:28.046982" elapsed="0.000248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.047673" 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-10-11T01:06:28.047455" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.048620" 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-10-11T01:06:28.048372" elapsed="0.000290"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.049077" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.048833" elapsed="0.000268"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.049705" 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-10-11T01:06:28.049438" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:28.050387" 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-10-11T01:06:28.050197" elapsed="0.000266"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:28.050511" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:06:28.050640" 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-10-11T01:06:28.049895" 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-10-11T01:06:28.050824" elapsed="0.000167"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.2</var>
<status status="PASS" start="2026-10-11T01:06:28.049295" elapsed="0.001733"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.051550" 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-10-11T01:06:28.051253" elapsed="0.000321"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:28.052219" 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-10-11T01:06:28.052044" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:28.052317" elapsed="0.000030"/>
</return>
<msg time="2026-10-11T01:06:28.052461" 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-10-11T01:06:28.051742" elapsed="0.000742"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.052645" elapsed="0.000310"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T01:06:28.051126" elapsed="0.001867"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.053523" 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-10-11T01:06:28.053219" elapsed="0.000328"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:28.054193" 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-10-11T01:06:28.054019" elapsed="0.000198"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:28.054260" elapsed="0.000043"/>
</return>
<msg time="2026-10-11T01:06:28.054400" 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-10-11T01:06:28.053715" elapsed="0.000722"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.054598" elapsed="0.000164"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T01:06:28.053091" elapsed="0.001708"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.055300" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:28.055022" elapsed="0.000303"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:28.056050" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.055874" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:28.056116" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:28.056237" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:28.055507" elapsed="0.000753"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.056449" elapsed="0.000167"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:06:28.054896" elapsed="0.001756"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.057141" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:28.056876" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:28.057836" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.057662" elapsed="0.000198"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:28.057904" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:28.058026" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:28.057342" elapsed="0.000707"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.058207" elapsed="0.000181"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:06:28.056751" elapsed="0.001688"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:06:28.049145" elapsed="0.009327"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:06:28.058509" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:06:28.058639" 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-10-11T01:06:28.048022" elapsed="0.010641"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.047777" elapsed="0.010950"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.058899" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.058751" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.047759" elapsed="0.011209"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.059707" 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-10-11T01:06:28.059123" elapsed="0.000611"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:06:28.059778" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:28.044607" elapsed="0.015271"/>
</kw>
<msg time="2026-10-11T01:06:28.059926" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:28.040363" elapsed="0.019607"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:28.064134" 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/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-10-11T01:06:28.068276" 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/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-10-11T01:06:28.072379" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.072573" 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-10-11T01:06:28.072753" elapsed="0.000018"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.073084" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.072943" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:28.072929" 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-10-11T01:06:28.073319" 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-10-11T01:06:28.073511" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.073672" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:06:28.072904" elapsed="0.000815"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:06:28.072817" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.073889" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:28.073987" elapsed="0.000017"/>
</return>
<msg time="2026-10-11T01:06:28.074102" 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-10-11T01:06:28.039733" elapsed="0.034394"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.075147" 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-10-11T01:06:28.074924" elapsed="0.000267"/>
</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-10-11T01:06:28.084742" level="INFO">DELETE Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i3mo6pz4qpz73djuaqc1rypd26.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:06:28.084787" level="INFO">DELETE Response : url=http://10.30.170.173: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-10-11T01:06:28.084873" 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-10-11T01:06:28.075506" elapsed="0.009392"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.075251" elapsed="0.009684"/>
</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-10-11T01:06:28.085105" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.084959" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.075235" elapsed="0.009945"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.086434" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:28.086129" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.085889" elapsed="0.000618"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.085871" elapsed="0.000659"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.087075" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:28.086813" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.086580" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.086565" elapsed="0.000604"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.087735" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:28.087379" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.088027" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.087822" elapsed="0.000256"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.088542" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:28.088255" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.088099" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.087806" elapsed="0.000813"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.089120" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:28.088788" elapsed="0.000357"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.089448" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.089208" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.089938" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:28.089680" elapsed="0.000282"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.089522" elapsed="0.000472"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.089191" elapsed="0.000822"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:28.090152" elapsed="0.000324"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:06:28.090887" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:28.090667" elapsed="0.000245"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.091061" elapsed="0.000209"/>
</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-10-11T01:06:28.085550" elapsed="0.005790"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:06:28.091381" elapsed="0.000047"/>
</return>
<msg time="2026-10-11T01:06:28.091577" 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-10-11T01:06:28.074388" elapsed="0.017213"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:06:28.091647" elapsed="0.000025"/>
</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-10-11T01:06:28.032607" elapsed="0.059136"/>
</kw>
<var name="${index}">2</var>
<var name="${peer_type}">ibgp_peer</var>
<status status="PASS" start="2026-10-11T01:06:28.031701" elapsed="0.060076"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.092585" 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-10-11T01:06:28.092048" elapsed="0.000565"/>
</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-10-11T01:06:28.105639" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:28.105319" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:28.106321" 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-10-11T01:06:28.106132" elapsed="0.000254">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-10-11T01:06:28.106486" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:28.105820" elapsed="0.000689"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.106983" 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-10-11T01:06:28.106678" elapsed="0.000330"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:28.107277" 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-10-11T01:06:28.107438" 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-10-11T01:06:28.107170" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.107871" 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-10-11T01:06:28.107654" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.108816" 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-10-11T01:06:28.108586" elapsed="0.000271"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.109271" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.109027" elapsed="0.000284"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.109904" 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-10-11T01:06:28.109638" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:28.110607" 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-10-11T01:06:28.110425" elapsed="0.000239"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:28.110710" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:06:28.110837" 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-10-11T01:06:28.110093" 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-10-11T01:06:28.111020" elapsed="0.000166"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.3</var>
<status status="PASS" start="2026-10-11T01:06:28.109510" elapsed="0.001713"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.111749" 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-10-11T01:06:28.111480" elapsed="0.000293"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:28.112463" 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-10-11T01:06:28.112245" elapsed="0.000243"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:28.112533" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:28.112657" 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-10-11T01:06:28.111939" elapsed="0.000741"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.112839" elapsed="0.000166"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T01:06:28.111337" elapsed="0.001705"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.113720" 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-10-11T01:06:28.113269" elapsed="0.000475"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:28.114427" 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-10-11T01:06:28.114222" elapsed="0.000230"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:28.114495" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:28.114620" 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-10-11T01:06:28.113916" elapsed="0.000726"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.114802" elapsed="0.000164"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T01:06:28.113142" elapsed="0.001861"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.115523" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:28.115228" elapsed="0.000318"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:28.116192" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.116018" elapsed="0.000197"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:28.116258" elapsed="0.000040"/>
</return>
<msg time="2026-10-11T01:06:28.116401" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:28.115711" elapsed="0.000727"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.116600" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:06:28.115102" elapsed="0.001698"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.117303" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:28.117023" elapsed="0.000306"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:28.117989" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.117815" elapsed="0.000198"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:28.118056" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:28.118178" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:28.117509" elapsed="0.000692"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.118392" elapsed="0.000180"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:06:28.116898" elapsed="0.001710"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:06:28.109354" elapsed="0.009284"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:06:28.118676" elapsed="0.000024"/>
</return>
<msg time="2026-10-11T01:06:28.118802" 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-10-11T01:06:28.108218" elapsed="0.010608"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.107973" elapsed="0.010916"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.119061" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.118913" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.107956" elapsed="0.011174"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.119870" 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-10-11T01:06:28.119302" elapsed="0.000594"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:06:28.119941" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:28.104807" elapsed="0.015234"/>
</kw>
<msg time="2026-10-11T01:06:28.120089" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:28.100593" 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/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-10-11T01:06:28.124268" 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/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-10-11T01:06:28.128694" 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/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-10-11T01:06:28.132998" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.133179" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.133370" 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-10-11T01:06:28.133719" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.133577" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:28.133563" 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-10-11T01:06:28.133940" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.134114" elapsed="0.000017"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.134270" elapsed="0.000030"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:06:28.133538" elapsed="0.000792"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:06:28.133450" elapsed="0.000903"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.134513" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:28.134611" elapsed="0.000017"/>
</return>
<msg time="2026-10-11T01:06:28.134725" 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-10-11T01:06:28.099948" elapsed="0.034802"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.135745" 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-10-11T01:06:28.135522" elapsed="0.000266"/>
</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-10-11T01:06:28.142205" level="INFO">DELETE Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i3mo6pz4qpz73djuaqc1rypd26.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:06:28.142250" level="INFO">DELETE Response : url=http://10.30.170.173: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-10-11T01:06:28.142357" 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-10-11T01:06:28.136067" elapsed="0.006315"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.135847" elapsed="0.006596"/>
</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-10-11T01:06:28.142615" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.142468" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.135831" elapsed="0.006857"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.143872" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:28.143602" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.143343" elapsed="0.000600"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.143326" elapsed="0.000640"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.144539" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:28.144245" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.144014" elapsed="0.000596"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.143999" elapsed="0.000633"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.145138" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:28.144801" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.145458" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.145226" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.145947" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:28.145687" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.145532" elapsed="0.000472"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.145209" elapsed="0.000814"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.146564" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:28.146192" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.146854" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.146651" elapsed="0.000253"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.147359" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:28.147082" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.146926" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.146635" elapsed="0.000817"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:28.147592" elapsed="0.000288"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:06:28.148316" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:28.148066" elapsed="0.000276"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.148506" elapsed="0.000211"/>
</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-10-11T01:06:28.143001" elapsed="0.005772"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:06:28.148814" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:28.148985" 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-10-11T01:06:28.134976" elapsed="0.014033"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:06:28.149056" elapsed="0.000024"/>
</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-10-11T01:06:28.092819" elapsed="0.056331"/>
</kw>
<var name="${index}">3</var>
<var name="${peer_type}">ebgp_peer</var>
<status status="PASS" start="2026-10-11T01:06:28.091873" elapsed="0.057310"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.149950" 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-10-11T01:06:28.149487" elapsed="0.000490"/>
</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-10-11T01:06:28.163131" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:28.162830" elapsed="0.000327"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:28.163847" 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-10-11T01:06:28.163676" elapsed="0.000230">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-10-11T01:06:28.163989" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:28.163342" elapsed="0.000669"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.164522" 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-10-11T01:06:28.164180" elapsed="0.000367"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:28.164814" 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-10-11T01:06:28.164928" 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-10-11T01:06:28.164707" elapsed="0.000245"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.165373" 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-10-11T01:06:28.165141" 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-10-11T01:06:28.166318" 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-10-11T01:06:28.166072" elapsed="0.000289"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.166801" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.166553" elapsed="0.000272"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.167429" 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-10-11T01:06:28.167134" elapsed="0.000320"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:28.168099" 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-10-11T01:06:28.167923" elapsed="0.000232"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:28.168202" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:28.168367" 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-10-11T01:06:28.167620" 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-10-11T01:06:28.168568" elapsed="0.000167"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.4</var>
<status status="PASS" start="2026-10-11T01:06:28.167007" elapsed="0.001764"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.169261" 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-10-11T01:06:28.168996" elapsed="0.000325"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:28.169988" 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-10-11T01:06:28.169812" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:28.170056" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:28.170179" 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-10-11T01:06:28.169505" elapsed="0.000696"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.170438" elapsed="0.000169"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T01:06:28.168869" elapsed="0.001775"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.171273" 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-10-11T01:06:28.170868" elapsed="0.000444"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:28.171980" 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-10-11T01:06:28.171805" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:28.172046" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:28.172170" 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-10-11T01:06:28.171500" elapsed="0.000692"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.172364" elapsed="0.000181"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T01:06:28.170742" elapsed="0.001841"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.173069" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:28.172806" elapsed="0.000287"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:28.173762" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.173588" elapsed="0.000198"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:28.173828" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:06:28.173948" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:28.173256" elapsed="0.000715"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.174242" elapsed="0.000217"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:06:28.172680" elapsed="0.001817"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.174988" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:28.174721" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:28.175694" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.175517" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:28.175760" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:28.175882" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:28.175177" elapsed="0.000727"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.176063" elapsed="0.000162"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:06:28.174595" elapsed="0.001665"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:06:28.166868" elapsed="0.009436"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:06:28.176345" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:28.176491" 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-10-11T01:06:28.165737" elapsed="0.010778"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.165492" elapsed="0.011088"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.176752" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.176603" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.165475" elapsed="0.011347"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.177552" 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-10-11T01:06:28.176977" elapsed="0.000601"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:06:28.177621" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:28.162312" elapsed="0.015409"/>
</kw>
<msg time="2026-10-11T01:06:28.177768" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:28.157994" elapsed="0.019817"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:28.181821" 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/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-10-11T01:06:28.186676" 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/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-10-11T01:06:28.190659" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.190838" 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-10-11T01:06:28.191016" 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-10-11T01:06:28.191360" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.191205" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:28.191191" 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-10-11T01:06:28.191600" 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-10-11T01:06:28.191776" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.191936" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:06:28.191167" elapsed="0.000816"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:06:28.191080" elapsed="0.000926"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.192152" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:28.192245" elapsed="0.000017"/>
</return>
<msg time="2026-10-11T01:06:28.192373" 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-10-11T01:06:28.157367" elapsed="0.035031"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.193395" 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-10-11T01:06:28.193158" 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-10-11T01:06:28.199493" level="INFO">DELETE Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i3mo6pz4qpz73djuaqc1rypd26.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:06:28.199538" level="INFO">DELETE Response : url=http://10.30.170.173: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-10-11T01:06:28.199624" 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-10-11T01:06:28.193739" elapsed="0.005909"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.193515" elapsed="0.006169"/>
</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-10-11T01:06:28.199854" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.199708" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.193498" elapsed="0.006428"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.201115" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:28.200843" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.200608" elapsed="0.000578"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.200591" elapsed="0.000618"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.201787" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:28.201519" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.201257" elapsed="0.000601"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.201242" elapsed="0.000639"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.202428" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:28.202052" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.202721" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.202516" elapsed="0.000256"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.203210" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:28.202949" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.202793" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.202499" elapsed="0.000805"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.203828" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:28.203494" elapsed="0.000358"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.204117" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.203914" elapsed="0.000253"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.204639" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:28.204365" elapsed="0.000298"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.204188" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.203898" elapsed="0.000817"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:28.204854" elapsed="0.000287"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:06:28.205580" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:28.205345" elapsed="0.000258"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.205751" elapsed="0.000207"/>
</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-10-11T01:06:28.200240" elapsed="0.005774"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:06:28.206053" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:28.206224" 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-10-11T01:06:28.192641" elapsed="0.013607"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:06:28.206324" elapsed="0.000025"/>
</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-10-11T01:06:28.150181" elapsed="0.056254"/>
</kw>
<var name="${index}">4</var>
<var name="${peer_type}">ebgp_peer</var>
<status status="PASS" start="2026-10-11T01:06:28.149296" elapsed="0.057173"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.207204" 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-10-11T01:06:28.206740" elapsed="0.000490"/>
</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-10-11T01:06:28.220235" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:28.219935" elapsed="0.000326"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:28.220937" 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-10-11T01:06:28.220767" elapsed="0.000229">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-10-11T01:06:28.221079" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:28.220451" elapsed="0.000650"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.221608" 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-10-11T01:06:28.221271" elapsed="0.000362"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:28.221903" 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-10-11T01:06:28.222019" 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-10-11T01:06:28.221796" elapsed="0.000247"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.222478" 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-10-11T01:06:28.222231" 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-10-11T01:06:28.223427" 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-10-11T01:06:28.223165" elapsed="0.000306"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.223888" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.223643" elapsed="0.000269"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.224523" 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-10-11T01:06:28.224221" elapsed="0.000326"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:28.225225" 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-10-11T01:06:28.225013" elapsed="0.000236"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:28.225308" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:06:28.225455" 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-10-11T01:06:28.224712" elapsed="0.000766"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.225639" elapsed="0.000166"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.5</var>
<status status="PASS" start="2026-10-11T01:06:28.224093" elapsed="0.001749"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.226350" 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-10-11T01:06:28.226066" elapsed="0.000312"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:28.227038" 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-10-11T01:06:28.226862" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:28.227105" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:28.227227" 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-10-11T01:06:28.226559" elapsed="0.000691"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.227436" elapsed="0.000168"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T01:06:28.225940" elapsed="0.001701"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.228294" 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-10-11T01:06:28.227865" elapsed="0.000455"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:28.228985" 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-10-11T01:06:28.228809" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:28.229052" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:28.229175" 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-10-11T01:06:28.228504" elapsed="0.000693"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.229373" elapsed="0.000181"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T01:06:28.227739" elapsed="0.001853"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.230082" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:28.229816" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:28.230796" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.230621" elapsed="0.000199"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:28.230862" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:28.230984" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:28.230271" elapsed="0.000736"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.231167" elapsed="0.000175"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:06:28.229690" elapsed="0.001689"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.231882" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:28.231617" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:28.232584" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.232391" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:28.232651" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:28.232774" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:28.232071" elapsed="0.000726"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.232957" elapsed="0.000163"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:06:28.231491" elapsed="0.001665"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:06:28.223954" elapsed="0.009233"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:06:28.233223" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:06:28.233366" 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-10-11T01:06:28.222829" elapsed="0.010609"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.222582" elapsed="0.010889"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.233642" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.233494" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.222565" elapsed="0.011147"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.234473" 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-10-11T01:06:28.233865" elapsed="0.000635"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:06:28.234544" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:28.219432" elapsed="0.015211"/>
</kw>
<msg time="2026-10-11T01:06:28.234692" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:28.215166" 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/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-10-11T01:06:28.238751" 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/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-10-11T01:06:28.242933" 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/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-10-11T01:06:28.246928" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.247108" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.247300" 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-10-11T01:06:28.247651" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.247508" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:28.247494" 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-10-11T01:06:28.247877" 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-10-11T01:06:28.248053" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.248213" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:06:28.247469" elapsed="0.000792"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:06:28.247367" elapsed="0.000929"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.248460" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:28.248563" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:06:28.248676" 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-10-11T01:06:28.214555" elapsed="0.034147"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.249704" 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-10-11T01:06:28.249479" elapsed="0.000268"/>
</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-10-11T01:06:28.255571" level="INFO">DELETE Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i3mo6pz4qpz73djuaqc1rypd26.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:06:28.255615" level="INFO">DELETE Response : url=http://10.30.170.173: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-10-11T01:06:28.255701" 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-10-11T01:06:28.250028" elapsed="0.005697"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.249806" elapsed="0.005956"/>
</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-10-11T01:06:28.255931" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.255786" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.249790" elapsed="0.006215"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.257191" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:28.256919" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.256681" elapsed="0.000581"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.256664" elapsed="0.000634"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.257872" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:28.257605" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.257353" elapsed="0.000590"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.257336" elapsed="0.000629"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.258650" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:28.258136" elapsed="0.000539"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.258944" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.258739" elapsed="0.000256"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.259483" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:28.259173" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.259016" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.258721" elapsed="0.000840"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.260064" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:28.259730" elapsed="0.000359"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.260369" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.260151" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.260875" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:28.260615" elapsed="0.000283"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.260459" elapsed="0.000471"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.260135" elapsed="0.000814"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:28.261124" elapsed="0.000336"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:06:28.261838" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:28.261619" elapsed="0.000244"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.262013" elapsed="0.000209"/>
</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-10-11T01:06:28.256334" elapsed="0.005943"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:06:28.262351" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:28.262544" 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-10-11T01:06:28.248931" elapsed="0.013637"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:06:28.262615" elapsed="0.000025"/>
</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-10-11T01:06:28.207467" elapsed="0.055244"/>
</kw>
<var name="${index}">5</var>
<var name="${peer_type}">rr_client_peer</var>
<status status="PASS" start="2026-10-11T01:06:28.206566" elapsed="0.056179"/>
</iter>
<iter>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.263523" 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-10-11T01:06:28.263017" elapsed="0.000534"/>
</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-10-11T01:06:28.276779" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:28.276478" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:28.277497" 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-10-11T01:06:28.277273" elapsed="0.000291">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-10-11T01:06:28.277655" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:28.276960" elapsed="0.000720"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.278202" 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-10-11T01:06:28.277867" elapsed="0.000361"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:28.278562" 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-10-11T01:06:28.278688" 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-10-11T01:06:28.278443" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.279129" 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-10-11T01:06:28.278909" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.280089" 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-10-11T01:06:28.279857" elapsed="0.000274"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.280583" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.280317" elapsed="0.000290"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.281183" 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-10-11T01:06:28.280918" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:28.281939" 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-10-11T01:06:28.281761" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:28.282008" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:28.282133" 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-10-11T01:06:28.281451" elapsed="0.000704"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.282331" elapsed="0.000191"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">127.0.0.6</var>
<status status="PASS" start="2026-10-11T01:06:28.280792" elapsed="0.001768"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.283056" 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-10-11T01:06:28.282788" elapsed="0.000292"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:28.283758" 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-10-11T01:06:28.283581" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:28.283825" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:28.283948" 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-10-11T01:06:28.283248" elapsed="0.000723"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.284129" elapsed="0.000178"/>
</kw>
<var name="${key}">HOLDTIME</var>
<var name="${value}">180</var>
<status status="PASS" start="2026-10-11T01:06:28.282661" elapsed="0.001686"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.285002" 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-10-11T01:06:28.284589" elapsed="0.000437"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:28.285710" 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-10-11T01:06:28.285532" elapsed="0.000202"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:28.285778" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:28.285902" 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-10-11T01:06:28.285195" elapsed="0.000729"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.286084" elapsed="0.000165"/>
</kw>
<var name="${key}">PASSIVE_MODE</var>
<var name="${value}">true</var>
<status status="PASS" start="2026-10-11T01:06:28.284463" elapsed="0.001852"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.286931" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:28.286659" elapsed="0.000296"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:28.287635" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.287458" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:28.287701" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:28.287825" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:28.287120" elapsed="0.000726"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.288005" elapsed="0.000164"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:06:28.286438" elapsed="0.001768"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.288730" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:28.288463" elapsed="0.000291"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:28.289424" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.289222" elapsed="0.000226"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:28.289491" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:28.289615" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:28.288919" elapsed="0.000719"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.289796" elapsed="0.000165"/>
</kw>
<var name="${key}">RIB_INSTANCE_NAME</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:06:28.288321" elapsed="0.001676"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:06:28.280652" elapsed="0.009376"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:06:28.290065" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:06:28.290193" 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-10-11T01:06:28.279517" elapsed="0.010734"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.279234" elapsed="0.011061"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.290485" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.290319" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.279216" elapsed="0.011340"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.291256" 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-10-11T01:06:28.290711" elapsed="0.000584"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:06:28.291340" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:28.275947" elapsed="0.015508"/>
</kw>
<msg time="2026-10-11T01:06:28.291505" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:28.271681" 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/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-10-11T01:06:28.295559" 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/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-10-11T01:06:28.299762" 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/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-10-11T01:06:28.303770" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.303947" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.304124" 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-10-11T01:06:28.304489" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.304331" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:28.304318" 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-10-11T01:06:28.304715" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.304890" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.305050" elapsed="0.000017"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:06:28.304290" elapsed="0.000807"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:06:28.304188" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.305267" elapsed="0.000029"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:28.305376" elapsed="0.000016"/>
</return>
<msg time="2026-10-11T01:06:28.305503" 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-10-11T01:06:28.271039" elapsed="0.034490"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.306545" 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-10-11T01:06:28.306276" 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-10-11T01:06:28.312805" level="INFO">DELETE Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i3mo6pz4qpz73djuaqc1rypd26.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:06:28.312848" level="INFO">DELETE Response : url=http://10.30.170.173: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-10-11T01:06:28.312935" 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-10-11T01:06:28.306870" elapsed="0.006089"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.306648" elapsed="0.006347"/>
</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-10-11T01:06:28.313166" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.313019" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.306632" elapsed="0.006607"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.314475" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:28.314166" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.313929" elapsed="0.000618"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.313912" elapsed="0.000658"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.315113" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:28.314850" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.314618" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.314603" elapsed="0.000603"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.315753" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:28.315391" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.316043" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.315839" elapsed="0.000255"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.316566" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:28.316273" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.316116" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.315823" elapsed="0.000821"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.317148" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:28.316812" elapsed="0.000361"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.317474" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.317235" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.317965" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:28.317703" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.317548" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.317218" elapsed="0.000823"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:28.318212" elapsed="0.000335"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:06:28.318923" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:28.318705" elapsed="0.000243"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.319096" elapsed="0.000238"/>
</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-10-11T01:06:28.313599" elapsed="0.005792"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:06:28.319447" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:06:28.319624" 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-10-11T01:06:28.305758" elapsed="0.013890"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:06:28.319694" elapsed="0.000025"/>
</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-10-11T01:06:28.263757" elapsed="0.056033"/>
</kw>
<var name="${index}">6</var>
<var name="${peer_type}">rr_client_peer</var>
<status status="PASS" start="2026-10-11T01:06:28.262841" elapsed="0.056983"/>
</iter>
<var>${index}</var>
<var>${peer_type}</var>
<value>${NUMBERS}</value>
<value>${PEER_TYPES}</value>
<status status="PASS" start="2026-10-11T01:06:27.971969" elapsed="0.347886"/>
</for>
<doc>Revert the BGP configuration to the original state: without any configured peers.</doc>
<status status="PASS" start="2026-10-11T01:06:27.855968" elapsed="0.463981"/>
</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-10-11T01:06:28.321301" elapsed="0.000371"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-11T01:06:28.321044" elapsed="0.000679"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:06:28.322649" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:28.322563" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.322546" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:06:28.324655" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:28.324574" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.324557" elapsed="0.000160"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.325621" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:06:28.325270" elapsed="0.000376"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.326061" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:06:28.325794" elapsed="0.000290"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:06:28.326123" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:28.326247" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:06:28.324918" elapsed="0.001351"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:06:28.328749" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:28.328665" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.328647" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:06:28.329858" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:28.329776" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.329759" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:06:28.330229" level="INFO">${karaf_connection_index} = 4</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.330064" elapsed="0.000189"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:06:28.330610" level="INFO">${current_connection_index} = 7</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:06:28.330470" elapsed="0.000163"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-11T01:06:28.365621" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "u "s "e "r "f "e "a "t "u "r "[78Ce "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-11T01:06:28.331113" elapsed="0.034611"/>
</kw>
<msg time="2026-10-11T01:06:28.365919" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-11T01:06:28.365963" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "b "g "p "c "e "p "- "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:28.330788" elapsed="0.035211"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-11T01:06:28.394396" 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-10-11T01:06:28.366558" elapsed="0.027950"/>
</kw>
<msg time="2026-10-11T01:06:28.394658" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-11T01:06:28.394699" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:28.366172" elapsed="0.028562"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.395014" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.394805" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.394786" elapsed="0.000301"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.395657" 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-10-11T01:06:28.395265" elapsed="0.000458"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.395984" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.395785" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.395768" elapsed="0.000286"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-11T01:06:28.396084" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-11T01:06:28.398545" elapsed="0.000117"/>
</kw>
<msg time="2026-10-11T01:06:28.398718" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:28.397488" elapsed="0.001357"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.399144" elapsed="0.000072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.399517" 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-10-11T01:06:28.396872" elapsed="0.002829"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-11T01:06:28.396387" elapsed="0.003372"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-11T01:06:28.329520" elapsed="0.070311"/>
</kw>
<msg time="2026-10-11T01:06:28.399911" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:06:28.399950" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:28.328958" elapsed="0.071027"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-11T01:06:28.400137" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-11T01:06:28.400053" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.400036" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.400586" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.400885" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-11T01:06:28.400948" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-11T01:06:28.328366" elapsed="0.072665"/>
</kw>
<msg time="2026-10-11T01:06:28.401113" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:06:28.401154" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:28.326629" elapsed="0.074559"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.401546" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.401302" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.401271" elapsed="0.000347"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:06:28.326490" elapsed="0.075150"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:06:28.326333" elapsed="0.075334"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-11T01:06:28.324257" elapsed="0.077457"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-11T01:06:28.322267" elapsed="0.079495"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:28.321872" elapsed="0.079929"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-11T01:06:28.320706" elapsed="0.081142"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.402530" level="INFO">&amp;{mapping} = { IP=10.30.170.173 | 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-10-11T01:06:28.402023" elapsed="0.000535"/>
</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-10-11T01:06:28.415549" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:28.415208" elapsed="0.000368"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:28.416218" 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-10-11T01:06:28.416043" elapsed="0.000248">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-10-11T01:06:28.416377" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:28.415730" elapsed="0.000670"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.416890" 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-10-11T01:06:28.416583" elapsed="0.000332"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:28.417184" 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-10-11T01:06:28.417316" 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-10-11T01:06:28.417076" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.417765" 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-10-11T01:06:28.417547" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.418732" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:06:28.418501" elapsed="0.000272"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.419187" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.418943" elapsed="0.000268"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.419820" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:28.419554" elapsed="0.000290"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:28.420529" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.420332" elapsed="0.000221"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:28.420597" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:28.420722" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:28.420011" elapsed="0.000734"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.420940" elapsed="0.000172"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:06:28.419417" elapsed="0.001732"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.421679" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:28.421396" elapsed="0.000307"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:28.422369" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.422176" elapsed="0.000217"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:28.422451" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:06:28.422577" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:28.421870" elapsed="0.000729"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.422759" elapsed="0.000166"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:06:28.421249" elapsed="0.001713"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:06:28.419253" elapsed="0.003741"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:06:28.423031" elapsed="0.000025"/>
</return>
<msg time="2026-10-11T01:06:28.423157" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:06:28.418113" elapsed="0.005068"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.417867" elapsed="0.005343"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.423389" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.423231" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.417850" elapsed="0.005623"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.424124" 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-10-11T01:06:28.423630" elapsed="0.000521"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:06:28.424194" elapsed="0.000026"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:28.414705" elapsed="0.009599"/>
</kw>
<msg time="2026-10-11T01:06:28.424354" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:28.410319" elapsed="0.014078"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:28.428567" 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/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-10-11T01:06:28.432566" 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/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-10-11T01:06:28.436541" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.436753" 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-10-11T01:06:28.436933" 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-10-11T01:06:28.437265" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.437123" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:28.437110" 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-10-11T01:06:28.437519" 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-10-11T01:06:28.437696" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.437855" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:06:28.437085" elapsed="0.000817"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:06:28.436998" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.438073" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:28.438138" elapsed="0.000015"/>
</return>
<msg time="2026-10-11T01:06:28.438246" 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-10-11T01:06:28.409699" elapsed="0.028572"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.439273" 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-10-11T01:06:28.439050" elapsed="0.000278"/>
</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-10-11T01:06:28.445929" level="INFO">DELETE Request : url=http://10.30.170.173: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i3mo6pz4qpz73djuaqc1rypd26.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:06:28.445974" level="INFO">DELETE Response : url=http://10.30.170.173: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-10-11T01:06:28.446061" 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-10-11T01:06:28.439631" elapsed="0.006455"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.439389" elapsed="0.006733"/>
</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-10-11T01:06:28.446307" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.446146" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.439372" elapsed="0.007013"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.447603" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:28.447308" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.447052" elapsed="0.000624"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.447035" elapsed="0.000663"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.448267" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:28.448004" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.447747" elapsed="0.000606"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.447732" elapsed="0.000647"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.448908" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:28.448567" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.449235" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.449025" elapsed="0.000276"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.449764" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:28.449498" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.449324" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.448978" elapsed="0.000864"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.450370" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:28.450014" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.450685" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.450479" elapsed="0.000256"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.451175" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:28.450913" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.450757" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.450462" elapsed="0.000788"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:28.451467" elapsed="0.000295"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:06:28.452137" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:28.451919" elapsed="0.000242"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.452321" elapsed="0.000225"/>
</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-10-11T01:06:28.446721" elapsed="0.005881"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:06:28.452643" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:28.452816" 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-10-11T01:06:28.438527" elapsed="0.014313"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:06:28.452887" elapsed="0.000024"/>
</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-10-11T01:06:28.402756" elapsed="0.050226"/>
</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-10-11T01:06:28.465964" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:28.465664" elapsed="0.000327"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-11T01:06:28.466667" 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-10-11T01:06:28.466494" elapsed="0.000234">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-10-11T01:06:28.466812" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-10-11T01:06:28.466145" elapsed="0.000690"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.467328" 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-10-11T01:06:28.467006" elapsed="0.000348"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-11T01:06:28.467643" 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-10-11T01:06:28.467827" 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-10-11T01:06:28.467534" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.468266" 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-10-11T01:06:28.468047" 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-10-11T01:06:28.469253" level="INFO">mapping: {'IP': '10.30.170.173', '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-10-11T01:06:28.469022" elapsed="0.000286"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.469751" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given `items`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.469502" elapsed="0.000273"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.470359" level="INFO">${value} = 10.30.170.173</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:28.470080" elapsed="0.000308"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:28.471052" level="INFO">${encoded} = 10.30.170.173</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.470876" elapsed="0.000201"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:28.471121" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:28.471245" level="INFO">${encoded_value} = 10.30.170.173</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:28.470571" elapsed="0.000697"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.471456" elapsed="0.000166"/>
</kw>
<var name="${key}">IP</var>
<var name="${value}">10.30.170.173</var>
<status status="PASS" start="2026-10-11T01:06:28.469953" elapsed="0.001706"/>
</iter>
<iter>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.472147" level="INFO">${value} = example-bgp-rib</msg>
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-10-11T01:06:28.471883" elapsed="0.000289"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:28.472857" level="INFO">${encoded} = example-bgp-rib</msg>
<var>${encoded}</var>
<arg>${value}</arg>
<arg>:</arg>
<arg>%3A</arg>
<doc>Replaces `pattern` in the given `string` with `replace_with`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.472682" elapsed="0.000200"/>
</kw>
<return>
<value>${encoded}</value>
<status status="PASS" start="2026-10-11T01:06:28.472925" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:28.473048" level="INFO">${encoded_value} = example-bgp-rib</msg>
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="PASS" start="2026-10-11T01:06:28.472358" elapsed="0.000713"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given `key_value_pairs` and/or `items` to the `dictionary`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.473230" elapsed="0.000214"/>
</kw>
<var name="${key}">BGP_RIB_OPENCONFIG</var>
<var name="${value}">example-bgp-rib</var>
<status status="PASS" start="2026-10-11T01:06:28.471757" elapsed="0.001725"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="PASS" start="2026-10-11T01:06:28.469817" elapsed="0.003696"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-11T01:06:28.473552" elapsed="0.000026"/>
</return>
<msg time="2026-10-11T01:06:28.473679" level="INFO">${mapping_to_use} = {'IP': '10.30.170.173', 'BGP_RIB_OPENCONFIG': 'example-bgp-rib'}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-11T01:06:28.468687" elapsed="0.005015"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.468435" elapsed="0.005296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.473898" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.473754" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.468402" elapsed="0.005564"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.475547" level="INFO">${final_text} = rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:06:28.474122" elapsed="0.001453"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-11T01:06:28.475620" 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_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-10-11T01:06:28.465127" elapsed="0.010594"/>
</kw>
<msg time="2026-10-11T01:06:28.475768" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:28.460904" elapsed="0.014907"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<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-10-11T01:06:28.479801" 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/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-10-11T01:06:28.483826" 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/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-10-11T01:06:28.487826" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.488005" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.488182" 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-10-11T01:06:28.488542" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.488385" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-10-11T01:06:28.488372" 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-10-11T01:06:28.488766" elapsed="0.000018"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.488941" elapsed="0.000018"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.489100" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-11T01:06:28.488347" elapsed="0.000800"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-11T01:06:28.488247" elapsed="0.000923"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.489328" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-11T01:06:28.489400" elapsed="0.000028"/>
</return>
<msg time="2026-10-11T01:06:28.489523" level="INFO">${uri} = rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:06:28.460266" elapsed="0.029281"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.490566" level="INFO">rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:06:28.490321" 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="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:06:28.497594" level="INFO">DELETE Request : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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.173/tables=bgp-types%3Aipv4-address-family,bgp-types%3Aunicast-subsequent-address-family/bgp-inet:ipv4-routes 
 headers={'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0i3mo6pz4qpz73djuaqc1rypd26.node0', 'Content-Length': '0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-11T01:06:28.497637" level="INFO">DELETE Response : url=http://10.30.170.173:8181/rests/data/bgp-rib:application-rib=10.30.170.173/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-10-11T01:06:28.497723" 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-10-11T01:06:28.490895" elapsed="0.006852"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.490670" elapsed="0.007114"/>
</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-10-11T01:06:28.497955" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.497808" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.490654" elapsed="0.007408"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.499258" level="INFO"/>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:28.498986" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.498749" elapsed="0.000594"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.498732" elapsed="0.000634"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.499931" level="INFO">204</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:28.499665" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.499430" elapsed="0.000573"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.499401" elapsed="0.000624"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.500574" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:28.500197" 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>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.500868" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.500663" elapsed="0.000257"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.501375" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:28.501099" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.500942" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.500647" elapsed="0.000819"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.501971" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:28.501638" elapsed="0.000358"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.502260" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.502058" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.502780" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:28.502520" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.502346" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.502042" elapsed="0.000813"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:28.502995" elapsed="0.000297"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-10-11T01:06:28.503688" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given `lists` together and returns the result.</doc>
<status status="PASS" start="2026-10-11T01:06:28.503469" elapsed="0.000243"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the `value` is not found from `list`.</doc>
<status status="PASS" start="2026-10-11T01:06:28.503861" elapsed="0.000208"/>
</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-10-11T01:06:28.498401" elapsed="0.005723"/>
</kw>
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-10-11T01:06:28.504166" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:28.504353" 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-10-11T01:06:28.489775" elapsed="0.014602"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-10-11T01:06:28.504440" elapsed="0.000026"/>
</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-10-11T01:06:28.453179" elapsed="0.051359"/>
</kw>
<doc>Revert the BGP configuration to the original state: without application peer</doc>
<status status="PASS" start="2026-10-11T01:06:28.320193" elapsed="0.184437"/>
</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-10-11T01:06:28.508149" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:28.507871" elapsed="0.000304"/>
</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-10-11T01:06:28.509511" level="INFO">Executing command 'cd '.' &amp;&amp; rm -rf /tmp/defaultvenv'.</msg>
<msg time="2026-10-11T01:06:28.572825" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:06:28.573056" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T01:06:28.573142" level="INFO">${stderr} = </msg>
<msg time="2026-10-11T01:06:28.573222" 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-10-11T01:06:28.509335" elapsed="0.063934"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.575126" level="INFO">Length is 0.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="PASS" start="2026-10-11T01:06:28.574590" elapsed="0.000630"/>
</kw>
<msg time="2026-10-11T01:06:28.575476" level="INFO">${emptiness_status} = PASS</msg>
<msg time="2026-10-11T01:06:28.575568" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:28.573807" elapsed="0.001807"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.576832" 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-10-11T01:06:28.576003" elapsed="0.000883"/>
</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-10-11T01:06:28.578946" level="INFO"/>
<arg>${stdout}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:28.578457" elapsed="0.000576"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.580113" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:28.579638" elapsed="0.000558"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.581201" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:28.580725" 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-10-11T01:06:28.577674" elapsed="0.003820"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:28.577044" elapsed="0.004523"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.577003" elapsed="0.004613"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T01:06:28.581901" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:28.581730" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.581694" elapsed="0.000340"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T01:06:28.582307" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-10-11T01:06:28.582135" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.582105" elapsed="0.000404"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.582834" elapsed="0.000043"/>
</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-10-11T01:06:28.508845" elapsed="0.074201"/>
</kw>
<msg time="2026-10-11T01:06:28.583147" 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-10-11T01:06:28.508344" elapsed="0.074924"/>
</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-10-11T01:06:28.507377" elapsed="0.076105"/>
</kw>
<msg time="2026-10-11T01:06:28.583583" 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-10-11T01:06:28.506002" elapsed="0.077692"/>
</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-10-11T01:06:28.505695" elapsed="0.078149"/>
</kw>
<doc>Deletes a directory with virtual env.</doc>
<status status="PASS" start="2026-10-11T01:06:28.505309" elapsed="0.078636"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-10-11T01:06:28.584253" elapsed="0.000703"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-10-11T01:06:28.585499" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects </doc>
<status status="PASS" start="2026-10-11T01:06:28.585269" elapsed="0.000375"/>
</kw>
<doc>Suite teardown keyword</doc>
<status status="PASS" start="2026-10-11T01:06:28.505061" elapsed="0.080691"/>
</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-10-11T01:05:45.312045" elapsed="43.273765"/>
</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-10-11T01:06:28.630352" 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-10-11T01:06:28.628521" elapsed="0.001869"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-10-11T01:06:28.630678" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:28.630519" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.630492" elapsed="0.000274"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.631523" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:06:28.631005" elapsed="0.000580"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.632031" 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-10-11T01:06:28.631756" elapsed="0.000300"/>
</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-10-11T01:06:28.632573" elapsed="0.000249"/>
</kw>
<msg time="2026-10-11T01:06:28.632908" level="INFO">${status} = PASS</msg>
<msg time="2026-10-11T01:06:28.632949" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:28.632208" elapsed="0.000763"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.633486" 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-10-11T01:06:28.633135" elapsed="0.000375"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.634344" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:06:28.634083" elapsed="0.000288"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.634763" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:06:28.634525" elapsed="0.000262"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.635216" 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-10-11T01:06:28.634951" elapsed="0.000289"/>
</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-10-11T01:06:28.636085" elapsed="0.000156"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.636703" level="INFO">${member_ip} = 10.30.170.173</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:28.636424" elapsed="0.000304"/>
</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-10-11T01:06:28.636884" elapsed="0.000168"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.637939" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:28.637509" elapsed="0.000454"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-11T01:06:28.638005" elapsed="0.000029"/>
</return>
<msg time="2026-10-11T01:06:28.638133" 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-10-11T01:06:28.637220" elapsed="0.000936"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:06:28.638707" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7434457bf290&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-10-11T01:06:28.638369" elapsed="0.000452"/>
</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-10-11T01:06:28.638974" elapsed="0.000149"/>
</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-10-11T01:06:28.635658" elapsed="0.003519"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:06:28.635494" elapsed="0.003722"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-10-11T01:06:28.635299" elapsed="0.003946"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.639784" level="INFO">${ClusterManagement__member_index_list} = [1]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:06:28.639445" elapsed="0.000378"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.640344" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.173'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:06:28.639997" elapsed="0.000386"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.640898" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1']</msg>
<arg>\${ClusterManagement__session_list}</arg>
<arg>${session_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:06:28.640572" elapsed="0.000364"/>
</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-10-11T01:06:28.633723" elapsed="0.007266"/>
</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-10-11T01:06:28.628066" elapsed="0.013010"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-11T01:06:28.641226" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:28.641138" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.641120" elapsed="0.000180"/>
</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-10-11T01:06:28.642566" level="INFO">${return_list_reference} = [1]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-11T01:06:28.642124" elapsed="0.000467"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.642994" level="INFO">${return_list_copy} = [1]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-11T01:06:28.642735" elapsed="0.000283"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-11T01:06:28.643058" elapsed="0.000027"/>
</return>
<msg time="2026-10-11T01:06:28.643184" level="INFO">${index_list} = [1]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-11T01:06:28.641837" elapsed="0.001370"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:06:28.644042" level="INFO">${member_ip} = 10.30.170.173</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-10-11T01:06:28.643839" elapsed="0.000227"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:06:28.644827" 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-10-11T01:06:28.644918" 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-10-11T01:06:28.644693" elapsed="0.000248"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:28.647145" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:28.646917" elapsed="0.000398"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:28.646899" elapsed="0.000442"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:06:28.647663" 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-10-11T01:06:28.647773" 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-10-11T01:06:28.647546" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.648913" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.173" 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-10-11T01:06:28.647978" elapsed="0.000980"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:06:28.649619" 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-10-11T01:06:28.649131" elapsed="0.000513"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:06:28.650830" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T01:06:28.651036" 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-10-11T01:06:28.650304" elapsed="0.000778"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:28.651359" elapsed="0.000581"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T01:06:28.653437" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T01:06:29.027944" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 01:05:45 UTC 2026

  System load:  0.02               Processes:             123
  Usage of /:   14.2% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.173
  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.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 01:05:46 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T01:06:28.653102" elapsed="0.374986"/>
</kw>
<msg time="2026-10-11T01:06:29.028165" 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-10-11T01:06:28.652242" elapsed="0.376090"/>
</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-10-11T01:06:28.649836" elapsed="0.378721"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:29.028953" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-10-11T01:06:29.041721" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-10-11T01:06:29.041917" level="INFO">${stdout} = </msg>
<msg time="2026-10-11T01:06:29.041974" 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-10-11T01:06:29.028754" elapsed="0.013251"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:06:29.042210" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:29.043472" 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-10-11T01:06:29.042804" elapsed="0.000730"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T01:06:29.043755" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:29.043627" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:29.043598" elapsed="0.000244"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T01:06:29.044017" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-10-11T01:06:29.043907" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:29.043888" elapsed="0.000234"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-11T01:06:29.044164" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:29.045159" elapsed="0.000955"/>
</kw>
<kw name="Open 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-10-11T01:06:29.046520" elapsed="0.000557"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:06:29.047334" elapsed="0.000292"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:06:29.044592" elapsed="0.003139"/>
</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-10-11T01:06:28.646557" elapsed="0.401271"/>
</kw>
<msg time="2026-10-11T01:06:29.047892" 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-10-11T01:06:28.645925" elapsed="0.402031"/>
</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-10-11T01:06:28.645550" elapsed="0.402501"/>
</kw>
<msg time="2026-10-11T01:06:29.048099" 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-10-11T01:06:28.645084" elapsed="0.403071"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:29.049003" elapsed="0.000484"/>
</kw>
<kw name="Open 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-10-11T01:06:29.049737" elapsed="0.000186"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:06:29.050109" elapsed="0.000121"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:06:29.048559" elapsed="0.001749"/>
</kw>
<msg time="2026-10-11T01:06:29.050488" 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-10-11T01:06:28.644255" elapsed="0.406268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:29.051109" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:29.050803" elapsed="0.000360"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-11T01:06:29.051214" elapsed="0.000038"/>
</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-10-11T01:06:28.643538" elapsed="0.407853"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:06:28.643368" elapsed="0.408137"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-11T01:06:28.643253" elapsed="0.408294"/>
</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-10-11T01:06:28.641508" elapsed="0.410108"/>
</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-10-11T01:06:29.051816" elapsed="0.000283"/>
</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-10-11T01:06:29.059712" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:29.059593" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:29.059569" elapsed="0.000231"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:06:29.060220" 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-10-11T01:06:29.060364" 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-10-11T01:06:29.060059" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:29.060985" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:29.060671" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:29.061636" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:29.061304" elapsed="0.000387"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:06:29.062642" 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-10-11T01:06:29.062386" elapsed="0.000383">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-10-11T01:06:29.062900" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T01:06:29.062955" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:29.061893" elapsed="0.001092"/>
</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-10-11T01:06:29.063398" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:29.063079" elapsed="0.000432"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:29.063055" elapsed="0.000487"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-11T01:06:29.064426" level="INFO">${ip_address} = 10.30.170.173</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-10-11T01:06:29.064105" elapsed="0.000357"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-10-11T01:06:29.064521" elapsed="0.000038"/>
</return>
<msg time="2026-10-11T01:06:29.064690" level="INFO">${odl_ip} = 10.30.170.173</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-10-11T01:06:29.063782" elapsed="0.000938"/>
</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-10-11T01:06:29.064949" elapsed="0.000443"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:06:29.065826" level="INFO">index=4
host=10.30.170.173
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-10-11T01:06:29.065948" level="INFO">${karaf_connection_object} = index=4
host=10.30.170.173
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-10-11T01:06:29.065694" elapsed="0.000287"/>
</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-10-11T01:06:29.066206" elapsed="0.000355"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-10-11T01:06:29.067072" level="INFO">Logging into '10.30.170.173:8101' as 'karaf'.</msg>
<msg time="2026-10-11T01:06:29.282908" 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-10-11T01:06:29.066806" elapsed="0.216184"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:29.284144" elapsed="0.000302"/>
</kw>
<kw name="Open 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-10-11T01:06:29.284622" elapsed="0.000134"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:06:29.284888" elapsed="0.000087"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-11T01:06:29.283816" elapsed="0.001205"/>
</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-10-11T01:06:29.283311" elapsed="0.001750"/>
</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-10-11T01:06:29.059240" elapsed="0.225866"/>
</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-10-11T01:06:29.053299" elapsed="0.231849"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:29.052534" elapsed="0.232659"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-11T01:06:29.052331" elapsed="0.232898"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-10-11T01:06:29.052163" elapsed="0.233095"/>
</for>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-10-11T01:06:28.627609" elapsed="0.657712"/>
</kw>
<kw name="Create_Default_Session" owner="TemplatedRequests">
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:06:29.287087" level="INFO">Creating Session using : alias=default, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7434458795d0&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-10-11T01:06:29.286801" elapsed="0.000386"/>
</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-10-11T01:06:29.286465" elapsed="0.000783"/>
</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-10-11T01:06:29.289582" 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-10-11T01:06:29.289251" elapsed="0.000357"/>
</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-10-11T01:06:29.291031" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T01:06:29.291102" 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-10-11T01:06:29.290792" elapsed="0.000332"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:29.291266" elapsed="0.000315"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T01:06:29.292333" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T01:06:29.669127" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 01:05:45 UTC 2026

  System load:  0.02               Processes:             123
  Usage of /:   14.2% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.173
  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.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 01:06:28 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T01:06:29.292095" elapsed="0.377109"/>
</kw>
<msg time="2026-10-11T01:06:29.669260" 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-10-11T01:06:29.291738" elapsed="0.377588"/>
</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-10-11T01:06:29.290429" elapsed="0.378972"/>
</kw>
<msg time="2026-10-11T01:06:29.669463" 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-10-11T01:06:29.290043" elapsed="0.379462"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-10-11T01:06:29.289761" elapsed="0.379808"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-10-11T01:06:29.669643" elapsed="0.000031"/>
</return>
<msg time="2026-10-11T01:06:29.669779" 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-10-11T01:06:29.288976" elapsed="0.380826"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<msg time="2026-10-11T01:06:29.680900" level="INFO">[chan 1] Opened sftp connection (server version 3)</msg>
<msg time="2026-10-11T01:06:29.691201" 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-10-11T01:06:29.669974" elapsed="0.021318"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:06:29.691517" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="not (${tools_system_connect})">
<return>
<status status="NOT RUN" start="2026-10-11T01:06:29.692051" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:29.691920" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:29.691894" elapsed="0.000237"/>
</if>
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:06:29.695028" 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-10-11T01:06:29.694616" elapsed="0.000446"/>
</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-10-11T01:06:29.697100" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T01:06:29.697197" 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-10-11T01:06:29.696768" elapsed="0.000460"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:29.697471" elapsed="0.000392"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T01:06:29.698934" level="INFO">Logging into '10.30.171.7:22' as 'jenkins'.</msg>
<msg time="2026-10-11T01:06:30.416200" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Sun Oct 11 01:06:30 UTC 2026

  System load:  0.0                Processes:             106
  Usage of /:   19.9% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.7
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 01:04:55 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T01:06:29.698620" elapsed="0.717728"/>
</kw>
<msg time="2026-10-11T01:06:30.416455" 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-10-11T01:06:29.698081" elapsed="0.718455"/>
</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-10-11T01:06:29.696203" elapsed="0.720445"/>
</kw>
<msg time="2026-10-11T01:06:30.416711" 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-10-11T01:06:29.695714" elapsed="0.721056"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-10-11T01:06:29.695296" elapsed="0.721565"/>
</kw>
<return>
<value>${tools_connection}</value>
<status status="PASS" start="2026-10-11T01:06:30.416913" 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-10-11T01:06:29.694146" elapsed="0.722930"/>
</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-10-11T01:06:29.287505" elapsed="1.129636"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:06:30.417678" level="INFO">index=7
host=10.30.171.7
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-10-11T01:06:30.417812" level="INFO">${current_connection} = index=7
host=10.30.171.7
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-10-11T01:06:30.417501" elapsed="0.000346"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:30.418664" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:30.418052" elapsed="0.000643"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:30.419121" level="INFO">&gt;</msg>
<arg>${current_prompt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:30.418900" elapsed="0.000262"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:30.421096" level="INFO">${prompt} = &gt;</msg>
<arg>${prompt}</arg>
<arg>${current_prompt}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-11T01:06:30.419355" elapsed="0.001783"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-11T01:06:30.421602" level="INFO">Creating Session using : alias=session, url=http://10.30.170.173:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x743445542e90&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-10-11T01:06:30.421321" elapsed="0.000427"/>
</kw>
<kw name="Deploy_Test_Tool" owner="NexusKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:30.426236" 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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:30.425968" elapsed="0.000293"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:30.426767" 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-10-11T01:06:30.426460" elapsed="0.000331"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:30.427290" 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-10-11T01:06:30.426956" elapsed="0.000359"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:30.428289" elapsed="0.000288"/>
</kw>
<kw name="Fetch From Left" owner="String">
<msg time="2026-10-11T01:06:30.428904" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories//autorelease-10272</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-10-11T01:06:30.428729" elapsed="0.000200"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:30.429449" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories//autorelease-10272</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-10-11T01:06:30.429090" elapsed="0.000384"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:30.436570" elapsed="0.000323"/>
</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-10-11T01:06:30.436209" elapsed="0.000746"/>
</kw>
<msg time="2026-10-11T01:06:30.436995" 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-10-11T01:06:30.433249" elapsed="0.003791"/>
</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-10-11T01:06:30.432953" elapsed="0.004154"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:30.444287" elapsed="0.000338"/>
</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-10-11T01:06:30.443945" elapsed="0.000744"/>
</kw>
<msg time="2026-10-11T01:06:30.444729" 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-10-11T01:06:30.440904" elapsed="0.003870"/>
</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-10-11T01:06:30.440616" elapsed="0.004224"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:30.452212" elapsed="0.000532"/>
</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-10-11T01:06:30.451833" elapsed="0.000983"/>
</kw>
<msg time="2026-10-11T01:06:30.452865" 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-10-11T01:06:30.448634" elapsed="0.004284"/>
</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-10-11T01:06:30.448326" elapsed="0.004667"/>
</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-10-11T01:06:30.454169" elapsed="0.000264"/>
</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-10-11T01:06:30.455022" elapsed="0.000166"/>
</kw>
<msg time="2026-10-11T01:06:30.455235" 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-10-11T01:06:30.454634" elapsed="0.000670"/>
</kw>
<msg time="2026-10-11T01:06:30.455435" 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-10-11T01:06:30.453858" elapsed="0.001607"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:06:30.455820" level="INFO">index=7
host=10.30.171.7
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-10-11T01:06:30.455921" level="INFO">${current_ssh_connection} = index=7
host=10.30.171.7
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-10-11T01:06:30.455708" elapsed="0.000242"/>
</kw>
<kw name="Open_Connection_To_ODL_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-11T01:06:30.457996" 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-10-11T01:06:30.457683" elapsed="0.000339"/>
</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-10-11T01:06:30.459502" level="INFO">Length is 0.</msg>
<msg time="2026-10-11T01:06:30.459572" 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-10-11T01:06:30.459222" elapsed="0.000373"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:30.459734" elapsed="0.000278"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-11T01:06:30.462463" level="INFO">Logging into '10.30.170.173:22' as 'jenkins'.</msg>
<msg time="2026-10-11T01:06:30.813195" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Sun Oct 11 01:05:45 UTC 2026

  System load:  0.02               Processes:             123
  Usage of /:   14.2% of 77.35GB   Users logged in:       0
  Memory usage: 10%                IPv4 address for ens3: 10.30.170.173
  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.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Oct 11 01:06:29 2026 from 10.30.170.34
[?2004h[jenkins@releng-26932-423-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-10-11T01:06:30.462036" elapsed="0.351339"/>
</kw>
<msg time="2026-10-11T01:06:30.813479" 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-10-11T01:06:30.460167" elapsed="0.353405"/>
</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-10-11T01:06:30.458864" elapsed="0.354825"/>
</kw>
<msg time="2026-10-11T01:06:30.813740" 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-10-11T01:06:30.458514" elapsed="0.355272"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-10-11T01:06:30.458174" elapsed="0.355682"/>
</kw>
<return>
<value>${odl_connection}</value>
<status status="PASS" start="2026-10-11T01:06:30.813908" 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-10-11T01:06:30.457393" elapsed="0.356671"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:30.814648" level="INFO">Executing command 'sh search.sh /tmp/karaf-0.23.3/system pcep-impl'.</msg>
<msg time="2026-10-11T01:06:30.918719" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:06:30.918964" level="INFO">${version} = 1.0.3
org/opendaylight/bgpcep</msg>
<msg time="2026-10-11T01:06:30.919055" 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-10-11T01:06:30.814352" elapsed="0.104750"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-11T01:06:30.919507" elapsed="0.000443"/>
</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-10-11T01:06:30.922728" elapsed="0.000263"/>
</kw>
<msg time="2026-10-11T01:06:30.923077" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-11T01:06:30.921390" elapsed="0.001788"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:30.923728" elapsed="0.000047"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:30.924057" 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-10-11T01:06:30.920608" elapsed="0.003612"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:30.925364" level="INFO">1.0.3
org/opendaylight/bgpcep</msg>
<arg>${version}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:30.924799" elapsed="0.000689"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:30.926113" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:30.925658" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:30.925610" elapsed="0.000691"/>
</if>
<kw name="Split String" owner="String">
<msg time="2026-10-11T01:06:30.927096" level="INFO">${version} = 1.0.3</msg>
<msg time="2026-10-11T01:06:30.927186" 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-10-11T01:06:30.926657" elapsed="0.000577"/>
</kw>
<return>
<value>${version}</value>
<value>${location}</value>
<status status="PASS" start="2026-10-11T01:06:30.927357" elapsed="0.000090"/>
</return>
<msg time="2026-10-11T01:06:30.927727" level="INFO">${version} = 1.0.3</msg>
<msg time="2026-10-11T01:06:30.927813" 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-10-11T01:06:30.453493" elapsed="0.474366"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:30.453076" elapsed="0.474866"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:30.928337" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:30.927992" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:30.453053" elapsed="0.475479"/>
</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-10-11T01:06:30.929073" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-10-11T01:06:30.928646" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:30.928614" elapsed="0.000623"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:30.930469" 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-10-11T01:06:30.929628" elapsed="0.000897"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:30.931836" 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-10-11T01:06:30.931005" elapsed="0.000888"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:30.933061" level="INFO">${urlbase} = https://nexus.opendaylight.org/content/repositories//autorelease-10272</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-10-11T01:06:30.932263" elapsed="0.000853"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:30.934155" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3</msg>
<var>${url}</var>
<arg>${urlbase}/${location}/${artifact}/${version}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:30.933501" elapsed="0.000709"/>
</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-10-11T01:06:30.938013" level="INFO">Executing command 'curl -L https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/maven-metadata.xml'.</msg>
<msg time="2026-10-11T01:06:31.043454" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:06:31.043727" level="INFO">${stdout} = &lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-10272 (staging: closed)&amp;quot; [id=autor...</msg>
<msg time="2026-10-11T01:06:31.043824" 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-10-11T01:06:31.043910" 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-10-11T01:06:30.937677" elapsed="0.106281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T01:06:31.045813" level="INFO">Length is 316.</msg>
<msg time="2026-10-11T01:06:31.045991" 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  1104    0  1104    0     0  12881      0 --:--:-- --:--:-- --:--:-- 12988' should be empty.</msg>
<arg>${stderr}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="FAIL" start="2026-10-11T01:06:31.045178" elapsed="0.000961">'  % 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  1104    0  1104    0     0  12881      0 --:--:-- --:--:-- --:--:-- 12988' should be empty.</status>
</kw>
<msg time="2026-10-11T01:06:31.046557" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-10-11T01:06:31.046650" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:31.044391" elapsed="0.002308"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:31.047940" 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-10-11T01:06:31.047073" elapsed="0.000922"/>
</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-10-11T01:06:31.050114" level="INFO">&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-10272 (staging: closed)&amp;quot; [id=autorelease-10272]&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.3/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-10272 (staging: closed)&amp;quot; [id=autorelease-10272]&lt;/h1&gt;
    &lt;p&gt;Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-10272 (staging: closed)&amp;quot; [id=autorelease-10272]&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-10-11T01:06:31.049619" elapsed="0.000620"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:31.051233" 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  1104    0  1104    0     0  12881      0 --:--:-- --:--:-- --:--:-- 12988</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:31.050756" elapsed="0.000598"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:31.052258" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:31.051784" elapsed="0.000588"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T01:06:31.048813" elapsed="0.003698"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:31.048156" elapsed="0.004427"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:31.048113" elapsed="0.004524"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T01:06:31.052923" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:31.052749" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:31.052715" elapsed="0.000343"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-11T01:06:31.053333" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-10-11T01:06:31.053160" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:31.053130" elapsed="0.000406"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Got rc: ${rc} or stderr was not empty: ${stderr}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:31.053846" elapsed="0.000042"/>
</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-10-11T01:06:30.936560" elapsed="0.117494"/>
</kw>
<msg time="2026-10-11T01:06:31.054174" 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-10-11T01:06:30.935355" elapsed="0.118939"/>
</kw>
<msg time="2026-10-11T01:06:31.054627" level="INFO">${metadata} = &lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-10272 (staging: closed)&amp;quot; [id=autor...</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-10-11T01:06:30.934656" elapsed="0.120030"/>
</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-10-11T01:06:31.059290" level="INFO">Executing command 'echo "&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-10272 (staging: closed)&amp;quot; [id=autorelease-10272]&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.3/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-10272 (staging: closed)&amp;quot; [id=autorelease-10272]&lt;/h1&gt;
    &lt;p&gt;Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-10272 (staging: closed)&amp;quot; [id=autorelease-10272]&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-10-11T01:06:31.097126" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-11T01:06:31.097385" level="INFO">${stdout} = &lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-10272 (staging: closed)&amp;quot; [id=autor...</msg>
<msg time="2026-10-11T01:06:31.097521" 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-10-11T01:06:31.097610" 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-10-11T01:06:31.058929" elapsed="0.038727"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Should Be Empty" owner="BuiltIn">
<msg time="2026-10-11T01:06:31.099343" level="INFO">Length is 253.</msg>
<msg time="2026-10-11T01:06:31.099544" 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-10-11T01:06:31.098794" elapsed="0.000883">'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-10-11T01:06:31.099891" level="INFO">${emptiness_status} = FAIL</msg>
<msg time="2026-10-11T01:06:31.099980" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:31.098026" elapsed="0.002005"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:31.101243" 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-10-11T01:06:31.100457" elapsed="0.000862"/>
</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-10-11T01:06:31.103366" level="INFO">&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;404 - Path /org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/maven-metadata.xml not found in local storage of repository &amp;quot;autorelease-10272 (staging: closed)&amp;quot; [id=autorelease-10272]&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-10-11T01:06:31.102849" elapsed="0.000696"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:31.104485" 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-10-11T01:06:31.103950" elapsed="0.000636"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:31.105525" level="INFO">0</msg>
<arg>${rc}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:31.104985" elapsed="0.000630"/>
</kw>
<arg>${stdout}</arg>
<arg>${stderr}</arg>
<arg>${rc}</arg>
<doc>Log everything returned by SSHLibrary.Execute_Command</doc>
<status status="PASS" start="2026-10-11T01:06:31.102069" elapsed="0.003655"/>
</kw>
<status status="PASS" start="2026-10-11T01:06:31.101506" elapsed="0.004289"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:31.101463" elapsed="0.004382"/>
</if>
<if>
<branch type="IF" condition="${return_success_only}">
<return>
<value>${success}</value>
<status status="NOT RUN" start="2026-10-11T01:06:31.106128" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:31.105958" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:31.105923" elapsed="0.000340"/>
</if>
<if>
<branch type="IF" condition="${success}">
<return>
<value>${stdout}</value>
<status status="NOT RUN" start="2026-10-11T01:06:31.106575" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:31.106391" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:31.106359" elapsed="0.000347"/>
</if>
<kw name="Fail" owner="BuiltIn">
<msg time="2026-10-11T01:06:31.107728" 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 or task with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-10-11T01:06:31.107010" elapsed="0.000851">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-10-11T01:06:31.057791" elapsed="0.050739">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-10-11T01:06:31.108652" 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-10-11T01:06:31.056683" elapsed="0.052065"/>
</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-10-11T01:06:31.055863" elapsed="0.053083">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-10-11T01:06:31.109241" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-11T01:06:31.109366" 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 errorw.</doc>
<status status="PASS" start="2026-10-11T01:06:31.055017" elapsed="0.054431"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-11T01:06:31.110363" level="INFO">Length is 288.</msg>
<msg time="2026-10-11T01:06:31.110547" 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-10-11T01:06:31.109801" elapsed="0.000797"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-11T01:06:31.111809" level="INFO">${namepart} = 1.0.3</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-10-11T01:06:31.111001" elapsed="0.000896"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:31.113317" level="INFO">${filename} = pcep-pcc-mock-1.0.3-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 variable.</doc>
<status status="PASS" start="2026-10-11T01:06:31.112398" elapsed="0.000979"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:31.114334" level="INFO">pcep-pcc-mock-1.0.3-executable.jar</msg>
<arg>${filename}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:31.113826" elapsed="0.000630"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-11T01:06:31.115438" level="INFO">${url} = https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</msg>
<var>${url}</var>
<arg>${url}/${filename}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-11T01:06:31.114781" elapsed="0.000715"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:31.116197" level="INFO">Executing command 'wget -q -N 'https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar' 2&gt;&amp;1'.</msg>
<msg time="2026-10-11T01:06:31.179491" level="INFO">Command exited with return code 8.</msg>
<msg time="2026-10-11T01:06:31.179730" level="INFO">${response} = </msg>
<msg time="2026-10-11T01:06:31.179827" 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-10-11T01:06:31.115896" elapsed="0.063980"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:31.181055" level="INFO"/>
<arg>${response}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:31.180379" elapsed="0.000767"/>
</kw>
<if>
<branch type="IF" condition="${result} == 0">
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-10-11T01:06:31.181590" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-11T01:06:31.181320" elapsed="0.000365"/>
</branch>
<status status="PASS" start="2026-10-11T01:06:31.181246" elapsed="0.000485"/>
</if>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-10-11T01:06:31.182558" level="INFO">${release_url} = https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-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-10-11T01:06:31.182073" elapsed="0.000543"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-11T01:06:31.183386" level="INFO">Executing command 'wget -q -N 'https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar' 2&gt;&amp;1'.</msg>
<msg time="2026-10-11T01:06:31.255347" level="INFO">Command exited with return code 8.</msg>
<msg time="2026-10-11T01:06:31.255643" level="INFO">${response} = </msg>
<msg time="2026-10-11T01:06:31.255734" level="INFO">${result} = 8</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-10-11T01:06:31.183030" elapsed="0.072752"/>
</kw>
<if>
<branch type="IF" condition="${result} != 0">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-10-11T01:06:31.257331" level="FAIL">Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</msg>
<arg>Artifact "${artifact}" in component "${component}" could not be downloaded from ${release_url} nor ${url}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-10-11T01:06:31.256499" elapsed="0.001011">Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</kw>
<status status="FAIL" start="2026-10-11T01:06:31.255964" elapsed="0.001692">Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</branch>
<status status="FAIL" start="2026-10-11T01:06:31.255917" elapsed="0.001812">Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</if>
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-10-11T01:06:31.257829" elapsed="0.000034"/>
</return>
<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-10272/org/opendaylight/integration/karaf/0.23.3/karaf-0.23.3.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="FAIL" start="2026-10-11T01:06:30.427819" elapsed="0.830229">Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</kw>
<return>
<value>${filename}</value>
<status status="NOT RUN" start="2026-10-11T01:06:31.258338" elapsed="0.000036"/>
</return>
<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="FAIL" start="2026-10-11T01:06:30.425554" elapsed="0.833017">Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${filename}</arg>
<arg>${name}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-11T01:06:31.259018" elapsed="0.000045"/>
</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-10-11T01:06:31.259522" elapsed="0.000053"/>
</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="FAIL" start="2026-10-11T01:06:28.627139" elapsed="2.632609">Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</kw>
<test id="s1-s21-t1" name="Topology_Precondition" line="49">
<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="FAIL" start="2026-10-11T01:06:31.259918" elapsed="0.001217">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s21-t2" name="Start_Secure_Pcc_Mock" line="61">
<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="FAIL" start="2026-10-11T01:06:31.261771" elapsed="0.000990">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s21-t3" name="Topology_Unauthorized_1" line="65">
<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="FAIL" start="2026-10-11T01:06:31.263306" elapsed="0.001012">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s21-t4" name="Set_Wrong_Password" line="70">
<doc>Configure password in pcep dispatcher for client with Mininet IP address.
This password does not match what pcc-mock uses.</doc>
<status status="FAIL" start="2026-10-11T01:06:31.264887" elapsed="0.001037">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s21-t5" name="Topology_Unauthorized_2" line="75">
<doc>The same logic as Topology_Unauthorized_1 as incorrect password was provided to ODL.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-10-11T01:06:31.266533" elapsed="0.000929">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s21-t6" name="Set_Correct_Password" line="80">
<doc>Configure password in pcep dispatcher for client with Mininet IP address.
This password finally matches what pcc-mock uses.</doc>
<status status="FAIL" start="2026-10-11T01:06:31.267988" elapsed="0.001055">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s21-t7" name="Topology_Intercondition" line="85">
<doc>Compare pcep-topology/path-computation-client to filled one, which includes a tunnel from pcc-mock.</doc>
<status status="FAIL" start="2026-10-11T01:06:31.269625" elapsed="0.000933">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s21-t8" name="Stop_Pcc_Mock_1" line="102">
<doc>Stops First instance of pcc-mock.</doc>
<status status="FAIL" start="2026-10-11T01:06:31.271117" elapsed="0.000741">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s21-t9" name="Topology_Unauthorized_3" line="110">
<doc>The same logic as Topology_Unauthorized_1, with no pcc-mock running.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-10-11T01:06:31.272212" elapsed="0.000805">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s21-t10" name="Start_Secure_Pcc_Mock_2" line="115">
<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="FAIL" start="2026-10-11T01:06:31.273539" elapsed="0.001191">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s21-t11" name="Topology_Unauthorized_4" line="119">
<doc>The same logic as Topology_Unauthorized_1, but ODL password became incorrect with new pcc-mock running.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-10-11T01:06:31.275247" elapsed="0.001078">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s21-t12" name="Set_Correct_Password_2" line="124">
<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="FAIL" start="2026-10-11T01:06:31.276887" elapsed="0.001057">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s21-t13" name="Topology_Intercondition_2" line="129">
<doc>Compare pcep-topology/path-computation-client to filled one, which includes a tunnel from pcc-mock.</doc>
<status status="FAIL" start="2026-10-11T01:06:31.278515" elapsed="0.000955">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s21-t14" name="Update_Delegated" line="146">
<doc>Perform update-lsp on the mocked tunnel, check response is success.</doc>
<status status="FAIL" start="2026-10-11T01:06:31.279992" elapsed="0.000824">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s21-t15" name="Topology_Updated" line="156">
<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-10-11T01:06:31.281356" elapsed="0.000903">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s21-t16" name="Unset_Password" line="174">
<doc>De-configure password for pcep dispatcher for client with Mininet IP address.</doc>
<status status="FAIL" start="2026-10-11T01:06:31.282834" elapsed="0.001425">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s21-t17" name="Topology_Unauthorized_5" line="182">
<doc>Wait for pcep-topology to become empty again.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-10-11T01:06:31.284857" elapsed="0.000835">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s21-t18" name="Stop_Pcc_Mock_2" line="187">
<doc>Stops second instance of pcc-mock</doc>
<status status="FAIL" start="2026-10-11T01:06:31.286188" elapsed="0.000666">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s21-t19" name="Topology_Postcondition" line="195">
<doc>Verify that pcep-topology stays empty.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-10-11T01:06:31.287196" elapsed="0.000950">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<test id="s1-s21-t20" name="Delete_Pcep_Client_Module" line="200">
<doc>Delete Pcep client module.</doc>
<status status="FAIL" start="2026-10-11T01:06:31.288827" elapsed="0.000743">Parent suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar</status>
</test>
<kw name="Tear_It_Down" type="TEARDOWN">
<kw name="Get File" owner="SSHLibrary">
<msg time="2026-10-11T01:06:31.301557" level="INFO">[chan 5] Opened sftp connection (server version 3)</msg>
<msg time="2026-10-11T01:06:31.311861" level="FAIL">There were no source files matching 'pccmock.log'.</msg>
<arg>pccmock.log</arg>
<doc>Downloads file(s) from the remote machine to the local machine.</doc>
<status status="FAIL" start="2026-10-11T01:06:31.291182" elapsed="0.021566">There were no source files matching 'pccmock.log'.</status>
</kw>
<kw name="Run" owner="OperatingSystem">
<msg time="2026-10-11T01:06:31.313377" level="INFO">Running command 'cat pccmock.log'.</msg>
<msg time="2026-10-11T01:06:31.318461" level="INFO">${pccmocklog} = cat: pccmock.log: No such file or directory</msg>
<var>${pccmocklog}</var>
<arg>cat pccmock.log</arg>
<doc>*This keyword is considered deprecated. Use the [Process] library instead.*</doc>
<status status="PASS" start="2026-10-11T01:06:31.313143" elapsed="0.005383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-11T01:06:31.319586" level="INFO">cat: pccmock.log: No such file or directory</msg>
<arg>${pccmocklog}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-11T01:06:31.318976" elapsed="0.000707"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-10-11T01:06:31.320132" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects </doc>
<status status="PASS" start="2026-10-11T01:06:31.319983" elapsed="0.000375"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-10-11T01:06:31.320706" elapsed="0.000627"/>
</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="FAIL" start="2026-10-11T01:06:31.290660" elapsed="0.030960">There were no source files matching 'pccmock.log'.</status>
</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-10-11T01:06:28.586921" elapsed="2.734857">Suite setup failed:
Artifact "pcep-pcc-mock" in component "bgpcep" could not be downloaded from https://nexus.opendaylight.org/content/repositories//opendaylight.release2/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar nor https://nexus.opendaylight.org/content/repositories//autorelease-10272/org/opendaylight/bgpcep/pcep-pcc-mock/1.0.3/pcep-pcc-mock-1.0.3-executable.jar

Also suite teardown failed:
There were no source files matching 'pccmock.log'.</status>
</suite>
<status status="FAIL" start="2026-10-11T00:46:51.145505" elapsed="1180.179797"/>
</suite>
<statistics>
<total>
<stat pass="333" fail="59" skip="0">All Tests</stat>
</total>
<tag>
<stat pass="114" fail="35" 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="333" fail="59" skip="0">bgpcep-userfeatures.txt</stat>
<stat name="050 Bmp Basic" id="s1-s1" pass="0" fail="4" skip="0">bgpcep-userfeatures.txt.050 Bmp Basic</stat>
<stat name="Pcepuser" id="s1-s2" pass="0" fail="16" 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="38" fail="0" 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="26" fail="2" skip="0">bgpcep-userfeatures.txt.Bgp App Peer Basic</stat>
<stat name="Ibgp Peers Basic" id="s1-s8" pass="35" fail="1" 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="0" fail="20" skip="0">bgpcep-userfeatures.txt.Tcpmd5User</stat>
</suite>
</statistics>
<errors>
<msg time="2026-10-11T00:46:55.239171" 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-10-11T00:47:25.324709" 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-10-11T00:47:25.325847" 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-10-11T00:47:25.326900" 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-10-11T00:47:25.327866" 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-10-11T00:47:25.336263" 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-10-11T00:47:25.339855" 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-10-11T00:48:41.114912" 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-10-11T00:51:34.652083" 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-10-11T00:52:08.488541" 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-10-11T00:52:08.489249" 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-10-11T00:52:08.489787" 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-10-11T00:52:08.490265" 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-10-11T00:52:08.495599" 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-10-11T00:52:08.498453" 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-10-11T00:53:13.398116" 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-10-11T00:53:13.400036" 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-10-11T00:53:13.401257" 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-10-11T00:53:13.402318" 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-10-11T00:53:13.410644" 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-10-11T00:53:13.445337" 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-10-11T00:53:13.451480" 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-10-11T00:54:34.394099" 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-10-11T00:54:34.394829" 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-10-11T00:54:34.395369" 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-10-11T00:54:34.395851" 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-10-11T00:54:34.401207" 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-10-11T00:54:34.403834" 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-10-11T00:54:34.405520" 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-10-11T00:57:02.533682" 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-10-11T00:57:15.323157" 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-10-11T00:57:15.323893" 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-10-11T00:57:15.324430" 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-10-11T00:57:15.324977" 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-10-11T00:57:15.330505" 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-10-11T00:57:15.333197" 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-10-11T00:57:15.336025" 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-10-11T00:58:04.851776" 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-10-11T00:58:27.850863" 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-10-11T01:01:29.085965" 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-10-11T01:02:14.729325" 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-10-11T01:03:04.023361" 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-10-11T01:04:31.409398" 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-10-11T01:04:54.369361" 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-10-11T01:05:29.113890" 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-10-11T01:05:45.368428" 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-10-11T01:06:28.598630" 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-10-11T01:06:28.603835" 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-10-11T01:06:28.604538" 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-10-11T01:06:28.616767" 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-10-11T01:06:28.619339" 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>
